Wi-Fi communication thread

Dependencies:   Commands charQueue esp8266-driver

Committer:
williampeers
Date:
Wed Aug 23 02:26:14 2017 +0000
Revision:
0:69f99583ac66

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
williampeers 0:69f99583ac66 1 #include "wifi.h"
williampeers 0:69f99583ac66 2
williampeers 0:69f99583ac66 3 Wifi::Wifi(osPriority priority, int memory) : ESP8266Interface(D8, D2, false), ch_pd(D3, 1), rst(D4, 1)
williampeers 0:69f99583ac66 4 {
williampeers 0:69f99583ac66 5 set_credentials("denver", "11111111", NSAPI_SECURITY_WPA_WPA2);
williampeers 0:69f99583ac66 6
williampeers 0:69f99583ac66 7 sender = new TCPSocket::TCPSocket();
williampeers 0:69f99583ac66 8 receiver = new TCPSocket::TCPSocket();
williampeers 0:69f99583ac66 9
williampeers 0:69f99583ac66 10 sender->open(this);
williampeers 0:69f99583ac66 11 receiver->open(this);
williampeers 0:69f99583ac66 12
williampeers 0:69f99583ac66 13 wifi_thread = new Thread(priority, memory);
williampeers 0:69f99583ac66 14
williampeers 0:69f99583ac66 15 sendQueue = StrQueue(QUEUESIZE);
williampeers 0:69f99583ac66 16 recvQueue = StrQueue(QUEUESIZE);
williampeers 0:69f99583ac66 17
williampeers 0:69f99583ac66 18 sendConnected = false;
williampeers 0:69f99583ac66 19 recvConnected = false;
williampeers 0:69f99583ac66 20 sendReady = false, recvReady = false;
williampeers 0:69f99583ac66 21 sendState = 0, recvState = 0;
williampeers 0:69f99583ac66 22 }
williampeers 0:69f99583ac66 23
williampeers 0:69f99583ac66 24 void Wifi::start()
williampeers 0:69f99583ac66 25 {
williampeers 0:69f99583ac66 26 #ifdef DEBUG
williampeers 0:69f99583ac66 27 Thread::wait(10);
williampeers 0:69f99583ac66 28 Serial::Serial(USBTX, USBRX).printf("Wifi starting\n");
williampeers 0:69f99583ac66 29 #endif
williampeers 0:69f99583ac66 30 wifi_thread.start(callback(this, &Wifi::run));
williampeers 0:69f99583ac66 31 }
williampeers 0:69f99583ac66 32
williampeers 0:69f99583ac66 33 void Wifi::run()
williampeers 0:69f99583ac66 34 {
williampeers 0:69f99583ac66 35 int ret = -1, recvLength;
williampeers 0:69f99583ac66 36 sender->set_blocking(false);
williampeers 0:69f99583ac66 37
williampeers 0:69f99583ac66 38 Timer sendConnectTimer, sendSocketTimer, recvConnectTimer, recvSocketTimer;
williampeers 0:69f99583ac66 39
williampeers 0:69f99583ac66 40 connectWifi();
williampeers 0:69f99583ac66 41
williampeers 0:69f99583ac66 42 connectSockets();
williampeers 0:69f99583ac66 43
williampeers 0:69f99583ac66 44 while(true) {
williampeers 0:69f99583ac66 45 //Serial::Serial(USBTX, USBRX).printf("RSSI: %i\n", getRSSI("denver"));
williampeers 0:69f99583ac66 46
williampeers 0:69f99583ac66 47 Thread::wait(DELAY);
williampeers 0:69f99583ac66 48
williampeers 0:69f99583ac66 49 if (!sendConnected) {
williampeers 0:69f99583ac66 50 if (sendConnectTimer.read_ms() > CONNECTDELAY) {
williampeers 0:69f99583ac66 51 sendConnectTimer.stop();
williampeers 0:69f99583ac66 52 sendConnectTimer.reset();
williampeers 0:69f99583ac66 53 connectSockets();
williampeers 0:69f99583ac66 54 if (!sendConnected) {
williampeers 0:69f99583ac66 55 sendConnectTimer.start();
williampeers 0:69f99583ac66 56 }
williampeers 0:69f99583ac66 57 } else {
williampeers 0:69f99583ac66 58 sendConnectTimer.start();
williampeers 0:69f99583ac66 59 }
williampeers 0:69f99583ac66 60 } else {
williampeers 0:69f99583ac66 61 switch (sendState) {
williampeers 0:69f99583ac66 62 case 0:
williampeers 0:69f99583ac66 63 if (sendQueue.getChars(ssbuffer, BUFFERSIZE) > 0) {
williampeers 0:69f99583ac66 64 sendState = 1;
williampeers 0:69f99583ac66 65 } else {
williampeers 0:69f99583ac66 66 break;
williampeers 0:69f99583ac66 67 }
williampeers 0:69f99583ac66 68
williampeers 0:69f99583ac66 69 case 1:
williampeers 0:69f99583ac66 70 Thread::wait(DELAY);
williampeers 0:69f99583ac66 71 ret = sender->send(ssbuffer, BUFFERSIZE);
williampeers 0:69f99583ac66 72 #ifdef DEBUG
williampeers 0:69f99583ac66 73 Thread::wait(DELAY);
williampeers 0:69f99583ac66 74 Serial::Serial(USBTX, USBRX).printf("Sender send return code: [%d]\n", ret);
williampeers 0:69f99583ac66 75 #endif
williampeers 0:69f99583ac66 76 if(ret > 0) {
williampeers 0:69f99583ac66 77 sendState = 2;
williampeers 0:69f99583ac66 78 } else if(ret == -3012) {
williampeers 0:69f99583ac66 79 sendState = 0;
williampeers 0:69f99583ac66 80 sendConnected = false;
williampeers 0:69f99583ac66 81 break;
williampeers 0:69f99583ac66 82 } else if(ret == -3001) {
williampeers 0:69f99583ac66 83 if(sendSocketTimer.read_ms() > SOCKETTIMEOUT) {
williampeers 0:69f99583ac66 84 sendSocketTimer.reset();
williampeers 0:69f99583ac66 85 sendSocketTimer.stop();
williampeers 0:69f99583ac66 86 sendConnected = false;
williampeers 0:69f99583ac66 87 } else {
williampeers 0:69f99583ac66 88 sendSocketTimer.start();
williampeers 0:69f99583ac66 89 }
williampeers 0:69f99583ac66 90 break;
williampeers 0:69f99583ac66 91 } else {
williampeers 0:69f99583ac66 92 break;
williampeers 0:69f99583ac66 93 }
williampeers 0:69f99583ac66 94
williampeers 0:69f99583ac66 95 case 2:
williampeers 0:69f99583ac66 96 strcpy(srbuffer, "");
williampeers 0:69f99583ac66 97 Thread::wait(DELAY);
williampeers 0:69f99583ac66 98 ret = sender->recv(srbuffer, BUFFERSIZE);
williampeers 0:69f99583ac66 99 #ifdef DEBUG
williampeers 0:69f99583ac66 100 Thread::wait(DELAY);
williampeers 0:69f99583ac66 101 Serial::Serial(USBTX, USBRX).printf("Sender recv return code: [%d]\n", ret);
williampeers 0:69f99583ac66 102 #endif
williampeers 0:69f99583ac66 103 if(ret > 0) {
williampeers 0:69f99583ac66 104 sendSocketTimer.reset();
williampeers 0:69f99583ac66 105 sendSocketTimer.stop();
williampeers 0:69f99583ac66 106 if (strcmp(srbuffer, ssbuffer)==0) {
williampeers 0:69f99583ac66 107 sendState = 0;
williampeers 0:69f99583ac66 108 } else {
williampeers 0:69f99583ac66 109 sendState = 1;
williampeers 0:69f99583ac66 110 }
williampeers 0:69f99583ac66 111 } else if(ret == -3012) {
williampeers 0:69f99583ac66 112 sendSocketTimer.reset();
williampeers 0:69f99583ac66 113 sendSocketTimer.stop();
williampeers 0:69f99583ac66 114 sendConnected = false;
williampeers 0:69f99583ac66 115 sendState = 0;
williampeers 0:69f99583ac66 116 break;
williampeers 0:69f99583ac66 117 } else if(ret == -3001) {
williampeers 0:69f99583ac66 118 if(sendSocketTimer.read_ms() > SOCKETTIMEOUT) {
williampeers 0:69f99583ac66 119 sendSocketTimer.reset();
williampeers 0:69f99583ac66 120 sendSocketTimer.stop();
williampeers 0:69f99583ac66 121 sendConnected = false;
williampeers 0:69f99583ac66 122 } else {
williampeers 0:69f99583ac66 123 sendSocketTimer.start();
williampeers 0:69f99583ac66 124 }
williampeers 0:69f99583ac66 125 break;
williampeers 0:69f99583ac66 126 }
williampeers 0:69f99583ac66 127 break;
williampeers 0:69f99583ac66 128 }
williampeers 0:69f99583ac66 129 }
williampeers 0:69f99583ac66 130
williampeers 0:69f99583ac66 131 if (!recvConnected) {
williampeers 0:69f99583ac66 132 if (recvConnectTimer.read_ms() > CONNECTDELAY) {
williampeers 0:69f99583ac66 133 recvConnectTimer.stop();
williampeers 0:69f99583ac66 134 recvConnectTimer.reset();
williampeers 0:69f99583ac66 135 connectSockets();
williampeers 0:69f99583ac66 136 if (!recvConnected) {
williampeers 0:69f99583ac66 137 recvConnectTimer.start();
williampeers 0:69f99583ac66 138 }
williampeers 0:69f99583ac66 139 } else {
williampeers 0:69f99583ac66 140 recvConnectTimer.start();
williampeers 0:69f99583ac66 141 }
williampeers 0:69f99583ac66 142 } else {
williampeers 0:69f99583ac66 143 switch (recvState) {
williampeers 0:69f99583ac66 144 case 0:
williampeers 0:69f99583ac66 145 strcpy(rbuffer, "");
williampeers 0:69f99583ac66 146 Thread::wait(DELAY);
williampeers 0:69f99583ac66 147 recvLength = receiver->recv(rbuffer, BUFFERSIZE);
williampeers 0:69f99583ac66 148 //receiver->recv(srbuffer, BUFFERSIZE);
williampeers 0:69f99583ac66 149 //Thread::wait(DELAY*10);
williampeers 0:69f99583ac66 150 //if(strcmp(rbuffer, "10")==0) {
williampeers 0:69f99583ac66 151 //printf("Receiver: [%s]\n", rbuffer);
williampeers 0:69f99583ac66 152 //}
williampeers 0:69f99583ac66 153 #ifdef DEBUG
williampeers 0:69f99583ac66 154 Thread::wait(DELAY);
williampeers 0:69f99583ac66 155 Serial::Serial(USBTX, USBRX).printf("Receiver recv return code: [%d]\n", recvLength);
williampeers 0:69f99583ac66 156 #endif
williampeers 0:69f99583ac66 157
williampeers 0:69f99583ac66 158 if(recvLength > 0) {
williampeers 0:69f99583ac66 159 recvSocketTimer.reset();
williampeers 0:69f99583ac66 160 recvSocketTimer.stop();
williampeers 0:69f99583ac66 161 recvState = 1;
williampeers 0:69f99583ac66 162 } else if(recvLength == -3012) {
williampeers 0:69f99583ac66 163 recvSocketTimer.reset();
williampeers 0:69f99583ac66 164 recvSocketTimer.stop();
williampeers 0:69f99583ac66 165 recvConnected = false;
williampeers 0:69f99583ac66 166 recvState = 0;
williampeers 0:69f99583ac66 167 break;
williampeers 0:69f99583ac66 168 } else if(recvLength == -3001) {
williampeers 0:69f99583ac66 169 if(recvSocketTimer.read_ms() > SOCKETTIMEOUT) {
williampeers 0:69f99583ac66 170 recvSocketTimer.reset();
williampeers 0:69f99583ac66 171 recvSocketTimer.stop();
williampeers 0:69f99583ac66 172 recvConnected = false;
williampeers 0:69f99583ac66 173 recvState = 0;
williampeers 0:69f99583ac66 174 } else {
williampeers 0:69f99583ac66 175 recvSocketTimer.start();
williampeers 0:69f99583ac66 176 }
williampeers 0:69f99583ac66 177 break;
williampeers 0:69f99583ac66 178 } else {
williampeers 0:69f99583ac66 179 break;
williampeers 0:69f99583ac66 180 }
williampeers 0:69f99583ac66 181
williampeers 0:69f99583ac66 182
williampeers 0:69f99583ac66 183 case 1:
williampeers 0:69f99583ac66 184 Thread::wait(DELAY);
williampeers 0:69f99583ac66 185 ret = receiver->send(rbuffer, recvLength);
williampeers 0:69f99583ac66 186 #ifdef DEBUG
williampeers 0:69f99583ac66 187 Thread::wait(DELAY);
williampeers 0:69f99583ac66 188 Serial::Serial(USBTX, USBRX).printf("Receiver send return code: [%d]\n", ret);
williampeers 0:69f99583ac66 189 #endif
williampeers 0:69f99583ac66 190 if(ret > 0) {
williampeers 0:69f99583ac66 191 recvState = 2;
williampeers 0:69f99583ac66 192 } else if(ret == -3012) {
williampeers 0:69f99583ac66 193 recvState = 0;
williampeers 0:69f99583ac66 194 recvConnected = false;
williampeers 0:69f99583ac66 195 break;
williampeers 0:69f99583ac66 196 } else if(ret == -3001) {
williampeers 0:69f99583ac66 197 if(recvSocketTimer.read_ms() > SOCKETTIMEOUT) {
williampeers 0:69f99583ac66 198 recvSocketTimer.reset();
williampeers 0:69f99583ac66 199 recvSocketTimer.stop();
williampeers 0:69f99583ac66 200 recvConnected = false;
williampeers 0:69f99583ac66 201 } else {
williampeers 0:69f99583ac66 202 recvSocketTimer.start();
williampeers 0:69f99583ac66 203 }
williampeers 0:69f99583ac66 204 break;
williampeers 0:69f99583ac66 205 } else {
williampeers 0:69f99583ac66 206 break;
williampeers 0:69f99583ac66 207 }
williampeers 0:69f99583ac66 208
williampeers 0:69f99583ac66 209 case 2:
williampeers 0:69f99583ac66 210 if (recvQueue.put(rbuffer, recvLength) > 0) {
williampeers 0:69f99583ac66 211 recvState = 0;
williampeers 0:69f99583ac66 212 break;
williampeers 0:69f99583ac66 213 } else {
williampeers 0:69f99583ac66 214 break;
williampeers 0:69f99583ac66 215 }
williampeers 0:69f99583ac66 216 }
williampeers 0:69f99583ac66 217 }
williampeers 0:69f99583ac66 218 }
williampeers 0:69f99583ac66 219 }
williampeers 0:69f99583ac66 220
williampeers 0:69f99583ac66 221 int Wifi::connectWifi()
williampeers 0:69f99583ac66 222 {
williampeers 0:69f99583ac66 223 int ret;
williampeers 0:69f99583ac66 224 while(true) {
williampeers 0:69f99583ac66 225 Thread::wait(DELAY);
williampeers 0:69f99583ac66 226 #ifdef DEBUG
williampeers 0:69f99583ac66 227 Thread::wait(5);
williampeers 0:69f99583ac66 228 Serial::Serial(USBTX, USBRX).printf("Wifi connecting\n");
williampeers 0:69f99583ac66 229 #endif
williampeers 0:69f99583ac66 230 ret = connect();
williampeers 0:69f99583ac66 231 Thread::wait(DELAY);
williampeers 0:69f99583ac66 232 Serial::Serial(USBTX, USBRX).printf("Wifi connect ret code: [%d]\n", ret);
williampeers 0:69f99583ac66 233
williampeers 0:69f99583ac66 234 if (ret == 0) {
williampeers 0:69f99583ac66 235 Thread::wait(DELAY);
williampeers 0:69f99583ac66 236 #ifdef DEBUG
williampeers 0:69f99583ac66 237 Thread::wait(DELAY);
williampeers 0:69f99583ac66 238 Serial::Serial(USBTX, USBRX).printf("Wifi connected\n");
williampeers 0:69f99583ac66 239 #endif
williampeers 0:69f99583ac66 240 break;
williampeers 0:69f99583ac66 241 } else {
williampeers 0:69f99583ac66 242 Thread::wait(DELAY);
williampeers 0:69f99583ac66 243 #ifdef DEBUG
williampeers 0:69f99583ac66 244 Thread::wait(DELAY);
williampeers 0:69f99583ac66 245 Serial::Serial(USBTX, USBRX).printf("Wifi connect ret code: [%d]\n", ret);
williampeers 0:69f99583ac66 246 #endif
williampeers 0:69f99583ac66 247 }
williampeers 0:69f99583ac66 248 }
williampeers 0:69f99583ac66 249 Thread::wait(5);
williampeers 0:69f99583ac66 250 return(1);
williampeers 0:69f99583ac66 251 }
williampeers 0:69f99583ac66 252
williampeers 0:69f99583ac66 253 int Wifi::connectSockets()
williampeers 0:69f99583ac66 254 {
williampeers 0:69f99583ac66 255 int ret;
williampeers 0:69f99583ac66 256 #ifdef DEBUG
williampeers 0:69f99583ac66 257 Thread::wait(DELAY);
williampeers 0:69f99583ac66 258 Serial::Serial(USBTX, USBRX).printf("Sockets connecting\n");
williampeers 0:69f99583ac66 259 #endif
williampeers 0:69f99583ac66 260 if(!sendConnected) {
williampeers 0:69f99583ac66 261 Thread::wait(5);
williampeers 0:69f99583ac66 262 ret = sender->connect("192.168.173.1", 5001);
williampeers 0:69f99583ac66 263 Thread::wait(5);
williampeers 0:69f99583ac66 264 #ifdef DEBUG
williampeers 0:69f99583ac66 265 Thread::wait(DELAY);
williampeers 0:69f99583ac66 266 Serial::Serial(USBTX, USBRX).printf("Send connect Ret: [%i]\n", ret);
williampeers 0:69f99583ac66 267 #endif
williampeers 0:69f99583ac66 268 if (ret == 0) {
williampeers 0:69f99583ac66 269 sendConnected = true;
williampeers 0:69f99583ac66 270 sender->set_blocking(false);
williampeers 0:69f99583ac66 271 }
williampeers 0:69f99583ac66 272 //else if (ret == -3012) {connectWifi();}
williampeers 0:69f99583ac66 273 }
williampeers 0:69f99583ac66 274
williampeers 0:69f99583ac66 275 if(!recvConnected) {
williampeers 0:69f99583ac66 276 Thread::wait(5);
williampeers 0:69f99583ac66 277 ret = receiver->connect("192.168.173.1", 5000);
williampeers 0:69f99583ac66 278 Thread::wait(5);
williampeers 0:69f99583ac66 279 #ifdef DEBUG
williampeers 0:69f99583ac66 280 Thread::wait(DELAY);
williampeers 0:69f99583ac66 281 Serial::Serial(USBTX, USBRX).printf("Receiver connect Ret: [%i]\n", ret);
williampeers 0:69f99583ac66 282 #endif
williampeers 0:69f99583ac66 283 if (ret == 0) {
williampeers 0:69f99583ac66 284 recvConnected = true;
williampeers 0:69f99583ac66 285 receiver->set_blocking(false);
williampeers 0:69f99583ac66 286 }
williampeers 0:69f99583ac66 287 }//else if (ret == -3012) {connectWifi();}
williampeers 0:69f99583ac66 288 return(0);
williampeers 0:69f99583ac66 289 }
williampeers 0:69f99583ac66 290
williampeers 0:69f99583ac66 291 int Wifi::send(string message)
williampeers 0:69f99583ac66 292 {
williampeers 0:69f99583ac66 293 return(sendQueue.put(message.c_str(), message.length()));
williampeers 0:69f99583ac66 294 }
williampeers 0:69f99583ac66 295
williampeers 0:69f99583ac66 296 int Wifi::send(char* message)
williampeers 0:69f99583ac66 297 {
williampeers 0:69f99583ac66 298 return(sendQueue.put(message, strlen(message)));
williampeers 0:69f99583ac66 299 }
williampeers 0:69f99583ac66 300
williampeers 0:69f99583ac66 301 union i_to_c {
williampeers 0:69f99583ac66 302 int i;
williampeers 0:69f99583ac66 303 char c[4];
williampeers 0:69f99583ac66 304 };
williampeers 0:69f99583ac66 305
williampeers 0:69f99583ac66 306 int Wifi::send(int message)
williampeers 0:69f99583ac66 307 {
williampeers 0:69f99583ac66 308 i_to_c m;
williampeers 0:69f99583ac66 309 m.i = message;
williampeers 0:69f99583ac66 310 return(sendQueue.put(m.c, strlen(m.c)));
williampeers 0:69f99583ac66 311 }
williampeers 0:69f99583ac66 312
williampeers 0:69f99583ac66 313 Message Wifi::recv()
williampeers 0:69f99583ac66 314 {
williampeers 0:69f99583ac66 315 Message out;
williampeers 0:69f99583ac66 316 char str[44];
williampeers 0:69f99583ac66 317 int ret = recvQueue.get(str, 44);
williampeers 0:69f99583ac66 318 if(ret > 0) {
williampeers 0:69f99583ac66 319 out.parse(str);
williampeers 0:69f99583ac66 320 }
williampeers 0:69f99583ac66 321 return(out);
williampeers 0:69f99583ac66 322 }