X10 Server - IOT device to leverage a collection of old X10 devices for home automation and lighting control.

Dependencies:   IniManager mbed HTTPClient SWUpdate mbed-rtos Watchdog X10 SW_HTTPServer SW_String EthernetInterface TimeInterface SSDP

X10 Server

See the X10 Server Nodebook page

Committer:
WiredHome
Date:
Mon Mar 04 00:05:08 2019 +0000
Revision:
12:67c524db9e07
Parent:
8:a45fe77efcc5
Fix the SignOfLife LED display.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 0:de1dfa2ab813 1
WiredHome 0:de1dfa2ab813 2 #include "mbed.h"
WiredHome 0:de1dfa2ab813 3
WiredHome 0:de1dfa2ab813 4 #include "EthernetInterface.h"
WiredHome 7:16129d213e6a 5 #include "SW_String.h"
WiredHome 7:16129d213e6a 6 #include "X10.h"
WiredHome 0:de1dfa2ab813 7 #include "WebPages.h"
WiredHome 7:16129d213e6a 8 #include "IniManager.h" // v20
WiredHome 7:16129d213e6a 9
WiredHome 7:16129d213e6a 10 extern INI ini;
WiredHome 7:16129d213e6a 11 extern X10Interface cm17a;
WiredHome 0:de1dfa2ab813 12
WiredHome 0:de1dfa2ab813 13 extern EthernetInterface eth;
WiredHome 0:de1dfa2ab813 14 extern const char * BUILD_DATE;
WiredHome 0:de1dfa2ab813 15 extern const char * PROG_NAME;
WiredHome 0:de1dfa2ab813 16 extern const char * My_Name;
WiredHome 0:de1dfa2ab813 17 extern const char * My_SerialNum;
WiredHome 4:5da66fab599c 18 extern int Server_Port;
WiredHome 0:de1dfa2ab813 19
WiredHome 7:16129d213e6a 20 extern bool swUpdateCheck;
WiredHome 0:de1dfa2ab813 21
WiredHome 8:a45fe77efcc5 22 extern DigitalOut linkdata;
WiredHome 8:a45fe77efcc5 23
WiredHome 8:a45fe77efcc5 24 extern "C" void mbed_reset();
WiredHome 8:a45fe77efcc5 25
WiredHome 0:de1dfa2ab813 26
WiredHome 0:de1dfa2ab813 27 static const char hdrTypeHTML_NoCache[] =
WiredHome 0:de1dfa2ab813 28 "Content-Type: text/html\r\n"
WiredHome 0:de1dfa2ab813 29 "Cache-Control: no-cache\r\n";
WiredHome 0:de1dfa2ab813 30
WiredHome 0:de1dfa2ab813 31
WiredHome 0:de1dfa2ab813 32 // The /setup.xml file
WiredHome 0:de1dfa2ab813 33 //
WiredHome 0:de1dfa2ab813 34 // sprintf(buf, SETUP_TEMPLATE, "FriendlyName", "udn_hexstring", "serialNum", "ip.ad.dr", portNum);
WiredHome 2:ca5d12560ff7 35 static const char SETUP_TEMPLATE[] =
WiredHome 0:de1dfa2ab813 36 "<?xml version=\"1.0\"?>\n"
WiredHome 0:de1dfa2ab813 37 "<root xmlns=\"urn:Belkin:device-1-0\">\n"
WiredHome 0:de1dfa2ab813 38 " <specVersion>\n"
WiredHome 0:de1dfa2ab813 39 " <major>1</major>\n"
WiredHome 0:de1dfa2ab813 40 " <minor>0</minor>\n"
WiredHome 0:de1dfa2ab813 41 " </specVersion>\n"
WiredHome 0:de1dfa2ab813 42 " <device>\n"
WiredHome 0:de1dfa2ab813 43 " <deviceType>urn:Belkin:device:controllee:1</deviceType>\n"
WiredHome 0:de1dfa2ab813 44 " <friendlyName>%s</friendlyName>\n"
WiredHome 0:de1dfa2ab813 45 " <manufacturer>Belkin International Inc.</manufacturer>\n" ///< must be "Belkin..." for Alexa discovery
WiredHome 0:de1dfa2ab813 46 " <manufacturerURL>http://www.smart-family.net</manufacturerURL>\n" ///<
WiredHome 0:de1dfa2ab813 47 " <modelDescription>Special thing</modelDescription>\n" ///<
WiredHome 0:de1dfa2ab813 48 " <modelName>Smart Node</modelName>\n" ///<
WiredHome 0:de1dfa2ab813 49 " <modelNumber>1.0.0</modelNumber>\n"
WiredHome 7:16129d213e6a 50 #if 1
WiredHome 0:de1dfa2ab813 51 " <modelURL>http://www.smart-family.net</modelURL>\n" ///< This causes it to fail to send completely
WiredHome 0:de1dfa2ab813 52 #endif
WiredHome 0:de1dfa2ab813 53 " <UDN>uuid:Socket-1_0-%s</UDN>\n"
WiredHome 0:de1dfa2ab813 54 " <serialNumber>%s</serialNumber>\n"
WiredHome 0:de1dfa2ab813 55 " <iconList>\n"
WiredHome 0:de1dfa2ab813 56 " <mimetype>jpg</mimetype>\n"
WiredHome 0:de1dfa2ab813 57 " <width>100</width>\n"
WiredHome 0:de1dfa2ab813 58 " <height>100</height>\n"
WiredHome 0:de1dfa2ab813 59 " <depth>100</depth>\n"
WiredHome 0:de1dfa2ab813 60 " <url>icon.jpg</url>\n"
WiredHome 0:de1dfa2ab813 61 " </iconList>\n"
WiredHome 0:de1dfa2ab813 62 " <presentationURL>http://%s:%d</presentationURL>\n"
WiredHome 0:de1dfa2ab813 63 #if 0
WiredHome 0:de1dfa2ab813 64 " <serviceList>\n"
WiredHome 0:de1dfa2ab813 65 " <service>\n"
WiredHome 0:de1dfa2ab813 66 " <serviceType>urn:Belkin:service:WiFiSetup:1</serviceType>\n"
WiredHome 0:de1dfa2ab813 67 " <serviceId>urn:Belkin:serviceId:WiFiSetup1</serviceId>\n"
WiredHome 0:de1dfa2ab813 68 " <controlURL>/upnp/control/WiFiSetup1</controlURL>\n"
WiredHome 0:de1dfa2ab813 69 " <eventSubURL>/upnp/event/WiFiSetup1</eventSubURL>\n"
WiredHome 0:de1dfa2ab813 70 " <SCPDURL>/setupservice.xml</SCPDURL>\n"
WiredHome 0:de1dfa2ab813 71 " </service>\n"
WiredHome 0:de1dfa2ab813 72 " <service>\n"
WiredHome 0:de1dfa2ab813 73 " <serviceType>urn:Belkin:service:timesync:1</serviceType>\n"
WiredHome 0:de1dfa2ab813 74 " <serviceId>urn:Belkin:serviceId:timesync1</serviceId>\n"
WiredHome 0:de1dfa2ab813 75 " <controlURL>/upnp/control/timesync1</controlURL>\n"
WiredHome 0:de1dfa2ab813 76 " <eventSubURL>/upnp/event/timesync1</eventSubURL>\n"
WiredHome 0:de1dfa2ab813 77 " <SCPDURL>/timesyncservice.xml</SCPDURL>\n"
WiredHome 0:de1dfa2ab813 78 " </service>\n"
WiredHome 0:de1dfa2ab813 79 " <service>\n"
WiredHome 0:de1dfa2ab813 80 " <serviceType>urn:Belkin:service:basicevent:1</serviceType>\n"
WiredHome 0:de1dfa2ab813 81 " <serviceId>urn:Belkin:serviceId:basicevent1</serviceId>\n"
WiredHome 0:de1dfa2ab813 82 " <controlURL>/upnp/control/basicevent1</controlURL>\n"
WiredHome 0:de1dfa2ab813 83 " <eventSubURL>/upnp/event/basicevent1</eventSubURL>\n"
WiredHome 0:de1dfa2ab813 84 " <SCPDURL>/eventservice.xml</SCPDURL>\n"
WiredHome 0:de1dfa2ab813 85 " </service>\n"
WiredHome 0:de1dfa2ab813 86 " <service>\n"
WiredHome 0:de1dfa2ab813 87 " <serviceType>urn:Belkin:service:firmwareupdate:1</serviceType>\n"
WiredHome 0:de1dfa2ab813 88 " <serviceId>urn:Belkin:serviceId:firmwareupdate1</serviceId>\n"
WiredHome 0:de1dfa2ab813 89 " <controlURL>/upnp/control/firmwareupdate1</controlURL>\n"
WiredHome 0:de1dfa2ab813 90 " <eventSubURL>/upnp/event/firmwareupdate1</eventSubURL>\n"
WiredHome 0:de1dfa2ab813 91 " <SCPDURL>/firmwareupdate.xml</SCPDURL>\n"
WiredHome 0:de1dfa2ab813 92 " </service>\n"
WiredHome 0:de1dfa2ab813 93 " <service>\n"
WiredHome 0:de1dfa2ab813 94 " <serviceType>urn:Belkin:service:rules:1</serviceType>\n"
WiredHome 0:de1dfa2ab813 95 " <serviceId>urn:Belkin:serviceId:rules1</serviceId>\n"
WiredHome 0:de1dfa2ab813 96 " <controlURL>/upnp/control/rules1</controlURL>\n"
WiredHome 0:de1dfa2ab813 97 " <eventSubURL>/upnp/event/rules1</eventSubURL>\n"
WiredHome 0:de1dfa2ab813 98 " <SCPDURL>/rulesservice.xml</SCPDURL>\n"
WiredHome 0:de1dfa2ab813 99 " </service>\n"
WiredHome 0:de1dfa2ab813 100 " <service>\n"
WiredHome 0:de1dfa2ab813 101 " <serviceType>urn:Belkin:service:metainfo:1</serviceType>\n"
WiredHome 0:de1dfa2ab813 102 " <serviceId>urn:Belkin:serviceId:metainfo1</serviceId>\n"
WiredHome 0:de1dfa2ab813 103 " <controlURL>/upnp/control/metainfo1</controlURL>\n"
WiredHome 0:de1dfa2ab813 104 " <eventSubURL>/upnp/event/metainfo1</eventSubURL>\n"
WiredHome 0:de1dfa2ab813 105 " <SCPDURL>/metainfoservice.xml</SCPDURL>\n"
WiredHome 0:de1dfa2ab813 106 " </service>\n"
WiredHome 0:de1dfa2ab813 107 " <service>\n"
WiredHome 0:de1dfa2ab813 108 " <serviceType>urn:Belkin:service:remoteaccess:1</serviceType>\n"
WiredHome 0:de1dfa2ab813 109 " <serviceId>urn:Belkin:serviceId:remoteaccess1</serviceId>\n"
WiredHome 0:de1dfa2ab813 110 " <controlURL>/upnp/control/remoteaccess1</controlURL>\n"
WiredHome 0:de1dfa2ab813 111 " <eventSubURL>/upnp/event/remoteaccess1</eventSubURL>\n"
WiredHome 0:de1dfa2ab813 112 " <SCPDURL>/remoteaccess.xml</SCPDURL>\n"
WiredHome 0:de1dfa2ab813 113 " </service>\n"
WiredHome 0:de1dfa2ab813 114 " <service>\n"
WiredHome 0:de1dfa2ab813 115 " <serviceType>urn:Belkin:service:deviceinfo:1</serviceType>\n"
WiredHome 0:de1dfa2ab813 116 " <serviceId>urn:Belkin:serviceId:deviceinfo1</serviceId>\n"
WiredHome 0:de1dfa2ab813 117 " <controlURL>/upnp/control/deviceinfo1</controlURL>\n"
WiredHome 0:de1dfa2ab813 118 " <eventSubURL>/upnp/event/deviceinfo1</eventSubURL>\n"
WiredHome 0:de1dfa2ab813 119 " <SCPDURL>/deviceinfoservice.xml</SCPDURL>\n"
WiredHome 0:de1dfa2ab813 120 " </service>\n"
WiredHome 0:de1dfa2ab813 121 " <service>\n"
WiredHome 0:de1dfa2ab813 122 " <serviceType>urn:Belkin:service:smartsetup:1</serviceType>\n"
WiredHome 0:de1dfa2ab813 123 " <serviceId>urn:Belkin:serviceId:smartsetup1</serviceId>\n"
WiredHome 0:de1dfa2ab813 124 " <controlURL>/upnp/control/smartsetup1</controlURL>\n"
WiredHome 0:de1dfa2ab813 125 " <eventSubURL>/upnp/event/smartsetup1</eventSubURL>\n"
WiredHome 0:de1dfa2ab813 126 " <SCPDURL>/smartsetup.xml</SCPDURL>\n"
WiredHome 0:de1dfa2ab813 127 " </service>\n"
WiredHome 0:de1dfa2ab813 128 " <service>\n"
WiredHome 0:de1dfa2ab813 129 " <serviceType>urn:Belkin:service:manufacture:1</serviceType>\n"
WiredHome 0:de1dfa2ab813 130 " <serviceId>urn:Belkin:serviceId:manufacture1</serviceId>\n"
WiredHome 0:de1dfa2ab813 131 " <controlURL>/upnp/control/manufacture1</controlURL>\n"
WiredHome 0:de1dfa2ab813 132 " <eventSubURL>/upnp/event/manufacture1</eventSubURL>\n"
WiredHome 0:de1dfa2ab813 133 " <SCPDURL>/manufacture.xml</SCPDURL>\n"
WiredHome 0:de1dfa2ab813 134 " </service>\n"
WiredHome 0:de1dfa2ab813 135 " </serviceList>\n"
WiredHome 0:de1dfa2ab813 136 #endif
WiredHome 0:de1dfa2ab813 137 " </device>\n"
WiredHome 0:de1dfa2ab813 138 "</root>\n";
WiredHome 0:de1dfa2ab813 139
WiredHome 0:de1dfa2ab813 140
WiredHome 0:de1dfa2ab813 141 HTTPServer::CallBackResults Setup_xml(HTTPServer *svr, HTTPServer::CallBackType type, char * path,
WiredHome 0:de1dfa2ab813 142 const HTTPServer::namevalue *queryParams, int queryParamCount)
WiredHome 0:de1dfa2ab813 143 {
WiredHome 2:ca5d12560ff7 144 char BigBuffer[sizeof(SETUP_TEMPLATE) + 150];
WiredHome 0:de1dfa2ab813 145 HTTPServer::CallBackResults ret = HTTPServer::ACCEPT_ERROR;
WiredHome 8:a45fe77efcc5 146 linkdata = true;
WiredHome 0:de1dfa2ab813 147 switch (type) {
WiredHome 0:de1dfa2ab813 148 case HTTPServer::SEND_PAGE:
WiredHome 0:de1dfa2ab813 149 svr->header(HTTPServer::OK, "OK", hdrTypeHTML_NoCache);
WiredHome 0:de1dfa2ab813 150 sprintf(BigBuffer, SETUP_TEMPLATE,
WiredHome 0:de1dfa2ab813 151 My_Name, eth.getMACAddress(), My_SerialNum,
WiredHome 0:de1dfa2ab813 152 eth.getIPAddress(), Server_Port);
WiredHome 0:de1dfa2ab813 153 svr->send(BigBuffer);
WiredHome 0:de1dfa2ab813 154 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 0:de1dfa2ab813 155 break;
WiredHome 0:de1dfa2ab813 156 case HTTPServer::CONTENT_LENGTH_REQUEST:
WiredHome 0:de1dfa2ab813 157 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 0:de1dfa2ab813 158 break;
WiredHome 0:de1dfa2ab813 159 case HTTPServer::DATA_TRANSFER:
WiredHome 0:de1dfa2ab813 160 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 0:de1dfa2ab813 161 break;
WiredHome 0:de1dfa2ab813 162 default:
WiredHome 0:de1dfa2ab813 163 ret = HTTPServer::ACCEPT_ERROR;
WiredHome 0:de1dfa2ab813 164 break;
WiredHome 0:de1dfa2ab813 165 }
WiredHome 8:a45fe77efcc5 166 linkdata = false;
WiredHome 0:de1dfa2ab813 167 return ret;
WiredHome 0:de1dfa2ab813 168 }
WiredHome 0:de1dfa2ab813 169
WiredHome 0:de1dfa2ab813 170
WiredHome 0:de1dfa2ab813 171
WiredHome 0:de1dfa2ab813 172 HTTPServer::CallBackResults RootPage(HTTPServer *svr, HTTPServer::CallBackType type, char * path,
WiredHome 0:de1dfa2ab813 173 const HTTPServer::namevalue *queryParams, int queryParamCount)
WiredHome 0:de1dfa2ab813 174 {
WiredHome 8:a45fe77efcc5 175 char smallBuf[100];
WiredHome 8:a45fe77efcc5 176 char bigBuf[3000] = ""; // sized by test and adjust, and then round up generously.
WiredHome 7:16129d213e6a 177 int count;
WiredHome 0:de1dfa2ab813 178 HTTPServer::CallBackResults ret = HTTPServer::ACCEPT_ERROR;
WiredHome 0:de1dfa2ab813 179
WiredHome 8:a45fe77efcc5 180 linkdata = true;
WiredHome 0:de1dfa2ab813 181 switch (type) {
WiredHome 0:de1dfa2ab813 182 case HTTPServer::SEND_PAGE:
WiredHome 7:16129d213e6a 183 if (0 == strcmp(svr->GetParameter("SWUpdate"),"CheckNow")) {
WiredHome 7:16129d213e6a 184 swUpdateCheck = true;
WiredHome 7:16129d213e6a 185 svr->header(HTTPServer::Found, "Found", "Location: /\r\n");
WiredHome 7:16129d213e6a 186 svr->send("\r\n");
WiredHome 7:16129d213e6a 187 break;
WiredHome 7:16129d213e6a 188 }
WiredHome 7:16129d213e6a 189 count = svr->GetParameterCount();
WiredHome 7:16129d213e6a 190 printf("Data Transfer: %d parameters\r\n", count);
WiredHome 7:16129d213e6a 191 if (count) {
WiredHome 8:a45fe77efcc5 192 //for (int i=0; i<count; i++) {
WiredHome 8:a45fe77efcc5 193 // const HTTPServer::namevalue * nv = svr->GetParameter(i);
WiredHome 8:a45fe77efcc5 194 // printf(" %d: %s => %s\r\n", i, nv->name, nv->value);
WiredHome 8:a45fe77efcc5 195 //}
WiredHome 7:16129d213e6a 196 const char * p = svr->GetParameter("House");
WiredHome 7:16129d213e6a 197 if (p && strlen(p) == 1) {
WiredHome 7:16129d213e6a 198 char cmdBuf[7]; // "HUU +6"
WiredHome 7:16129d213e6a 199 strcpy_s(cmdBuf, sizeof(cmdBuf), p);
WiredHome 7:16129d213e6a 200 p = svr->GetParameter("Unit");
WiredHome 7:16129d213e6a 201 if (p && strlen(p) >= 1 && strlen(p) <= 2) {
WiredHome 7:16129d213e6a 202 strcat_s(cmdBuf, sizeof(cmdBuf), p);
WiredHome 7:16129d213e6a 203 p = svr->GetParameter("Cmd");
WiredHome 7:16129d213e6a 204 if (p && strlen(p) >= 1 && strlen(p) <= 2) {
WiredHome 7:16129d213e6a 205 strcat_s(cmdBuf, sizeof(cmdBuf), " ");
WiredHome 7:16129d213e6a 206 strcat_s(cmdBuf, sizeof(cmdBuf), p);
WiredHome 7:16129d213e6a 207 printf("Web Command: '%s'\r\n", cmdBuf);
WiredHome 7:16129d213e6a 208 cm17a.ParseCommand(cmdBuf);
WiredHome 7:16129d213e6a 209 svr->header(HTTPServer::Found, "Found", "Location: /\r\n");
WiredHome 7:16129d213e6a 210 svr->send("\r\n");
WiredHome 7:16129d213e6a 211 break;
WiredHome 7:16129d213e6a 212 }
WiredHome 7:16129d213e6a 213 }
WiredHome 7:16129d213e6a 214 }
WiredHome 7:16129d213e6a 215 }
WiredHome 7:16129d213e6a 216
WiredHome 7:16129d213e6a 217 svr->header(HTTPServer::OK, "OK", "Content-Type: text/html\r\n");
WiredHome 8:a45fe77efcc5 218 strcat_s(bigBuf, sizeof(bigBuf), "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n<title>X10 Server Info</title>\r\n");
WiredHome 8:a45fe77efcc5 219 strcat_s(bigBuf, sizeof(bigBuf), "<style>\n");
WiredHome 8:a45fe77efcc5 220 strcat_s(bigBuf, sizeof(bigBuf), "body {\n");
WiredHome 8:a45fe77efcc5 221 strcat_s(bigBuf, sizeof(bigBuf), " transform: scale(1.6);\n");
WiredHome 8:a45fe77efcc5 222 strcat_s(bigBuf, sizeof(bigBuf), " transform-origin: 0 0;\n");
WiredHome 8:a45fe77efcc5 223 strcat_s(bigBuf, sizeof(bigBuf), "}\n");
WiredHome 8:a45fe77efcc5 224 strcat_s(bigBuf, sizeof(bigBuf), "</style>\n");
WiredHome 8:a45fe77efcc5 225 strcat_s(bigBuf, sizeof(bigBuf), "</head>\r\n");
WiredHome 8:a45fe77efcc5 226 strcat_s(bigBuf, sizeof(bigBuf), "<body>\r\n");
WiredHome 8:a45fe77efcc5 227 strcat_s(bigBuf, sizeof(bigBuf), "<h1>X10 Server Info</h1>\r\n");
WiredHome 8:a45fe77efcc5 228 strcat_s(bigBuf, sizeof(bigBuf), "<blockquote>\r\n");
WiredHome 8:a45fe77efcc5 229 strcat_s(bigBuf, sizeof(bigBuf), "<table border='1'>\r\n");
WiredHome 8:a45fe77efcc5 230 strcat_s(bigBuf, sizeof(bigBuf), "<tr><th><h2>Command</h2></th></tr>\r\n");
WiredHome 8:a45fe77efcc5 231 strcat_s(bigBuf, sizeof(bigBuf), "<tr><td>\r\n");
WiredHome 8:a45fe77efcc5 232 strcat_s(bigBuf, sizeof(bigBuf), "<form method='get'>\r\n");
WiredHome 8:a45fe77efcc5 233 strcat_s(bigBuf, sizeof(bigBuf), "<table border='0'><tr><th>House</th><th>Unit</th><th>Cmd</th><th>&nbsp;</th></tr>\r\n");
WiredHome 8:a45fe77efcc5 234 // House code
WiredHome 8:a45fe77efcc5 235 strcat_s(bigBuf, sizeof(bigBuf), "<tr><td align='center'><select name='House'>\r\n");
WiredHome 7:16129d213e6a 236 for (int i = 'A'; i <= 'P'; i++) {
WiredHome 8:a45fe77efcc5 237 snprintf(smallBuf, 100, "<option value='%c'>%c</option>\r\n", i, i);
WiredHome 8:a45fe77efcc5 238 strcat_s(bigBuf, sizeof(bigBuf), smallBuf);
WiredHome 7:16129d213e6a 239 }
WiredHome 8:a45fe77efcc5 240 strcat_s(bigBuf, sizeof(bigBuf), "</select></td>\r\n");
WiredHome 8:a45fe77efcc5 241 strcat_s(bigBuf, sizeof(bigBuf), "<td><select name='Unit'>\r\n");
WiredHome 7:16129d213e6a 242 for (int i = 1; i <= 16; i++) {
WiredHome 8:a45fe77efcc5 243 snprintf(smallBuf, 100, "<option value='%d'>%d</option>\r\n", i, i);
WiredHome 8:a45fe77efcc5 244 strcat_s(bigBuf, sizeof(bigBuf), smallBuf);
WiredHome 7:16129d213e6a 245 }
WiredHome 8:a45fe77efcc5 246 strcat_s(bigBuf, sizeof(bigBuf), "</select></td>\r\n");
WiredHome 8:a45fe77efcc5 247 // Unit code
WiredHome 8:a45fe77efcc5 248 strcat_s(bigBuf, sizeof(bigBuf), "<td><select name='Cmd'>\r\n");
WiredHome 7:16129d213e6a 249 for (int i = -6; i <= 7; i++) {
WiredHome 7:16129d213e6a 250 if (i < 0)
WiredHome 8:a45fe77efcc5 251 snprintf(smallBuf, 100, "<option value='%+d'>%+d</option>\r\n", i, i);
WiredHome 7:16129d213e6a 252 else if (i == 0)
WiredHome 8:a45fe77efcc5 253 snprintf(smallBuf, 100, "<option value='%d' selected>%d</option>\r\n", i, i);
WiredHome 7:16129d213e6a 254 else if (i == 1)
WiredHome 8:a45fe77efcc5 255 snprintf(smallBuf, 100, "<option value='%d'>%d</option>\r\n", i, i);
WiredHome 7:16129d213e6a 256 else // if (i > 1)
WiredHome 8:a45fe77efcc5 257 snprintf(smallBuf, 100, "<option value='%+d'>%+d</option>\r\n", i-1, i-1);
WiredHome 8:a45fe77efcc5 258 strcat_s(bigBuf, sizeof(bigBuf), smallBuf);
WiredHome 7:16129d213e6a 259 }
WiredHome 8:a45fe77efcc5 260 strcat_s(bigBuf, sizeof(bigBuf), "</select></td>\r\n");
WiredHome 7:16129d213e6a 261
WiredHome 8:a45fe77efcc5 262 strcat_s(bigBuf, sizeof(bigBuf), "<td><input type='Submit' value='Send'></td>\r\n");
WiredHome 8:a45fe77efcc5 263 strcat_s(bigBuf, sizeof(bigBuf), "</tr></table>\r\n");
WiredHome 8:a45fe77efcc5 264 strcat_s(bigBuf, sizeof(bigBuf), "</form>\r\n");
WiredHome 8:a45fe77efcc5 265 strcat_s(bigBuf, sizeof(bigBuf), "</td></tr></table>\r\n");
WiredHome 8:a45fe77efcc5 266 strcat_s(bigBuf, sizeof(bigBuf), "<br/><br/><a href='/info'>info Page</a> | <a href='/setup.xml'>setup.xml</a>\r\n");
WiredHome 8:a45fe77efcc5 267 strcat_s(bigBuf, sizeof(bigBuf), "</blockquote>\r\n");
WiredHome 8:a45fe77efcc5 268 strcat_s(bigBuf, sizeof(bigBuf), "X10 Server, Copyright &copy; 2019 by Smartware Computing, all rights reserved.");
WiredHome 8:a45fe77efcc5 269 strcat_s(bigBuf, sizeof(bigBuf), "</body></html>");
WiredHome 8:a45fe77efcc5 270 printf("bigBuf size is %d bytes\r\n", strlen(bigBuf));
WiredHome 8:a45fe77efcc5 271 svr->send(bigBuf);
WiredHome 0:de1dfa2ab813 272 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 0:de1dfa2ab813 273 break;
WiredHome 0:de1dfa2ab813 274 case HTTPServer::CONTENT_LENGTH_REQUEST:
WiredHome 0:de1dfa2ab813 275 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 0:de1dfa2ab813 276 break;
WiredHome 0:de1dfa2ab813 277 case HTTPServer::DATA_TRANSFER:
WiredHome 0:de1dfa2ab813 278 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 0:de1dfa2ab813 279 break;
WiredHome 0:de1dfa2ab813 280 default:
WiredHome 0:de1dfa2ab813 281 ret = HTTPServer::ACCEPT_ERROR;
WiredHome 0:de1dfa2ab813 282 break;
WiredHome 0:de1dfa2ab813 283 }
WiredHome 8:a45fe77efcc5 284 linkdata = false;
WiredHome 0:de1dfa2ab813 285 return ret;
WiredHome 0:de1dfa2ab813 286 }
WiredHome 7:16129d213e6a 287
WiredHome 7:16129d213e6a 288
WiredHome 7:16129d213e6a 289 HTTPServer::CallBackResults InfoPage(HTTPServer *svr, HTTPServer::CallBackType type, char * path,
WiredHome 7:16129d213e6a 290 const HTTPServer::namevalue *queryParams, int queryParamCount)
WiredHome 7:16129d213e6a 291 {
WiredHome 7:16129d213e6a 292 char lineBuf[60];
WiredHome 8:a45fe77efcc5 293 char bigBuf[1000] = ""; // sized by test and adjust, and then round up generously.
WiredHome 7:16129d213e6a 294 HTTPServer::CallBackResults ret = HTTPServer::ACCEPT_ERROR;
WiredHome 7:16129d213e6a 295 FILE * fh;
WiredHome 7:16129d213e6a 296
WiredHome 8:a45fe77efcc5 297 linkdata = true;
WiredHome 7:16129d213e6a 298 switch (type) {
WiredHome 7:16129d213e6a 299 case HTTPServer::SEND_PAGE:
WiredHome 7:16129d213e6a 300 svr->header(HTTPServer::OK, "OK", "Content-Type: text/html\r\n");
WiredHome 8:a45fe77efcc5 301 strcat_s(bigBuf, sizeof(bigBuf), "<!DOCTYPE html>\r\n<html><head><title>X10 Server Info</title></head>\r\n");
WiredHome 8:a45fe77efcc5 302 strcat_s(bigBuf, sizeof(bigBuf), "<body>\r\n");
WiredHome 8:a45fe77efcc5 303 strcat_s(bigBuf, sizeof(bigBuf), "<h1>X10 Server Info</h1>\r\n");
WiredHome 8:a45fe77efcc5 304 strcat_s(bigBuf, sizeof(bigBuf), "<table border='1' width='100%'>\r\n");
WiredHome 8:a45fe77efcc5 305 strcat_s(bigBuf, sizeof(bigBuf), "<tr><th>Configuration</th><th>Software</th></tr>\r\n");
WiredHome 8:a45fe77efcc5 306 strcat_s(bigBuf, sizeof(bigBuf), "<tr><td valign='top' width='50%'><pre>\r\n");
WiredHome 7:16129d213e6a 307 fh = fopen("/local/X10svr.ini", "rt");
WiredHome 7:16129d213e6a 308 if (fh) {
WiredHome 7:16129d213e6a 309 char fileBuf[60];
WiredHome 7:16129d213e6a 310 while(fgets(fileBuf, sizeof(fileBuf), fh)) {
WiredHome 8:a45fe77efcc5 311 strcat_s(bigBuf, sizeof(bigBuf), fileBuf);
WiredHome 7:16129d213e6a 312 }
WiredHome 7:16129d213e6a 313 fclose(fh);
WiredHome 7:16129d213e6a 314 }
WiredHome 8:a45fe77efcc5 315 strcat_s(bigBuf, sizeof(bigBuf), "</pre>\r\n");
WiredHome 8:a45fe77efcc5 316 strcat_s(bigBuf, sizeof(bigBuf), "</td>\r\n");
WiredHome 8:a45fe77efcc5 317 strcat_s(bigBuf, sizeof(bigBuf), "<td valign='top' width='50%'><pre>\r\n");
WiredHome 7:16129d213e6a 318 if (INI::INI_SUCCESS == ini.ReadString("SWUpdate", "name", lineBuf, sizeof(lineBuf))) {
WiredHome 8:a45fe77efcc5 319 strcat_s(bigBuf, sizeof(bigBuf), "name=");
WiredHome 8:a45fe77efcc5 320 strcat_s(bigBuf, sizeof(bigBuf), lineBuf);
WiredHome 8:a45fe77efcc5 321 strcat_s(bigBuf, sizeof(bigBuf), "\r\nversion=");
WiredHome 7:16129d213e6a 322 lineBuf[6] = '\0';
WiredHome 7:16129d213e6a 323 char fname[45];
WiredHome 7:16129d213e6a 324 snprintf(fname, sizeof(fname), "/local/%s.ver", lineBuf);
WiredHome 7:16129d213e6a 325 fh = fopen(fname, "rt");
WiredHome 7:16129d213e6a 326 if (fh) {
WiredHome 7:16129d213e6a 327 while(fgets(lineBuf, sizeof(lineBuf), fh)) {
WiredHome 8:a45fe77efcc5 328 strcat_s(bigBuf, sizeof(bigBuf), lineBuf);
WiredHome 7:16129d213e6a 329 }
WiredHome 7:16129d213e6a 330 fclose(fh);
WiredHome 7:16129d213e6a 331 }
WiredHome 7:16129d213e6a 332 }
WiredHome 8:a45fe77efcc5 333 strcat_s(bigBuf, sizeof(bigBuf), "</pre>\r\n");
WiredHome 8:a45fe77efcc5 334 strcat_s(bigBuf, sizeof(bigBuf), "<img src='/icon.png'>");
WiredHome 8:a45fe77efcc5 335 strcat_s(bigBuf, sizeof(bigBuf), "</td></tr>\r\n");
WiredHome 8:a45fe77efcc5 336 strcat_s(bigBuf, sizeof(bigBuf), "<tr>\r\n");
WiredHome 8:a45fe77efcc5 337 strcat_s(bigBuf, sizeof(bigBuf), "<td><a href='/'>Home Page</a> | <a href='/reboot'>Reboot</a></td>\r\n");
WiredHome 8:a45fe77efcc5 338 strcat_s(bigBuf, sizeof(bigBuf), "<td><a href='/software'>Software Update Check</a> | ");
WiredHome 8:a45fe77efcc5 339 strcat_s(bigBuf, sizeof(bigBuf), "<a href='/setup.xml' target='_xml'>view setup.xml</a>\r\n");
WiredHome 8:a45fe77efcc5 340 strcat_s(bigBuf, sizeof(bigBuf), "</td></tr></table>\r\n");
WiredHome 8:a45fe77efcc5 341 strcat_s(bigBuf, sizeof(bigBuf), "</body></html>");
WiredHome 8:a45fe77efcc5 342 printf("bigBuf size is %d bytes\r\n", strlen(bigBuf));
WiredHome 8:a45fe77efcc5 343 svr->send(bigBuf);
WiredHome 7:16129d213e6a 344 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 7:16129d213e6a 345 break;
WiredHome 7:16129d213e6a 346 case HTTPServer::CONTENT_LENGTH_REQUEST:
WiredHome 7:16129d213e6a 347 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 7:16129d213e6a 348 break;
WiredHome 7:16129d213e6a 349 case HTTPServer::DATA_TRANSFER:
WiredHome 7:16129d213e6a 350 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 7:16129d213e6a 351 break;
WiredHome 7:16129d213e6a 352 default:
WiredHome 7:16129d213e6a 353 ret = HTTPServer::ACCEPT_ERROR;
WiredHome 7:16129d213e6a 354 break;
WiredHome 7:16129d213e6a 355 }
WiredHome 8:a45fe77efcc5 356 linkdata = false;
WiredHome 7:16129d213e6a 357 return ret;
WiredHome 7:16129d213e6a 358 }
WiredHome 7:16129d213e6a 359
WiredHome 7:16129d213e6a 360
WiredHome 7:16129d213e6a 361 HTTPServer::CallBackResults SoftwarePage(HTTPServer *svr, HTTPServer::CallBackType type, char * path,
WiredHome 7:16129d213e6a 362 const HTTPServer::namevalue *queryParams, int queryParamCount)
WiredHome 7:16129d213e6a 363 {
WiredHome 7:16129d213e6a 364 HTTPServer::CallBackResults ret = HTTPServer::ACCEPT_ERROR;
WiredHome 7:16129d213e6a 365
WiredHome 8:a45fe77efcc5 366 linkdata = true;
WiredHome 7:16129d213e6a 367 switch (type) {
WiredHome 7:16129d213e6a 368 case HTTPServer::SEND_PAGE:
WiredHome 7:16129d213e6a 369 swUpdateCheck = true;
WiredHome 7:16129d213e6a 370 printf("SW Update Check scheduled.\r\n");
WiredHome 7:16129d213e6a 371 svr->header(HTTPServer::Found, "Found", "Location: /\r\n");
WiredHome 7:16129d213e6a 372 svr->send("\r\n");
WiredHome 7:16129d213e6a 373 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 7:16129d213e6a 374 break;
WiredHome 7:16129d213e6a 375 case HTTPServer::CONTENT_LENGTH_REQUEST:
WiredHome 7:16129d213e6a 376 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 7:16129d213e6a 377 break;
WiredHome 7:16129d213e6a 378 case HTTPServer::DATA_TRANSFER:
WiredHome 7:16129d213e6a 379 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 7:16129d213e6a 380 break;
WiredHome 7:16129d213e6a 381 default:
WiredHome 7:16129d213e6a 382 ret = HTTPServer::ACCEPT_ERROR;
WiredHome 7:16129d213e6a 383 break;
WiredHome 7:16129d213e6a 384 }
WiredHome 8:a45fe77efcc5 385 linkdata = false;
WiredHome 7:16129d213e6a 386 return ret;
WiredHome 7:16129d213e6a 387 }
WiredHome 8:a45fe77efcc5 388
WiredHome 8:a45fe77efcc5 389
WiredHome 8:a45fe77efcc5 390 HTTPServer::CallBackResults RebootPage(HTTPServer *svr, HTTPServer::CallBackType type, char * path,
WiredHome 8:a45fe77efcc5 391 const HTTPServer::namevalue *queryParams, int queryParamCount)
WiredHome 8:a45fe77efcc5 392 {
WiredHome 8:a45fe77efcc5 393 HTTPServer::CallBackResults ret = HTTPServer::ACCEPT_ERROR;
WiredHome 8:a45fe77efcc5 394
WiredHome 8:a45fe77efcc5 395 linkdata = true;
WiredHome 8:a45fe77efcc5 396 switch (type) {
WiredHome 8:a45fe77efcc5 397 case HTTPServer::SEND_PAGE:
WiredHome 8:a45fe77efcc5 398 swUpdateCheck = true;
WiredHome 8:a45fe77efcc5 399 printf("Reboot scheduled.\r\n");
WiredHome 8:a45fe77efcc5 400 svr->header(HTTPServer::Found, "Found", "Location: /\r\n");
WiredHome 8:a45fe77efcc5 401 svr->send("\r\n");
WiredHome 8:a45fe77efcc5 402 Thread::wait(500);
WiredHome 8:a45fe77efcc5 403 mbed_reset();
WiredHome 8:a45fe77efcc5 404 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 8:a45fe77efcc5 405 break;
WiredHome 8:a45fe77efcc5 406 case HTTPServer::CONTENT_LENGTH_REQUEST:
WiredHome 8:a45fe77efcc5 407 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 8:a45fe77efcc5 408 break;
WiredHome 8:a45fe77efcc5 409 case HTTPServer::DATA_TRANSFER:
WiredHome 8:a45fe77efcc5 410 ret = HTTPServer::ACCEPT_COMPLETE;
WiredHome 8:a45fe77efcc5 411 break;
WiredHome 8:a45fe77efcc5 412 default:
WiredHome 8:a45fe77efcc5 413 ret = HTTPServer::ACCEPT_ERROR;
WiredHome 8:a45fe77efcc5 414 break;
WiredHome 8:a45fe77efcc5 415 }
WiredHome 8:a45fe77efcc5 416 linkdata = false;
WiredHome 8:a45fe77efcc5 417 return ret;
WiredHome 8:a45fe77efcc5 418 }