Backing up an unused program in case of future need

Dependencies:   mbed

Revision:
0:09f915e6f9f6
Child:
1:94282484baae
diff -r 000000000000 -r 09f915e6f9f6 at.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/at.cpp	Wed Apr 13 09:21:02 2016 +0000
@@ -0,0 +1,197 @@
+#include "mbed.h"
+#include  "log.h"
+#include  "esp.h"
+#include   "io.h"
+#include   "at.h"
+#include "wifi.h"
+
+#define TIMEOUT    10
+#define TIMEOUT_OK  2
+
+#define WAIT_FOR_COMMAND        0
+#define WAIT_FOR_ESP_READY      1
+#define WAIT_FOR_WIFI_CONNECTED 2
+#define WAIT_FOR_WIFI_GOT_IP    3
+#define WAIT_FOR_OK             4
+#define WAIT_FOR_SEND_OK        5
+static int wait_for;
+
+static int * pFeedback;
+static void startCommand(int* pStatus, int waitfor)
+{
+    wait_for = waitfor;
+    pFeedback = pStatus;
+    if (pFeedback) *pFeedback = AT_NONE;
+}
+static void finishAndReset(int feedback)
+{
+    if (pFeedback)
+    {
+        *pFeedback = feedback;
+        pFeedback = NULL;
+    }
+    wait_for = WAIT_FOR_COMMAND;
+}
+void AtReleaseResetAndStart(int *pStatus)
+{
+    startCommand(pStatus, WAIT_FOR_ESP_READY);
+    EspReleaseFromReset();
+}
+void AtConnect(const char *ssid, const char *password, int *pStatus)
+{
+    startCommand(pStatus, WAIT_FOR_OK);
+    EspSendStringF("AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, password);
+}
+void AtAt(int *pStatus)
+{
+    startCommand(pStatus, WAIT_FOR_OK);
+    EspSendString("AT\r\n");
+}
+
+void AtConnectId(int id, char * type, char * addr, int port, void * buffer, int bufferlength, int *pStatus)
+{
+    startCommand(pStatus, WAIT_FOR_OK);
+    
+    EspIpdBuffer[id] = buffer;
+    EspIpdBufferLen[id] = bufferlength;
+
+    EspSendStringF("AT+CIPSTART=%d,\"%s\",\"%s\",%d\r\n", id, type, addr, port);
+}
+void AtStartServer(int port, int *pStatus)
+{
+    startCommand(pStatus, WAIT_FOR_OK);
+    EspSendStringF("AT+CIPSERVER=1,%d\r\n", port);
+}
+void AtClose(int id, int *pStatus)
+{
+    startCommand(pStatus, WAIT_FOR_OK);
+    EspSendStringF("AT+CIPCLOSE=%d\r\n", id);
+}
+void AtMux(int *pStatus)
+{
+    startCommand(pStatus, WAIT_FOR_OK);
+    EspSendString("AT+CIPMUX=1\r\n");
+}
+void AtBaud(int baud, int *pStatus)
+{
+    startCommand(pStatus, WAIT_FOR_OK);
+    EspSendStringF("AT+CIOBAUD=%d\r\n", baud);
+}
+
+void AtSendData(int id, int length, const void * pdata, int *pStatus)
+{
+    startCommand(pStatus, WAIT_FOR_SEND_OK);
+    EspLengthToSend = length;
+    EspDataToSend = pdata;
+    EspSendStringF("AT+CIPSEND=%d,%d\r\n", id, length);
+}
+
+int AtBusy()
+{
+    return wait_for;
+}
+void AtResetAndStop()
+{
+    startCommand(NULL, WAIT_FOR_COMMAND);
+    EspResetAndStop();
+    WifiStatus = WIFI_STOPPED;
+}
+void AtInit()
+{   
+    startCommand(NULL, WAIT_FOR_COMMAND);
+    WifiStatus = WIFI_STOPPED;
+}
+int handleLine()
+{
+    switch (wait_for)
+    {
+        //No command
+        case WAIT_FOR_COMMAND:
+            return 0;
+            
+        //Connect    
+        case WAIT_FOR_ESP_READY:
+            if (strcmp(EspLine, "ready") == 0)
+            {
+                WifiStatus = WIFI_READY;
+                wait_for = WAIT_FOR_WIFI_CONNECTED;
+            }
+            return 0;
+        case WAIT_FOR_WIFI_CONNECTED:
+            if (strcmp(EspLine, "WIFI CONNECTED") == 0)
+            {
+                WifiStatus = WIFI_CONNECTED;
+                wait_for = WAIT_FOR_WIFI_GOT_IP;
+            }
+            return 0;
+        case WAIT_FOR_WIFI_GOT_IP:
+            if (strcmp(EspLine, "WIFI GOT IP") == 0)
+            {
+                WifiStatus = WIFI_GOT_IP;
+                finishAndReset(AT_SUCCESS);
+            }
+            return 0;
+        
+        //Send command
+        case WAIT_FOR_SEND_OK:
+            if (strcmp(EspLine, "SEND OK") == 0) finishAndReset(AT_SUCCESS);
+            return 0;
+        
+        //Most commands
+        case WAIT_FOR_OK:
+            if (strcmp(EspLine, "OK"     ) == 0) finishAndReset(AT_SUCCESS);
+            if (strcmp(EspLine, "ERROR"  ) == 0) finishAndReset(AT_ERROR);
+            return 0;
+            
+        default:
+            LogF("Unknown wait_for %d\r\n", wait_for);
+            return -1;
+    }
+}
+int AtMain()
+{
+    
+    //Monitor time taken
+    static Timer receiveTimer;
+    if (wait_for)
+    {
+        receiveTimer.start();
+    }
+    else
+    {
+        receiveTimer.stop();
+        receiveTimer.reset();
+    }
+    
+    //Check for problems; feedback status and reset
+    if (receiveTimer.read() > TIMEOUT || (wait_for == WAIT_FOR_OK && receiveTimer.read() > TIMEOUT_OK))
+    {
+        finishAndReset(AT_RESPONCE_TIMEOUT);
+        LogCrLf("Command timed out");
+        return 0;
+    }
+    
+
+    //Depending on what the Esp has returned: do nothing; treat the line or finish and reset
+    switch (EspLineAvailable)
+    {
+        case ESP_IDLE:
+            break;
+        case ESP_AVAILABLE:
+            if (handleLine()) return -1;
+            break;
+        case ESP_TIMEOUT:
+            finishAndReset(AT_LINE_TIMEOUT);
+            LogCrLf("Esp timed out");
+            break;
+        case ESP_OVERFLOW:
+            finishAndReset(AT_LINE_OVERFLOW);
+            LogCrLf("Esp buffer overflow");
+            break;
+        default:
+            LogF("Unknown EsplineAvailable %d\r\n");
+            return -1;
+    }
+    
+    return 0;
+}