Regenerating PPM signal based on distances from ultrasonic sensors, ESP8266 for connectin via wifi. Autonomous quadcopter behaviour, autonomou height holding. Flying direction based on front and back ultrasonic sensors.

Dependencies:   ConfigFile HCSR04 PID PPM2 mbed-rtos mbed

Committer:
edy05
Date:
Tue May 22 19:43:09 2018 +0000
Branch:
DistanceRegulation
Revision:
41:5fe200d20022
Parent:
40:0aa1cefe80ab
final updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
edy05 2:d172c9963f87 1 #include "mbed.h"
edy05 2:d172c9963f87 2 #include "rtos.h"
edy05 9:86a5af9935b1 3 #include "hardware.h"
edy05 2:d172c9963f87 4
edy05 2:d172c9963f87 5
edy05 29:c35bcfe62c77 6 RawSerial esp(p13, p14); // tx, rx
edy05 32:c729e6da7f9a 7 DigitalOut reset(p11);
edy05 37:76bfd4e9c383 8 DigitalOut chd_dp(p10);
edy05 2:d172c9963f87 9
edy05 2:d172c9963f87 10 // Standard Mbed LED definitions
edy05 2:d172c9963f87 11 DigitalOut led1(LED1); // (PTB18)
edy05 2:d172c9963f87 12 DigitalOut led3(LED3); // (PTD1)
edy05 2:d172c9963f87 13
edy05 2:d172c9963f87 14 Timer t1;
edy05 2:d172c9963f87 15 Timer t2;
edy05 2:d172c9963f87 16
edy05 2:d172c9963f87 17 char cmdbuff[32];
edy05 2:d172c9963f87 18 char replybuff[1024];
edy05 2:d172c9963f87 19 char webcount[8];
edy05 34:5dca557e982f 20 char webdata[2048]; // This may need to be bigger depending on WEB browser used
edy05 34:5dca557e982f 21 char webbuff[8192]; // Currently using 1986 characters, Increase this if more web page data added
edy05 2:d172c9963f87 22 char type[16];
edy05 2:d172c9963f87 23 char channel[2];
edy05 2:d172c9963f87 24 char ip_address[20];
edy05 2:d172c9963f87 25 int bufflen, DataRX, count, getcount, replycount, servreq, timeout;
edy05 2:d172c9963f87 26 int bufl, ipdLen, linkID, weberror, webcounter;
edy05 2:d172c9963f87 27
edy05 2:d172c9963f87 28 void getreply(); void SendCMD();
edy05 2:d172c9963f87 29 void startserver();
edy05 2:d172c9963f87 30 void ReadWebData();
edy05 2:d172c9963f87 31 void sendpage();
edy05 2:d172c9963f87 32 void sendcheck();
edy05 2:d172c9963f87 33 void get_ip_address(char web_data[1024]);
edy05 2:d172c9963f87 34 void SendWEB();
edy05 2:d172c9963f87 35
edy05 2:d172c9963f87 36 void serverRun();
edy05 2:d172c9963f87 37 void serverMain();
edy05 2:d172c9963f87 38 void serverLoop();
edy05 2:d172c9963f87 39 void callback();
edy05 2:d172c9963f87 40
edy05 33:a2f9fea05cb9 41 int port = 80; // set server port
edy05 33:a2f9fea05cb9 42 int SERVtimeout = 8; // set server timeout in seconds in case link breaks.
edy05 2:d172c9963f87 43
edy05 9:86a5af9935b1 44
edy05 2:d172c9963f87 45
edy05 2:d172c9963f87 46 //serverThread.start(serverRun);
edy05 2:d172c9963f87 47
edy05 2:d172c9963f87 48 void callback(){
edy05 34:5dca557e982f 49 ////pc.printf("callback!!!!!!!!!!!!!!!!_________________________\n\r");
edy05 2:d172c9963f87 50 led3 = 1;
edy05 2:d172c9963f87 51 while (esp.readable()) {
edy05 2:d172c9963f87 52 webbuff[count] = esp.getc();
edy05 2:d172c9963f87 53 count++;
edy05 2:d172c9963f87 54 }
edy05 2:d172c9963f87 55 if(strlen(webbuff)>bufflen) {
edy05 40:0aa1cefe80ab 56 //printf("bufflen %d \n\r");
edy05 2:d172c9963f87 57 DataRX=1;
edy05 2:d172c9963f87 58 led3=0;
edy05 2:d172c9963f87 59 }
edy05 2:d172c9963f87 60 }
edy05 2:d172c9963f87 61
edy05 2:d172c9963f87 62
edy05 2:d172c9963f87 63 void serverRun(){
edy05 37:76bfd4e9c383 64 chd_dp = 1;
edy05 2:d172c9963f87 65 reset=0;
edy05 25:69190c222dbf 66
edy05 34:5dca557e982f 67 //pc.printf("\f\n\r------------ ESP8266 Hardware Reset --------------\n\r");
edy05 37:76bfd4e9c383 68 wait(0.5);
edy05 2:d172c9963f87 69 reset=1;
edy05 2:d172c9963f87 70 timeout=6000;
edy05 2:d172c9963f87 71 getcount=500;
edy05 2:d172c9963f87 72 getreply();
edy05 2:d172c9963f87 73 esp.baud(115200); // ESP8266 baudrate. Maximum on KLxx' is 115200, 230400 works on K20 and K22F
edy05 2:d172c9963f87 74 startserver();
edy05 26:11539036f0fb 75 webcounter = 0;
edy05 31:5f1737e480f3 76 Timer timer;
edy05 34:5dca557e982f 77 bool pageWasSent = false;
edy05 2:d172c9963f87 78 while(1){
edy05 2:d172c9963f87 79 if(DataRX==1) {
edy05 31:5f1737e480f3 80 timer.start();
edy05 2:d172c9963f87 81 ReadWebData();
edy05 11:002927b2675d 82 // Save data to configFile
edy05 34:5dca557e982f 83 if ((servreq == 1 && weberror == 0) && pageWasSent == false) {
edy05 10:bb9c778f8e3e 84 // send HTTP Response
edy05 2:d172c9963f87 85 sendpage();
edy05 34:5dca557e982f 86 pageWasSent = true;
edy05 39:93d8aa47f4ce 87 timer.reset();
edy05 31:5f1737e480f3 88
edy05 2:d172c9963f87 89 }
edy05 32:c729e6da7f9a 90 else{
edy05 40:0aa1cefe80ab 91 pc.printf("Page was not sent \n\r");
edy05 32:c729e6da7f9a 92 }
edy05 2:d172c9963f87 93 esp.attach(&callback);
edy05 34:5dca557e982f 94 ////pc.printf(" IPD Data:\r\n\n Link ID = %d,\r\n IPD Header Length = %d \r\n IPD Type = %s\r\n", linkID, ipdLen, type);
edy05 34:5dca557e982f 95 ////pc.printf("HTTP Packet: \n\n%s", webdata);
edy05 34:5dca557e982f 96 ////pc.printf("Web Characters sent : %d\n\n", bufl);
edy05 34:5dca557e982f 97 ////pc.printf("-------------------------------------\n\n");
edy05 2:d172c9963f87 98 servreq=0;
edy05 15:9cdf757269fb 99 memset(_serverMessage, '\0', sizeof(_serverMessage));
edy05 2:d172c9963f87 100 }
edy05 34:5dca557e982f 101 if(timer.read_ms() > 3000){
edy05 34:5dca557e982f 102 pageWasSent = false;
edy05 34:5dca557e982f 103 ////pc.printf("starting reading new configuration in server task\n\r");
edy05 31:5f1737e480f3 104 // when stop sending answers
edy05 31:5f1737e480f3 105 timer.stop();
edy05 31:5f1737e480f3 106 timer.reset();
edy05 32:c729e6da7f9a 107 if(_newP == _P && _newI == _I && _newD == _D){
edy05 31:5f1737e480f3 108 _onlyDistanChanged = true;
edy05 31:5f1737e480f3 109 }
edy05 39:93d8aa47f4ce 110 _groundSetPoint = _newGroundSetPoint;
edy05 32:c729e6da7f9a 111 _P = _newP;
edy05 32:c729e6da7f9a 112 _I = _newI;
edy05 32:c729e6da7f9a 113 _D = _newD;
edy05 31:5f1737e480f3 114 // Save data to configFile
edy05 31:5f1737e480f3 115 writeSettingsToConfig();
edy05 31:5f1737e480f3 116 // notification that config of pid was changed
edy05 31:5f1737e480f3 117 _configChanges = true;
edy05 31:5f1737e480f3 118 // start or stop ground regulation
edy05 31:5f1737e480f3 119 //_groundRegulation = _tempGroundRegulation;
edy05 31:5f1737e480f3 120 if(_groundRegulation != _tempGroundRegulation){
edy05 31:5f1737e480f3 121 _groundRegulation = _tempGroundRegulation;
edy05 31:5f1737e480f3 122 _groundDistance->resetError();
edy05 31:5f1737e480f3 123 }
edy05 31:5f1737e480f3 124
edy05 31:5f1737e480f3 125 }
edy05 31:5f1737e480f3 126
edy05 34:5dca557e982f 127 Thread::wait(100);
edy05 2:d172c9963f87 128 }
edy05 2:d172c9963f87 129 }
edy05 2:d172c9963f87 130
edy05 2:d172c9963f87 131
edy05 2:d172c9963f87 132 // Static WEB page
edy05 2:d172c9963f87 133 void sendpage(){
edy05 2:d172c9963f87 134 strcpy(webbuff, "<!DOCTYPE html>");
edy05 2:d172c9963f87 135 strcat(webbuff, "<html><head><title>ESP8266 Mbed LPC1768</title></head>");
edy05 2:d172c9963f87 136 strcat(webbuff, "<body>");
edy05 34:5dca557e982f 137 //strcat(webbuff, "<div style=\"text-align:center; background-color:#F4F4F4; color:#00AEDB;\"><h1>ESP8266 Mbed IoT Web PID Controller</h1>");
edy05 34:5dca557e982f 138 //strcat(webbuff, "Hit Count - ");
edy05 34:5dca557e982f 139 //strcat(webbuff, webcount);
edy05 34:5dca557e982f 140 //strcat(webbuff, "</div><br /><hr>");
edy05 15:9cdf757269fb 141 //server message (mostly errors)
edy05 34:5dca557e982f 142 //strcat(webbuff, "<div stye=\"text-align:center; background-color:#F4F4F4; color:#00AEDB;\"><h3>Server messages</h3>");
edy05 34:5dca557e982f 143 //strcat(webbuff, _serverMessage);
edy05 34:5dca557e982f 144 //strcat(webbuff, "</div><br><hr>");
edy05 34:5dca557e982f 145 strcat(webbuff, "<form method=\"POST\">");
edy05 34:5dca557e982f 146 //if(led1==0) {
edy05 34:5dca557e982f 147 // strcat(webbuff, "<p><input type=\"radio\" name=\"led1\" value=\"0\" checked> LED 1 off");
edy05 34:5dca557e982f 148 // strcat(webbuff, "<br><input type=\"radio\" name=\"led1\" value=\"1\" > LED 1 on<br>");
edy05 34:5dca557e982f 149 //} else {
edy05 34:5dca557e982f 150 // strcat(webbuff, "<p><input type=\"radio\" name=\"led1\" value=\"0\" > LED 1 off");
edy05 34:5dca557e982f 151 // strcat(webbuff, "<br><input type=\"radio\" name=\"led1\" value=\"1\" checked> LED 1 on<br>");
edy05 34:5dca557e982f 152 //}
edy05 25:69190c222dbf 153 // pid ground min output
edy05 41:5fe200d20022 154 strcat(webbuff, "<table><tr>");
edy05 41:5fe200d20022 155 strcat(webbuff, "<td>PID min: </td> <td><input type=\"text\" name=\"groundPidMinOutput\" size=\"4\" value=\"");
edy05 25:69190c222dbf 156 ConvertToCharArray(_groundPidMinOutput);
edy05 25:69190c222dbf 157 strcat(webbuff, _str);
edy05 41:5fe200d20022 158 strcat(webbuff, "\">");
edy05 41:5fe200d20022 159 strcat(webbuff, "</td></tr>");
edy05 41:5fe200d20022 160 strcat(webbuff, "<tr>");
edy05 25:69190c222dbf 161 //pid ground max output
edy05 41:5fe200d20022 162 strcat(webbuff, "<td>PID max: </td><td> <input type=\"text\" name=\"groundPidMaxOutput\" size=\"4\" value=\"");
edy05 25:69190c222dbf 163 ConvertToCharArray(_groundPidMaxOutput);
edy05 25:69190c222dbf 164 strcat(webbuff, _str);
edy05 41:5fe200d20022 165 strcat(webbuff, "\">");
edy05 41:5fe200d20022 166 strcat(webbuff, "</td></tr>");
edy05 25:69190c222dbf 167 //ground regulation bias
edy05 41:5fe200d20022 168 strcat(webbuff, "<tr>");
edy05 41:5fe200d20022 169 strcat(webbuff, "<td>Bias: </td><td><input type=\"text\" name=\"bias\" size=\"4\" value=\"");
edy05 25:69190c222dbf 170 ConvertToCharArray(_bias);
edy05 25:69190c222dbf 171 strcat(webbuff, _str);
edy05 41:5fe200d20022 172 strcat(webbuff, "\">");
edy05 41:5fe200d20022 173 strcat(webbuff, "</td></tr>");
edy05 41:5fe200d20022 174 strcat(webbuff, "<tr>");
edy05 41:5fe200d20022 175 strcat(webbuff, "<td>P:</td><td> <input type=\"text\" name=\"proportional\" size=\"4\" value=\"");
edy05 32:c729e6da7f9a 176 ConvertToCharArray(_newP);
edy05 9:86a5af9935b1 177 strcat(webbuff, _str);
edy05 41:5fe200d20022 178 strcat(webbuff, "\"></td></tr>");
edy05 41:5fe200d20022 179 strcat(webbuff, "<tr>");
edy05 41:5fe200d20022 180 strcat(webbuff, "<td>I: </td><td><input type=\"text\" name=\"integral\" size=\"4\" value=\"");
edy05 32:c729e6da7f9a 181 ConvertToCharArray(_newI);
edy05 9:86a5af9935b1 182 strcat(webbuff, _str);
edy05 41:5fe200d20022 183 strcat(webbuff, "\"></td></tr>");
edy05 41:5fe200d20022 184 strcat(webbuff, "<tr>");
edy05 41:5fe200d20022 185 strcat(webbuff, "<td>D: </td><td><input type=\"text\" name=\"derivative\" size=\"4\" value=\"");
edy05 32:c729e6da7f9a 186 ConvertToCharArray(_newD);
edy05 9:86a5af9935b1 187 strcat(webbuff, _str);
edy05 41:5fe200d20022 188 strcat(webbuff, "\"></td></tr>");
edy05 41:5fe200d20022 189 strcat(webbuff, "</table><br>");
edy05 14:076ef843e1ba 190 //Ground set Point
edy05 41:5fe200d20022 191 strcat(webbuff, "Regulovana vyska: <input type=\"text\" name=\"groundSetPoint\" size=\"4\" value=\"");
edy05 39:93d8aa47f4ce 192 ConvertToCharArray(_newGroundSetPoint);
edy05 14:076ef843e1ba 193 strcat(webbuff, _str);
edy05 14:076ef843e1ba 194 strcat(webbuff, "\"><br>");
edy05 41:5fe200d20022 195 // ground regulation
edy05 41:5fe200d20022 196 if(_tempGroundRegulation) {
edy05 41:5fe200d20022 197 strcat(webbuff, "<p><input type=\"radio\" name=\"groundRegulation\" value=\"1\" checked> Regulace vysky - zapnout");
edy05 41:5fe200d20022 198 strcat(webbuff, "<br><input type=\"radio\" name=\"groundRegulation\" value=\"0\" > Regulace vysky - vypnout</p>");
edy05 38:801fee0330e2 199 } else {
edy05 41:5fe200d20022 200 strcat(webbuff, "<p><input type=\"radio\" name=\"groundRegulation\" value=\"1\" > Regulace vysky - zapnout");
edy05 41:5fe200d20022 201 strcat(webbuff, "<br><input type=\"radio\" name=\"groundRegulation\" value=\"0\" checked> Regulace vysky - vypnout<p>");
edy05 38:801fee0330e2 202 }
edy05 41:5fe200d20022 203 if(_goAhead == false) {
edy05 41:5fe200d20022 204 strcat(webbuff, "<p><input type=\"radio\" name=\"goAhead\" value=\"1\" > Autonomni pohyb - zapnout");
edy05 41:5fe200d20022 205 strcat(webbuff, "<br><input type=\"radio\" name=\"goAhead\" value=\"0\" checked> Autonomni pohyb - vypnout</p>");
edy05 41:5fe200d20022 206 } else {
edy05 41:5fe200d20022 207 strcat(webbuff, "<p><input type=\"radio\" name=\"goAhead\" value=\"1\" checked> Autonomni pohyb - zapnout");
edy05 41:5fe200d20022 208 strcat(webbuff, "<br><input type=\"radio\" name=\"goAhead\" value=\"0\"> Autonomni pohyb - vypnout</p>");
edy05 41:5fe200d20022 209 }
edy05 41:5fe200d20022 210 strcat(webbuff, "<p><input type=\"radio\" name=\"nothing\" value=\"1\" style=\"display:none\" checked></p>");
edy05 34:5dca557e982f 211 strcat(webbuff, "<p><input type=\"submit\"></p>");
edy05 34:5dca557e982f 212 strcat(webbuff, "</form>");
edy05 2:d172c9963f87 213 strcat(webbuff, "</body></html>");
edy05 2:d172c9963f87 214 // end of WEB page data
edy05 2:d172c9963f87 215 bufl = strlen(webbuff); // get total page buffer length
edy05 2:d172c9963f87 216 sprintf(cmdbuff,"AT+CIPSEND=%d,%d\r\n", linkID, bufl); // send IPD link channel and buffer character length.
edy05 34:5dca557e982f 217 pc.printf("%s \n\r", cmdbuff);
edy05 2:d172c9963f87 218 timeout=200;
edy05 2:d172c9963f87 219 getcount=7;
edy05 2:d172c9963f87 220 SendCMD();
edy05 34:5dca557e982f 221 Thread::wait(1000);
edy05 2:d172c9963f87 222 getreply();
edy05 34:5dca557e982f 223 pc.printf("%s \n\r", replybuff);
edy05 2:d172c9963f87 224 SendWEB(); // send web page
edy05 2:d172c9963f87 225 memset(webbuff, '\0', sizeof(webbuff));
edy05 2:d172c9963f87 226 sendcheck();
edy05 2:d172c9963f87 227
edy05 2:d172c9963f87 228 }
edy05 2:d172c9963f87 229
edy05 2:d172c9963f87 230 void sendcheck(){
edy05 2:d172c9963f87 231 weberror=1;
edy05 33:a2f9fea05cb9 232 timeout= 1000;
edy05 33:a2f9fea05cb9 233 getcount = 50;
edy05 2:d172c9963f87 234 t2.reset();
edy05 2:d172c9963f87 235 t2.start();
edy05 2:d172c9963f87 236 while(weberror==1 && t2.read() <5) {
edy05 2:d172c9963f87 237 getreply();
edy05 2:d172c9963f87 238 if (strstr(replybuff, "SEND OK") != NULL) {
edy05 2:d172c9963f87 239 weberror=0; // wait for valid SEND OK
edy05 2:d172c9963f87 240 }
edy05 2:d172c9963f87 241 }
edy05 2:d172c9963f87 242 if(weberror==1) { // restart connection
edy05 40:0aa1cefe80ab 243 pc.printf("sendcheck - restarting connection \n\r");
edy05 2:d172c9963f87 244 strcpy(cmdbuff, "AT+CIPMUX=1\r\n");
edy05 2:d172c9963f87 245 timeout=500;
edy05 2:d172c9963f87 246 getcount=10;
edy05 2:d172c9963f87 247 SendCMD();
edy05 2:d172c9963f87 248 getreply();
edy05 34:5dca557e982f 249 //pc.printf(replybuff);
edy05 33:a2f9fea05cb9 250 sprintf(cmdbuff,"AT+CIPSERVER=0,%d\r\n", port);
edy05 33:a2f9fea05cb9 251 timeout=500;
edy05 33:a2f9fea05cb9 252 getcount=10;
edy05 33:a2f9fea05cb9 253 SendCMD();
edy05 33:a2f9fea05cb9 254 getreply();
edy05 34:5dca557e982f 255 //pc.printf(replybuff);
edy05 2:d172c9963f87 256 sprintf(cmdbuff,"AT+CIPSERVER=1,%d\r\n", port);
edy05 2:d172c9963f87 257 timeout=500;
edy05 2:d172c9963f87 258 getcount=10;
edy05 2:d172c9963f87 259 SendCMD();
edy05 2:d172c9963f87 260 getreply();
edy05 34:5dca557e982f 261 //pc.printf(replybuff);
edy05 2:d172c9963f87 262 } else {
edy05 34:5dca557e982f 263 //pc.printf("sendcheck ok \n\r");
edy05 2:d172c9963f87 264 sprintf(cmdbuff, "AT+CIPCLOSE=%s\r\n",channel); // close current connection
edy05 2:d172c9963f87 265 SendCMD();
edy05 2:d172c9963f87 266 getreply();
edy05 34:5dca557e982f 267 //pc.printf(replybuff);
edy05 2:d172c9963f87 268 }
edy05 2:d172c9963f87 269 t2.reset();
edy05 2:d172c9963f87 270 }
edy05 2:d172c9963f87 271
edy05 2:d172c9963f87 272 // Large WEB buffer data send
edy05 2:d172c9963f87 273 void SendWEB()
edy05 2:d172c9963f87 274 {
edy05 2:d172c9963f87 275 int i=0;
edy05 2:d172c9963f87 276 if(esp.writeable()) {
edy05 2:d172c9963f87 277 while(webbuff[i]!='\0') {
edy05 2:d172c9963f87 278 esp.putc(webbuff[i]);
edy05 2:d172c9963f87 279 i++;
edy05 2:d172c9963f87 280 }
edy05 2:d172c9963f87 281 }
edy05 2:d172c9963f87 282 }
edy05 2:d172c9963f87 283
edy05 2:d172c9963f87 284 // Reads and processes GET and POST web data
edy05 2:d172c9963f87 285 void ReadWebData(){
edy05 2:d172c9963f87 286 wait_ms(200);
edy05 2:d172c9963f87 287 esp.attach(NULL);
edy05 2:d172c9963f87 288 count=0;
edy05 2:d172c9963f87 289 DataRX=0;
edy05 2:d172c9963f87 290 weberror=0;
edy05 2:d172c9963f87 291 memset(webdata, '\0', sizeof(webdata));
edy05 2:d172c9963f87 292 int x = strcspn (webbuff,"+");
edy05 2:d172c9963f87 293 if(x) {
edy05 2:d172c9963f87 294 strcpy(webdata, webbuff + x);
edy05 34:5dca557e982f 295 //////pc.printf("webdata received: %s", webdata);
edy05 2:d172c9963f87 296 weberror=0;
edy05 2:d172c9963f87 297 int numMatched = sscanf(webdata,"+IPD,%d,%d:%s", &linkID, &ipdLen, type);
edy05 2:d172c9963f87 298 if (strstr(webdata, "led1=1") != NULL ) {
edy05 2:d172c9963f87 299 led1=1;
edy05 2:d172c9963f87 300 }
edy05 2:d172c9963f87 301 if (strstr(webdata, "led1=0") != NULL ) {
edy05 2:d172c9963f87 302 led1=0;
edy05 2:d172c9963f87 303 }
edy05 21:0afb91824792 304 //ground regulation
edy05 21:0afb91824792 305 if (strstr(webdata, "groundRegulation=1") != NULL )
edy05 31:5f1737e480f3 306 _tempGroundRegulation = true;
edy05 21:0afb91824792 307 if (strstr(webdata, "groundRegulation=0") != NULL )
edy05 31:5f1737e480f3 308 _tempGroundRegulation = false;
edy05 25:69190c222dbf 309 // pid min Output
edy05 25:69190c222dbf 310 if (strstr(webdata, "groundPidMinOutput") != NULL ){
edy05 34:5dca557e982f 311 //////pc.printf("\n\r looking for data \n\r");
edy05 25:69190c222dbf 312 char* p_webdata = strstr(webdata, "groundPidMinOutput");
edy05 25:69190c222dbf 313 p_webdata = p_webdata + strlen("groundPidMinOutput") + 1;
edy05 25:69190c222dbf 314 int i = 0;
edy05 25:69190c222dbf 315 while(*p_webdata != '&'){
edy05 34:5dca557e982f 316 ////pc.printf("%c", *p_webdata);
edy05 25:69190c222dbf 317 _str[i] = *p_webdata;
edy05 25:69190c222dbf 318 p_webdata += 1;
edy05 25:69190c222dbf 319 i++;
edy05 25:69190c222dbf 320 }
edy05 34:5dca557e982f 321 ////pc.printf("\n\r");
edy05 25:69190c222dbf 322 _str[i] = '\0';
edy05 34:5dca557e982f 323 //////pc.printf("groundPidMinOutput: %s", _str);
edy05 25:69190c222dbf 324 _groundPidMinOutput = atof(_str);
edy05 34:5dca557e982f 325 //////pc.printf("\n\r end of looking for data \n\r");
edy05 25:69190c222dbf 326 }
edy05 25:69190c222dbf 327 //pid max output
edy05 25:69190c222dbf 328 if (strstr(webdata, "groundPidMaxOutput") != NULL ){
edy05 34:5dca557e982f 329 //////pc.printf("\n\r looking for data \n\r");
edy05 25:69190c222dbf 330 char* p_webdata = strstr(webdata, "groundPidMaxOutput");
edy05 25:69190c222dbf 331 p_webdata = p_webdata + strlen("groundPidMaxOutput") + 1;
edy05 25:69190c222dbf 332 int i = 0;
edy05 25:69190c222dbf 333 while(*p_webdata != '&'){
edy05 34:5dca557e982f 334 ////pc.printf("%c", *p_webdata);
edy05 25:69190c222dbf 335 _str[i] = *p_webdata;
edy05 25:69190c222dbf 336 p_webdata += 1;
edy05 25:69190c222dbf 337 i++;
edy05 25:69190c222dbf 338 }
edy05 34:5dca557e982f 339 //////pc.printf("\n\r");
edy05 25:69190c222dbf 340 _str[i] = '\0';
edy05 34:5dca557e982f 341 //////pc.printf("groundPidMaxOutput: %s", _str);
edy05 25:69190c222dbf 342 _groundPidMaxOutput = atof(_str);
edy05 34:5dca557e982f 343 //////pc.printf("\n\r end of looking for data \n\r");
edy05 25:69190c222dbf 344 }
edy05 25:69190c222dbf 345 //bias
edy05 25:69190c222dbf 346 if (strstr(webdata, "bias") != NULL ){
edy05 34:5dca557e982f 347 //////pc.printf("\n\r looking for data \n\r");
edy05 25:69190c222dbf 348 char* p_webdata = strstr(webdata, "bias");
edy05 25:69190c222dbf 349 p_webdata = p_webdata + strlen("bias") + 1;
edy05 25:69190c222dbf 350 int i = 0;
edy05 25:69190c222dbf 351 while(*p_webdata != '&'){
edy05 34:5dca557e982f 352 ////pc.printf("%c", *p_webdata);
edy05 25:69190c222dbf 353 _str[i] = *p_webdata;
edy05 25:69190c222dbf 354 p_webdata += 1;
edy05 25:69190c222dbf 355 i++;
edy05 25:69190c222dbf 356 }
edy05 34:5dca557e982f 357 //////pc.printf("\n\r");
edy05 25:69190c222dbf 358 _str[i] = '\0';
edy05 34:5dca557e982f 359 //////pc.printf("bias: %s", _str);
edy05 25:69190c222dbf 360 _bias = atof(_str);
edy05 34:5dca557e982f 361 //////pc.printf("\n\r end of looking for data \n\r");
edy05 25:69190c222dbf 362 }
edy05 21:0afb91824792 363 // PID values
edy05 2:d172c9963f87 364 if (strstr(webdata, "proportional") != NULL ){
edy05 34:5dca557e982f 365 //////pc.printf("\n\r looking for data \n\r");
edy05 2:d172c9963f87 366 char* p_webdata = strstr(webdata, "proportional");
edy05 2:d172c9963f87 367 p_webdata = p_webdata + strlen("proportional") + 1;
edy05 2:d172c9963f87 368 int i = 0;
edy05 2:d172c9963f87 369 while(*p_webdata != '&'){
edy05 34:5dca557e982f 370 ////pc.printf("%c", *p_webdata);
edy05 9:86a5af9935b1 371 _str[i] = *p_webdata;
edy05 2:d172c9963f87 372 p_webdata += 1;
edy05 2:d172c9963f87 373 i++;
edy05 2:d172c9963f87 374 }
edy05 34:5dca557e982f 375 //////pc.printf("\n\r");
edy05 9:86a5af9935b1 376 _str[i] = '\0';
edy05 34:5dca557e982f 377 //////pc.printf("proportional: %s", _str);
edy05 32:c729e6da7f9a 378 _newP = atof(_str);
edy05 34:5dca557e982f 379 //////pc.printf("\n\r end of looking for data \n\r");
edy05 2:d172c9963f87 380 }
edy05 2:d172c9963f87 381 if (strstr(webdata, "integral") != NULL){
edy05 34:5dca557e982f 382 //////pc.printf("\n\r looking for data \n\r");
edy05 2:d172c9963f87 383 char* p_webdata = strstr(webdata, "integral");
edy05 2:d172c9963f87 384 p_webdata = p_webdata + strlen("integral") + 1;
edy05 2:d172c9963f87 385 int i = 0;
edy05 2:d172c9963f87 386 while(*p_webdata != '&'){
edy05 34:5dca557e982f 387 ////pc.printf("%c", *p_webdata);
edy05 9:86a5af9935b1 388 _str[i] = *p_webdata;
edy05 2:d172c9963f87 389 p_webdata += 1;
edy05 2:d172c9963f87 390 i++;
edy05 2:d172c9963f87 391 }
edy05 34:5dca557e982f 392 //////pc.printf("\n\r");
edy05 9:86a5af9935b1 393 _str[i] = '\0';
edy05 34:5dca557e982f 394 //////pc.printf("integral: %s", _str);
edy05 32:c729e6da7f9a 395 _newI = atof(_str);
edy05 34:5dca557e982f 396 //////pc.printf("\n\r end of looking for data \n\r");
edy05 2:d172c9963f87 397
edy05 2:d172c9963f87 398 }
edy05 2:d172c9963f87 399 if (strstr(webdata, "derivative") != NULL){
edy05 34:5dca557e982f 400 //////pc.printf("\n\r looking for data \n\r");
edy05 2:d172c9963f87 401 char* p_webdata = strstr(webdata, "derivative");
edy05 2:d172c9963f87 402 p_webdata = p_webdata + strlen("derivative") + 1;
edy05 2:d172c9963f87 403 int i = 0;
edy05 2:d172c9963f87 404 while(*p_webdata != '&'){
edy05 34:5dca557e982f 405 ////pc.printf("%c", *p_webdata);
edy05 9:86a5af9935b1 406 _str[i] = *p_webdata;
edy05 2:d172c9963f87 407 p_webdata += 1;
edy05 2:d172c9963f87 408 i++;
edy05 2:d172c9963f87 409 }
edy05 34:5dca557e982f 410 //////pc.printf("\n\r");
edy05 9:86a5af9935b1 411 _str[i] = '\0';
edy05 34:5dca557e982f 412 //////pc.printf("derivative: %s", _str);
edy05 32:c729e6da7f9a 413 _newD = atof(_str);
edy05 34:5dca557e982f 414 //////pc.printf("\n\r end of looking for data \n\r");
edy05 2:d172c9963f87 415 }
edy05 14:076ef843e1ba 416 if (strstr(webdata, "groundSetPoint") != NULL){
edy05 34:5dca557e982f 417 //////pc.printf("\n\r looking for data \n\r");
edy05 14:076ef843e1ba 418 char* p_webdata = strstr(webdata, "groundSetPoint");
edy05 14:076ef843e1ba 419 p_webdata = p_webdata + strlen("groundSetPoint") + 1;
edy05 14:076ef843e1ba 420 int i = 0;
edy05 14:076ef843e1ba 421 while(*p_webdata != '&'){
edy05 34:5dca557e982f 422 ////pc.printf("%c", *p_webdata);
edy05 14:076ef843e1ba 423 _str[i] = *p_webdata;
edy05 14:076ef843e1ba 424 p_webdata += 1;
edy05 14:076ef843e1ba 425 i++;
edy05 14:076ef843e1ba 426 }
edy05 34:5dca557e982f 427 //////pc.printf("\n\r");
edy05 14:076ef843e1ba 428 _str[i] = '\0';
edy05 34:5dca557e982f 429 //////pc.printf("groundSetPoint: %s", _str);
edy05 39:93d8aa47f4ce 430 _newGroundSetPoint = atof(_str);
edy05 38:801fee0330e2 431 //////pc.printf("\n\r end of looking for data \n\r");
edy05 14:076ef843e1ba 432 }
edy05 38:801fee0330e2 433 //Go ahead
edy05 41:5fe200d20022 434 if (strstr(webdata, "goAhead=1") != NULL ){
edy05 41:5fe200d20022 435 pc.printf("go agead ON \n\r");
edy05 38:801fee0330e2 436 _goAhead = true;
edy05 41:5fe200d20022 437 }
edy05 41:5fe200d20022 438 if (strstr(webdata, "goAhead=0") != NULL ){
edy05 41:5fe200d20022 439 pc.printf("go agead OFF \n\r");
edy05 38:801fee0330e2 440 _goAhead = false;
edy05 41:5fe200d20022 441 }
edy05 40:0aa1cefe80ab 442 pc.printf("test \n\r");
edy05 2:d172c9963f87 443 sprintf(channel, "%d",linkID);
edy05 2:d172c9963f87 444 if (strstr(webdata, "GET") != NULL) {
edy05 40:0aa1cefe80ab 445 pc.printf("GET \n\r");
edy05 2:d172c9963f87 446 servreq=1;
edy05 2:d172c9963f87 447 }
edy05 2:d172c9963f87 448 if (strstr(webdata, "POST") != NULL) {
edy05 40:0aa1cefe80ab 449 pc.printf("POST \n\r");
edy05 2:d172c9963f87 450 servreq=1;
edy05 2:d172c9963f87 451 }
edy05 2:d172c9963f87 452 webcounter++;
edy05 2:d172c9963f87 453 sprintf(webcount, "%d",webcounter);
edy05 2:d172c9963f87 454 }else{
edy05 40:0aa1cefe80ab 455 pc.printf("no + \n\r");
edy05 2:d172c9963f87 456 memset(webbuff, '\0', sizeof(webbuff));
edy05 2:d172c9963f87 457 esp.attach(&callback);
edy05 2:d172c9963f87 458 weberror=1;
edy05 2:d172c9963f87 459 }
edy05 2:d172c9963f87 460
edy05 2:d172c9963f87 461 }
edy05 2:d172c9963f87 462
edy05 2:d172c9963f87 463 void startserver(){
edy05 34:5dca557e982f 464 //pc.printf("++++++++++ Resetting ESP ++++++++++\r\n");
edy05 2:d172c9963f87 465 strcpy(cmdbuff,"AT+RST\r\n");
edy05 2:d172c9963f87 466 timeout=8000;
edy05 2:d172c9963f87 467 getcount=1000;
edy05 2:d172c9963f87 468 SendCMD();
edy05 2:d172c9963f87 469 getreply();
edy05 34:5dca557e982f 470 //pc.printf(replybuff);
edy05 34:5dca557e982f 471 //pc.printf("%d",count);
edy05 2:d172c9963f87 472 if (strstr(replybuff, "OK") != NULL) {
edy05 34:5dca557e982f 473 //////pc.printf("\n++++++++++ Starting Server ++++++++++\r\n");
edy05 2:d172c9963f87 474 strcpy(cmdbuff, "AT+CIPMUX=1\r\n"); // set multiple connections.
edy05 2:d172c9963f87 475 timeout=500;
edy05 2:d172c9963f87 476 getcount=20;
edy05 2:d172c9963f87 477 SendCMD();
edy05 2:d172c9963f87 478 getreply();
edy05 34:5dca557e982f 479 //pc.printf(replybuff);
edy05 2:d172c9963f87 480 sprintf(cmdbuff,"AT+CIPSERVER=1,%d\r\n", port);
edy05 2:d172c9963f87 481 timeout=500;
edy05 2:d172c9963f87 482 getcount=20;
edy05 2:d172c9963f87 483 SendCMD();
edy05 2:d172c9963f87 484 getreply();
edy05 34:5dca557e982f 485 //pc.printf(replybuff);
edy05 2:d172c9963f87 486 wait(1);
edy05 2:d172c9963f87 487 sprintf(cmdbuff,"AT+CIPSTO=%d\r\n",SERVtimeout);
edy05 2:d172c9963f87 488 timeout=500;
edy05 2:d172c9963f87 489 getcount=50;
edy05 2:d172c9963f87 490 SendCMD();
edy05 2:d172c9963f87 491 getreply();
edy05 34:5dca557e982f 492 //pc.printf(replybuff);
edy05 2:d172c9963f87 493 wait(5);
edy05 34:5dca557e982f 494 //pc.printf("\n Getting Server IP \r\n");
edy05 2:d172c9963f87 495 strcpy(cmdbuff, "AT+CIFSR\r\n");
edy05 2:d172c9963f87 496 timeout=2500;
edy05 2:d172c9963f87 497 getcount=200;
edy05 2:d172c9963f87 498 while(weberror==0) {
edy05 2:d172c9963f87 499 SendCMD();
edy05 2:d172c9963f87 500 getreply();
edy05 2:d172c9963f87 501 if (strstr(replybuff, "0.0.0.0") == NULL) {
edy05 2:d172c9963f87 502 weberror=1; // wait for valid IP
edy05 2:d172c9963f87 503 }
edy05 2:d172c9963f87 504 }
edy05 34:5dca557e982f 505 //pc.printf("\n Enter WEB address (IP) found below in your browser \r\n\n");
edy05 34:5dca557e982f 506 //pc.printf("\n The MAC address is also shown below,if it is needed \r\n\n");
edy05 2:d172c9963f87 507 replybuff[strlen(replybuff)-1] = '\0';
edy05 2:d172c9963f87 508 //char* IP = replybuff + 5;
edy05 2:d172c9963f87 509 sprintf(webdata,"%s", replybuff);
edy05 2:d172c9963f87 510 //SAVE IP ADDRESS
edy05 2:d172c9963f87 511 get_ip_address(webdata);
edy05 34:5dca557e982f 512 //pc.printf("ip_address: %s\n\r",ip_address);
edy05 34:5dca557e982f 513 //pc.printf(webdata);
edy05 34:5dca557e982f 514 //pc.printf("\n\n++++++++++ Ready ++++++++++\r\n\n");
edy05 2:d172c9963f87 515 esp.attach(&callback);
edy05 2:d172c9963f87 516 } else {
edy05 34:5dca557e982f 517 //pc.printf("\n++++++++++ ESP8266 error, check power/connections ++++++++++\r\n");
edy05 2:d172c9963f87 518 while(1) {}
edy05 2:d172c9963f87 519 }
edy05 2:d172c9963f87 520 t2.reset();
edy05 2:d172c9963f87 521 t2.start();
edy05 2:d172c9963f87 522 }
edy05 2:d172c9963f87 523
edy05 2:d172c9963f87 524 void SendCMD()
edy05 2:d172c9963f87 525 {
edy05 2:d172c9963f87 526 esp.printf("%s", cmdbuff);
edy05 2:d172c9963f87 527 }
edy05 2:d172c9963f87 528
edy05 2:d172c9963f87 529 void getreply()
edy05 2:d172c9963f87 530 {
edy05 2:d172c9963f87 531 memset(replybuff, '\0', sizeof(replybuff));
edy05 2:d172c9963f87 532 t1.reset();
edy05 2:d172c9963f87 533 t1.start();
edy05 2:d172c9963f87 534 replycount=0;
edy05 2:d172c9963f87 535 while(t1.read_ms()< timeout && replycount < getcount) {
edy05 2:d172c9963f87 536 if(esp.readable()) {
edy05 2:d172c9963f87 537 replybuff[replycount] = esp.getc();
edy05 2:d172c9963f87 538 replycount++;
edy05 2:d172c9963f87 539 }
edy05 2:d172c9963f87 540 }
edy05 2:d172c9963f87 541 t1.stop();
edy05 2:d172c9963f87 542 }
edy05 2:d172c9963f87 543
edy05 2:d172c9963f87 544 void get_ip_address(char web_data[1024]){
edy05 2:d172c9963f87 545 char pre_text[] = "+CIFSR:STAIP,\"";
edy05 2:d172c9963f87 546 char* p_text = strstr(webdata, pre_text);
edy05 2:d172c9963f87 547 p_text = p_text+strlen(pre_text);
edy05 2:d172c9963f87 548 char* p_text2 = strstr(p_text, "\"");
edy05 2:d172c9963f87 549 for(int i = 0;;i++){
edy05 2:d172c9963f87 550 if(*(p_text+i) == *p_text2){
edy05 2:d172c9963f87 551 ip_address[i] = '\0';
edy05 2:d172c9963f87 552 break;
edy05 2:d172c9963f87 553 }
edy05 2:d172c9963f87 554 ip_address[i] = *(p_text+i);
edy05 2:d172c9963f87 555
edy05 2:d172c9963f87 556 }
edy05 2:d172c9963f87 557 }