Wi-Fi communication thread

Dependencies:   Commands charQueue esp8266-driver

Files at this revision

API Documentation at this revision

Comitter:
williampeers
Date:
Wed Aug 23 02:26:14 2017 +0000
Commit message:

Changed in this revision

Commands.lib Show annotated file Show diff for this revision Revisions of this file
charQueue.lib Show annotated file Show diff for this revision Revisions of this file
esp8266-driver.lib Show annotated file Show diff for this revision Revisions of this file
wifi.cpp Show annotated file Show diff for this revision Revisions of this file
wifi.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 69f99583ac66 Commands.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Commands.lib	Wed Aug 23 02:26:14 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/williampeers/code/Commands/#90ca7dd67eb8
diff -r 000000000000 -r 69f99583ac66 charQueue.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/charQueue.lib	Wed Aug 23 02:26:14 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/williampeers/code/charQueue/#8f54ba4d961f
diff -r 000000000000 -r 69f99583ac66 esp8266-driver.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/esp8266-driver.lib	Wed Aug 23 02:26:14 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/williampeers/code/esp8266-driver/#fb13d8ecbefa
diff -r 000000000000 -r 69f99583ac66 wifi.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wifi.cpp	Wed Aug 23 02:26:14 2017 +0000
@@ -0,0 +1,322 @@
+#include "wifi.h"
+
+Wifi::Wifi(osPriority priority, int memory) : ESP8266Interface(D8, D2, false), ch_pd(D3, 1), rst(D4, 1)
+{
+    set_credentials("denver", "11111111", NSAPI_SECURITY_WPA_WPA2);
+    
+    sender = new TCPSocket::TCPSocket();
+    receiver = new TCPSocket::TCPSocket();
+    
+    sender->open(this);
+    receiver->open(this);
+
+    wifi_thread = new Thread(priority, memory);
+
+    sendQueue = StrQueue(QUEUESIZE);
+    recvQueue = StrQueue(QUEUESIZE);
+
+    sendConnected = false;
+    recvConnected = false;
+    sendReady = false, recvReady = false;
+    sendState = 0, recvState = 0;
+}
+
+void Wifi::start()
+{
+#ifdef DEBUG
+    Thread::wait(10);
+    Serial::Serial(USBTX, USBRX).printf("Wifi starting\n");
+#endif
+    wifi_thread.start(callback(this, &Wifi::run));
+}
+
+void Wifi::run()
+{
+    int ret = -1, recvLength;
+    sender->set_blocking(false);
+
+    Timer sendConnectTimer, sendSocketTimer, recvConnectTimer, recvSocketTimer;
+
+    connectWifi();
+
+    connectSockets();
+
+    while(true) {
+        //Serial::Serial(USBTX, USBRX).printf("RSSI: %i\n", getRSSI("denver"));
+
+        Thread::wait(DELAY);
+
+        if (!sendConnected) {
+            if (sendConnectTimer.read_ms() > CONNECTDELAY) {
+                sendConnectTimer.stop();
+                sendConnectTimer.reset();
+                connectSockets();
+                if (!sendConnected) {
+                    sendConnectTimer.start();
+                }
+            } else {
+                sendConnectTimer.start();
+            }
+        } else {
+            switch (sendState) {
+                case 0:
+                    if (sendQueue.getChars(ssbuffer, BUFFERSIZE) > 0) {
+                        sendState = 1;
+                    } else {
+                        break;
+                    }
+
+                case 1:
+                    Thread::wait(DELAY);
+                    ret = sender->send(ssbuffer, BUFFERSIZE);
+#ifdef DEBUG
+                    Thread::wait(DELAY);
+                    Serial::Serial(USBTX, USBRX).printf("Sender send return code: [%d]\n", ret);
+#endif
+                    if(ret > 0) {
+                        sendState = 2;
+                    } else if(ret == -3012) {
+                        sendState = 0;
+                        sendConnected = false;
+                        break;
+                    } else if(ret == -3001) {
+                        if(sendSocketTimer.read_ms() > SOCKETTIMEOUT) {
+                            sendSocketTimer.reset();
+                            sendSocketTimer.stop();
+                            sendConnected = false;
+                        } else {
+                            sendSocketTimer.start();
+                        }
+                        break;
+                    } else {
+                        break;
+                    }
+
+                case 2:
+                    strcpy(srbuffer, "");
+                    Thread::wait(DELAY);
+                    ret = sender->recv(srbuffer, BUFFERSIZE);
+#ifdef DEBUG
+                    Thread::wait(DELAY);
+                    Serial::Serial(USBTX, USBRX).printf("Sender recv return code: [%d]\n", ret);
+#endif
+                    if(ret > 0) {
+                        sendSocketTimer.reset();
+                        sendSocketTimer.stop();
+                        if (strcmp(srbuffer, ssbuffer)==0) {
+                            sendState = 0;
+                        } else {
+                            sendState = 1;
+                        }
+                    } else if(ret == -3012) {
+                        sendSocketTimer.reset();
+                        sendSocketTimer.stop();
+                        sendConnected = false;
+                        sendState = 0;
+                        break;
+                    } else if(ret == -3001) {
+                        if(sendSocketTimer.read_ms() > SOCKETTIMEOUT) {
+                            sendSocketTimer.reset();
+                            sendSocketTimer.stop();
+                            sendConnected = false;
+                        } else {
+                            sendSocketTimer.start();
+                        }
+                        break;
+                    }
+                    break;
+            }
+        }
+
+        if (!recvConnected) {
+            if (recvConnectTimer.read_ms() > CONNECTDELAY) {
+                recvConnectTimer.stop();
+                recvConnectTimer.reset();
+                connectSockets();
+                if (!recvConnected) {
+                    recvConnectTimer.start();
+                }
+            } else {
+                recvConnectTimer.start();
+            }
+        } else {
+            switch (recvState) {
+                case 0:
+                    strcpy(rbuffer, "");
+                    Thread::wait(DELAY);
+                    recvLength = receiver->recv(rbuffer, BUFFERSIZE);
+                    //receiver->recv(srbuffer, BUFFERSIZE);
+                    //Thread::wait(DELAY*10);
+                    //if(strcmp(rbuffer, "10")==0) {
+                    //printf("Receiver: [%s]\n", rbuffer);
+                    //}
+#ifdef DEBUG
+                    Thread::wait(DELAY);
+                    Serial::Serial(USBTX, USBRX).printf("Receiver recv return code: [%d]\n", recvLength);
+#endif
+
+                    if(recvLength > 0) {
+                        recvSocketTimer.reset();
+                        recvSocketTimer.stop();
+                        recvState = 1;
+                    } else if(recvLength == -3012) {
+                        recvSocketTimer.reset();
+                        recvSocketTimer.stop();
+                        recvConnected = false;
+                        recvState = 0;
+                        break;
+                    } else if(recvLength == -3001) {
+                        if(recvSocketTimer.read_ms() > SOCKETTIMEOUT) {
+                            recvSocketTimer.reset();
+                            recvSocketTimer.stop();
+                            recvConnected = false;
+                            recvState = 0;
+                        } else {
+                            recvSocketTimer.start();
+                        }
+                        break;
+                    } else {
+                        break;
+                    }
+
+
+                case 1:
+                    Thread::wait(DELAY);
+                    ret = receiver->send(rbuffer, recvLength);
+#ifdef DEBUG
+                    Thread::wait(DELAY);
+                    Serial::Serial(USBTX, USBRX).printf("Receiver send return code: [%d]\n", ret);
+#endif
+                    if(ret > 0) {
+                        recvState = 2;
+                    } else if(ret == -3012) {
+                        recvState = 0;
+                        recvConnected = false;
+                        break;
+                    } else if(ret == -3001) {
+                        if(recvSocketTimer.read_ms() > SOCKETTIMEOUT) {
+                            recvSocketTimer.reset();
+                            recvSocketTimer.stop();
+                            recvConnected = false;
+                        } else {
+                            recvSocketTimer.start();
+                        }
+                        break;
+                    } else {
+                        break;
+                    }
+
+                case 2:
+                    if (recvQueue.put(rbuffer, recvLength) > 0) {
+                        recvState = 0;
+                        break;
+                    } else {
+                        break;
+                    }
+            }
+        }
+    }
+}
+
+int Wifi::connectWifi()
+{
+    int ret;
+    while(true) {
+        Thread::wait(DELAY);
+#ifdef DEBUG
+        Thread::wait(5);
+        Serial::Serial(USBTX, USBRX).printf("Wifi connecting\n");
+#endif
+        ret = connect();
+        Thread::wait(DELAY);
+        Serial::Serial(USBTX, USBRX).printf("Wifi connect ret code: [%d]\n", ret);
+
+        if (ret == 0) {
+            Thread::wait(DELAY);
+#ifdef DEBUG
+            Thread::wait(DELAY);
+            Serial::Serial(USBTX, USBRX).printf("Wifi connected\n");
+#endif
+            break;
+        } else {
+            Thread::wait(DELAY);
+#ifdef DEBUG
+            Thread::wait(DELAY);
+            Serial::Serial(USBTX, USBRX).printf("Wifi connect ret code: [%d]\n", ret);
+#endif
+        }
+    }
+    Thread::wait(5);
+    return(1);
+}
+
+int Wifi::connectSockets()
+{
+    int ret;
+#ifdef DEBUG
+    Thread::wait(DELAY);
+    Serial::Serial(USBTX, USBRX).printf("Sockets connecting\n");
+#endif
+    if(!sendConnected) {
+        Thread::wait(5);
+        ret = sender->connect("192.168.173.1", 5001);
+        Thread::wait(5);
+#ifdef DEBUG
+        Thread::wait(DELAY);
+        Serial::Serial(USBTX, USBRX).printf("Send connect Ret: [%i]\n", ret);
+#endif
+        if (ret == 0) {
+            sendConnected = true;
+            sender->set_blocking(false);
+        }
+        //else if (ret == -3012) {connectWifi();}
+    }
+
+    if(!recvConnected) {
+        Thread::wait(5);
+        ret = receiver->connect("192.168.173.1", 5000);
+        Thread::wait(5);
+#ifdef DEBUG
+        Thread::wait(DELAY);
+        Serial::Serial(USBTX, USBRX).printf("Receiver connect Ret: [%i]\n", ret);
+#endif
+        if (ret == 0) {
+            recvConnected = true;
+            receiver->set_blocking(false);
+        }
+    }//else if (ret == -3012) {connectWifi();}
+    return(0);
+}
+
+int Wifi::send(string message)
+{
+    return(sendQueue.put(message.c_str(), message.length()));
+}
+
+int Wifi::send(char* message)
+{
+    return(sendQueue.put(message, strlen(message)));
+}
+
+union i_to_c {
+    int i;
+    char c[4];
+};
+
+int Wifi::send(int message)
+{
+    i_to_c m;
+    m.i = message;
+    return(sendQueue.put(m.c, strlen(m.c)));
+}
+
+Message Wifi::recv()
+{
+    Message out;
+    char str[44];
+    int ret = recvQueue.get(str, 44);
+    if(ret > 0) {
+        out.parse(str);
+    }
+    return(out);
+}
\ No newline at end of file
diff -r 000000000000 -r 69f99583ac66 wifi.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wifi.h	Wed Aug 23 02:26:14 2017 +0000
@@ -0,0 +1,53 @@
+#ifndef __WIFI_INCLUDED__
+#define __WIFI_INCLUDED__
+
+#define DEBUG
+#define DELAY 15
+#define BUFFERSIZE 256
+#define QUEUESIZE 1024
+#define CONNECTDELAY 3000
+#define SOCKETTIMEOUT 5000
+
+#include "mbed.h"
+#include "TCPSocket.h"
+#include "ESP8266Interface.h"
+#include "objectQueue.h"
+#include "commands.h"
+#include <string>
+#include <sstream>
+
+class Wifi : public ESP8266Interface{
+private:
+    Thread wifi_thread;
+    TCPSocket *sender, *receiver;
+    int port;
+    char host[15]; 
+    
+    DigitalOut ch_pd, rst;
+    
+    StrQueue sendQueue;
+    StrQueue recvQueue;
+    
+    char rbuffer[BUFFERSIZE];
+    char ssbuffer[BUFFERSIZE];
+    char srbuffer[BUFFERSIZE];
+
+    bool sendConnected, recvConnected;
+    int sendState, recvState;
+    bool sendReady, recvReady;
+    
+    void run();
+    int connectWifi();
+    int connectSockets();
+
+public:
+    Wifi(osPriority, int);
+    void start();
+    int send(string message);
+    int send(char* message);
+    int send(int message);
+    
+    Message recv();
+};
+
+#endif
\ No newline at end of file