Wi-Fi communication thread
Dependencies: Commands charQueue esp8266-driver
Diff: wifi.cpp
- Revision:
- 0:69f99583ac66
--- /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