Andrew Boyson
/
iot
Backing up an unused program in case of future need
server.cpp@8:45a0205a298f, 2018-12-06 (annotated)
- Committer:
- andrewboyson
- Date:
- Thu Dec 06 11:40:19 2018 +0000
- Revision:
- 8:45a0205a298f
- Parent:
- 7:024ace6d943c
Backing up
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 5:6226f3c566ef | 1 | #include "esp.h" |
andrewboyson | 5:6226f3c566ef | 2 | #include "at.h" |
andrewboyson | 5:6226f3c566ef | 3 | #include "io.h" |
andrewboyson | 5:6226f3c566ef | 4 | #include "log.h" |
andrewboyson | 5:6226f3c566ef | 5 | #include "time.h" |
andrewboyson | 5:6226f3c566ef | 6 | #include "wifi.h" |
andrewboyson | 5:6226f3c566ef | 7 | #include "ds18b20.h" |
andrewboyson | 6:be97d38e0b01 | 8 | #include "cfg.h" |
andrewboyson | 6:be97d38e0b01 | 9 | #define RECV_BUFFER_SIZE 128 |
andrewboyson | 6:be97d38e0b01 | 10 | #define SEND_BUFFER_SIZE 256 |
andrewboyson | 0:09f915e6f9f6 | 11 | #define SERVER_PORT 80 |
andrewboyson | 0:09f915e6f9f6 | 12 | |
andrewboyson | 1:94282484baae | 13 | static char recvbuffer[RECV_BUFFER_SIZE]; |
andrewboyson | 1:94282484baae | 14 | static char sendbuffer[SEND_BUFFER_SIZE]; |
andrewboyson | 1:94282484baae | 15 | |
andrewboyson | 1:94282484baae | 16 | #define WHAT_NOT_FOUND 0 |
andrewboyson | 1:94282484baae | 17 | #define WHAT_BAD_REQUEST 1 |
andrewboyson | 1:94282484baae | 18 | #define WHAT_BAD_METHOD 2 |
andrewboyson | 1:94282484baae | 19 | #define WHAT_LED 3 |
andrewboyson | 1:94282484baae | 20 | #define WHAT_LOG 4 |
andrewboyson | 1:94282484baae | 21 | static int whatToSendToId[4]; |
andrewboyson | 1:94282484baae | 22 | static int lineToSendToId[4]; //0 == do nothing; -1 == close |
andrewboyson | 0:09f915e6f9f6 | 23 | |
andrewboyson | 2:06fa34661f19 | 24 | int ServerInit(void) //Make sure this is only called after any other ids are reserved. |
andrewboyson | 0:09f915e6f9f6 | 25 | { |
andrewboyson | 0:09f915e6f9f6 | 26 | for (int id = 0; id < 4; id++) |
andrewboyson | 0:09f915e6f9f6 | 27 | { |
andrewboyson | 0:09f915e6f9f6 | 28 | if (!EspIpdReserved[id]) |
andrewboyson | 0:09f915e6f9f6 | 29 | { |
andrewboyson | 0:09f915e6f9f6 | 30 | EspIpdBuffer[id] = recvbuffer; |
andrewboyson | 1:94282484baae | 31 | EspIpdBufferLen[id] = RECV_BUFFER_SIZE; |
andrewboyson | 1:94282484baae | 32 | } |
andrewboyson | 1:94282484baae | 33 | whatToSendToId[id] = 0; |
andrewboyson | 1:94282484baae | 34 | lineToSendToId[id] = 0; |
andrewboyson | 1:94282484baae | 35 | } |
andrewboyson | 2:06fa34661f19 | 36 | return 0; |
andrewboyson | 1:94282484baae | 37 | } |
andrewboyson | 5:6226f3c566ef | 38 | static int addChunkF(int prevlen, char *fmt, ...) |
andrewboyson | 5:6226f3c566ef | 39 | { |
andrewboyson | 5:6226f3c566ef | 40 | //Set up variable arguments |
andrewboyson | 5:6226f3c566ef | 41 | va_list argptr; |
andrewboyson | 5:6226f3c566ef | 42 | va_start(argptr, fmt); |
andrewboyson | 5:6226f3c566ef | 43 | |
andrewboyson | 5:6226f3c566ef | 44 | //Fill the buffer |
andrewboyson | 5:6226f3c566ef | 45 | int room = SEND_BUFFER_SIZE - prevlen; |
andrewboyson | 5:6226f3c566ef | 46 | int sent = vsnprintf(sendbuffer + prevlen, room, fmt, argptr); |
andrewboyson | 5:6226f3c566ef | 47 | if (sent > room) sent = room; |
andrewboyson | 5:6226f3c566ef | 48 | if (sent < 0) sent = 0; |
andrewboyson | 5:6226f3c566ef | 49 | |
andrewboyson | 5:6226f3c566ef | 50 | //Finish with variable arguments |
andrewboyson | 5:6226f3c566ef | 51 | va_end(argptr); |
andrewboyson | 5:6226f3c566ef | 52 | |
andrewboyson | 5:6226f3c566ef | 53 | //Return length |
andrewboyson | 5:6226f3c566ef | 54 | int len = prevlen + sent; |
andrewboyson | 5:6226f3c566ef | 55 | return len < SEND_BUFFER_SIZE ? len : SEND_BUFFER_SIZE; |
andrewboyson | 5:6226f3c566ef | 56 | |
andrewboyson | 5:6226f3c566ef | 57 | } |
andrewboyson | 1:94282484baae | 58 | |
andrewboyson | 1:94282484baae | 59 | static int addChunk(int prevlen, char *text) |
andrewboyson | 1:94282484baae | 60 | { |
andrewboyson | 1:94282484baae | 61 | strncpy(sendbuffer + prevlen, text, SEND_BUFFER_SIZE - prevlen); |
andrewboyson | 1:94282484baae | 62 | int len = prevlen + strlen(text); |
andrewboyson | 1:94282484baae | 63 | return len < SEND_BUFFER_SIZE ? len : SEND_BUFFER_SIZE; |
andrewboyson | 1:94282484baae | 64 | } |
andrewboyson | 1:94282484baae | 65 | static int fillChunk(char * text) |
andrewboyson | 1:94282484baae | 66 | { |
andrewboyson | 1:94282484baae | 67 | strncpy(sendbuffer, text, SEND_BUFFER_SIZE); |
andrewboyson | 1:94282484baae | 68 | int len = strlen(text); |
andrewboyson | 1:94282484baae | 69 | return len < SEND_BUFFER_SIZE ? len : SEND_BUFFER_SIZE; |
andrewboyson | 1:94282484baae | 70 | } |
andrewboyson | 1:94282484baae | 71 | static int fillNotFound(int id) |
andrewboyson | 1:94282484baae | 72 | { |
andrewboyson | 1:94282484baae | 73 | int len = fillChunk("HTTP/1.0 404 Not Found\r\n\r\n"); |
andrewboyson | 1:94282484baae | 74 | lineToSendToId[id] = -1; |
andrewboyson | 1:94282484baae | 75 | return len; |
andrewboyson | 1:94282484baae | 76 | } |
andrewboyson | 1:94282484baae | 77 | static int fillBadRequest(int id) |
andrewboyson | 1:94282484baae | 78 | { |
andrewboyson | 1:94282484baae | 79 | int len = fillChunk("HTTP/1.0 400 Bad Request\r\n\r\n"); |
andrewboyson | 1:94282484baae | 80 | lineToSendToId[id] = -1; |
andrewboyson | 1:94282484baae | 81 | return len; |
andrewboyson | 1:94282484baae | 82 | } |
andrewboyson | 1:94282484baae | 83 | static int fillBadMethod(int id) |
andrewboyson | 1:94282484baae | 84 | { |
andrewboyson | 1:94282484baae | 85 | int len = fillChunk("HTTP/1.0 405 Method Not Allowed\r\nAllow: GET\r\n\r\n"); |
andrewboyson | 1:94282484baae | 86 | lineToSendToId[id] = -1; |
andrewboyson | 1:94282484baae | 87 | return len; |
andrewboyson | 1:94282484baae | 88 | } |
andrewboyson | 1:94282484baae | 89 | static int fillLogChunk() //Returns length. If length is less than the buffer size then that was the last chunk to send: that could mean a length of zero. |
andrewboyson | 1:94282484baae | 90 | { |
andrewboyson | 1:94282484baae | 91 | static int enumerationStarted = false; |
andrewboyson | 1:94282484baae | 92 | if (!enumerationStarted) |
andrewboyson | 1:94282484baae | 93 | { |
andrewboyson | 1:94282484baae | 94 | LogEnumerateStart(); |
andrewboyson | 1:94282484baae | 95 | enumerationStarted = true; |
andrewboyson | 1:94282484baae | 96 | } |
andrewboyson | 1:94282484baae | 97 | char* p = sendbuffer; |
andrewboyson | 1:94282484baae | 98 | while (p < sendbuffer + SEND_BUFFER_SIZE) |
andrewboyson | 1:94282484baae | 99 | { |
andrewboyson | 1:94282484baae | 100 | int c = LogEnumerate(); |
andrewboyson | 1:94282484baae | 101 | if (c == EOF) |
andrewboyson | 1:94282484baae | 102 | { |
andrewboyson | 1:94282484baae | 103 | enumerationStarted = false; |
andrewboyson | 1:94282484baae | 104 | break; |
andrewboyson | 0:09f915e6f9f6 | 105 | } |
andrewboyson | 1:94282484baae | 106 | *p++ = c; |
andrewboyson | 1:94282484baae | 107 | } |
andrewboyson | 1:94282484baae | 108 | return p - sendbuffer; |
andrewboyson | 1:94282484baae | 109 | } |
andrewboyson | 1:94282484baae | 110 | static char* header = |
andrewboyson | 1:94282484baae | 111 | "HTTP/1.0 200 OK\r\n" |
andrewboyson | 1:94282484baae | 112 | "Content-Type: text/html; charset=ISO-8859-1\r\n" |
andrewboyson | 1:94282484baae | 113 | "\r\n" |
andrewboyson | 1:94282484baae | 114 | "<!DOCTYPE html>\r\n" |
andrewboyson | 1:94282484baae | 115 | "<html>\r\n" |
andrewboyson | 1:94282484baae | 116 | "<head>\r\n" |
andrewboyson | 1:94282484baae | 117 | "<title>IoT mbed</title>\r\n" |
andrewboyson | 1:94282484baae | 118 | "</head>\r\n" |
andrewboyson | 6:be97d38e0b01 | 119 | "<style>\r\n" |
andrewboyson | 6:be97d38e0b01 | 120 | "* { font-family: Tahoma, Geneva, sans-serif; }\r\n" |
andrewboyson | 6:be97d38e0b01 | 121 | "</style>\r\n" |
andrewboyson | 1:94282484baae | 122 | "<body>\r\n"; |
andrewboyson | 1:94282484baae | 123 | |
andrewboyson | 1:94282484baae | 124 | static int fillLog(int id) |
andrewboyson | 1:94282484baae | 125 | { |
andrewboyson | 1:94282484baae | 126 | int len = 0; |
andrewboyson | 1:94282484baae | 127 | |
andrewboyson | 1:94282484baae | 128 | switch (lineToSendToId[id]) |
andrewboyson | 1:94282484baae | 129 | { |
andrewboyson | 1:94282484baae | 130 | case 1: len = fillChunk(header); lineToSendToId[id] += 1; break; |
andrewboyson | 1:94282484baae | 131 | case 2: len = fillChunk("<code><pre>"); lineToSendToId[id] += 1; break; |
andrewboyson | 1:94282484baae | 132 | case 3: len = fillLogChunk(); if (len < SEND_BUFFER_SIZE) lineToSendToId[id] += 1; break; //only increments after the last chunk |
andrewboyson | 1:94282484baae | 133 | case 4: len = fillChunk( |
andrewboyson | 1:94282484baae | 134 | "</pre></code>\r\n" |
andrewboyson | 1:94282484baae | 135 | "</body>\r\n" |
andrewboyson | 1:94282484baae | 136 | "</html>\r\n"); |
andrewboyson | 1:94282484baae | 137 | lineToSendToId[id] = -1; |
andrewboyson | 1:94282484baae | 138 | break; |
andrewboyson | 1:94282484baae | 139 | } |
andrewboyson | 1:94282484baae | 140 | return len; |
andrewboyson | 1:94282484baae | 141 | } |
andrewboyson | 6:be97d38e0b01 | 142 | static int addTemperature(int len, int16_t value) |
andrewboyson | 6:be97d38e0b01 | 143 | { |
andrewboyson | 6:be97d38e0b01 | 144 | switch (value) |
andrewboyson | 6:be97d38e0b01 | 145 | { |
andrewboyson | 6:be97d38e0b01 | 146 | case DS18B20_ERROR_CRC: return addChunk (len, "CRC error" ); |
andrewboyson | 6:be97d38e0b01 | 147 | case DS18B20_ERROR_NOT_FOUND: return addChunk (len, "ROM not found" ); |
andrewboyson | 6:be97d38e0b01 | 148 | case DS18B20_ERROR_TIMED_OUT: return addChunk (len, "Timed out" ); |
andrewboyson | 6:be97d38e0b01 | 149 | case DS18B20_ERROR_NO_DEVICE_PRESENT: return addChunk (len, "No device detected after reset"); |
andrewboyson | 6:be97d38e0b01 | 150 | case DS18B20_ERROR_NO_DEVICE_PARTICIPATING: return addChunk (len, "Device removed during search" ); |
andrewboyson | 6:be97d38e0b01 | 151 | default: return addChunkF(len, "%1.1f", value / 16.0 ); |
andrewboyson | 6:be97d38e0b01 | 152 | } |
andrewboyson | 6:be97d38e0b01 | 153 | } |
andrewboyson | 1:94282484baae | 154 | static int fillLed(int id) |
andrewboyson | 1:94282484baae | 155 | { |
andrewboyson | 1:94282484baae | 156 | int len; |
andrewboyson | 1:94282484baae | 157 | switch (lineToSendToId[id]) |
andrewboyson | 1:94282484baae | 158 | { |
andrewboyson | 1:94282484baae | 159 | case 1: |
andrewboyson | 1:94282484baae | 160 | len = fillChunk(header); |
andrewboyson | 1:94282484baae | 161 | lineToSendToId[id] += 1; |
andrewboyson | 1:94282484baae | 162 | break; |
andrewboyson | 1:94282484baae | 163 | case 2: |
andrewboyson | 5:6226f3c566ef | 164 | len = 0; |
andrewboyson | 7:024ace6d943c | 165 | struct tm tm; |
andrewboyson | 7:024ace6d943c | 166 | TimeGetTm(&tm); |
andrewboyson | 8:45a0205a298f | 167 | len = addChunkF(len, "Time: %d-%02d-%02d ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); |
andrewboyson | 7:024ace6d943c | 168 | switch(tm.tm_wday) |
andrewboyson | 7:024ace6d943c | 169 | { |
andrewboyson | 7:024ace6d943c | 170 | case 0: len = addChunk(len, "Sun"); break; |
andrewboyson | 7:024ace6d943c | 171 | case 1: len = addChunk(len, "Mon"); break; |
andrewboyson | 7:024ace6d943c | 172 | case 2: len = addChunk(len, "Tue"); break; |
andrewboyson | 7:024ace6d943c | 173 | case 3: len = addChunk(len, "Wed"); break; |
andrewboyson | 7:024ace6d943c | 174 | case 4: len = addChunk(len, "Thu"); break; |
andrewboyson | 7:024ace6d943c | 175 | case 5: len = addChunk(len, "Fri"); break; |
andrewboyson | 7:024ace6d943c | 176 | case 6: len = addChunk(len, "Sat"); break; |
andrewboyson | 7:024ace6d943c | 177 | default: len = addChunk(len, "???"); break; |
andrewboyson | 7:024ace6d943c | 178 | } |
andrewboyson | 8:45a0205a298f | 179 | len = addChunkF(len, " %02d:%02d:%02d UTC", tm.tm_hour, tm.tm_min, tm.tm_sec); |
andrewboyson | 7:024ace6d943c | 180 | len = addChunk (len, "<br/><br/>\r\n"); |
andrewboyson | 7:024ace6d943c | 181 | len = addChunkF(len, "Scan µs: %d<br/><br/>\r\n", TimeScanUs); |
andrewboyson | 2:06fa34661f19 | 182 | lineToSendToId[id] += 1; |
andrewboyson | 2:06fa34661f19 | 183 | break; |
andrewboyson | 2:06fa34661f19 | 184 | case 3: |
andrewboyson | 6:be97d38e0b01 | 185 | len = 0; |
andrewboyson | 6:be97d38e0b01 | 186 | len = addChunk (len, "Devices:<br/>\r\n"); |
andrewboyson | 6:be97d38e0b01 | 187 | for (int j = 0; j < DS18B20DeviceCount; j++) |
andrewboyson | 6:be97d38e0b01 | 188 | { |
andrewboyson | 6:be97d38e0b01 | 189 | len = addChunkF(len, "%d - ", j); |
andrewboyson | 6:be97d38e0b01 | 190 | for (int i = 0; i < 8; i++) len = addChunkF(len, " %02X", DS18B20DeviceList[j*8 + i]); |
andrewboyson | 6:be97d38e0b01 | 191 | len = addChunk(len, " - "); |
andrewboyson | 6:be97d38e0b01 | 192 | len = addTemperature(len, DS18B20Value[j]); |
andrewboyson | 6:be97d38e0b01 | 193 | len = addChunk (len, "<br/>\r\n"); |
andrewboyson | 6:be97d38e0b01 | 194 | } |
andrewboyson | 6:be97d38e0b01 | 195 | len = addChunk (len, "<br/>\r\n"); |
andrewboyson | 6:be97d38e0b01 | 196 | lineToSendToId[id] += 1; |
andrewboyson | 6:be97d38e0b01 | 197 | break; |
andrewboyson | 6:be97d38e0b01 | 198 | case 4: |
andrewboyson | 6:be97d38e0b01 | 199 | len = 0; |
andrewboyson | 6:be97d38e0b01 | 200 | int16_t temp; |
andrewboyson | 6:be97d38e0b01 | 201 | |
andrewboyson | 6:be97d38e0b01 | 202 | temp = DS18B20ValueFromRom(CfgTankRom); |
andrewboyson | 6:be97d38e0b01 | 203 | len = addChunk (len, "Tank temperature: "); |
andrewboyson | 6:be97d38e0b01 | 204 | len = addTemperature(len, temp); |
andrewboyson | 6:be97d38e0b01 | 205 | len = addChunk (len, "<br/>\r\n"); |
andrewboyson | 6:be97d38e0b01 | 206 | |
andrewboyson | 6:be97d38e0b01 | 207 | temp = DS18B20ValueFromRom(CfgInletRom); |
andrewboyson | 6:be97d38e0b01 | 208 | len = addChunk (len, "Inlet temperature: "); |
andrewboyson | 6:be97d38e0b01 | 209 | len = addTemperature(len, temp); |
andrewboyson | 6:be97d38e0b01 | 210 | len = addChunk (len, "<br/><br/>\r\n"); |
andrewboyson | 6:be97d38e0b01 | 211 | |
andrewboyson | 6:be97d38e0b01 | 212 | lineToSendToId[id] += 1; |
andrewboyson | 6:be97d38e0b01 | 213 | break; |
andrewboyson | 6:be97d38e0b01 | 214 | case 5: |
andrewboyson | 1:94282484baae | 215 | len = fillChunk( |
andrewboyson | 6:be97d38e0b01 | 216 | "<br/>" |
andrewboyson | 1:94282484baae | 217 | "<form action='/' method='get'>\r\n" |
andrewboyson | 1:94282484baae | 218 | "<input type='hidden' name='ledonoff'>\r\n"); |
andrewboyson | 1:94282484baae | 219 | lineToSendToId[id] += 1; |
andrewboyson | 1:94282484baae | 220 | break; |
andrewboyson | 6:be97d38e0b01 | 221 | case 6: |
andrewboyson | 1:94282484baae | 222 | len = fillChunk("Led <input type='checkbox' name='led' value='on'"); |
andrewboyson | 1:94282484baae | 223 | if (Led1) len = addChunk(len, " checked='checked'"); |
andrewboyson | 1:94282484baae | 224 | len = addChunk(len, ">\r\n"); |
andrewboyson | 1:94282484baae | 225 | lineToSendToId[id] += 1; |
andrewboyson | 1:94282484baae | 226 | break; |
andrewboyson | 6:be97d38e0b01 | 227 | case 7: |
andrewboyson | 1:94282484baae | 228 | len = fillChunk( |
andrewboyson | 1:94282484baae | 229 | "<input type='submit' value='Set'><br/>\r\n" |
andrewboyson | 1:94282484baae | 230 | "</form>\r\n" |
andrewboyson | 1:94282484baae | 231 | "</body>\r\n" |
andrewboyson | 1:94282484baae | 232 | "</html>\r\n"); |
andrewboyson | 1:94282484baae | 233 | lineToSendToId[id] = -1; |
andrewboyson | 1:94282484baae | 234 | break; |
andrewboyson | 1:94282484baae | 235 | } |
andrewboyson | 1:94282484baae | 236 | return len; |
andrewboyson | 1:94282484baae | 237 | } |
andrewboyson | 1:94282484baae | 238 | static int fillSendBuffer(int id) |
andrewboyson | 1:94282484baae | 239 | { |
andrewboyson | 1:94282484baae | 240 | switch(whatToSendToId[id]) |
andrewboyson | 1:94282484baae | 241 | { |
andrewboyson | 1:94282484baae | 242 | case WHAT_NOT_FOUND: return fillNotFound(id); |
andrewboyson | 1:94282484baae | 243 | case WHAT_BAD_REQUEST: return fillBadRequest(id); |
andrewboyson | 1:94282484baae | 244 | case WHAT_BAD_METHOD: return fillBadMethod(id); |
andrewboyson | 1:94282484baae | 245 | case WHAT_LOG: return fillLog(id); |
andrewboyson | 1:94282484baae | 246 | case WHAT_LED: return fillLed(id); |
andrewboyson | 1:94282484baae | 247 | default: |
andrewboyson | 1:94282484baae | 248 | LogF("No such 'whatToSendToId' %s", whatToSendToId[id]); |
andrewboyson | 1:94282484baae | 249 | return -1; |
andrewboyson | 0:09f915e6f9f6 | 250 | } |
andrewboyson | 0:09f915e6f9f6 | 251 | } |
andrewboyson | 1:94282484baae | 252 | static int splitRequest(char** ppMethod, char** ppPath, char** ppQuery, int *pLenMethod, int *pLenPath, int *pLenQuery) //returns 1 if malformed request; 0 if ok |
andrewboyson | 0:09f915e6f9f6 | 253 | { |
andrewboyson | 1:94282484baae | 254 | char* p = recvbuffer; |
andrewboyson | 1:94282484baae | 255 | char* pE = recvbuffer + RECV_BUFFER_SIZE; |
andrewboyson | 1:94282484baae | 256 | |
andrewboyson | 1:94282484baae | 257 | *ppMethod = NULL; |
andrewboyson | 1:94282484baae | 258 | *ppPath = NULL; |
andrewboyson | 1:94282484baae | 259 | *ppQuery = NULL; |
andrewboyson | 1:94282484baae | 260 | *pLenMethod = 0; |
andrewboyson | 1:94282484baae | 261 | *pLenPath = 0; |
andrewboyson | 1:94282484baae | 262 | *pLenQuery = 0; |
andrewboyson | 0:09f915e6f9f6 | 263 | |
andrewboyson | 1:94282484baae | 264 | while (*p == ' ') //Loop to non space |
andrewboyson | 1:94282484baae | 265 | { |
andrewboyson | 1:94282484baae | 266 | if (p == pE) return -1; |
andrewboyson | 1:94282484baae | 267 | if (*p < ' ') return -1; |
andrewboyson | 1:94282484baae | 268 | if (*p >= 0x7f) return -1; |
andrewboyson | 1:94282484baae | 269 | p++; |
andrewboyson | 1:94282484baae | 270 | } |
andrewboyson | 1:94282484baae | 271 | *ppMethod = p; //Record the start of the method GET or POST |
andrewboyson | 1:94282484baae | 272 | |
andrewboyson | 1:94282484baae | 273 | while (*p != ' ') //Loop to a space |
andrewboyson | 1:94282484baae | 274 | { |
andrewboyson | 1:94282484baae | 275 | if (p == pE) return -1; |
andrewboyson | 1:94282484baae | 276 | if (*p < ' ') return -1; |
andrewboyson | 1:94282484baae | 277 | if (*p >= 0x7f) return -1; |
andrewboyson | 1:94282484baae | 278 | p++; |
andrewboyson | 1:94282484baae | 279 | } |
andrewboyson | 1:94282484baae | 280 | *pLenMethod = p - *ppMethod; //Record the length of the method GET or POST |
andrewboyson | 0:09f915e6f9f6 | 281 | |
andrewboyson | 1:94282484baae | 282 | |
andrewboyson | 1:94282484baae | 283 | while (*p == ' ') //Loop to non space |
andrewboyson | 1:94282484baae | 284 | { |
andrewboyson | 1:94282484baae | 285 | if (p == pE) return -1; |
andrewboyson | 1:94282484baae | 286 | if (*p < ' ') return -1; |
andrewboyson | 1:94282484baae | 287 | if (*p >= 0x7f) return -1; |
andrewboyson | 1:94282484baae | 288 | p++; |
andrewboyson | 1:94282484baae | 289 | } |
andrewboyson | 1:94282484baae | 290 | *ppPath = p; //Record the start of the file part of the url |
andrewboyson | 1:94282484baae | 291 | |
andrewboyson | 1:94282484baae | 292 | while (*p != ' ') //Loop to space |
andrewboyson | 1:94282484baae | 293 | { |
andrewboyson | 1:94282484baae | 294 | if (p == pE) return -1; |
andrewboyson | 1:94282484baae | 295 | if (*p < ' ') return -1; |
andrewboyson | 1:94282484baae | 296 | if (*p >= 0x7f) return -1; |
andrewboyson | 1:94282484baae | 297 | if (*p == '?') *ppQuery = p + 1; |
andrewboyson | 1:94282484baae | 298 | p++; |
andrewboyson | 1:94282484baae | 299 | } |
andrewboyson | 1:94282484baae | 300 | |
andrewboyson | 1:94282484baae | 301 | if (*ppQuery) //Calulate length of the file and query parts |
andrewboyson | 0:09f915e6f9f6 | 302 | { |
andrewboyson | 1:94282484baae | 303 | *pLenPath = *ppQuery - *ppPath - 1; |
andrewboyson | 1:94282484baae | 304 | *pLenQuery = p - *ppQuery; |
andrewboyson | 1:94282484baae | 305 | } |
andrewboyson | 1:94282484baae | 306 | else |
andrewboyson | 1:94282484baae | 307 | { |
andrewboyson | 1:94282484baae | 308 | *pLenPath = p - *ppPath; |
andrewboyson | 1:94282484baae | 309 | *pLenQuery = 0; |
andrewboyson | 1:94282484baae | 310 | } |
andrewboyson | 1:94282484baae | 311 | |
andrewboyson | 1:94282484baae | 312 | return 0; |
andrewboyson | 1:94282484baae | 313 | } |
andrewboyson | 1:94282484baae | 314 | int compare(char* mem, int len, char* str) //Returns true if same and false if not |
andrewboyson | 1:94282484baae | 315 | { |
andrewboyson | 1:94282484baae | 316 | if (strlen(str) != len) return false; |
andrewboyson | 1:94282484baae | 317 | if (memcmp(mem, str, len)) return false; |
andrewboyson | 1:94282484baae | 318 | return true; |
andrewboyson | 1:94282484baae | 319 | } |
andrewboyson | 1:94282484baae | 320 | static int recvMain() |
andrewboyson | 1:94282484baae | 321 | { |
andrewboyson | 6:be97d38e0b01 | 322 | //Wait for data to be available oneshot. Buffer will normally hit limit. |
andrewboyson | 6:be97d38e0b01 | 323 | if (!EspDataAvailable) return 0; |
andrewboyson | 1:94282484baae | 324 | |
andrewboyson | 1:94282484baae | 325 | //Ignore ids that have been reserved elsewhere (ie NTP) |
andrewboyson | 1:94282484baae | 326 | if (EspIpdReserved[EspIpdId]) return 0; |
andrewboyson | 1:94282484baae | 327 | |
andrewboyson | 1:94282484baae | 328 | //Set up the next line to send to be the first |
andrewboyson | 1:94282484baae | 329 | lineToSendToId[EspIpdId] = 1; |
andrewboyson | 1:94282484baae | 330 | |
andrewboyson | 1:94282484baae | 331 | char* pMethod; |
andrewboyson | 1:94282484baae | 332 | char* pPath; |
andrewboyson | 1:94282484baae | 333 | char* pQuery; |
andrewboyson | 1:94282484baae | 334 | int lenMethod; |
andrewboyson | 1:94282484baae | 335 | int lenQuery; |
andrewboyson | 1:94282484baae | 336 | int lenPath; |
andrewboyson | 1:94282484baae | 337 | int r = splitRequest(&pMethod, &pPath, &pQuery, &lenMethod, &lenPath, &lenQuery); |
andrewboyson | 1:94282484baae | 338 | if (r) |
andrewboyson | 1:94282484baae | 339 | { |
andrewboyson | 1:94282484baae | 340 | whatToSendToId[EspIpdId] = WHAT_BAD_REQUEST; |
andrewboyson | 1:94282484baae | 341 | return 0; |
andrewboyson | 1:94282484baae | 342 | } |
andrewboyson | 1:94282484baae | 343 | |
andrewboyson | 1:94282484baae | 344 | if (!compare(pMethod, lenMethod, "GET")) |
andrewboyson | 1:94282484baae | 345 | { |
andrewboyson | 1:94282484baae | 346 | whatToSendToId[EspIpdId] = WHAT_BAD_METHOD; |
andrewboyson | 1:94282484baae | 347 | return 0; |
andrewboyson | 1:94282484baae | 348 | } |
andrewboyson | 1:94282484baae | 349 | |
andrewboyson | 1:94282484baae | 350 | if (compare(pPath, lenPath, "/")) |
andrewboyson | 1:94282484baae | 351 | { |
andrewboyson | 1:94282484baae | 352 | if (pQuery) |
andrewboyson | 0:09f915e6f9f6 | 353 | { |
andrewboyson | 1:94282484baae | 354 | if (compare(pQuery, lenQuery, "ledonoff=&led=on")) Led1 = 1; |
andrewboyson | 1:94282484baae | 355 | if (compare(pQuery, lenQuery, "ledonoff=" )) Led1 = 0; |
andrewboyson | 0:09f915e6f9f6 | 356 | } |
andrewboyson | 1:94282484baae | 357 | whatToSendToId[EspIpdId] = WHAT_LED; |
andrewboyson | 1:94282484baae | 358 | return 0; |
andrewboyson | 1:94282484baae | 359 | } |
andrewboyson | 1:94282484baae | 360 | |
andrewboyson | 1:94282484baae | 361 | if (compare(pPath, lenPath, "/log")) |
andrewboyson | 1:94282484baae | 362 | { |
andrewboyson | 1:94282484baae | 363 | whatToSendToId[EspIpdId] = WHAT_LOG; |
andrewboyson | 1:94282484baae | 364 | return 0; |
andrewboyson | 1:94282484baae | 365 | } |
andrewboyson | 1:94282484baae | 366 | |
andrewboyson | 1:94282484baae | 367 | whatToSendToId[EspIpdId] = WHAT_NOT_FOUND; |
andrewboyson | 1:94282484baae | 368 | return 0; |
andrewboyson | 1:94282484baae | 369 | } |
andrewboyson | 1:94282484baae | 370 | static int sendMain() |
andrewboyson | 1:94282484baae | 371 | { |
andrewboyson | 1:94282484baae | 372 | //Do nothing if a command is already in progress |
andrewboyson | 1:94282484baae | 373 | if (AtBusy()) return 0; |
andrewboyson | 1:94282484baae | 374 | |
andrewboyson | 1:94282484baae | 375 | //Send data. Do each id in turn to avoid interleaved calls to fillers like LogEnumerate which are not reentrant. |
andrewboyson | 1:94282484baae | 376 | for(int id = 0; id < 4; id++) |
andrewboyson | 1:94282484baae | 377 | { |
andrewboyson | 1:94282484baae | 378 | if (lineToSendToId[id] > 0) |
andrewboyson | 0:09f915e6f9f6 | 379 | { |
andrewboyson | 1:94282484baae | 380 | int length = fillSendBuffer(id); |
andrewboyson | 1:94282484baae | 381 | if (length < 0) return -1; |
andrewboyson | 1:94282484baae | 382 | if (length > 0) AtSendData(id, length, sendbuffer, NULL); |
andrewboyson | 1:94282484baae | 383 | } |
andrewboyson | 1:94282484baae | 384 | else if (lineToSendToId[id] < 0) |
andrewboyson | 1:94282484baae | 385 | { |
andrewboyson | 1:94282484baae | 386 | AtClose(id, NULL); |
andrewboyson | 1:94282484baae | 387 | lineToSendToId[id] = 0; |
andrewboyson | 0:09f915e6f9f6 | 388 | } |
andrewboyson | 0:09f915e6f9f6 | 389 | } |
andrewboyson | 0:09f915e6f9f6 | 390 | |
andrewboyson | 1:94282484baae | 391 | return 0; |
andrewboyson | 1:94282484baae | 392 | } |
andrewboyson | 1:94282484baae | 393 | int startMain() |
andrewboyson | 1:94282484baae | 394 | { |
andrewboyson | 1:94282484baae | 395 | //Do nothing if a command is already in progress |
andrewboyson | 1:94282484baae | 396 | if (AtBusy()) return 0; |
andrewboyson | 1:94282484baae | 397 | |
andrewboyson | 1:94282484baae | 398 | //Do nothing until WiFi is running |
andrewboyson | 1:94282484baae | 399 | if (!WifiStarted()) return 0; |
andrewboyson | 0:09f915e6f9f6 | 400 | |
andrewboyson | 1:94282484baae | 401 | //Start the server if not started |
andrewboyson | 1:94282484baae | 402 | static int startServerReply = AT_NONE; |
andrewboyson | 1:94282484baae | 403 | if (startServerReply != AT_SUCCESS) AtStartServer(SERVER_PORT, &startServerReply); |
andrewboyson | 1:94282484baae | 404 | return 0; |
andrewboyson | 1:94282484baae | 405 | } |
andrewboyson | 1:94282484baae | 406 | int ServerMain() |
andrewboyson | 1:94282484baae | 407 | { |
andrewboyson | 1:94282484baae | 408 | if (startMain()) return -1; |
andrewboyson | 1:94282484baae | 409 | if ( recvMain()) return -1; |
andrewboyson | 1:94282484baae | 410 | if ( sendMain()) return -1; |
andrewboyson | 0:09f915e6f9f6 | 411 | |
andrewboyson | 0:09f915e6f9f6 | 412 | return 0; |
andrewboyson | 0:09f915e6f9f6 | 413 | } |