Massey 2017, Group 5, AGV control software.

Dependencies:   Commands charQueue esp8266-driver

Committer:
williampeers
Date:
Wed Aug 23 02:17:18 2017 +0000
Revision:
1:87d8ac1a1e94
Parent:
0:91703b1eb29e
First edition. Mostly just templates

Who changed what in which revision?

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