Backing up an unused program in case of future need

Dependencies:   mbed

Committer:
andrewboyson
Date:
Thu Dec 06 11:40:19 2018 +0000
Revision:
8:45a0205a298f
Parent:
3:accba7e07a0d
Backing up

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 0:09f915e6f9f6 1 #include "mbed.h"
andrewboyson 3:accba7e07a0d 2 #include "uart.h"
andrewboyson 0:09f915e6f9f6 3 #include "esp.h"
andrewboyson 0:09f915e6f9f6 4 #include "at.h"
andrewboyson 0:09f915e6f9f6 5 #include "wifi.h"
andrewboyson 0:09f915e6f9f6 6 #include "log.h"
andrewboyson 0:09f915e6f9f6 7 #include "io.h"
andrewboyson 2:06fa34661f19 8 #include "cfg.h"
andrewboyson 0:09f915e6f9f6 9
andrewboyson 2:06fa34661f19 10 #define IP_WAIT_TIME_MS 5000
andrewboyson 0:09f915e6f9f6 11
andrewboyson 0:09f915e6f9f6 12 int WifiStatus;
andrewboyson 0:09f915e6f9f6 13
andrewboyson 2:06fa34661f19 14 /*
andrewboyson 2:06fa34661f19 15 START
andrewboyson 2:06fa34661f19 16 =====
andrewboyson 2:06fa34661f19 17 AT_SUCCESS + WIFI_GOT_IP -> MUX Under normal circumstances the module will start at the correct baud and already set up for the wifi.
andrewboyson 2:06fa34661f19 18 AT_TIMEOUT + WIFI_CONNECTED -> GET_STATUS Connected to WiFi but no IP given - give the wifi a bit longer
andrewboyson 2:06fa34661f19 19 AT_TIMEOUT + WIFI_READY -> GET_STATUS Not connected to WiFi - give the wifi a bit longer
andrewboyson 2:06fa34661f19 20 AT_TIMEOUT + WIFI_NONE -> AUTOBAUD Not even the module ready message was received: probably the baud rate is wrong so check each baud.
andrewboyson 2:06fa34661f19 21
andrewboyson 2:06fa34661f19 22 AUTOBAUD
andrewboyson 2:06fa34661f19 23 ========
andrewboyson 2:06fa34661f19 24 Changes the baud rate; sends AT and waits for OK
andrewboyson 2:06fa34661f19 25 AT_SUCCESS -> CHANGE_BAUD Found a baud rate which works so now need to change to the correct baud rate
andrewboyson 2:06fa34661f19 26 AT_TIMEOUT Try the next baud rate
andrewboyson 2:06fa34661f19 27
andrewboyson 2:06fa34661f19 28 CHANGE_BAUD
andrewboyson 2:06fa34661f19 29 ===========
andrewboyson 2:06fa34661f19 30 AT_SUCCESS -> GET_STATUS Don't know the wifi status at this point so find it
andrewboyson 2:06fa34661f19 31
andrewboyson 2:06fa34661f19 32 GET_STATUS
andrewboyson 2:06fa34661f19 33 ==========
andrewboyson 2:06fa34661f19 34 wait until some time has passed since start
andrewboyson 2:06fa34661f19 35 AT_SUCCESS + WIFI_GOT_IP -> MUX
andrewboyson 2:06fa34661f19 36 AT_SUCCESS + WIFI_CONNECTED -> BOMB_OUT Connected to wifi but could not get an IP
andrewboyson 2:06fa34661f19 37 AT_SUCCESS + WIFI_READY -> CONNECT This happens when the module has never been, or has lost its connection to, the wifi.
andrewboyson 2:06fa34661f19 38 AT_SUCCESS + WIFI_NONE -> BOMB_OUT This should not happen
andrewboyson 2:06fa34661f19 39
andrewboyson 2:06fa34661f19 40 CONNECT
andrewboyson 2:06fa34661f19 41 =======
andrewboyson 2:06fa34661f19 42 AT_SUCCESS -> GET_STATUS
andrewboyson 2:06fa34661f19 43
andrewboyson 2:06fa34661f19 44 AT_MUX
andrewboyson 2:06fa34661f19 45 ======
andrewboyson 2:06fa34661f19 46
andrewboyson 2:06fa34661f19 47 AT_VERSION
andrewboyson 2:06fa34661f19 48 ==========
andrewboyson 2:06fa34661f19 49
andrewboyson 2:06fa34661f19 50 AT_STARTED
andrewboyson 2:06fa34661f19 51 ==========
andrewboyson 2:06fa34661f19 52
andrewboyson 2:06fa34661f19 53 */
andrewboyson 2:06fa34661f19 54
andrewboyson 2:06fa34661f19 55 #define AM_STOP 0
andrewboyson 2:06fa34661f19 56 #define AM_START 1
andrewboyson 2:06fa34661f19 57 #define AM_AUTOBAUD 2
andrewboyson 2:06fa34661f19 58 #define AM_CHANGE_BAUD 3
andrewboyson 2:06fa34661f19 59 #define AM_CONNECT 4
andrewboyson 2:06fa34661f19 60 #define AM_GET_STATUS 5
andrewboyson 2:06fa34661f19 61 #define AM_WAIT_WIFI 6
andrewboyson 2:06fa34661f19 62 #define AM_MUX 7
andrewboyson 2:06fa34661f19 63 #define AM_VERSION 8
andrewboyson 2:06fa34661f19 64 #define AM_STARTED 9
andrewboyson 2:06fa34661f19 65 static int am = AM_STOP;
andrewboyson 0:09f915e6f9f6 66 int WifiStarted() { return am == AM_STARTED; }
andrewboyson 0:09f915e6f9f6 67
andrewboyson 0:09f915e6f9f6 68 int WifiMain()
andrewboyson 0:09f915e6f9f6 69 {
andrewboyson 0:09f915e6f9f6 70 if (AtBusy()) return 0;
andrewboyson 0:09f915e6f9f6 71
andrewboyson 0:09f915e6f9f6 72 static int result = AT_NONE;
andrewboyson 3:accba7e07a0d 73 static int autoBaudMultiplier = 1;
andrewboyson 3:accba7e07a0d 74 static int autoBaudOdd = false;
andrewboyson 3:accba7e07a0d 75 static int autoBaudRate = 0;
andrewboyson 0:09f915e6f9f6 76
andrewboyson 2:06fa34661f19 77 static Timer wifiWaitTimer;
andrewboyson 0:09f915e6f9f6 78
andrewboyson 0:09f915e6f9f6 79 switch (am)
andrewboyson 0:09f915e6f9f6 80 {
andrewboyson 2:06fa34661f19 81 case AM_STOP:
andrewboyson 0:09f915e6f9f6 82 AtResetAndStop();
andrewboyson 2:06fa34661f19 83 am = AM_START;
andrewboyson 0:09f915e6f9f6 84 result = AT_NONE;
andrewboyson 0:09f915e6f9f6 85 break;
andrewboyson 2:06fa34661f19 86 case AM_START:
andrewboyson 0:09f915e6f9f6 87 switch (result)
andrewboyson 0:09f915e6f9f6 88 {
andrewboyson 0:09f915e6f9f6 89 case AT_NONE:
andrewboyson 0:09f915e6f9f6 90 AtReleaseResetAndStart(&result);
andrewboyson 2:06fa34661f19 91 wifiWaitTimer.reset();
andrewboyson 2:06fa34661f19 92 wifiWaitTimer.start();
andrewboyson 0:09f915e6f9f6 93 break;
andrewboyson 0:09f915e6f9f6 94 case AT_SUCCESS:
andrewboyson 0:09f915e6f9f6 95 switch (WifiStatus)
andrewboyson 0:09f915e6f9f6 96 {
andrewboyson 0:09f915e6f9f6 97 case WIFI_GOT_IP:
andrewboyson 2:06fa34661f19 98 am = AM_MUX;
andrewboyson 0:09f915e6f9f6 99 result = AT_NONE;
andrewboyson 0:09f915e6f9f6 100 break;
andrewboyson 0:09f915e6f9f6 101 default:
andrewboyson 0:09f915e6f9f6 102 LogF("Started WiFi and expected WIFI_GOT_IP but had %d", WifiStatus);
andrewboyson 0:09f915e6f9f6 103 return -1;
andrewboyson 0:09f915e6f9f6 104 }
andrewboyson 0:09f915e6f9f6 105 break;
andrewboyson 0:09f915e6f9f6 106 default:
andrewboyson 0:09f915e6f9f6 107 switch (WifiStatus)
andrewboyson 0:09f915e6f9f6 108 {
andrewboyson 0:09f915e6f9f6 109 case WIFI_READY:
andrewboyson 2:06fa34661f19 110 am = AM_CONNECT;
andrewboyson 0:09f915e6f9f6 111 result = AT_NONE;
andrewboyson 0:09f915e6f9f6 112 break;
andrewboyson 0:09f915e6f9f6 113 default:
andrewboyson 2:06fa34661f19 114 am = AM_AUTOBAUD;
andrewboyson 0:09f915e6f9f6 115 result = AT_NONE;
andrewboyson 3:accba7e07a0d 116 autoBaudMultiplier = 1;
andrewboyson 3:accba7e07a0d 117 autoBaudOdd = false;
andrewboyson 0:09f915e6f9f6 118 break;
andrewboyson 0:09f915e6f9f6 119 }
andrewboyson 0:09f915e6f9f6 120 break;
andrewboyson 0:09f915e6f9f6 121 }
andrewboyson 0:09f915e6f9f6 122 break;
andrewboyson 2:06fa34661f19 123 case AM_AUTOBAUD:
andrewboyson 0:09f915e6f9f6 124 switch (result)
andrewboyson 0:09f915e6f9f6 125 {
andrewboyson 0:09f915e6f9f6 126 case AT_NONE:
andrewboyson 3:accba7e07a0d 127 autoBaudRate = 9600 * autoBaudMultiplier;
andrewboyson 3:accba7e07a0d 128 if (autoBaudOdd) autoBaudRate += autoBaudRate >> 1; //Multiply by 1.5
andrewboyson 3:accba7e07a0d 129 UartBaud(autoBaudRate);
andrewboyson 0:09f915e6f9f6 130 AtAt(&result);
andrewboyson 0:09f915e6f9f6 131 break;
andrewboyson 0:09f915e6f9f6 132 case AT_SUCCESS:
andrewboyson 3:accba7e07a0d 133 LogF("Connected successfully at a baud rate of %d\r\n", autoBaudRate);
andrewboyson 2:06fa34661f19 134 am = AM_CHANGE_BAUD;
andrewboyson 0:09f915e6f9f6 135 result = AT_NONE;
andrewboyson 0:09f915e6f9f6 136 break;
andrewboyson 0:09f915e6f9f6 137 default:
andrewboyson 3:accba7e07a0d 138 if (autoBaudOdd) autoBaudMultiplier <<= 1;
andrewboyson 3:accba7e07a0d 139 autoBaudOdd = !autoBaudOdd;
andrewboyson 3:accba7e07a0d 140 if (autoBaudMultiplier > 64)
andrewboyson 0:09f915e6f9f6 141 {
andrewboyson 2:06fa34661f19 142 LogCrLf("Could not find a baud rate to connect to ESP");
andrewboyson 0:09f915e6f9f6 143 return -1;
andrewboyson 0:09f915e6f9f6 144 }
andrewboyson 0:09f915e6f9f6 145 result = AT_NONE;
andrewboyson 0:09f915e6f9f6 146 break;
andrewboyson 0:09f915e6f9f6 147 }
andrewboyson 0:09f915e6f9f6 148 break;
andrewboyson 2:06fa34661f19 149 case AM_CHANGE_BAUD:
andrewboyson 0:09f915e6f9f6 150 switch (result)
andrewboyson 0:09f915e6f9f6 151 {
andrewboyson 0:09f915e6f9f6 152 case AT_NONE:
andrewboyson 3:accba7e07a0d 153 LogF("Changing baud rate to %d\r\n", CfgBaud);
andrewboyson 2:06fa34661f19 154 AtBaud(CfgBaud, &result);
andrewboyson 0:09f915e6f9f6 155 break;
andrewboyson 0:09f915e6f9f6 156 case AT_SUCCESS:
andrewboyson 3:accba7e07a0d 157 UartBaud(CfgBaud);
andrewboyson 2:06fa34661f19 158 am = AM_GET_STATUS;
andrewboyson 0:09f915e6f9f6 159 result = AT_NONE;
andrewboyson 0:09f915e6f9f6 160 break;
andrewboyson 0:09f915e6f9f6 161 default:
andrewboyson 0:09f915e6f9f6 162 LogCrLf("Could not change baud");
andrewboyson 0:09f915e6f9f6 163 return -1;
andrewboyson 0:09f915e6f9f6 164 }
andrewboyson 0:09f915e6f9f6 165 break;
andrewboyson 2:06fa34661f19 166 case AM_CONNECT:
andrewboyson 0:09f915e6f9f6 167 switch (result)
andrewboyson 0:09f915e6f9f6 168 {
andrewboyson 0:09f915e6f9f6 169 case AT_NONE:
andrewboyson 2:06fa34661f19 170 AtConnect(CfgSsid, CfgPassword, &result);
andrewboyson 0:09f915e6f9f6 171 break;
andrewboyson 0:09f915e6f9f6 172 case AT_SUCCESS:
andrewboyson 2:06fa34661f19 173 wifiWaitTimer.reset();
andrewboyson 2:06fa34661f19 174 wifiWaitTimer.start();
andrewboyson 2:06fa34661f19 175 am = AM_GET_STATUS;
andrewboyson 0:09f915e6f9f6 176 result = AT_NONE;
andrewboyson 0:09f915e6f9f6 177 break;
andrewboyson 0:09f915e6f9f6 178 default:
andrewboyson 0:09f915e6f9f6 179 LogCrLf("Could not connect to WiFi");
andrewboyson 0:09f915e6f9f6 180 return -1;
andrewboyson 0:09f915e6f9f6 181 }
andrewboyson 0:09f915e6f9f6 182 break;
andrewboyson 2:06fa34661f19 183 case AM_GET_STATUS:
andrewboyson 2:06fa34661f19 184 if (wifiWaitTimer.read_ms() < IP_WAIT_TIME_MS) break; //Do nothing until enough time has passed
andrewboyson 2:06fa34661f19 185 wifiWaitTimer.stop();
andrewboyson 2:06fa34661f19 186 switch (result)
andrewboyson 2:06fa34661f19 187 {
andrewboyson 2:06fa34661f19 188 case AT_NONE:
andrewboyson 2:06fa34661f19 189 AtGetEspStatus(&result);
andrewboyson 2:06fa34661f19 190 break;
andrewboyson 2:06fa34661f19 191 case AT_SUCCESS:
andrewboyson 2:06fa34661f19 192 switch(AtEspStatus)
andrewboyson 2:06fa34661f19 193 {
andrewboyson 2:06fa34661f19 194 case 2:
andrewboyson 2:06fa34661f19 195 WifiStatus = WIFI_GOT_IP;
andrewboyson 2:06fa34661f19 196 am = AM_MUX;
andrewboyson 2:06fa34661f19 197 break;
andrewboyson 2:06fa34661f19 198 case 3:
andrewboyson 2:06fa34661f19 199 WifiStatus = WIFI_CONNECTED;
andrewboyson 2:06fa34661f19 200 LogCrLf("Could connect but not get an IP address");
andrewboyson 2:06fa34661f19 201 return -1;
andrewboyson 2:06fa34661f19 202 case 4:
andrewboyson 2:06fa34661f19 203 WifiStatus = WIFI_READY;
andrewboyson 2:06fa34661f19 204 am = AM_CONNECT;
andrewboyson 2:06fa34661f19 205 break;
andrewboyson 2:06fa34661f19 206 default:
andrewboyson 2:06fa34661f19 207 LogF("Unknown CIPSTATUS --> STATUS:%d", AtEspStatus);
andrewboyson 2:06fa34661f19 208 return -1;
andrewboyson 2:06fa34661f19 209 }
andrewboyson 2:06fa34661f19 210 result = AT_NONE;
andrewboyson 2:06fa34661f19 211 break;
andrewboyson 2:06fa34661f19 212 default:
andrewboyson 2:06fa34661f19 213 LogCrLf("Could not connect to WiFi");
andrewboyson 2:06fa34661f19 214 return -1;
andrewboyson 2:06fa34661f19 215 }
andrewboyson 2:06fa34661f19 216 break;
andrewboyson 2:06fa34661f19 217
andrewboyson 2:06fa34661f19 218 case AM_MUX:
andrewboyson 0:09f915e6f9f6 219 switch (result)
andrewboyson 0:09f915e6f9f6 220 {
andrewboyson 0:09f915e6f9f6 221 case AT_NONE:
andrewboyson 0:09f915e6f9f6 222 AtMux(&result);
andrewboyson 0:09f915e6f9f6 223 break;
andrewboyson 0:09f915e6f9f6 224 case AT_SUCCESS:
andrewboyson 2:06fa34661f19 225 am = AM_VERSION;
andrewboyson 2:06fa34661f19 226 result = AT_NONE;
andrewboyson 2:06fa34661f19 227 break;
andrewboyson 2:06fa34661f19 228 default:
andrewboyson 2:06fa34661f19 229 LogCrLf("Could not set up multiple ids");
andrewboyson 2:06fa34661f19 230 return -1;
andrewboyson 2:06fa34661f19 231 }
andrewboyson 2:06fa34661f19 232 break;
andrewboyson 2:06fa34661f19 233 case AM_VERSION:
andrewboyson 2:06fa34661f19 234 switch (result)
andrewboyson 2:06fa34661f19 235 {
andrewboyson 2:06fa34661f19 236 case AT_NONE:
andrewboyson 2:06fa34661f19 237 AtGetEspVersion(&result);
andrewboyson 2:06fa34661f19 238 break;
andrewboyson 2:06fa34661f19 239 case AT_SUCCESS:
andrewboyson 0:09f915e6f9f6 240 am = AM_STARTED;
andrewboyson 0:09f915e6f9f6 241 result = AT_NONE;
andrewboyson 0:09f915e6f9f6 242 break;
andrewboyson 0:09f915e6f9f6 243 default:
andrewboyson 0:09f915e6f9f6 244 LogCrLf("Could not set up multiple ids");
andrewboyson 0:09f915e6f9f6 245 return -1;
andrewboyson 0:09f915e6f9f6 246 }
andrewboyson 2:06fa34661f19 247 break;
andrewboyson 0:09f915e6f9f6 248 case AM_STARTED:
andrewboyson 2:06fa34661f19 249 wifiWaitTimer.stop();
andrewboyson 0:09f915e6f9f6 250 return 0;
andrewboyson 0:09f915e6f9f6 251 default:
andrewboyson 0:09f915e6f9f6 252 LogF("Unknown \'am\' %d", am);
andrewboyson 0:09f915e6f9f6 253 return -1;
andrewboyson 0:09f915e6f9f6 254 }
andrewboyson 0:09f915e6f9f6 255
andrewboyson 0:09f915e6f9f6 256 return 0;
andrewboyson 0:09f915e6f9f6 257 }