![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Backing up an unused program in case of future need
server.cpp@7:024ace6d943c, 2016-06-02 (annotated)
- Committer:
- andrewboyson
- Date:
- Thu Jun 02 09:26:28 2016 +0000
- Revision:
- 7:024ace6d943c
- Parent:
- 6:be97d38e0b01
- Child:
- 8:45a0205a298f
Added a routine to break time_t into a struct tm without using gmtime as that did not seem to work.
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 | 7:024ace6d943c | 167 | len = addChunkF(len, "Time (UTC): %d-%02d-%02d %02d:%02d:%02d ", |
andrewboyson | 7:024ace6d943c | 168 | tm.tm_year + 1900, |
andrewboyson | 7:024ace6d943c | 169 | tm.tm_mon + 1, |
andrewboyson | 7:024ace6d943c | 170 | tm.tm_mday, |
andrewboyson | 7:024ace6d943c | 171 | tm.tm_hour, |
andrewboyson | 7:024ace6d943c | 172 | tm.tm_min, |
andrewboyson | 7:024ace6d943c | 173 | tm.tm_sec); |
andrewboyson | 7:024ace6d943c | 174 | switch(tm.tm_wday) |
andrewboyson | 7:024ace6d943c | 175 | { |
andrewboyson | 7:024ace6d943c | 176 | case 0: len = addChunk(len, "Sun"); break; |
andrewboyson | 7:024ace6d943c | 177 | case 1: len = addChunk(len, "Mon"); break; |
andrewboyson | 7:024ace6d943c | 178 | case 2: len = addChunk(len, "Tue"); break; |
andrewboyson | 7:024ace6d943c | 179 | case 3: len = addChunk(len, "Wed"); break; |
andrewboyson | 7:024ace6d943c | 180 | case 4: len = addChunk(len, "Thu"); break; |
andrewboyson | 7:024ace6d943c | 181 | case 5: len = addChunk(len, "Fri"); break; |
andrewboyson | 7:024ace6d943c | 182 | case 6: len = addChunk(len, "Sat"); break; |
andrewboyson | 7:024ace6d943c | 183 | default: len = addChunk(len, "???"); break; |
andrewboyson | 7:024ace6d943c | 184 | } |
andrewboyson | 7:024ace6d943c | 185 | len = addChunk (len, "<br/><br/>\r\n"); |
andrewboyson | 7:024ace6d943c | 186 | len = addChunkF(len, "Scan µs: %d<br/><br/>\r\n", TimeScanUs); |
andrewboyson | 2:06fa34661f19 | 187 | lineToSendToId[id] += 1; |
andrewboyson | 2:06fa34661f19 | 188 | break; |
andrewboyson | 2:06fa34661f19 | 189 | case 3: |
andrewboyson | 6:be97d38e0b01 | 190 | len = 0; |
andrewboyson | 6:be97d38e0b01 | 191 | len = addChunk (len, "Devices:<br/>\r\n"); |
andrewboyson | 6:be97d38e0b01 | 192 | for (int j = 0; j < DS18B20DeviceCount; j++) |
andrewboyson | 6:be97d38e0b01 | 193 | { |
andrewboyson | 6:be97d38e0b01 | 194 | len = addChunkF(len, "%d - ", j); |
andrewboyson | 6:be97d38e0b01 | 195 | for (int i = 0; i < 8; i++) len = addChunkF(len, " %02X", DS18B20DeviceList[j*8 + i]); |
andrewboyson | 6:be97d38e0b01 | 196 | len = addChunk(len, " - "); |
andrewboyson | 6:be97d38e0b01 | 197 | len = addTemperature(len, DS18B20Value[j]); |
andrewboyson | 6:be97d38e0b01 | 198 | len = addChunk (len, "<br/>\r\n"); |
andrewboyson | 6:be97d38e0b01 | 199 | } |
andrewboyson | 6:be97d38e0b01 | 200 | len = addChunk (len, "<br/>\r\n"); |
andrewboyson | 6:be97d38e0b01 | 201 | lineToSendToId[id] += 1; |
andrewboyson | 6:be97d38e0b01 | 202 | break; |
andrewboyson | 6:be97d38e0b01 | 203 | case 4: |
andrewboyson | 6:be97d38e0b01 | 204 | len = 0; |
andrewboyson | 6:be97d38e0b01 | 205 | int16_t temp; |
andrewboyson | 6:be97d38e0b01 | 206 | |
andrewboyson | 6:be97d38e0b01 | 207 | temp = DS18B20ValueFromRom(CfgTankRom); |
andrewboyson | 6:be97d38e0b01 | 208 | len = addChunk (len, "Tank temperature: "); |
andrewboyson | 6:be97d38e0b01 | 209 | len = addTemperature(len, temp); |
andrewboyson | 6:be97d38e0b01 | 210 | len = addChunk (len, "<br/>\r\n"); |
andrewboyson | 6:be97d38e0b01 | 211 | |
andrewboyson | 6:be97d38e0b01 | 212 | temp = DS18B20ValueFromRom(CfgInletRom); |
andrewboyson | 6:be97d38e0b01 | 213 | len = addChunk (len, "Inlet temperature: "); |
andrewboyson | 6:be97d38e0b01 | 214 | len = addTemperature(len, temp); |
andrewboyson | 6:be97d38e0b01 | 215 | len = addChunk (len, "<br/><br/>\r\n"); |
andrewboyson | 6:be97d38e0b01 | 216 | |
andrewboyson | 6:be97d38e0b01 | 217 | lineToSendToId[id] += 1; |
andrewboyson | 6:be97d38e0b01 | 218 | break; |
andrewboyson | 6:be97d38e0b01 | 219 | case 5: |
andrewboyson | 1:94282484baae | 220 | len = fillChunk( |
andrewboyson | 6:be97d38e0b01 | 221 | "<br/>" |
andrewboyson | 1:94282484baae | 222 | "<form action='/' method='get'>\r\n" |
andrewboyson | 1:94282484baae | 223 | "<input type='hidden' name='ledonoff'>\r\n"); |
andrewboyson | 1:94282484baae | 224 | lineToSendToId[id] += 1; |
andrewboyson | 1:94282484baae | 225 | break; |
andrewboyson | 6:be97d38e0b01 | 226 | case 6: |
andrewboyson | 1:94282484baae | 227 | len = fillChunk("Led <input type='checkbox' name='led' value='on'"); |
andrewboyson | 1:94282484baae | 228 | if (Led1) len = addChunk(len, " checked='checked'"); |
andrewboyson | 1:94282484baae | 229 | len = addChunk(len, ">\r\n"); |
andrewboyson | 1:94282484baae | 230 | lineToSendToId[id] += 1; |
andrewboyson | 1:94282484baae | 231 | break; |
andrewboyson | 6:be97d38e0b01 | 232 | case 7: |
andrewboyson | 1:94282484baae | 233 | len = fillChunk( |
andrewboyson | 1:94282484baae | 234 | "<input type='submit' value='Set'><br/>\r\n" |
andrewboyson | 1:94282484baae | 235 | "</form>\r\n" |
andrewboyson | 1:94282484baae | 236 | "</body>\r\n" |
andrewboyson | 1:94282484baae | 237 | "</html>\r\n"); |
andrewboyson | 1:94282484baae | 238 | lineToSendToId[id] = -1; |
andrewboyson | 1:94282484baae | 239 | break; |
andrewboyson | 1:94282484baae | 240 | } |
andrewboyson | 1:94282484baae | 241 | return len; |
andrewboyson | 1:94282484baae | 242 | } |
andrewboyson | 1:94282484baae | 243 | static int fillSendBuffer(int id) |
andrewboyson | 1:94282484baae | 244 | { |
andrewboyson | 1:94282484baae | 245 | switch(whatToSendToId[id]) |
andrewboyson | 1:94282484baae | 246 | { |
andrewboyson | 1:94282484baae | 247 | case WHAT_NOT_FOUND: return fillNotFound(id); |
andrewboyson | 1:94282484baae | 248 | case WHAT_BAD_REQUEST: return fillBadRequest(id); |
andrewboyson | 1:94282484baae | 249 | case WHAT_BAD_METHOD: return fillBadMethod(id); |
andrewboyson | 1:94282484baae | 250 | case WHAT_LOG: return fillLog(id); |
andrewboyson | 1:94282484baae | 251 | case WHAT_LED: return fillLed(id); |
andrewboyson | 1:94282484baae | 252 | default: |
andrewboyson | 1:94282484baae | 253 | LogF("No such 'whatToSendToId' %s", whatToSendToId[id]); |
andrewboyson | 1:94282484baae | 254 | return -1; |
andrewboyson | 0:09f915e6f9f6 | 255 | } |
andrewboyson | 0:09f915e6f9f6 | 256 | } |
andrewboyson | 1:94282484baae | 257 | 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 | 258 | { |
andrewboyson | 1:94282484baae | 259 | char* p = recvbuffer; |
andrewboyson | 1:94282484baae | 260 | char* pE = recvbuffer + RECV_BUFFER_SIZE; |
andrewboyson | 1:94282484baae | 261 | |
andrewboyson | 1:94282484baae | 262 | *ppMethod = NULL; |
andrewboyson | 1:94282484baae | 263 | *ppPath = NULL; |
andrewboyson | 1:94282484baae | 264 | *ppQuery = NULL; |
andrewboyson | 1:94282484baae | 265 | *pLenMethod = 0; |
andrewboyson | 1:94282484baae | 266 | *pLenPath = 0; |
andrewboyson | 1:94282484baae | 267 | *pLenQuery = 0; |
andrewboyson | 0:09f915e6f9f6 | 268 | |
andrewboyson | 1:94282484baae | 269 | while (*p == ' ') //Loop to non space |
andrewboyson | 1:94282484baae | 270 | { |
andrewboyson | 1:94282484baae | 271 | if (p == pE) return -1; |
andrewboyson | 1:94282484baae | 272 | if (*p < ' ') return -1; |
andrewboyson | 1:94282484baae | 273 | if (*p >= 0x7f) return -1; |
andrewboyson | 1:94282484baae | 274 | p++; |
andrewboyson | 1:94282484baae | 275 | } |
andrewboyson | 1:94282484baae | 276 | *ppMethod = p; //Record the start of the method GET or POST |
andrewboyson | 1:94282484baae | 277 | |
andrewboyson | 1:94282484baae | 278 | while (*p != ' ') //Loop to a space |
andrewboyson | 1:94282484baae | 279 | { |
andrewboyson | 1:94282484baae | 280 | if (p == pE) return -1; |
andrewboyson | 1:94282484baae | 281 | if (*p < ' ') return -1; |
andrewboyson | 1:94282484baae | 282 | if (*p >= 0x7f) return -1; |
andrewboyson | 1:94282484baae | 283 | p++; |
andrewboyson | 1:94282484baae | 284 | } |
andrewboyson | 1:94282484baae | 285 | *pLenMethod = p - *ppMethod; //Record the length of the method GET or POST |
andrewboyson | 0:09f915e6f9f6 | 286 | |
andrewboyson | 1:94282484baae | 287 | |
andrewboyson | 1:94282484baae | 288 | while (*p == ' ') //Loop to non space |
andrewboyson | 1:94282484baae | 289 | { |
andrewboyson | 1:94282484baae | 290 | if (p == pE) return -1; |
andrewboyson | 1:94282484baae | 291 | if (*p < ' ') return -1; |
andrewboyson | 1:94282484baae | 292 | if (*p >= 0x7f) return -1; |
andrewboyson | 1:94282484baae | 293 | p++; |
andrewboyson | 1:94282484baae | 294 | } |
andrewboyson | 1:94282484baae | 295 | *ppPath = p; //Record the start of the file part of the url |
andrewboyson | 1:94282484baae | 296 | |
andrewboyson | 1:94282484baae | 297 | while (*p != ' ') //Loop to space |
andrewboyson | 1:94282484baae | 298 | { |
andrewboyson | 1:94282484baae | 299 | if (p == pE) return -1; |
andrewboyson | 1:94282484baae | 300 | if (*p < ' ') return -1; |
andrewboyson | 1:94282484baae | 301 | if (*p >= 0x7f) return -1; |
andrewboyson | 1:94282484baae | 302 | if (*p == '?') *ppQuery = p + 1; |
andrewboyson | 1:94282484baae | 303 | p++; |
andrewboyson | 1:94282484baae | 304 | } |
andrewboyson | 1:94282484baae | 305 | |
andrewboyson | 1:94282484baae | 306 | if (*ppQuery) //Calulate length of the file and query parts |
andrewboyson | 0:09f915e6f9f6 | 307 | { |
andrewboyson | 1:94282484baae | 308 | *pLenPath = *ppQuery - *ppPath - 1; |
andrewboyson | 1:94282484baae | 309 | *pLenQuery = p - *ppQuery; |
andrewboyson | 1:94282484baae | 310 | } |
andrewboyson | 1:94282484baae | 311 | else |
andrewboyson | 1:94282484baae | 312 | { |
andrewboyson | 1:94282484baae | 313 | *pLenPath = p - *ppPath; |
andrewboyson | 1:94282484baae | 314 | *pLenQuery = 0; |
andrewboyson | 1:94282484baae | 315 | } |
andrewboyson | 1:94282484baae | 316 | |
andrewboyson | 1:94282484baae | 317 | return 0; |
andrewboyson | 1:94282484baae | 318 | } |
andrewboyson | 1:94282484baae | 319 | int compare(char* mem, int len, char* str) //Returns true if same and false if not |
andrewboyson | 1:94282484baae | 320 | { |
andrewboyson | 1:94282484baae | 321 | if (strlen(str) != len) return false; |
andrewboyson | 1:94282484baae | 322 | if (memcmp(mem, str, len)) return false; |
andrewboyson | 1:94282484baae | 323 | return true; |
andrewboyson | 1:94282484baae | 324 | } |
andrewboyson | 1:94282484baae | 325 | static int recvMain() |
andrewboyson | 1:94282484baae | 326 | { |
andrewboyson | 6:be97d38e0b01 | 327 | //Wait for data to be available oneshot. Buffer will normally hit limit. |
andrewboyson | 6:be97d38e0b01 | 328 | if (!EspDataAvailable) return 0; |
andrewboyson | 1:94282484baae | 329 | |
andrewboyson | 1:94282484baae | 330 | //Ignore ids that have been reserved elsewhere (ie NTP) |
andrewboyson | 1:94282484baae | 331 | if (EspIpdReserved[EspIpdId]) return 0; |
andrewboyson | 1:94282484baae | 332 | |
andrewboyson | 1:94282484baae | 333 | //Set up the next line to send to be the first |
andrewboyson | 1:94282484baae | 334 | lineToSendToId[EspIpdId] = 1; |
andrewboyson | 1:94282484baae | 335 | |
andrewboyson | 1:94282484baae | 336 | char* pMethod; |
andrewboyson | 1:94282484baae | 337 | char* pPath; |
andrewboyson | 1:94282484baae | 338 | char* pQuery; |
andrewboyson | 1:94282484baae | 339 | int lenMethod; |
andrewboyson | 1:94282484baae | 340 | int lenQuery; |
andrewboyson | 1:94282484baae | 341 | int lenPath; |
andrewboyson | 1:94282484baae | 342 | int r = splitRequest(&pMethod, &pPath, &pQuery, &lenMethod, &lenPath, &lenQuery); |
andrewboyson | 1:94282484baae | 343 | if (r) |
andrewboyson | 1:94282484baae | 344 | { |
andrewboyson | 1:94282484baae | 345 | whatToSendToId[EspIpdId] = WHAT_BAD_REQUEST; |
andrewboyson | 1:94282484baae | 346 | return 0; |
andrewboyson | 1:94282484baae | 347 | } |
andrewboyson | 1:94282484baae | 348 | |
andrewboyson | 1:94282484baae | 349 | if (!compare(pMethod, lenMethod, "GET")) |
andrewboyson | 1:94282484baae | 350 | { |
andrewboyson | 1:94282484baae | 351 | whatToSendToId[EspIpdId] = WHAT_BAD_METHOD; |
andrewboyson | 1:94282484baae | 352 | return 0; |
andrewboyson | 1:94282484baae | 353 | } |
andrewboyson | 1:94282484baae | 354 | |
andrewboyson | 1:94282484baae | 355 | if (compare(pPath, lenPath, "/")) |
andrewboyson | 1:94282484baae | 356 | { |
andrewboyson | 1:94282484baae | 357 | if (pQuery) |
andrewboyson | 0:09f915e6f9f6 | 358 | { |
andrewboyson | 1:94282484baae | 359 | if (compare(pQuery, lenQuery, "ledonoff=&led=on")) Led1 = 1; |
andrewboyson | 1:94282484baae | 360 | if (compare(pQuery, lenQuery, "ledonoff=" )) Led1 = 0; |
andrewboyson | 0:09f915e6f9f6 | 361 | } |
andrewboyson | 1:94282484baae | 362 | whatToSendToId[EspIpdId] = WHAT_LED; |
andrewboyson | 1:94282484baae | 363 | return 0; |
andrewboyson | 1:94282484baae | 364 | } |
andrewboyson | 1:94282484baae | 365 | |
andrewboyson | 1:94282484baae | 366 | if (compare(pPath, lenPath, "/log")) |
andrewboyson | 1:94282484baae | 367 | { |
andrewboyson | 1:94282484baae | 368 | whatToSendToId[EspIpdId] = WHAT_LOG; |
andrewboyson | 1:94282484baae | 369 | return 0; |
andrewboyson | 1:94282484baae | 370 | } |
andrewboyson | 1:94282484baae | 371 | |
andrewboyson | 1:94282484baae | 372 | whatToSendToId[EspIpdId] = WHAT_NOT_FOUND; |
andrewboyson | 1:94282484baae | 373 | return 0; |
andrewboyson | 1:94282484baae | 374 | } |
andrewboyson | 1:94282484baae | 375 | static int sendMain() |
andrewboyson | 1:94282484baae | 376 | { |
andrewboyson | 1:94282484baae | 377 | //Do nothing if a command is already in progress |
andrewboyson | 1:94282484baae | 378 | if (AtBusy()) return 0; |
andrewboyson | 1:94282484baae | 379 | |
andrewboyson | 1:94282484baae | 380 | //Send data. Do each id in turn to avoid interleaved calls to fillers like LogEnumerate which are not reentrant. |
andrewboyson | 1:94282484baae | 381 | for(int id = 0; id < 4; id++) |
andrewboyson | 1:94282484baae | 382 | { |
andrewboyson | 1:94282484baae | 383 | if (lineToSendToId[id] > 0) |
andrewboyson | 0:09f915e6f9f6 | 384 | { |
andrewboyson | 1:94282484baae | 385 | int length = fillSendBuffer(id); |
andrewboyson | 1:94282484baae | 386 | if (length < 0) return -1; |
andrewboyson | 1:94282484baae | 387 | if (length > 0) AtSendData(id, length, sendbuffer, NULL); |
andrewboyson | 1:94282484baae | 388 | } |
andrewboyson | 1:94282484baae | 389 | else if (lineToSendToId[id] < 0) |
andrewboyson | 1:94282484baae | 390 | { |
andrewboyson | 1:94282484baae | 391 | AtClose(id, NULL); |
andrewboyson | 1:94282484baae | 392 | lineToSendToId[id] = 0; |
andrewboyson | 0:09f915e6f9f6 | 393 | } |
andrewboyson | 0:09f915e6f9f6 | 394 | } |
andrewboyson | 0:09f915e6f9f6 | 395 | |
andrewboyson | 1:94282484baae | 396 | return 0; |
andrewboyson | 1:94282484baae | 397 | } |
andrewboyson | 1:94282484baae | 398 | int startMain() |
andrewboyson | 1:94282484baae | 399 | { |
andrewboyson | 1:94282484baae | 400 | //Do nothing if a command is already in progress |
andrewboyson | 1:94282484baae | 401 | if (AtBusy()) return 0; |
andrewboyson | 1:94282484baae | 402 | |
andrewboyson | 1:94282484baae | 403 | //Do nothing until WiFi is running |
andrewboyson | 1:94282484baae | 404 | if (!WifiStarted()) return 0; |
andrewboyson | 0:09f915e6f9f6 | 405 | |
andrewboyson | 1:94282484baae | 406 | //Start the server if not started |
andrewboyson | 1:94282484baae | 407 | static int startServerReply = AT_NONE; |
andrewboyson | 1:94282484baae | 408 | if (startServerReply != AT_SUCCESS) AtStartServer(SERVER_PORT, &startServerReply); |
andrewboyson | 1:94282484baae | 409 | return 0; |
andrewboyson | 1:94282484baae | 410 | } |
andrewboyson | 1:94282484baae | 411 | int ServerMain() |
andrewboyson | 1:94282484baae | 412 | { |
andrewboyson | 1:94282484baae | 413 | if (startMain()) return -1; |
andrewboyson | 1:94282484baae | 414 | if ( recvMain()) return -1; |
andrewboyson | 1:94282484baae | 415 | if ( sendMain()) return -1; |
andrewboyson | 0:09f915e6f9f6 | 416 | |
andrewboyson | 0:09f915e6f9f6 | 417 | return 0; |
andrewboyson | 0:09f915e6f9f6 | 418 | } |