Final version

Dependencies:   mbed Servo Motor

Committer:
kzar
Date:
Wed Dec 05 16:38:47 2018 +0000
Revision:
0:60cec426fad9
Child:
1:6d317aa0aae7
Version 1 of car side mbed code. Car sets up a server and listens for data from the controller. Once data is received, this mbed will update the car control variables as necessary (This version flips led1 )

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 0:60cec426fad9 43 int port =80; // set server port
kzar 0:60cec426fad9 44 int SERVtimeout =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 0:60cec426fad9 119 wait(2);
kzar 0:60cec426fad9 120 getreply();
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 0:60cec426fad9 125 strcpy(cmdbuff,"wifi.setmode(wifi.STATION)\r\n");
kzar 0:60cec426fad9 126 SendCMD();
kzar 0:60cec426fad9 127 getreply();
kzar 0:60cec426fad9 128 wait(2);
kzar 0:60cec426fad9 129
kzar 0:60cec426fad9 130 strcpy(cmdbuff,"wifi.ap.config({ssid=\"WestSide\",pwd=\"uNwieldy_cAbbage87\"})\r\n");
kzar 0:60cec426fad9 131 SendCMD();
kzar 0:60cec426fad9 132 getreply();
kzar 0:60cec426fad9 133 wait(2);
kzar 0:60cec426fad9 134
kzar 0:60cec426fad9 135 pc.printf("Server IP Address: \r\n");
kzar 0:60cec426fad9 136 strcpy(cmdbuff,"wifi.ap.getip()\r\n");
kzar 0:60cec426fad9 137 SendCMD();
kzar 0:60cec426fad9 138 getreply();
kzar 0:60cec426fad9 139 wait(2);
kzar 0:60cec426fad9 140
kzar 0:60cec426fad9 141 // Start up the server
kzar 0:60cec426fad9 142 pc.printf("\n++++++++++ Starting Server ++++++++++\r\n> ");
kzar 0:60cec426fad9 143
kzar 0:60cec426fad9 144 //create server
kzar 0:60cec426fad9 145 sprintf(cmdbuff, "srv=net.createServer(net.TCP,%d)\r\n",SERVtimeout);
kzar 0:60cec426fad9 146 SendCMD();
kzar 0:60cec426fad9 147 getreply();
kzar 0:60cec426fad9 148 wait(0.5);
kzar 0:60cec426fad9 149 // Set the sever to listen (named conn)
kzar 0:60cec426fad9 150 strcpy(cmdbuff,"srv:listen(80,function(conn)\r\n");
kzar 0:60cec426fad9 151 SendCMD();
kzar 0:60cec426fad9 152 getreply();
kzar 0:60cec426fad9 153 wait(0.3);
kzar 0:60cec426fad9 154 // Define receive function
kzar 0:60cec426fad9 155 strcpy(cmdbuff,"conn:on(\"receive\",function(conn,receivedData) \r\n");
kzar 0:60cec426fad9 156 SendCMD();
kzar 0:60cec426fad9 157 getreply();
kzar 0:60cec426fad9 158 wait(0.3);
kzar 0:60cec426fad9 159
kzar 0:60cec426fad9 160 //print data to mbed
kzar 0:60cec426fad9 161 strcpy(cmdbuff,"print(recievedData)\r\n");
kzar 0:60cec426fad9 162 SendCMD();
kzar 0:60cec426fad9 163 getreply();
kzar 0:60cec426fad9 164 wait(0.2);
kzar 0:60cec426fad9 165
kzar 0:60cec426fad9 166 // End receive function
kzar 0:60cec426fad9 167 strcpy(cmdbuff,"end)\r\n");
kzar 0:60cec426fad9 168 SendCMD();
kzar 0:60cec426fad9 169 getreply();
kzar 0:60cec426fad9 170 wait(0.2);
kzar 0:60cec426fad9 171
kzar 0:60cec426fad9 172 // Define sent function
kzar 0:60cec426fad9 173 strcpy(cmdbuff,"conn:on(\"sent\",function(conn)\r\n");
kzar 0:60cec426fad9 174 SendCMD();
kzar 0:60cec426fad9 175 getreply();
kzar 0:60cec426fad9 176 wait(0.3);
kzar 0:60cec426fad9 177
kzar 0:60cec426fad9 178 //print data to mbed
kzar 0:60cec426fad9 179 strcpy(cmdbuff,"collectgarbage()\r\n");
kzar 0:60cec426fad9 180 SendCMD();
kzar 0:60cec426fad9 181 getreply();
kzar 0:60cec426fad9 182 wait(0.2);
kzar 0:60cec426fad9 183
kzar 0:60cec426fad9 184 // End sent function
kzar 0:60cec426fad9 185 strcpy(cmdbuff,"end)\r\n");
kzar 0:60cec426fad9 186 SendCMD();
kzar 0:60cec426fad9 187 getreply();
kzar 0:60cec426fad9 188 wait(0.2);
kzar 0:60cec426fad9 189
kzar 0:60cec426fad9 190 // End server listening
kzar 0:60cec426fad9 191 strcpy(cmdbuff,"end)\r\n");
kzar 0:60cec426fad9 192 SendCMD();
kzar 0:60cec426fad9 193 getreply();
kzar 0:60cec426fad9 194 wait(0.2);
kzar 0:60cec426fad9 195 }
kzar 0:60cec426fad9 196
kzar 0:60cec426fad9 197
kzar 0:60cec426fad9 198 // ESP Command data send
kzar 0:60cec426fad9 199 void SendCMD()
kzar 0:60cec426fad9 200 {
kzar 0:60cec426fad9 201 int i;
kzar 0:60cec426fad9 202 char temp_char;
kzar 0:60cec426fad9 203 bool empty;
kzar 0:60cec426fad9 204 i = 0;
kzar 0:60cec426fad9 205 // Start Critical Section - don't interrupt while changing global buffer variables
kzar 0:60cec426fad9 206 NVIC_DisableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 207 empty = (tx_in == tx_out);
kzar 0:60cec426fad9 208 while ((i==0) || (cmdbuff[i-1] != '\n')) {
kzar 0:60cec426fad9 209 // Wait if buffer full
kzar 0:60cec426fad9 210 if (((tx_in + 1) % buffer_size) == tx_out) {
kzar 0:60cec426fad9 211 // End Critical Section - need to let interrupt routine empty buffer by sending
kzar 0:60cec426fad9 212 NVIC_EnableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 213 while (((tx_in + 1) % buffer_size) == tx_out) {
kzar 0:60cec426fad9 214 }
kzar 0:60cec426fad9 215 // Start Critical Section - don't interrupt while changing global buffer variables
kzar 0:60cec426fad9 216 NVIC_DisableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 217 }
kzar 0:60cec426fad9 218 tx_buffer[tx_in] = cmdbuff[i];
kzar 0:60cec426fad9 219 i++;
kzar 0:60cec426fad9 220 tx_in = (tx_in + 1) % buffer_size;
kzar 0:60cec426fad9 221 }
kzar 0:60cec426fad9 222 if (esp.writeable() && (empty)) {
kzar 0:60cec426fad9 223 temp_char = tx_buffer[tx_out];
kzar 0:60cec426fad9 224 tx_out = (tx_out + 1) % buffer_size;
kzar 0:60cec426fad9 225 // Send first character to start tx interrupts, if stopped
kzar 0:60cec426fad9 226 esp.putc(temp_char);
kzar 0:60cec426fad9 227 }
kzar 0:60cec426fad9 228 // End Critical Section
kzar 0:60cec426fad9 229 NVIC_EnableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 230 return;
kzar 0:60cec426fad9 231 }
kzar 0:60cec426fad9 232
kzar 0:60cec426fad9 233
kzar 0:60cec426fad9 234 // Get Command and ESP status replies
kzar 0:60cec426fad9 235 void getreply()
kzar 0:60cec426fad9 236 {
kzar 0:60cec426fad9 237 read_line();
kzar 0:60cec426fad9 238 sscanf(rx_line,replybuff);
kzar 0:60cec426fad9 239 }
kzar 0:60cec426fad9 240
kzar 0:60cec426fad9 241 // FUNCTIONS BELOW ARE FOR RX AND TX INTERUPTS (NOT WEB STUFF)
kzar 0:60cec426fad9 242
kzar 0:60cec426fad9 243 // Read a line from the large rx buffer from rx interrupt routine
kzar 0:60cec426fad9 244 void read_line() {
kzar 0:60cec426fad9 245 int i;
kzar 0:60cec426fad9 246 i = 0;
kzar 0:60cec426fad9 247 // Start Critical Section - don't interrupt while changing global buffer variables
kzar 0:60cec426fad9 248 NVIC_DisableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 249 // Loop reading rx buffer characters until end of line character
kzar 0:60cec426fad9 250 while ((i==0) || (rx_line[i-1] != '\r')) {
kzar 0:60cec426fad9 251 // Wait if buffer empty
kzar 0:60cec426fad9 252 if (rx_in == rx_out) {
kzar 0:60cec426fad9 253 // End Critical Section - need to allow rx interrupt to get new characters for buffer
kzar 0:60cec426fad9 254 NVIC_EnableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 255 while (rx_in == rx_out) {
kzar 0:60cec426fad9 256 }
kzar 0:60cec426fad9 257 // Start Critical Section - don't interrupt while changing global buffer variables
kzar 0:60cec426fad9 258 NVIC_DisableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 259 }
kzar 0:60cec426fad9 260 rx_line[i] = rx_buffer[rx_out];
kzar 0:60cec426fad9 261 i++;
kzar 0:60cec426fad9 262 rx_out = (rx_out + 1) % buffer_size;
kzar 0:60cec426fad9 263 }
kzar 0:60cec426fad9 264 // End Critical Section
kzar 0:60cec426fad9 265 NVIC_EnableIRQ(UART1_IRQn);
kzar 0:60cec426fad9 266 rx_line[i-1] = 0;
kzar 0:60cec426fad9 267 return;
kzar 0:60cec426fad9 268 }
kzar 0:60cec426fad9 269
kzar 0:60cec426fad9 270
kzar 0:60cec426fad9 271 // Interupt Routine to read in data from serial port
kzar 0:60cec426fad9 272 void Rx_interrupt() {
kzar 0:60cec426fad9 273 DataRX=1;
kzar 0:60cec426fad9 274 //led3=1;
kzar 0:60cec426fad9 275 // Loop just in case more than one character is in UART's receive FIFO buffer
kzar 0:60cec426fad9 276 // Stop if buffer full
kzar 0:60cec426fad9 277 while ((esp.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
kzar 0:60cec426fad9 278 rx_buffer[rx_in] = esp.getc();
kzar 0:60cec426fad9 279 // Uncomment to Echo to USB serial to watch data flow
kzar 0:60cec426fad9 280 pc.putc(rx_buffer[rx_in]);
kzar 0:60cec426fad9 281 rx_in = (rx_in + 1) % buffer_size;
kzar 0:60cec426fad9 282 }
kzar 0:60cec426fad9 283 //led3=0;
kzar 0:60cec426fad9 284 return;
kzar 0:60cec426fad9 285 }
kzar 0:60cec426fad9 286
kzar 0:60cec426fad9 287
kzar 0:60cec426fad9 288 // Interupt Routine to write out data to serial port
kzar 0:60cec426fad9 289 void Tx_interrupt() {
kzar 0:60cec426fad9 290 //led2=1;
kzar 0:60cec426fad9 291 // Loop to fill more than one character in UART's transmit FIFO buffer
kzar 0:60cec426fad9 292 // Stop if buffer empty
kzar 0:60cec426fad9 293 while ((esp.writeable()) && (tx_in != tx_out)) {
kzar 0:60cec426fad9 294 esp.putc(tx_buffer[tx_out]);
kzar 0:60cec426fad9 295 tx_out = (tx_out + 1) % buffer_size;
kzar 0:60cec426fad9 296 }
kzar 0:60cec426fad9 297 //led2=0;
kzar 0:60cec426fad9 298 return;
kzar 0:60cec426fad9 299 }
kzar 0:60cec426fad9 300
kzar 0:60cec426fad9 301