Final version

Dependencies:   mbed Servo Motor

Committer:
kzar
Date:
Wed Dec 05 20:52:24 2018 +0000
Revision:
1:6d317aa0aae7
Parent:
0:60cec426fad9
Child:
2:15a043aa08ea
V2, received data from controller and flips led

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kzar 0:60cec426fad9 1 // This mbed code starts up a server on the esp8266 and then updates it according to inputs from the controller
kzar 0:60cec426fad9 2 // The car will host the server, the controller will send commands to the server
kzar 0:60cec426fad9 3
kzar 0:60cec426fad9 4 #include "mbed.h"
kzar 0:60cec426fad9 5
kzar 0:60cec426fad9 6 Serial pc(USBTX, USBRX);
kzar 0:60cec426fad9 7 Serial esp(p28, p27); // tx, rx
kzar 0:60cec426fad9 8
kzar 0:60cec426fad9 9
kzar 0:60cec426fad9 10 // Standard Mbed LED definitions
kzar 0:60cec426fad9 11 DigitalOut led1(LED1);
kzar 0:60cec426fad9 12 DigitalOut led2(LED2);
kzar 0:60cec426fad9 13 DigitalOut led3(LED3);
kzar 0:60cec426fad9 14 DigitalOut led4(LED4);
kzar 0:60cec426fad9 15
kzar 0:60cec426fad9 16
kzar 0:60cec426fad9 17 /*
kzar 0:60cec426fad9 18 char ssid[32] = "hsd"; // enter WiFi router ssid inside the quotes
kzar 0:60cec426fad9 19 char pwd [32] = "austin123"; // enter WiFi router password inside the quotes
kzar 0:60cec426fad9 20 */
kzar 0:60cec426fad9 21
kzar 0:60cec426fad9 22
kzar 0:60cec426fad9 23 // things for sending/receiving data over serial
kzar 0:60cec426fad9 24 volatile int tx_in=0;
kzar 0:60cec426fad9 25 volatile int tx_out=0;
kzar 0:60cec426fad9 26 volatile int rx_in=0;
kzar 0:60cec426fad9 27 volatile int rx_out=0;
kzar 0:60cec426fad9 28 const int buffer_size = 4095;
kzar 0:60cec426fad9 29 char tx_buffer[buffer_size+1];
kzar 0:60cec426fad9 30 char rx_buffer[buffer_size+1];
kzar 0:60cec426fad9 31 void Tx_interrupt();
kzar 0:60cec426fad9 32 void Rx_interrupt();
kzar 0:60cec426fad9 33 void read_line();
kzar 0:60cec426fad9 34
kzar 0:60cec426fad9 35 int DataRX;
kzar 0:60cec426fad9 36 int update;
kzar 0:60cec426fad9 37 char cmdbuff[1024];
kzar 0:60cec426fad9 38 char replybuff[4096];
kzar 0:60cec426fad9 39 char webdata[4096]; // This may need to be bigger depending on WEB browser used
kzar 0:60cec426fad9 40 char webbuff[4096]; // Currently using 1986 characters, Increase this if more web page data added
kzar 0:60cec426fad9 41 void SendCMD(),getreply(),ReadWebData(),startserver();
kzar 0:60cec426fad9 42 char rx_line[1024];
kzar 1:6d317aa0aae7 43 //int port =80; // set server port
kzar 1:6d317aa0aae7 44 int timeout =5; // set server timeout in seconds in case link breaks.
kzar 0:60cec426fad9 45
kzar 0:60cec426fad9 46
kzar 0:60cec426fad9 47
kzar 0:60cec426fad9 48 int main()
kzar 0:60cec426fad9 49 {
kzar 0:60cec426fad9 50 pc.baud(9600);
kzar 0:60cec426fad9 51 esp.baud(9600);
kzar 0:60cec426fad9 52 led1=1,led2=0,led3=0, led4=0;
kzar 0:60cec426fad9 53 // Setup a serial interrupt function to receive data
kzar 0:60cec426fad9 54 esp.attach(&Rx_interrupt, Serial::RxIrq);
kzar 0:60cec426fad9 55 // Setup a serial interrupt function to transmit data
kzar 0:60cec426fad9 56 esp.attach(&Tx_interrupt, Serial::TxIrq);
kzar 0:60cec426fad9 57 // Start up the server
kzar 0:60cec426fad9 58 startserver();
kzar 0:60cec426fad9 59
kzar 0:60cec426fad9 60 update = 0;
kzar 0:60cec426fad9 61 // Everything is interrupt driven, infinite loop
kzar 0:60cec426fad9 62 while(1) {
kzar 0:60cec426fad9 63 // Read data if its available
kzar 0:60cec426fad9 64 if(DataRX==1) {
kzar 0:60cec426fad9 65 ReadWebData();
kzar 0:60cec426fad9 66 esp.attach(&Rx_interrupt, Serial::RxIrq);
kzar 0:60cec426fad9 67 }
kzar 0:60cec426fad9 68 // //Send all car vals+
kzar 0:60cec426fad9 69 // if (update) {
kzar 0:60cec426fad9 70 // // Send led for testing
kzar 0:60cec426fad9 71 // led1 = !led1;
kzar 0:60cec426fad9 72 // // Reset update flag
kzar 0:60cec426fad9 73 // update = 0;
kzar 0:60cec426fad9 74 // }
kzar 0:60cec426fad9 75
kzar 0:60cec426fad9 76 }
kzar 0:60cec426fad9 77 }
kzar 0:60cec426fad9 78
kzar 0:60cec426fad9 79 // Reads and processes GET and POST web data
kzar 0:60cec426fad9 80 void ReadWebData()
kzar 0:60cec426fad9 81 {
kzar 0:60cec426fad9 82 wait_ms(200);
kzar 0:60cec426fad9 83 esp.attach(NULL,Serial::RxIrq);
kzar 0:60cec426fad9 84 DataRX=0;
kzar 0:60cec426fad9 85 memset(webdata, '\0', sizeof(webdata));
kzar 0:60cec426fad9 86 strcpy(webdata, rx_buffer);
kzar 0:60cec426fad9 87 memset(rx_buffer, '\0', sizeof(rx_buffer));
kzar 0:60cec426fad9 88 rx_in = 0;
kzar 0:60cec426fad9 89 rx_out = 0;
kzar 0:60cec426fad9 90
kzar 0:60cec426fad9 91 // Modify this to check for our commands
kzar 0:60cec426fad9 92 // check web data for form information
kzar 0:60cec426fad9 93 if( strstr(webdata, "flip_led1") != NULL ) {
kzar 0:60cec426fad9 94 led1=!led1;
kzar 0:60cec426fad9 95 }
kzar 0:60cec426fad9 96 if( strstr(webdata, "check=led2v") != NULL ) {
kzar 0:60cec426fad9 97 led2=!led2;
kzar 0:60cec426fad9 98 }
kzar 0:60cec426fad9 99 if( strstr(webdata, "check=led3v") != NULL ) {
kzar 0:60cec426fad9 100 led3=!led3;
kzar 0:60cec426fad9 101 }
kzar 0:60cec426fad9 102 if( strstr(webdata, "check=led4v") != NULL ) {
kzar 0:60cec426fad9 103 led4=!led4;
kzar 0:60cec426fad9 104 }
kzar 0:60cec426fad9 105 if( strstr(webdata, "POST") != NULL ) { // set update flag if POST request
kzar 0:60cec426fad9 106 update=1;
kzar 0:60cec426fad9 107 }
kzar 0:60cec426fad9 108 if( strstr(webdata, "GET") != NULL && strstr(webdata, "favicon") == NULL ) { // set update flag for GET request but do not want to update for favicon requests
kzar 0:60cec426fad9 109 update=1;
kzar 0:60cec426fad9 110 }
kzar 0:60cec426fad9 111 }
kzar 0:60cec426fad9 112 // Starts webserver
kzar 0:60cec426fad9 113 void startserver()
kzar 0:60cec426fad9 114 {
kzar 0:60cec426fad9 115 // Reset the ESP8266
kzar 0:60cec426fad9 116 pc.printf("++++++++++ Resetting ESP ++++++++++\r\n");
kzar 0:60cec426fad9 117 strcpy(cmdbuff,"node.restart()\r\n");
kzar 0:60cec426fad9 118 SendCMD();
kzar 1:6d317aa0aae7 119 getreply();
kzar 0:60cec426fad9 120 wait(2);
kzar 0:60cec426fad9 121
kzar 0:60cec426fad9 122 // Set up WiFi connection
kzar 0:60cec426fad9 123 pc.printf(" CONNECTING TO WIFI \r\n");
kzar 0:60cec426fad9 124
kzar 1:6d317aa0aae7 125 strcpy(cmdbuff,"wifi.setmode(wifi.STATIONAP)\r\n");
kzar 0:60cec426fad9 126 SendCMD();
kzar 0:60cec426fad9 127 getreply();
kzar 0:60cec426fad9 128 wait(2);
kzar 0:60cec426fad9 129
kzar 1:6d317aa0aae7 130 strcpy(cmdbuff,"wifi.ap.config({ssid=\"Marlon's iPhone\",pwd=\"feelsbadman\"})\r\n");
kzar 0:60cec426fad9 131 SendCMD();
kzar 0:60cec426fad9 132 getreply();
kzar 0:60cec426fad9 133 wait(2);
kzar 0:60cec426fad9 134
kzar 1:6d317aa0aae7 135 strcpy(cmdbuff,"print(\"Server IP Address: \", wifi.ap.getip())\r\n");
kzar 0:60cec426fad9 136 SendCMD();
kzar 0:60cec426fad9 137 getreply();
kzar 0:60cec426fad9 138 wait(2);
kzar 0:60cec426fad9 139
kzar 0:60cec426fad9 140 // Start up the server
kzar 0:60cec426fad9 141 pc.printf("\n++++++++++ Starting Server ++++++++++\r\n> ");
kzar 0:60cec426fad9 142
kzar 0:60cec426fad9 143 //create server
kzar 1:6d317aa0aae7 144 strcpy(cmdbuff, "srv=net.createServer(net.TCP)\r\n");
kzar 0:60cec426fad9 145 SendCMD();
kzar 0:60cec426fad9 146 getreply();
kzar 0:60cec426fad9 147 wait(0.5);
kzar 0:60cec426fad9 148 // Set the sever to listen (named conn)
kzar 0:60cec426fad9 149 strcpy(cmdbuff,"srv:listen(80,function(conn)\r\n");
kzar 0:60cec426fad9 150 SendCMD();
kzar 0:60cec426fad9 151 getreply();
kzar 1:6d317aa0aae7 152 wait(2);
kzar 0:60cec426fad9 153 // Define receive function
kzar 1:6d317aa0aae7 154 strcpy(cmdbuff,"conn:on(\"receive\", function(conn, receivedData)\r\n");
kzar 0:60cec426fad9 155 SendCMD();
kzar 0:60cec426fad9 156 getreply();
kzar 1:6d317aa0aae7 157 wait(2);
kzar 0:60cec426fad9 158
kzar 0:60cec426fad9 159 //print data to mbed
kzar 1:6d317aa0aae7 160 strcpy(cmdbuff,"print(\"Received Data: \" .. receivedData)\r\n");
kzar 0:60cec426fad9 161 SendCMD();
kzar 0:60cec426fad9 162 getreply();
kzar 1:6d317aa0aae7 163 wait(2);
kzar 0:60cec426fad9 164
kzar 0:60cec426fad9 165 // End receive function
kzar 0:60cec426fad9 166 strcpy(cmdbuff,"end)\r\n");
kzar 0:60cec426fad9 167 SendCMD();
kzar 0:60cec426fad9 168 getreply();
kzar 1:6d317aa0aae7 169 wait(2);
kzar 0:60cec426fad9 170
kzar 0:60cec426fad9 171 // Define sent function
kzar 0:60cec426fad9 172 strcpy(cmdbuff,"conn:on(\"sent\",function(conn)\r\n");
kzar 0:60cec426fad9 173 SendCMD();
kzar 0:60cec426fad9 174 getreply();
kzar 1:6d317aa0aae7 175 wait(2);
kzar 0:60cec426fad9 176
kzar 0:60cec426fad9 177 //print data to mbed
kzar 0:60cec426fad9 178 strcpy(cmdbuff,"collectgarbage()\r\n");
kzar 0:60cec426fad9 179 SendCMD();
kzar 0:60cec426fad9 180 getreply();
kzar 1:6d317aa0aae7 181 wait(2);
kzar 0:60cec426fad9 182
kzar 0:60cec426fad9 183 // End sent function
kzar 0:60cec426fad9 184 strcpy(cmdbuff,"end)\r\n");
kzar 0:60cec426fad9 185 SendCMD();
kzar 0:60cec426fad9 186 getreply();
kzar 1:6d317aa0aae7 187 wait(2);
kzar 0:60cec426fad9 188
kzar 0:60cec426fad9 189 // End server listening
kzar 0:60cec426fad9 190 strcpy(cmdbuff,"end)\r\n");
kzar 0:60cec426fad9 191 SendCMD();
kzar 0:60cec426fad9 192 getreply();
kzar 1:6d317aa0aae7 193 wait(2);
kzar 0:60cec426fad9 194 }
kzar 0:60cec426fad9 195
kzar 0:60cec426fad9 196
kzar 0:60cec426fad9 197 // ESP Command data send
kzar 0:60cec426fad9 198 void SendCMD()
kzar 0:60cec426fad9 199 {
kzar 0:60cec426fad9 200 int i;
kzar 0:60cec426fad9 201 char temp_char;
kzar 0:60cec426fad9 202 bool empty;
kzar 0:60cec426fad9 203 i = 0;
kzar 0:60cec426fad9 204 // Start Critical Section - don't interrupt while changing global buffer variables
kzar 0:60cec426fad9 205 NVIC_DisableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 206 empty = (tx_in == tx_out);
kzar 0:60cec426fad9 207 while ((i==0) || (cmdbuff[i-1] != '\n')) {
kzar 0:60cec426fad9 208 // Wait if buffer full
kzar 0:60cec426fad9 209 if (((tx_in + 1) % buffer_size) == tx_out) {
kzar 0:60cec426fad9 210 // End Critical Section - need to let interrupt routine empty buffer by sending
kzar 0:60cec426fad9 211 NVIC_EnableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 212 while (((tx_in + 1) % buffer_size) == tx_out) {
kzar 0:60cec426fad9 213 }
kzar 0:60cec426fad9 214 // Start Critical Section - don't interrupt while changing global buffer variables
kzar 0:60cec426fad9 215 NVIC_DisableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 216 }
kzar 0:60cec426fad9 217 tx_buffer[tx_in] = cmdbuff[i];
kzar 0:60cec426fad9 218 i++;
kzar 0:60cec426fad9 219 tx_in = (tx_in + 1) % buffer_size;
kzar 0:60cec426fad9 220 }
kzar 0:60cec426fad9 221 if (esp.writeable() && (empty)) {
kzar 0:60cec426fad9 222 temp_char = tx_buffer[tx_out];
kzar 0:60cec426fad9 223 tx_out = (tx_out + 1) % buffer_size;
kzar 0:60cec426fad9 224 // Send first character to start tx interrupts, if stopped
kzar 0:60cec426fad9 225 esp.putc(temp_char);
kzar 0:60cec426fad9 226 }
kzar 0:60cec426fad9 227 // End Critical Section
kzar 0:60cec426fad9 228 NVIC_EnableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 229 return;
kzar 0:60cec426fad9 230 }
kzar 0:60cec426fad9 231
kzar 0:60cec426fad9 232
kzar 0:60cec426fad9 233 // Get Command and ESP status replies
kzar 0:60cec426fad9 234 void getreply()
kzar 0:60cec426fad9 235 {
kzar 0:60cec426fad9 236 read_line();
kzar 0:60cec426fad9 237 sscanf(rx_line,replybuff);
kzar 0:60cec426fad9 238 }
kzar 0:60cec426fad9 239
kzar 0:60cec426fad9 240 // FUNCTIONS BELOW ARE FOR RX AND TX INTERUPTS (NOT WEB STUFF)
kzar 0:60cec426fad9 241
kzar 0:60cec426fad9 242 // Read a line from the large rx buffer from rx interrupt routine
kzar 0:60cec426fad9 243 void read_line() {
kzar 0:60cec426fad9 244 int i;
kzar 0:60cec426fad9 245 i = 0;
kzar 0:60cec426fad9 246 // Start Critical Section - don't interrupt while changing global buffer variables
kzar 0:60cec426fad9 247 NVIC_DisableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 248 // Loop reading rx buffer characters until end of line character
kzar 0:60cec426fad9 249 while ((i==0) || (rx_line[i-1] != '\r')) {
kzar 0:60cec426fad9 250 // Wait if buffer empty
kzar 0:60cec426fad9 251 if (rx_in == rx_out) {
kzar 0:60cec426fad9 252 // End Critical Section - need to allow rx interrupt to get new characters for buffer
kzar 0:60cec426fad9 253 NVIC_EnableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 254 while (rx_in == rx_out) {
kzar 0:60cec426fad9 255 }
kzar 0:60cec426fad9 256 // Start Critical Section - don't interrupt while changing global buffer variables
kzar 0:60cec426fad9 257 NVIC_DisableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 258 }
kzar 0:60cec426fad9 259 rx_line[i] = rx_buffer[rx_out];
kzar 0:60cec426fad9 260 i++;
kzar 0:60cec426fad9 261 rx_out = (rx_out + 1) % buffer_size;
kzar 0:60cec426fad9 262 }
kzar 0:60cec426fad9 263 // End Critical Section
kzar 0:60cec426fad9 264 NVIC_EnableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 265 rx_line[i-1] = 0;
kzar 0:60cec426fad9 266 return;
kzar 0:60cec426fad9 267 }
kzar 0:60cec426fad9 268
kzar 0:60cec426fad9 269
kzar 0:60cec426fad9 270 // Interupt Routine to read in data from serial port
kzar 0:60cec426fad9 271 void Rx_interrupt() {
kzar 0:60cec426fad9 272 DataRX=1;
kzar 0:60cec426fad9 273 //led3=1;
kzar 0:60cec426fad9 274 // Loop just in case more than one character is in UART's receive FIFO buffer
kzar 0:60cec426fad9 275 // Stop if buffer full
kzar 0:60cec426fad9 276 while ((esp.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
kzar 0:60cec426fad9 277 rx_buffer[rx_in] = esp.getc();
kzar 0:60cec426fad9 278 // Uncomment to Echo to USB serial to watch data flow
kzar 0:60cec426fad9 279 pc.putc(rx_buffer[rx_in]);
kzar 0:60cec426fad9 280 rx_in = (rx_in + 1) % buffer_size;
kzar 0:60cec426fad9 281 }
kzar 0:60cec426fad9 282 //led3=0;
kzar 0:60cec426fad9 283 return;
kzar 0:60cec426fad9 284 }
kzar 0:60cec426fad9 285
kzar 0:60cec426fad9 286
kzar 0:60cec426fad9 287 // Interupt Routine to write out data to serial port
kzar 0:60cec426fad9 288 void Tx_interrupt() {
kzar 0:60cec426fad9 289 //led2=1;
kzar 0:60cec426fad9 290 // Loop to fill more than one character in UART's transmit FIFO buffer
kzar 0:60cec426fad9 291 // Stop if buffer empty
kzar 0:60cec426fad9 292 while ((esp.writeable()) && (tx_in != tx_out)) {
kzar 0:60cec426fad9 293 esp.putc(tx_buffer[tx_out]);
kzar 0:60cec426fad9 294 tx_out = (tx_out + 1) % buffer_size;
kzar 0:60cec426fad9 295 }
kzar 0:60cec426fad9 296 //led2=0;
kzar 0:60cec426fad9 297 return;
kzar 0:60cec426fad9 298 }
kzar 0:60cec426fad9 299
kzar 0:60cec426fad9 300