Andrew Boyson
/
iot
Backing up an unused program in case of future need
server.cpp@5:6226f3c566ef, 2016-05-11 (annotated)
- Committer:
- andrewboyson
- Date:
- Wed May 11 16:42:35 2016 +0000
- Revision:
- 5:6226f3c566ef
- Parent:
- 2:06fa34661f19
- Child:
- 6:be97d38e0b01
Added CRC to 1-wire
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 | 1:94282484baae | 8 | #define RECV_BUFFER_SIZE 1024 |
andrewboyson | 1:94282484baae | 9 | #define SEND_BUFFER_SIZE 256 |
andrewboyson | 0:09f915e6f9f6 | 10 | #define SERVER_PORT 80 |
andrewboyson | 0:09f915e6f9f6 | 11 | |
andrewboyson | 1:94282484baae | 12 | static char recvbuffer[RECV_BUFFER_SIZE]; |
andrewboyson | 1:94282484baae | 13 | static char sendbuffer[SEND_BUFFER_SIZE]; |
andrewboyson | 1:94282484baae | 14 | |
andrewboyson | 1:94282484baae | 15 | #define WHAT_NOT_FOUND 0 |
andrewboyson | 1:94282484baae | 16 | #define WHAT_BAD_REQUEST 1 |
andrewboyson | 1:94282484baae | 17 | #define WHAT_BAD_METHOD 2 |
andrewboyson | 1:94282484baae | 18 | #define WHAT_LED 3 |
andrewboyson | 1:94282484baae | 19 | #define WHAT_LOG 4 |
andrewboyson | 1:94282484baae | 20 | static int whatToSendToId[4]; |
andrewboyson | 1:94282484baae | 21 | static int lineToSendToId[4]; //0 == do nothing; -1 == close |
andrewboyson | 0:09f915e6f9f6 | 22 | |
andrewboyson | 2:06fa34661f19 | 23 | int ServerInit(void) //Make sure this is only called after any other ids are reserved. |
andrewboyson | 0:09f915e6f9f6 | 24 | { |
andrewboyson | 0:09f915e6f9f6 | 25 | for (int id = 0; id < 4; id++) |
andrewboyson | 0:09f915e6f9f6 | 26 | { |
andrewboyson | 0:09f915e6f9f6 | 27 | if (!EspIpdReserved[id]) |
andrewboyson | 0:09f915e6f9f6 | 28 | { |
andrewboyson | 0:09f915e6f9f6 | 29 | EspIpdBuffer[id] = recvbuffer; |
andrewboyson | 1:94282484baae | 30 | EspIpdBufferLen[id] = RECV_BUFFER_SIZE; |
andrewboyson | 1:94282484baae | 31 | } |
andrewboyson | 1:94282484baae | 32 | whatToSendToId[id] = 0; |
andrewboyson | 1:94282484baae | 33 | lineToSendToId[id] = 0; |
andrewboyson | 1:94282484baae | 34 | } |
andrewboyson | 2:06fa34661f19 | 35 | return 0; |
andrewboyson | 1:94282484baae | 36 | } |
andrewboyson | 5:6226f3c566ef | 37 | static int addChunkF(int prevlen, char *fmt, ...) |
andrewboyson | 5:6226f3c566ef | 38 | { |
andrewboyson | 5:6226f3c566ef | 39 | //Set up variable arguments |
andrewboyson | 5:6226f3c566ef | 40 | va_list argptr; |
andrewboyson | 5:6226f3c566ef | 41 | va_start(argptr, fmt); |
andrewboyson | 5:6226f3c566ef | 42 | |
andrewboyson | 5:6226f3c566ef | 43 | //Fill the buffer |
andrewboyson | 5:6226f3c566ef | 44 | int room = SEND_BUFFER_SIZE - prevlen; |
andrewboyson | 5:6226f3c566ef | 45 | int sent = vsnprintf(sendbuffer + prevlen, room, fmt, argptr); |
andrewboyson | 5:6226f3c566ef | 46 | if (sent > room) sent = room; |
andrewboyson | 5:6226f3c566ef | 47 | if (sent < 0) sent = 0; |
andrewboyson | 5:6226f3c566ef | 48 | |
andrewboyson | 5:6226f3c566ef | 49 | //Finish with variable arguments |
andrewboyson | 5:6226f3c566ef | 50 | va_end(argptr); |
andrewboyson | 5:6226f3c566ef | 51 | |
andrewboyson | 5:6226f3c566ef | 52 | //Return length |
andrewboyson | 5:6226f3c566ef | 53 | int len = prevlen + sent; |
andrewboyson | 5:6226f3c566ef | 54 | return len < SEND_BUFFER_SIZE ? len : SEND_BUFFER_SIZE; |
andrewboyson | 5:6226f3c566ef | 55 | |
andrewboyson | 5:6226f3c566ef | 56 | } |
andrewboyson | 1:94282484baae | 57 | |
andrewboyson | 1:94282484baae | 58 | static int addChunk(int prevlen, char *text) |
andrewboyson | 1:94282484baae | 59 | { |
andrewboyson | 1:94282484baae | 60 | strncpy(sendbuffer + prevlen, text, SEND_BUFFER_SIZE - prevlen); |
andrewboyson | 1:94282484baae | 61 | int len = prevlen + strlen(text); |
andrewboyson | 1:94282484baae | 62 | return len < SEND_BUFFER_SIZE ? len : SEND_BUFFER_SIZE; |
andrewboyson | 1:94282484baae | 63 | } |
andrewboyson | 1:94282484baae | 64 | static int fillChunk(char * text) |
andrewboyson | 1:94282484baae | 65 | { |
andrewboyson | 1:94282484baae | 66 | strncpy(sendbuffer, text, SEND_BUFFER_SIZE); |
andrewboyson | 1:94282484baae | 67 | int len = strlen(text); |
andrewboyson | 1:94282484baae | 68 | return len < SEND_BUFFER_SIZE ? len : SEND_BUFFER_SIZE; |
andrewboyson | 1:94282484baae | 69 | } |
andrewboyson | 1:94282484baae | 70 | static int fillNotFound(int id) |
andrewboyson | 1:94282484baae | 71 | { |
andrewboyson | 1:94282484baae | 72 | int len = fillChunk("HTTP/1.0 404 Not Found\r\n\r\n"); |
andrewboyson | 1:94282484baae | 73 | lineToSendToId[id] = -1; |
andrewboyson | 1:94282484baae | 74 | return len; |
andrewboyson | 1:94282484baae | 75 | } |
andrewboyson | 1:94282484baae | 76 | static int fillBadRequest(int id) |
andrewboyson | 1:94282484baae | 77 | { |
andrewboyson | 1:94282484baae | 78 | int len = fillChunk("HTTP/1.0 400 Bad Request\r\n\r\n"); |
andrewboyson | 1:94282484baae | 79 | lineToSendToId[id] = -1; |
andrewboyson | 1:94282484baae | 80 | return len; |
andrewboyson | 1:94282484baae | 81 | } |
andrewboyson | 1:94282484baae | 82 | static int fillBadMethod(int id) |
andrewboyson | 1:94282484baae | 83 | { |
andrewboyson | 1:94282484baae | 84 | int len = fillChunk("HTTP/1.0 405 Method Not Allowed\r\nAllow: GET\r\n\r\n"); |
andrewboyson | 1:94282484baae | 85 | lineToSendToId[id] = -1; |
andrewboyson | 1:94282484baae | 86 | return len; |
andrewboyson | 1:94282484baae | 87 | } |
andrewboyson | 1:94282484baae | 88 | 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 | 89 | { |
andrewboyson | 1:94282484baae | 90 | static int enumerationStarted = false; |
andrewboyson | 1:94282484baae | 91 | if (!enumerationStarted) |
andrewboyson | 1:94282484baae | 92 | { |
andrewboyson | 1:94282484baae | 93 | LogEnumerateStart(); |
andrewboyson | 1:94282484baae | 94 | enumerationStarted = true; |
andrewboyson | 1:94282484baae | 95 | } |
andrewboyson | 1:94282484baae | 96 | char* p = sendbuffer; |
andrewboyson | 1:94282484baae | 97 | while (p < sendbuffer + SEND_BUFFER_SIZE) |
andrewboyson | 1:94282484baae | 98 | { |
andrewboyson | 1:94282484baae | 99 | int c = LogEnumerate(); |
andrewboyson | 1:94282484baae | 100 | if (c == EOF) |
andrewboyson | 1:94282484baae | 101 | { |
andrewboyson | 1:94282484baae | 102 | enumerationStarted = false; |
andrewboyson | 1:94282484baae | 103 | break; |
andrewboyson | 0:09f915e6f9f6 | 104 | } |
andrewboyson | 1:94282484baae | 105 | *p++ = c; |
andrewboyson | 1:94282484baae | 106 | } |
andrewboyson | 1:94282484baae | 107 | return p - sendbuffer; |
andrewboyson | 1:94282484baae | 108 | } |
andrewboyson | 1:94282484baae | 109 | static char* header = |
andrewboyson | 1:94282484baae | 110 | "HTTP/1.0 200 OK\r\n" |
andrewboyson | 1:94282484baae | 111 | "Content-Type: text/html; charset=ISO-8859-1\r\n" |
andrewboyson | 1:94282484baae | 112 | "\r\n" |
andrewboyson | 1:94282484baae | 113 | "<!DOCTYPE html>\r\n" |
andrewboyson | 1:94282484baae | 114 | "<html>\r\n" |
andrewboyson | 1:94282484baae | 115 | "<head>\r\n" |
andrewboyson | 1:94282484baae | 116 | "<title>IoT mbed</title>\r\n" |
andrewboyson | 1:94282484baae | 117 | "</head>\r\n" |
andrewboyson | 1:94282484baae | 118 | "<body>\r\n"; |
andrewboyson | 1:94282484baae | 119 | |
andrewboyson | 1:94282484baae | 120 | static int fillLog(int id) |
andrewboyson | 1:94282484baae | 121 | { |
andrewboyson | 1:94282484baae | 122 | int len = 0; |
andrewboyson | 1:94282484baae | 123 | |
andrewboyson | 1:94282484baae | 124 | switch (lineToSendToId[id]) |
andrewboyson | 1:94282484baae | 125 | { |
andrewboyson | 1:94282484baae | 126 | case 1: len = fillChunk(header); lineToSendToId[id] += 1; break; |
andrewboyson | 1:94282484baae | 127 | case 2: len = fillChunk("<code><pre>"); lineToSendToId[id] += 1; break; |
andrewboyson | 1:94282484baae | 128 | case 3: len = fillLogChunk(); if (len < SEND_BUFFER_SIZE) lineToSendToId[id] += 1; break; //only increments after the last chunk |
andrewboyson | 1:94282484baae | 129 | case 4: len = fillChunk( |
andrewboyson | 1:94282484baae | 130 | "</pre></code>\r\n" |
andrewboyson | 1:94282484baae | 131 | "</body>\r\n" |
andrewboyson | 1:94282484baae | 132 | "</html>\r\n"); |
andrewboyson | 1:94282484baae | 133 | lineToSendToId[id] = -1; |
andrewboyson | 1:94282484baae | 134 | break; |
andrewboyson | 1:94282484baae | 135 | } |
andrewboyson | 1:94282484baae | 136 | return len; |
andrewboyson | 1:94282484baae | 137 | } |
andrewboyson | 1:94282484baae | 138 | |
andrewboyson | 1:94282484baae | 139 | static int fillLed(int id) |
andrewboyson | 1:94282484baae | 140 | { |
andrewboyson | 1:94282484baae | 141 | int len; |
andrewboyson | 1:94282484baae | 142 | switch (lineToSendToId[id]) |
andrewboyson | 1:94282484baae | 143 | { |
andrewboyson | 1:94282484baae | 144 | case 1: |
andrewboyson | 1:94282484baae | 145 | len = fillChunk(header); |
andrewboyson | 1:94282484baae | 146 | lineToSendToId[id] += 1; |
andrewboyson | 1:94282484baae | 147 | break; |
andrewboyson | 1:94282484baae | 148 | case 2: |
andrewboyson | 5:6226f3c566ef | 149 | len = 0; |
andrewboyson | 5:6226f3c566ef | 150 | len = addChunkF(len, "Version: %s<br/>\r\n", AtEspVersion); |
andrewboyson | 5:6226f3c566ef | 151 | len = addChunkF(len, "Temperature: %1.1f\r\n", DS18B20Value / 16.0); |
andrewboyson | 2:06fa34661f19 | 152 | lineToSendToId[id] += 1; |
andrewboyson | 2:06fa34661f19 | 153 | break; |
andrewboyson | 2:06fa34661f19 | 154 | case 3: |
andrewboyson | 1:94282484baae | 155 | len = fillChunk( |
andrewboyson | 1:94282484baae | 156 | "<form action='/' method='get'>\r\n" |
andrewboyson | 1:94282484baae | 157 | "<input type='hidden' name='ledonoff'>\r\n"); |
andrewboyson | 1:94282484baae | 158 | lineToSendToId[id] += 1; |
andrewboyson | 1:94282484baae | 159 | break; |
andrewboyson | 2:06fa34661f19 | 160 | case 4: |
andrewboyson | 1:94282484baae | 161 | len = fillChunk("Led <input type='checkbox' name='led' value='on'"); |
andrewboyson | 1:94282484baae | 162 | if (Led1) len = addChunk(len, " checked='checked'"); |
andrewboyson | 1:94282484baae | 163 | len = addChunk(len, ">\r\n"); |
andrewboyson | 1:94282484baae | 164 | lineToSendToId[id] += 1; |
andrewboyson | 1:94282484baae | 165 | break; |
andrewboyson | 2:06fa34661f19 | 166 | case 5: |
andrewboyson | 1:94282484baae | 167 | len = fillChunk( |
andrewboyson | 1:94282484baae | 168 | "<input type='submit' value='Set'><br/>\r\n" |
andrewboyson | 1:94282484baae | 169 | "</form>\r\n" |
andrewboyson | 1:94282484baae | 170 | "</body>\r\n" |
andrewboyson | 1:94282484baae | 171 | "</html>\r\n"); |
andrewboyson | 1:94282484baae | 172 | lineToSendToId[id] = -1; |
andrewboyson | 1:94282484baae | 173 | break; |
andrewboyson | 1:94282484baae | 174 | } |
andrewboyson | 1:94282484baae | 175 | return len; |
andrewboyson | 1:94282484baae | 176 | } |
andrewboyson | 1:94282484baae | 177 | static int fillSendBuffer(int id) |
andrewboyson | 1:94282484baae | 178 | { |
andrewboyson | 1:94282484baae | 179 | switch(whatToSendToId[id]) |
andrewboyson | 1:94282484baae | 180 | { |
andrewboyson | 1:94282484baae | 181 | case WHAT_NOT_FOUND: return fillNotFound(id); |
andrewboyson | 1:94282484baae | 182 | case WHAT_BAD_REQUEST: return fillBadRequest(id); |
andrewboyson | 1:94282484baae | 183 | case WHAT_BAD_METHOD: return fillBadMethod(id); |
andrewboyson | 1:94282484baae | 184 | case WHAT_LOG: return fillLog(id); |
andrewboyson | 1:94282484baae | 185 | case WHAT_LED: return fillLed(id); |
andrewboyson | 1:94282484baae | 186 | default: |
andrewboyson | 1:94282484baae | 187 | LogF("No such 'whatToSendToId' %s", whatToSendToId[id]); |
andrewboyson | 1:94282484baae | 188 | return -1; |
andrewboyson | 0:09f915e6f9f6 | 189 | } |
andrewboyson | 0:09f915e6f9f6 | 190 | } |
andrewboyson | 1:94282484baae | 191 | 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 | 192 | { |
andrewboyson | 1:94282484baae | 193 | char* p = recvbuffer; |
andrewboyson | 1:94282484baae | 194 | char* pE = recvbuffer + RECV_BUFFER_SIZE; |
andrewboyson | 1:94282484baae | 195 | |
andrewboyson | 1:94282484baae | 196 | *ppMethod = NULL; |
andrewboyson | 1:94282484baae | 197 | *ppPath = NULL; |
andrewboyson | 1:94282484baae | 198 | *ppQuery = NULL; |
andrewboyson | 1:94282484baae | 199 | *pLenMethod = 0; |
andrewboyson | 1:94282484baae | 200 | *pLenPath = 0; |
andrewboyson | 1:94282484baae | 201 | *pLenQuery = 0; |
andrewboyson | 0:09f915e6f9f6 | 202 | |
andrewboyson | 1:94282484baae | 203 | while (*p == ' ') //Loop to non space |
andrewboyson | 1:94282484baae | 204 | { |
andrewboyson | 1:94282484baae | 205 | if (p == pE) return -1; |
andrewboyson | 1:94282484baae | 206 | if (*p < ' ') return -1; |
andrewboyson | 1:94282484baae | 207 | if (*p >= 0x7f) return -1; |
andrewboyson | 1:94282484baae | 208 | p++; |
andrewboyson | 1:94282484baae | 209 | } |
andrewboyson | 1:94282484baae | 210 | *ppMethod = p; //Record the start of the method GET or POST |
andrewboyson | 1:94282484baae | 211 | |
andrewboyson | 1:94282484baae | 212 | while (*p != ' ') //Loop to a space |
andrewboyson | 1:94282484baae | 213 | { |
andrewboyson | 1:94282484baae | 214 | if (p == pE) return -1; |
andrewboyson | 1:94282484baae | 215 | if (*p < ' ') return -1; |
andrewboyson | 1:94282484baae | 216 | if (*p >= 0x7f) return -1; |
andrewboyson | 1:94282484baae | 217 | p++; |
andrewboyson | 1:94282484baae | 218 | } |
andrewboyson | 1:94282484baae | 219 | *pLenMethod = p - *ppMethod; //Record the length of the method GET or POST |
andrewboyson | 0:09f915e6f9f6 | 220 | |
andrewboyson | 1:94282484baae | 221 | |
andrewboyson | 1:94282484baae | 222 | while (*p == ' ') //Loop to non space |
andrewboyson | 1:94282484baae | 223 | { |
andrewboyson | 1:94282484baae | 224 | if (p == pE) return -1; |
andrewboyson | 1:94282484baae | 225 | if (*p < ' ') return -1; |
andrewboyson | 1:94282484baae | 226 | if (*p >= 0x7f) return -1; |
andrewboyson | 1:94282484baae | 227 | p++; |
andrewboyson | 1:94282484baae | 228 | } |
andrewboyson | 1:94282484baae | 229 | *ppPath = p; //Record the start of the file part of the url |
andrewboyson | 1:94282484baae | 230 | |
andrewboyson | 1:94282484baae | 231 | while (*p != ' ') //Loop to space |
andrewboyson | 1:94282484baae | 232 | { |
andrewboyson | 1:94282484baae | 233 | if (p == pE) return -1; |
andrewboyson | 1:94282484baae | 234 | if (*p < ' ') return -1; |
andrewboyson | 1:94282484baae | 235 | if (*p >= 0x7f) return -1; |
andrewboyson | 1:94282484baae | 236 | if (*p == '?') *ppQuery = p + 1; |
andrewboyson | 1:94282484baae | 237 | p++; |
andrewboyson | 1:94282484baae | 238 | } |
andrewboyson | 1:94282484baae | 239 | |
andrewboyson | 1:94282484baae | 240 | if (*ppQuery) //Calulate length of the file and query parts |
andrewboyson | 0:09f915e6f9f6 | 241 | { |
andrewboyson | 1:94282484baae | 242 | *pLenPath = *ppQuery - *ppPath - 1; |
andrewboyson | 1:94282484baae | 243 | *pLenQuery = p - *ppQuery; |
andrewboyson | 1:94282484baae | 244 | } |
andrewboyson | 1:94282484baae | 245 | else |
andrewboyson | 1:94282484baae | 246 | { |
andrewboyson | 1:94282484baae | 247 | *pLenPath = p - *ppPath; |
andrewboyson | 1:94282484baae | 248 | *pLenQuery = 0; |
andrewboyson | 1:94282484baae | 249 | } |
andrewboyson | 1:94282484baae | 250 | |
andrewboyson | 1:94282484baae | 251 | return 0; |
andrewboyson | 1:94282484baae | 252 | } |
andrewboyson | 1:94282484baae | 253 | int compare(char* mem, int len, char* str) //Returns true if same and false if not |
andrewboyson | 1:94282484baae | 254 | { |
andrewboyson | 1:94282484baae | 255 | if (strlen(str) != len) return false; |
andrewboyson | 1:94282484baae | 256 | if (memcmp(mem, str, len)) return false; |
andrewboyson | 1:94282484baae | 257 | return true; |
andrewboyson | 1:94282484baae | 258 | } |
andrewboyson | 1:94282484baae | 259 | static int recvMain() |
andrewboyson | 1:94282484baae | 260 | { |
andrewboyson | 1:94282484baae | 261 | //Wait for data to be available oneshot |
andrewboyson | 1:94282484baae | 262 | if (EspDataAvailable != ESP_AVAILABLE) return 0; |
andrewboyson | 1:94282484baae | 263 | |
andrewboyson | 1:94282484baae | 264 | //Ignore ids that have been reserved elsewhere (ie NTP) |
andrewboyson | 1:94282484baae | 265 | if (EspIpdReserved[EspIpdId]) return 0; |
andrewboyson | 1:94282484baae | 266 | |
andrewboyson | 1:94282484baae | 267 | //Set up the next line to send to be the first |
andrewboyson | 1:94282484baae | 268 | lineToSendToId[EspIpdId] = 1; |
andrewboyson | 1:94282484baae | 269 | |
andrewboyson | 1:94282484baae | 270 | char* pMethod; |
andrewboyson | 1:94282484baae | 271 | char* pPath; |
andrewboyson | 1:94282484baae | 272 | char* pQuery; |
andrewboyson | 1:94282484baae | 273 | int lenMethod; |
andrewboyson | 1:94282484baae | 274 | int lenQuery; |
andrewboyson | 1:94282484baae | 275 | int lenPath; |
andrewboyson | 1:94282484baae | 276 | int r = splitRequest(&pMethod, &pPath, &pQuery, &lenMethod, &lenPath, &lenQuery); |
andrewboyson | 1:94282484baae | 277 | if (r) |
andrewboyson | 1:94282484baae | 278 | { |
andrewboyson | 1:94282484baae | 279 | whatToSendToId[EspIpdId] = WHAT_BAD_REQUEST; |
andrewboyson | 1:94282484baae | 280 | return 0; |
andrewboyson | 1:94282484baae | 281 | } |
andrewboyson | 1:94282484baae | 282 | |
andrewboyson | 1:94282484baae | 283 | if (!compare(pMethod, lenMethod, "GET")) |
andrewboyson | 1:94282484baae | 284 | { |
andrewboyson | 1:94282484baae | 285 | whatToSendToId[EspIpdId] = WHAT_BAD_METHOD; |
andrewboyson | 1:94282484baae | 286 | return 0; |
andrewboyson | 1:94282484baae | 287 | } |
andrewboyson | 1:94282484baae | 288 | |
andrewboyson | 1:94282484baae | 289 | if (compare(pPath, lenPath, "/")) |
andrewboyson | 1:94282484baae | 290 | { |
andrewboyson | 1:94282484baae | 291 | if (pQuery) |
andrewboyson | 0:09f915e6f9f6 | 292 | { |
andrewboyson | 1:94282484baae | 293 | if (compare(pQuery, lenQuery, "ledonoff=&led=on")) Led1 = 1; |
andrewboyson | 1:94282484baae | 294 | if (compare(pQuery, lenQuery, "ledonoff=" )) Led1 = 0; |
andrewboyson | 0:09f915e6f9f6 | 295 | } |
andrewboyson | 1:94282484baae | 296 | whatToSendToId[EspIpdId] = WHAT_LED; |
andrewboyson | 1:94282484baae | 297 | return 0; |
andrewboyson | 1:94282484baae | 298 | } |
andrewboyson | 1:94282484baae | 299 | |
andrewboyson | 1:94282484baae | 300 | if (compare(pPath, lenPath, "/log")) |
andrewboyson | 1:94282484baae | 301 | { |
andrewboyson | 1:94282484baae | 302 | whatToSendToId[EspIpdId] = WHAT_LOG; |
andrewboyson | 1:94282484baae | 303 | return 0; |
andrewboyson | 1:94282484baae | 304 | } |
andrewboyson | 1:94282484baae | 305 | |
andrewboyson | 1:94282484baae | 306 | whatToSendToId[EspIpdId] = WHAT_NOT_FOUND; |
andrewboyson | 1:94282484baae | 307 | return 0; |
andrewboyson | 1:94282484baae | 308 | } |
andrewboyson | 1:94282484baae | 309 | static int sendMain() |
andrewboyson | 1:94282484baae | 310 | { |
andrewboyson | 1:94282484baae | 311 | //Do nothing if a command is already in progress |
andrewboyson | 1:94282484baae | 312 | if (AtBusy()) return 0; |
andrewboyson | 1:94282484baae | 313 | |
andrewboyson | 1:94282484baae | 314 | //Send data. Do each id in turn to avoid interleaved calls to fillers like LogEnumerate which are not reentrant. |
andrewboyson | 1:94282484baae | 315 | for(int id = 0; id < 4; id++) |
andrewboyson | 1:94282484baae | 316 | { |
andrewboyson | 1:94282484baae | 317 | if (lineToSendToId[id] > 0) |
andrewboyson | 0:09f915e6f9f6 | 318 | { |
andrewboyson | 1:94282484baae | 319 | int length = fillSendBuffer(id); |
andrewboyson | 1:94282484baae | 320 | if (length < 0) return -1; |
andrewboyson | 1:94282484baae | 321 | if (length > 0) AtSendData(id, length, sendbuffer, NULL); |
andrewboyson | 1:94282484baae | 322 | } |
andrewboyson | 1:94282484baae | 323 | else if (lineToSendToId[id] < 0) |
andrewboyson | 1:94282484baae | 324 | { |
andrewboyson | 1:94282484baae | 325 | AtClose(id, NULL); |
andrewboyson | 1:94282484baae | 326 | lineToSendToId[id] = 0; |
andrewboyson | 0:09f915e6f9f6 | 327 | } |
andrewboyson | 0:09f915e6f9f6 | 328 | } |
andrewboyson | 0:09f915e6f9f6 | 329 | |
andrewboyson | 1:94282484baae | 330 | return 0; |
andrewboyson | 1:94282484baae | 331 | } |
andrewboyson | 1:94282484baae | 332 | int startMain() |
andrewboyson | 1:94282484baae | 333 | { |
andrewboyson | 1:94282484baae | 334 | //Do nothing if a command is already in progress |
andrewboyson | 1:94282484baae | 335 | if (AtBusy()) return 0; |
andrewboyson | 1:94282484baae | 336 | |
andrewboyson | 1:94282484baae | 337 | //Do nothing until WiFi is running |
andrewboyson | 1:94282484baae | 338 | if (!WifiStarted()) return 0; |
andrewboyson | 0:09f915e6f9f6 | 339 | |
andrewboyson | 1:94282484baae | 340 | //Start the server if not started |
andrewboyson | 1:94282484baae | 341 | static int startServerReply = AT_NONE; |
andrewboyson | 1:94282484baae | 342 | if (startServerReply != AT_SUCCESS) AtStartServer(SERVER_PORT, &startServerReply); |
andrewboyson | 1:94282484baae | 343 | return 0; |
andrewboyson | 1:94282484baae | 344 | } |
andrewboyson | 1:94282484baae | 345 | int ServerMain() |
andrewboyson | 1:94282484baae | 346 | { |
andrewboyson | 1:94282484baae | 347 | if (startMain()) return -1; |
andrewboyson | 1:94282484baae | 348 | if ( recvMain()) return -1; |
andrewboyson | 1:94282484baae | 349 | if ( sendMain()) return -1; |
andrewboyson | 0:09f915e6f9f6 | 350 | |
andrewboyson | 0:09f915e6f9f6 | 351 | return 0; |
andrewboyson | 0:09f915e6f9f6 | 352 | } |