Backing up an unused program in case of future need

Dependencies:   mbed

Committer:
andrewboyson
Date:
Tue May 31 07:35:28 2016 +0000
Revision:
6:be97d38e0b01
Parent:
4:e076884ef8bd
Moved to wait_us for delays below 100us and timer.read_us above. This replaced interrupts which worked but tended to be unreliable.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 0:09f915e6f9f6 1 #include "mbed.h"
andrewboyson 0:09f915e6f9f6 2 #include "log.h"
andrewboyson 0:09f915e6f9f6 3 #include "esp.h"
andrewboyson 0:09f915e6f9f6 4 #include "io.h"
andrewboyson 0:09f915e6f9f6 5 #include "at.h"
andrewboyson 0:09f915e6f9f6 6 #include "wifi.h"
andrewboyson 0:09f915e6f9f6 7
andrewboyson 0:09f915e6f9f6 8 #define TIMEOUT 10
andrewboyson 0:09f915e6f9f6 9 #define TIMEOUT_OK 2
andrewboyson 0:09f915e6f9f6 10
andrewboyson 0:09f915e6f9f6 11 #define WAIT_FOR_COMMAND 0
andrewboyson 0:09f915e6f9f6 12 #define WAIT_FOR_ESP_READY 1
andrewboyson 0:09f915e6f9f6 13 #define WAIT_FOR_WIFI_CONNECTED 2
andrewboyson 0:09f915e6f9f6 14 #define WAIT_FOR_WIFI_GOT_IP 3
andrewboyson 2:06fa34661f19 15 #define WAIT_FOR_STATUS 4
andrewboyson 2:06fa34661f19 16 #define WAIT_FOR_VERSION 5
andrewboyson 2:06fa34661f19 17 #define WAIT_FOR_OK 6
andrewboyson 2:06fa34661f19 18 #define WAIT_FOR_SEND_OK 7
andrewboyson 0:09f915e6f9f6 19 static int wait_for;
andrewboyson 0:09f915e6f9f6 20
andrewboyson 0:09f915e6f9f6 21 static int * pFeedback;
andrewboyson 0:09f915e6f9f6 22 static void startCommand(int* pStatus, int waitfor)
andrewboyson 0:09f915e6f9f6 23 {
andrewboyson 0:09f915e6f9f6 24 wait_for = waitfor;
andrewboyson 0:09f915e6f9f6 25 pFeedback = pStatus;
andrewboyson 0:09f915e6f9f6 26 if (pFeedback) *pFeedback = AT_NONE;
andrewboyson 0:09f915e6f9f6 27 }
andrewboyson 0:09f915e6f9f6 28 static void finishAndReset(int feedback)
andrewboyson 0:09f915e6f9f6 29 {
andrewboyson 0:09f915e6f9f6 30 if (pFeedback)
andrewboyson 0:09f915e6f9f6 31 {
andrewboyson 0:09f915e6f9f6 32 *pFeedback = feedback;
andrewboyson 0:09f915e6f9f6 33 pFeedback = NULL;
andrewboyson 0:09f915e6f9f6 34 }
andrewboyson 0:09f915e6f9f6 35 wait_for = WAIT_FOR_COMMAND;
andrewboyson 0:09f915e6f9f6 36 }
andrewboyson 0:09f915e6f9f6 37 void AtReleaseResetAndStart(int *pStatus)
andrewboyson 0:09f915e6f9f6 38 {
andrewboyson 0:09f915e6f9f6 39 startCommand(pStatus, WAIT_FOR_ESP_READY);
andrewboyson 0:09f915e6f9f6 40 EspReleaseFromReset();
andrewboyson 0:09f915e6f9f6 41 }
andrewboyson 0:09f915e6f9f6 42 void AtConnect(const char *ssid, const char *password, int *pStatus)
andrewboyson 0:09f915e6f9f6 43 {
andrewboyson 0:09f915e6f9f6 44 startCommand(pStatus, WAIT_FOR_OK);
andrewboyson 6:be97d38e0b01 45 EspSendCommandF("AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, password);
andrewboyson 0:09f915e6f9f6 46 }
andrewboyson 0:09f915e6f9f6 47 void AtAt(int *pStatus)
andrewboyson 0:09f915e6f9f6 48 {
andrewboyson 0:09f915e6f9f6 49 startCommand(pStatus, WAIT_FOR_OK);
andrewboyson 6:be97d38e0b01 50 EspSendCommand("AT\r\n");
andrewboyson 0:09f915e6f9f6 51 }
andrewboyson 0:09f915e6f9f6 52
andrewboyson 0:09f915e6f9f6 53 void AtConnectId(int id, char * type, char * addr, int port, void * buffer, int bufferlength, int *pStatus)
andrewboyson 0:09f915e6f9f6 54 {
andrewboyson 0:09f915e6f9f6 55 startCommand(pStatus, WAIT_FOR_OK);
andrewboyson 0:09f915e6f9f6 56
andrewboyson 0:09f915e6f9f6 57 EspIpdBuffer[id] = buffer;
andrewboyson 0:09f915e6f9f6 58 EspIpdBufferLen[id] = bufferlength;
andrewboyson 0:09f915e6f9f6 59
andrewboyson 6:be97d38e0b01 60 EspSendCommandF("AT+CIPSTART=%d,\"%s\",\"%s\",%d\r\n", id, type, addr, port);
andrewboyson 0:09f915e6f9f6 61 }
andrewboyson 0:09f915e6f9f6 62 void AtStartServer(int port, int *pStatus)
andrewboyson 0:09f915e6f9f6 63 {
andrewboyson 0:09f915e6f9f6 64 startCommand(pStatus, WAIT_FOR_OK);
andrewboyson 6:be97d38e0b01 65 EspSendCommandF("AT+CIPSERVER=1,%d\r\n", port);
andrewboyson 0:09f915e6f9f6 66 }
andrewboyson 0:09f915e6f9f6 67 void AtClose(int id, int *pStatus)
andrewboyson 0:09f915e6f9f6 68 {
andrewboyson 0:09f915e6f9f6 69 startCommand(pStatus, WAIT_FOR_OK);
andrewboyson 6:be97d38e0b01 70 EspSendCommandF("AT+CIPCLOSE=%d\r\n", id);
andrewboyson 0:09f915e6f9f6 71 }
andrewboyson 0:09f915e6f9f6 72 void AtMux(int *pStatus)
andrewboyson 0:09f915e6f9f6 73 {
andrewboyson 0:09f915e6f9f6 74 startCommand(pStatus, WAIT_FOR_OK);
andrewboyson 6:be97d38e0b01 75 EspSendCommand("AT+CIPMUX=1\r\n");
andrewboyson 0:09f915e6f9f6 76 }
andrewboyson 0:09f915e6f9f6 77 void AtBaud(int baud, int *pStatus)
andrewboyson 0:09f915e6f9f6 78 {
andrewboyson 0:09f915e6f9f6 79 startCommand(pStatus, WAIT_FOR_OK);
andrewboyson 6:be97d38e0b01 80 EspSendCommandF("AT+CIOBAUD=%d\r\n", baud);
andrewboyson 0:09f915e6f9f6 81 }
andrewboyson 2:06fa34661f19 82 int AtEspStatus;
andrewboyson 2:06fa34661f19 83 void AtGetEspStatus(int *pStatus)
andrewboyson 2:06fa34661f19 84 {
andrewboyson 2:06fa34661f19 85 AtEspStatus = 0;
andrewboyson 2:06fa34661f19 86 startCommand(pStatus, WAIT_FOR_STATUS);
andrewboyson 6:be97d38e0b01 87 EspSendCommand("AT+CIPSTATUS\r\n");
andrewboyson 2:06fa34661f19 88 }
andrewboyson 2:06fa34661f19 89 char AtEspVersion[20];
andrewboyson 2:06fa34661f19 90 static int versionlinecount;
andrewboyson 2:06fa34661f19 91 void AtGetEspVersion(int *pStatus)
andrewboyson 2:06fa34661f19 92 {
andrewboyson 2:06fa34661f19 93 AtEspVersion[0] = '\0';
andrewboyson 2:06fa34661f19 94 startCommand(pStatus, WAIT_FOR_VERSION);
andrewboyson 6:be97d38e0b01 95 EspSendCommand("AT+GMR\r\n");
andrewboyson 2:06fa34661f19 96 versionlinecount = 0;
andrewboyson 2:06fa34661f19 97 }
andrewboyson 0:09f915e6f9f6 98 void AtSendData(int id, int length, const void * pdata, int *pStatus)
andrewboyson 0:09f915e6f9f6 99 {
andrewboyson 0:09f915e6f9f6 100 startCommand(pStatus, WAIT_FOR_SEND_OK);
andrewboyson 0:09f915e6f9f6 101 EspLengthToSend = length;
andrewboyson 0:09f915e6f9f6 102 EspDataToSend = pdata;
andrewboyson 6:be97d38e0b01 103 EspSendCommandF("AT+CIPSEND=%d,%d\r\n", id, length);
andrewboyson 0:09f915e6f9f6 104 }
andrewboyson 0:09f915e6f9f6 105
andrewboyson 0:09f915e6f9f6 106 int AtBusy()
andrewboyson 0:09f915e6f9f6 107 {
andrewboyson 0:09f915e6f9f6 108 return wait_for;
andrewboyson 0:09f915e6f9f6 109 }
andrewboyson 0:09f915e6f9f6 110 void AtResetAndStop()
andrewboyson 0:09f915e6f9f6 111 {
andrewboyson 0:09f915e6f9f6 112 startCommand(NULL, WAIT_FOR_COMMAND);
andrewboyson 0:09f915e6f9f6 113 EspResetAndStop();
andrewboyson 0:09f915e6f9f6 114 WifiStatus = WIFI_STOPPED;
andrewboyson 0:09f915e6f9f6 115 }
andrewboyson 2:06fa34661f19 116 int AtInit()
andrewboyson 0:09f915e6f9f6 117 {
andrewboyson 0:09f915e6f9f6 118 startCommand(NULL, WAIT_FOR_COMMAND);
andrewboyson 0:09f915e6f9f6 119 WifiStatus = WIFI_STOPPED;
andrewboyson 2:06fa34661f19 120 return 0;
andrewboyson 0:09f915e6f9f6 121 }
andrewboyson 0:09f915e6f9f6 122 int handleLine()
andrewboyson 0:09f915e6f9f6 123 {
andrewboyson 0:09f915e6f9f6 124 switch (wait_for)
andrewboyson 0:09f915e6f9f6 125 {
andrewboyson 0:09f915e6f9f6 126 //No command
andrewboyson 0:09f915e6f9f6 127 case WAIT_FOR_COMMAND:
andrewboyson 0:09f915e6f9f6 128 return 0;
andrewboyson 0:09f915e6f9f6 129
andrewboyson 0:09f915e6f9f6 130 //Connect
andrewboyson 0:09f915e6f9f6 131 case WAIT_FOR_ESP_READY:
andrewboyson 0:09f915e6f9f6 132 if (strcmp(EspLine, "ready") == 0)
andrewboyson 0:09f915e6f9f6 133 {
andrewboyson 0:09f915e6f9f6 134 WifiStatus = WIFI_READY;
andrewboyson 0:09f915e6f9f6 135 wait_for = WAIT_FOR_WIFI_CONNECTED;
andrewboyson 0:09f915e6f9f6 136 }
andrewboyson 0:09f915e6f9f6 137 return 0;
andrewboyson 0:09f915e6f9f6 138 case WAIT_FOR_WIFI_CONNECTED:
andrewboyson 0:09f915e6f9f6 139 if (strcmp(EspLine, "WIFI CONNECTED") == 0)
andrewboyson 0:09f915e6f9f6 140 {
andrewboyson 0:09f915e6f9f6 141 WifiStatus = WIFI_CONNECTED;
andrewboyson 0:09f915e6f9f6 142 wait_for = WAIT_FOR_WIFI_GOT_IP;
andrewboyson 0:09f915e6f9f6 143 }
andrewboyson 0:09f915e6f9f6 144 return 0;
andrewboyson 0:09f915e6f9f6 145 case WAIT_FOR_WIFI_GOT_IP:
andrewboyson 0:09f915e6f9f6 146 if (strcmp(EspLine, "WIFI GOT IP") == 0)
andrewboyson 0:09f915e6f9f6 147 {
andrewboyson 0:09f915e6f9f6 148 WifiStatus = WIFI_GOT_IP;
andrewboyson 0:09f915e6f9f6 149 finishAndReset(AT_SUCCESS);
andrewboyson 0:09f915e6f9f6 150 }
andrewboyson 0:09f915e6f9f6 151 return 0;
andrewboyson 0:09f915e6f9f6 152
andrewboyson 0:09f915e6f9f6 153 //Send command
andrewboyson 0:09f915e6f9f6 154 case WAIT_FOR_SEND_OK:
andrewboyson 0:09f915e6f9f6 155 if (strcmp(EspLine, "SEND OK") == 0) finishAndReset(AT_SUCCESS);
andrewboyson 0:09f915e6f9f6 156 return 0;
andrewboyson 2:06fa34661f19 157
andrewboyson 2:06fa34661f19 158 //Status command
andrewboyson 2:06fa34661f19 159 case WAIT_FOR_STATUS:
andrewboyson 2:06fa34661f19 160 if (sscanf(EspLine, "STATUS:%d", &AtEspStatus) == 1) wait_for = WAIT_FOR_OK;
andrewboyson 2:06fa34661f19 161 return 0;
andrewboyson 2:06fa34661f19 162
andrewboyson 2:06fa34661f19 163 //Version command
andrewboyson 2:06fa34661f19 164 case WAIT_FOR_VERSION:
andrewboyson 2:06fa34661f19 165 if (++versionlinecount == 3)
andrewboyson 2:06fa34661f19 166 {
andrewboyson 2:06fa34661f19 167 strcpy(AtEspVersion, EspLine);
andrewboyson 2:06fa34661f19 168 wait_for = WAIT_FOR_OK;
andrewboyson 2:06fa34661f19 169 }
andrewboyson 2:06fa34661f19 170 return 0;
andrewboyson 0:09f915e6f9f6 171
andrewboyson 0:09f915e6f9f6 172 //Most commands
andrewboyson 0:09f915e6f9f6 173 case WAIT_FOR_OK:
andrewboyson 0:09f915e6f9f6 174 if (strcmp(EspLine, "OK" ) == 0) finishAndReset(AT_SUCCESS);
andrewboyson 0:09f915e6f9f6 175 if (strcmp(EspLine, "ERROR" ) == 0) finishAndReset(AT_ERROR);
andrewboyson 0:09f915e6f9f6 176 return 0;
andrewboyson 0:09f915e6f9f6 177
andrewboyson 0:09f915e6f9f6 178 default:
andrewboyson 0:09f915e6f9f6 179 LogF("Unknown wait_for %d\r\n", wait_for);
andrewboyson 0:09f915e6f9f6 180 return -1;
andrewboyson 0:09f915e6f9f6 181 }
andrewboyson 0:09f915e6f9f6 182 }
andrewboyson 0:09f915e6f9f6 183 int AtMain()
andrewboyson 0:09f915e6f9f6 184 {
andrewboyson 0:09f915e6f9f6 185
andrewboyson 0:09f915e6f9f6 186 //Monitor time taken
andrewboyson 0:09f915e6f9f6 187 static Timer receiveTimer;
andrewboyson 0:09f915e6f9f6 188 if (wait_for)
andrewboyson 0:09f915e6f9f6 189 {
andrewboyson 0:09f915e6f9f6 190 receiveTimer.start();
andrewboyson 0:09f915e6f9f6 191 }
andrewboyson 0:09f915e6f9f6 192 else
andrewboyson 0:09f915e6f9f6 193 {
andrewboyson 0:09f915e6f9f6 194 receiveTimer.stop();
andrewboyson 0:09f915e6f9f6 195 receiveTimer.reset();
andrewboyson 0:09f915e6f9f6 196 }
andrewboyson 0:09f915e6f9f6 197
andrewboyson 0:09f915e6f9f6 198 //Check for problems; feedback status and reset
andrewboyson 0:09f915e6f9f6 199 if (receiveTimer.read() > TIMEOUT || (wait_for == WAIT_FOR_OK && receiveTimer.read() > TIMEOUT_OK))
andrewboyson 0:09f915e6f9f6 200 {
andrewboyson 0:09f915e6f9f6 201 finishAndReset(AT_RESPONCE_TIMEOUT);
andrewboyson 0:09f915e6f9f6 202 LogCrLf("Command timed out");
andrewboyson 0:09f915e6f9f6 203 return 0;
andrewboyson 0:09f915e6f9f6 204 }
andrewboyson 0:09f915e6f9f6 205
andrewboyson 0:09f915e6f9f6 206
andrewboyson 0:09f915e6f9f6 207 //Depending on what the Esp has returned: do nothing; treat the line or finish and reset
andrewboyson 0:09f915e6f9f6 208 switch (EspLineAvailable)
andrewboyson 0:09f915e6f9f6 209 {
andrewboyson 0:09f915e6f9f6 210 case ESP_IDLE:
andrewboyson 0:09f915e6f9f6 211 break;
andrewboyson 0:09f915e6f9f6 212 case ESP_AVAILABLE:
andrewboyson 0:09f915e6f9f6 213 if (handleLine()) return -1;
andrewboyson 0:09f915e6f9f6 214 break;
andrewboyson 0:09f915e6f9f6 215 case ESP_TIMEOUT:
andrewboyson 0:09f915e6f9f6 216 finishAndReset(AT_LINE_TIMEOUT);
andrewboyson 0:09f915e6f9f6 217 LogCrLf("Esp timed out");
andrewboyson 0:09f915e6f9f6 218 break;
andrewboyson 0:09f915e6f9f6 219 case ESP_OVERFLOW:
andrewboyson 1:94282484baae 220 if (wait_for == WAIT_FOR_ESP_READY) break; //Ignore overflows from the esp's 450 byte boot message
andrewboyson 0:09f915e6f9f6 221 finishAndReset(AT_LINE_OVERFLOW);
andrewboyson 0:09f915e6f9f6 222 LogCrLf("Esp buffer overflow");
andrewboyson 0:09f915e6f9f6 223 break;
andrewboyson 0:09f915e6f9f6 224 default:
andrewboyson 0:09f915e6f9f6 225 LogF("Unknown EsplineAvailable %d\r\n");
andrewboyson 0:09f915e6f9f6 226 return -1;
andrewboyson 0:09f915e6f9f6 227 }
andrewboyson 0:09f915e6f9f6 228
andrewboyson 0:09f915e6f9f6 229 return 0;
andrewboyson 0:09f915e6f9f6 230 }