Skip to content

Commit 71808cb

Browse files
authoredMay 20, 2019
Interactive switch on web page
1 parent eaa934f commit 71808cb

File tree

3 files changed

+52
-35
lines changed

3 files changed

+52
-35
lines changed
 

‎AT_Display.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -900,8 +900,11 @@ void AT_Display::clickBar(boolean bottom,TS_Point p){
900900
void AT_Display::clickResults(uint8_t line, uint8_t column) {
901901
int16_t index = findWidgetSource(line,column);
902902
if (index >= 0) {
903-
_database->toggleResult(index);
904-
if (_onResultChange) _onResultChange(index);
903+
ATCURVALUES res = _database->getResult(index);
904+
if (res.type == ATTYPE_SWITCHOUT) {
905+
_database->toggleResult(index);
906+
if (_onResultChange) _onResultChange(index);
907+
}
905908
}
906909

907910
}

‎AT_Webserver.cpp

+44-33
Original file line numberDiff line numberDiff line change
@@ -12,42 +12,39 @@
1212
#include "WebServer.h"
1313

1414
const PROGMEM char AT_WIDGET_TEMPLATE[] =
15-
"<div style=\"background-color:#%06x;border-color:#%06x;color:#%06x;font-size:%ipt;font-weight:%s;text-align:center;width:%i%%;float:%s;\">"
16-
"<div style='padding:5px;'>";
15+
"<button type='submit' name='widget' value=%i style=\"border:none;background-color:#%06x;border-color:#%06x;color:#%06x;font-size:%ipt;font-weight:%s;text-align:center;width:%i%%;float:%s;\">\n"
16+
"<div style='padding:5px;'>\n";
1717

1818
const PROGMEM char HTML_HEADER[] =
19-
"<!DOCTYPE HTML>"
20-
"<html>"
21-
"<head>"
22-
"<meta name = \"viewport\" content = \"width = device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=0>\">"
23-
"<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">"
24-
"<title>Smart Home</title>"
25-
"<style>"
26-
"body { background-color: #d2f3eb; font-family: Arial, Helvetica, Sans-Serif; Color: #000000;font-size:12pt;width:800px; }"
27-
"th { background-color: #b6c0db; color: #050ed2;font-weight:lighter;font-size:10pt;}"
28-
"table, th, td {border: 1px solid black;}"
29-
".titel {font-size:18pt;font-weight:bold;text-align:center;} "
30-
"</style>";
19+
"<!DOCTYPE HTML>\n"
20+
"<html>\n"
21+
"<head>\n"
22+
"<meta name = \"viewport\" content = \"width = device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=0>\">\n"
23+
"<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n"
24+
"<title>Smart Home</title>\n"
25+
"<style>\n"
26+
"body { background-color: #d2f3eb; font-family: Arial, Helvetica, Sans-Serif; Color: #000000;font-size:12pt;width:800px; }\n"
27+
"th { background-color: #b6c0db; color: #050ed2;font-weight:lighter;font-size:10pt;}\n"
28+
"table, th, td {border: 1px solid black;}\n"
29+
".titel {font-size:18pt;font-weight:bold;text-align:center;} \n"
30+
"</style>\n";
3131

3232
const PROGMEM char HTML_HEADER_END[] =
33-
"</head>"
34-
"<body><div id='main_div' style='margin-left:15px;margin-right:15px;'>";
33+
"</head>\n"
34+
"<body><div id='main_div' style='margin-left:15px;margin-right:15px;'>\n";
3535
const PROGMEM char HTML_END[] =
36-
"</body></html>";
36+
"</body></html>\n";
3737
const PROGMEM char HTML_SCRIPT[] =
38-
"<script language=\"javascript\">"
39-
"function reload() {"
40-
"document.location=\"http://%s\";}"
41-
"function setWidth() {"
42-
"var x = screen.width;"
43-
"if (x<800) document.getElementById('main_div').style.width = (x-50) + 'px';}"
44-
"</script>";
38+
"<script language=\"javascript\">\n"
39+
"function reload() {\n"
40+
"document.location=\"http://%s\";}\n"
41+
"function setWidth() {\n"
42+
"var x = screen.width;\n"
43+
"if (x<800) document.getElementById('main_div').style.width = (x-50) + 'px';}\n"
44+
"</script>\n";
4545
const PROGMEM char HTML_END_RELOAD[] =
46-
"</div><script language=\"javascript\">setTimeout(reload, %i);</script></body>"
47-
"</html>";
48-
const PROGMEM char HTML_SET_WIDTH[] =
49-
"</div><script language=\"javascript\">setWidth();</script></body>"
50-
"</html>";
46+
"</div><script language=\"javascript\">setWidth(); setTimeout(reload, %i);</script></body>\n"
47+
"</html>\n";
5148

5249

5350

@@ -65,6 +62,15 @@ void AT_Webserver::handleClient(){
6562
}
6663

6764
void AT_Webserver::handleRoot(uint8_t refresh){
65+
//first check arguments to perform actions
66+
if (_server->hasArg("widget")){
67+
uint16_t id = _server->arg("widget").toInt();
68+
ATCURVALUES res = _database->getResult(id);
69+
if (res.type == ATTYPE_SWITCHOUT) {
70+
_database->toggleResult(id);
71+
if (_onResultChange) _onResultChange(id);
72+
}
73+
}
6874
char tmp1[20];
6975
char htmlbuf[256];
7076
_server->setContentLength(CONTENT_LENGTH_UNKNOWN);
@@ -75,14 +81,13 @@ void AT_Webserver::handleRoot(uint8_t refresh){
7581
sprintf(htmlbuf,HTML_SCRIPT,tmp1);
7682
_server->sendContent(htmlbuf);
7783
_server->sendContent(HTML_HEADER_END);
78-
_server->sendContent("<div class=\"titel\">ArduiTouch Smart&nbsp;Home</div><form method=\"post\">");
84+
_server->sendContent("<div class=\"titel\">ArduiTouch Smart&nbsp;Home</div>\n");
7985

8086
sendResults();
8187
//Das Formular mit den Eingabefeldern wird mit den aktuellen Werten befüllt
8288
//sprintf(htmlbuf,HTML_CONFIG,txtSSID,txtPassword,txtUser,txtPwd,txtId);
8389
//und an den Browsewr gesendet
8490
//server->sendContent("<h1>SMART Home</h1>");
85-
_server->sendContent(HTML_SET_WIDTH);
8691
sprintf(htmlbuf,HTML_END_RELOAD,refresh*1000);
8792
_server->sendContent(htmlbuf);
8893

@@ -117,6 +122,7 @@ void AT_Webserver::sendResults(){
117122
x = 0; y = 0;
118123
ATDISPLAYPAGE pg;
119124
ATDISPLAYWIDGET wdg;
125+
_server->sendContent("<form method='post'>\n");
120126
for (uint8_t p = 0; p<ATMAXPAGES; p++) {
121127
pg = _database->getPage(p);
122128
for (uint8_t i = 0;i<ATWIDGETSPERPAGE;i++) {
@@ -128,6 +134,7 @@ void AT_Webserver::sendResults(){
128134
}
129135
}
130136
}
137+
_server->sendContent("</form>\n");
131138

132139
}
133140

@@ -159,7 +166,7 @@ void AT_Webserver::sendSimpleWidget(ATDISPLAYWIDGET wdg){
159166
case ATWIDGET_LEFT: iflo=1; width = 50; break;
160167
case ATWIDGET_RIGHT: iflo=2; width = 50; break;
161168
}
162-
sprintf(htmlbuf,AT_WIDGET_TEMPLATE,convertColor(fill),convertColor(wdg.bgcolor),convertColor(wdg.fontcolor),15,weight[iwgt],width,flo[iflo]);
169+
sprintf(htmlbuf,AT_WIDGET_TEMPLATE,wdg.source,convertColor(fill),convertColor(wdg.bgcolor),convertColor(wdg.fontcolor),15,weight[iwgt],width,flo[iflo]);
163170
_server->sendContent(htmlbuf);
164171
if (wdg.size == ATWIDGET_SMALL) {
165172
msg = wdg.label + " " + val;
@@ -170,5 +177,9 @@ void AT_Webserver::sendSimpleWidget(ATDISPLAYWIDGET wdg){
170177
String msg = wdg.label+" "+val;
171178
_server->sendContent(val);
172179
}
173-
_server->sendContent("</div></div>");
180+
_server->sendContent("</div></button>\n");
181+
}
182+
//register a callback function result change event
183+
void AT_Webserver::registerOnResultChange(void (*callback)(uint16_t index)){
184+
_onResultChange = callback;
174185
}

‎AT_Webserver.h

+3
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,15 @@ class AT_Webserver {
4242
void handleClient();
4343
void handleRoot(uint8_t refresh = 10);
4444
void handleNotFound();
45+
//register a callback function result change event
46+
void registerOnResultChange(void (*callback)(uint16_t index));
4547
private:
4648
uint32_t convertColor(uint16_t color565);
4749
void sendResults();
4850
void sendSimpleWidget(ATDISPLAYWIDGET wdg);
4951
AT_Database * _database;
5052
WebServer * _server;
53+
void(*_onResultChange)(uint16_t index) = NULL;
5154
};
5255

5356
#endif

0 commit comments

Comments
 (0)