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