Wi-Fi communication thread
Dependencies: Commands charQueue esp8266-driver
Revision 0:69f99583ac66, committed 2017-08-23
- Comitter:
- williampeers
- Date:
- Wed Aug 23 02:26:14 2017 +0000
- Commit message:
Changed in this revision
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