Wifi Controlled Robot is done as a mini project (Lab4) for ECE 4180 class (Georgia Tech). Robot is assembled in Sparkfun's Shadow chasis robot kit. This robot takes the command from the webpage to move forward, reverse without colliding. The distance sensor is used as a mechanism for collision detection and play a short beep sound. It turn 90 degree with magnetometer when the turn command is sent.

Dependencies:   Motordriver mbed

/media/uploads/pkoirala3/capture.jpg Showing the setup and calibration: Part1 In this part the Wifi setups and attains an IP address so we can control it through a webpage on our phone/PC. After it obtains an IP address it calibrates the IMU so we can have accurate compass headings for precise turns.

The parts that we use are as follows:

  • Mbed
  • 2 DC motors
  • H-Bridge (to drive the DC motors)
  • Speaker
  • Class D Amp (to drive the Speaker)
  • IMU (use the magnometer for compass headings)
  • Wifi card (ESP8266)

Showing webpage functionality and Robot Functionality: In this part we demonstrate the functionality of the robot and the webpage to control it.

Final Code

[Repository '/teams/Prana-Koirala/code/Wifi_controlled_Robot_ECE4180/docs/tip/main_8cpp_source.html' not found]

Committer:
pkoirala3
Date:
Sun Mar 12 16:32:11 2017 +0000
Revision:
0:553fab92a347
Child:
1:bbe16318d747
ECE4180_Lab4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pkoirala3 0:553fab92a347 1 #include "mbed.h"
pkoirala3 0:553fab92a347 2 #include "motordriver.h"
pkoirala3 0:553fab92a347 3 #include "ultrasonic.h"
pkoirala3 0:553fab92a347 4
pkoirala3 0:553fab92a347 5 DigitalOut ledFwd(p8);
pkoirala3 0:553fab92a347 6 DigitalOut ledRev(p9);
pkoirala3 0:553fab92a347 7
pkoirala3 0:553fab92a347 8 Motor A(p26, p16, p25, 1); // pwm, fwd, rev, can brake
pkoirala3 0:553fab92a347 9 Motor B(p21, p22, p23, 1); // pwm, fwd, rev, can brake
pkoirala3 0:553fab92a347 10
pkoirala3 0:553fab92a347 11 Serial pc(USBTX, USBRX);
pkoirala3 0:553fab92a347 12 Serial esp(p28, p27); // tx, rx
pkoirala3 0:553fab92a347 13
pkoirala3 0:553fab92a347 14 PwmOut mySpeaker(p24);
pkoirala3 0:553fab92a347 15
pkoirala3 0:553fab92a347 16 void dist(int);
pkoirala3 0:553fab92a347 17 ultrasonic mu(p6, p7, .5, 2, &dist); //Check every .5 sec, timeout 1 sec,call dist when the distance changes
pkoirala3 0:553fab92a347 18
pkoirala3 0:553fab92a347 19 void dist(int distance)
pkoirala3 0:553fab92a347 20 {
pkoirala3 0:553fab92a347 21 if(distance < 1000) { // Distance is in the unit of cm
pkoirala3 0:553fab92a347 22 pc.printf("stop by sonar \r\n");
pkoirala3 0:553fab92a347 23 A.stop(0.5);
pkoirala3 0:553fab92a347 24 B.stop(0.5);
pkoirala3 0:553fab92a347 25 ledFwd = 0;
pkoirala3 0:553fab92a347 26 mySpeaker = 0.5; // Play Beep sound
pkoirala3 0:553fab92a347 27 }
pkoirala3 0:553fab92a347 28 }
pkoirala3 0:553fab92a347 29
pkoirala3 0:553fab92a347 30 // some test values to show on web page
pkoirala3 0:553fab92a347 31 AnalogIn DistSensor(p20);
pkoirala3 0:553fab92a347 32 AnalogIn Ain1(p18);
pkoirala3 0:553fab92a347 33 AnalogIn Ain2(p19);
pkoirala3 0:553fab92a347 34
pkoirala3 0:553fab92a347 35 float temperature, AdcIn, Ht;
pkoirala3 0:553fab92a347 36 float R1=100000, R2=10000; // resistor values to give a 10:1 reduction of measured AnalogIn voltage
pkoirala3 0:553fab92a347 37 char Vcc[10];
pkoirala3 0:553fab92a347 38 char Temp[10];
pkoirala3 0:553fab92a347 39
pkoirala3 0:553fab92a347 40 // things for sending/receiving data over serial
pkoirala3 0:553fab92a347 41 volatile int tx_in=0;
pkoirala3 0:553fab92a347 42 volatile int tx_out=0;
pkoirala3 0:553fab92a347 43 volatile int rx_in=0;
pkoirala3 0:553fab92a347 44 volatile int rx_out=0;
pkoirala3 0:553fab92a347 45 const int buffer_size = 4095;
pkoirala3 0:553fab92a347 46 char tx_buffer[buffer_size+1];
pkoirala3 0:553fab92a347 47 char rx_buffer[buffer_size+1];
pkoirala3 0:553fab92a347 48 void Tx_interrupt();
pkoirala3 0:553fab92a347 49 void Rx_interrupt();
pkoirala3 0:553fab92a347 50 void send_line();
pkoirala3 0:553fab92a347 51 void read_line();
pkoirala3 0:553fab92a347 52
pkoirala3 0:553fab92a347 53 int DataRX;
pkoirala3 0:553fab92a347 54 int update;
pkoirala3 0:553fab92a347 55 int count;
pkoirala3 0:553fab92a347 56 char cmdbuff[1024];
pkoirala3 0:553fab92a347 57 char replybuff[4096];
pkoirala3 0:553fab92a347 58 char webdata[4096]; // This may need to be bigger depending on WEB browser used
pkoirala3 0:553fab92a347 59 char webbuff[4096]; // Currently using 1986 characters, Increase this if more web page data added
pkoirala3 0:553fab92a347 60 char timebuf[30];
pkoirala3 0:553fab92a347 61 void SendCMD(),getreply(),ReadWebData(),startserver();
pkoirala3 0:553fab92a347 62 void gettime(),setRTC(),gettemp(),getbattery();
pkoirala3 0:553fab92a347 63 char rx_line[1024];
pkoirala3 0:553fab92a347 64 int port =80; // set server port
pkoirala3 0:553fab92a347 65 int SERVtimeout =5; // set server timeout in seconds in case link breaks.
pkoirala3 0:553fab92a347 66 struct tm t;
pkoirala3 0:553fab92a347 67
pkoirala3 0:553fab92a347 68 int main()
pkoirala3 0:553fab92a347 69 {
pkoirala3 0:553fab92a347 70 pc.baud(9600);
pkoirala3 0:553fab92a347 71 esp.baud(9600);
pkoirala3 0:553fab92a347 72 ledFwd = 1;
pkoirala3 0:553fab92a347 73 // Setup a serial interrupt function to receive data
pkoirala3 0:553fab92a347 74 esp.attach(&Rx_interrupt, Serial::RxIrq);
pkoirala3 0:553fab92a347 75 // Setup a serial interrupt function to transmit data
pkoirala3 0:553fab92a347 76 esp.attach(&Tx_interrupt, Serial::TxIrq);
pkoirala3 0:553fab92a347 77 startserver();
pkoirala3 0:553fab92a347 78 wait(0.01);
pkoirala3 0:553fab92a347 79 mu.startUpdates(); //start measuring the distance in sonar
pkoirala3 0:553fab92a347 80 DataRX=0;
pkoirala3 0:553fab92a347 81 count=0;
pkoirala3 0:553fab92a347 82 mySpeaker.period(1.0/500.0); // 500hz period
pkoirala3 0:553fab92a347 83 while(1) {
pkoirala3 0:553fab92a347 84 if(DataRX==1) {
pkoirala3 0:553fab92a347 85 ReadWebData();
pkoirala3 0:553fab92a347 86 esp.attach(&Rx_interrupt, Serial::RxIrq);
pkoirala3 0:553fab92a347 87 }
pkoirala3 0:553fab92a347 88 float stateA = A.state();
pkoirala3 0:553fab92a347 89 float stateB = B.state();
pkoirala3 0:553fab92a347 90 if((stateA > 0 && stateA <= 1)&&(stateB > 0 && stateB <= 1)) { // obstacle within 10 cm and robot is still moving
pkoirala3 0:553fab92a347 91 mu.checkDistance();
pkoirala3 0:553fab92a347 92 } else if((stateA < 0 && stateA >= -1)&&(stateB < 0 && stateB >= -1)) { // If moving rev
pkoirala3 0:553fab92a347 93 float currDist = DistSensor;
pkoirala3 0:553fab92a347 94 pc.printf("currDist: %f",currDist);
pkoirala3 0:553fab92a347 95 if(currDist <= 0.5f) {
pkoirala3 0:553fab92a347 96 A.stop(0.5);
pkoirala3 0:553fab92a347 97 B.stop(0.5);
pkoirala3 0:553fab92a347 98 ledRev = 0;
pkoirala3 0:553fab92a347 99 mySpeaker = 0.5; // Play Beep sound
pkoirala3 0:553fab92a347 100
pkoirala3 0:553fab92a347 101 }
pkoirala3 0:553fab92a347 102 }
pkoirala3 0:553fab92a347 103 }
pkoirala3 0:553fab92a347 104 }
pkoirala3 0:553fab92a347 105
pkoirala3 0:553fab92a347 106 // Reads and processes GET and POST web data
pkoirala3 0:553fab92a347 107 void ReadWebData()
pkoirala3 0:553fab92a347 108 {
pkoirala3 0:553fab92a347 109 wait_ms(200);
pkoirala3 0:553fab92a347 110 esp.attach(NULL,Serial::RxIrq);
pkoirala3 0:553fab92a347 111 DataRX=0;
pkoirala3 0:553fab92a347 112 memset(webdata, '\0', sizeof(webdata));
pkoirala3 0:553fab92a347 113 strcpy(webdata, rx_buffer);
pkoirala3 0:553fab92a347 114 memset(rx_buffer, '\0', sizeof(rx_buffer));
pkoirala3 0:553fab92a347 115 rx_in = 0;
pkoirala3 0:553fab92a347 116 rx_out = 0;
pkoirala3 0:553fab92a347 117 // check web data for form information
pkoirala3 0:553fab92a347 118 if( strstr(webdata, "check=BotFwd") != NULL ) {
pkoirala3 0:553fab92a347 119 A.speed(0.75);
pkoirala3 0:553fab92a347 120 B.speed(0.75);
pkoirala3 0:553fab92a347 121 ledRev = 0;
pkoirala3 0:553fab92a347 122 ledFwd = 1;
pkoirala3 0:553fab92a347 123 }
pkoirala3 0:553fab92a347 124 if( strstr(webdata, "check=BotRev") != NULL ) {
pkoirala3 0:553fab92a347 125 A.speed(-0.75);
pkoirala3 0:553fab92a347 126 B.speed(-0.75);
pkoirala3 0:553fab92a347 127 ledFwd = 0;
pkoirala3 0:553fab92a347 128 ledRev = 1;
pkoirala3 0:553fab92a347 129 }
pkoirala3 0:553fab92a347 130 if( strstr(webdata, "check=BotStop") != NULL ) {
pkoirala3 0:553fab92a347 131 A.stop(0.5);
pkoirala3 0:553fab92a347 132 B.stop(0.5);
pkoirala3 0:553fab92a347 133 ledFwd = 0;
pkoirala3 0:553fab92a347 134 ledRev = 0;
pkoirala3 0:553fab92a347 135 }
pkoirala3 0:553fab92a347 136 if( strstr(webdata, "check=BotLeft") != NULL ) {
pkoirala3 0:553fab92a347 137 B.stop(0.5);
pkoirala3 0:553fab92a347 138 A.speed(0.5);
pkoirala3 0:553fab92a347 139
pkoirala3 0:553fab92a347 140 }
pkoirala3 0:553fab92a347 141 if( strstr(webdata, "check=BotRight") != NULL ) {
pkoirala3 0:553fab92a347 142 A.stop(0.5);
pkoirala3 0:553fab92a347 143 B.speed(0.5);
pkoirala3 0:553fab92a347 144 }
pkoirala3 0:553fab92a347 145 if( strstr(webdata, "POST") != NULL ) { // set update flag if POST request
pkoirala3 0:553fab92a347 146 update=1;
pkoirala3 0:553fab92a347 147 }
pkoirala3 0:553fab92a347 148 if( strstr(webdata, "GET") != NULL && strstr(webdata, "favicon") == NULL ) { // set update flag for GET request but do not want to update for favicon requests
pkoirala3 0:553fab92a347 149 update=1;
pkoirala3 0:553fab92a347 150 }
pkoirala3 0:553fab92a347 151 }
pkoirala3 0:553fab92a347 152 // Starts webserver
pkoirala3 0:553fab92a347 153 void startserver()
pkoirala3 0:553fab92a347 154 {
pkoirala3 0:553fab92a347 155 pc.printf("Resetting ESP Device....\r\n");
pkoirala3 0:553fab92a347 156 strcpy(cmdbuff,"node.restart()\r\n");
pkoirala3 0:553fab92a347 157 SendCMD();
pkoirala3 0:553fab92a347 158 wait(2);
pkoirala3 0:553fab92a347 159 getreply();
pkoirala3 0:553fab92a347 160
pkoirala3 0:553fab92a347 161 pc.printf("\nStarting Server.....\r\n> ");
pkoirala3 0:553fab92a347 162 //create server
pkoirala3 0:553fab92a347 163 sprintf(cmdbuff, "srv=net.createServer(net.TCP,%d)\r\n",SERVtimeout);
pkoirala3 0:553fab92a347 164 SendCMD();
pkoirala3 0:553fab92a347 165 getreply();
pkoirala3 0:553fab92a347 166 wait(0.5);
pkoirala3 0:553fab92a347 167 strcpy(cmdbuff,"srv:listen(80,function(conn)\r\n");
pkoirala3 0:553fab92a347 168 SendCMD();
pkoirala3 0:553fab92a347 169 getreply();
pkoirala3 0:553fab92a347 170 wait(0.3);
pkoirala3 0:553fab92a347 171 strcpy(cmdbuff,"conn:on(\"receive\",function(conn,payload) \r\n");
pkoirala3 0:553fab92a347 172 SendCMD();
pkoirala3 0:553fab92a347 173 getreply();
pkoirala3 0:553fab92a347 174 wait(0.3);
pkoirala3 0:553fab92a347 175
pkoirala3 0:553fab92a347 176 //print data to mbed
pkoirala3 0:553fab92a347 177 strcpy(cmdbuff,"print(payload)\r\n");
pkoirala3 0:553fab92a347 178 SendCMD();
pkoirala3 0:553fab92a347 179 getreply();
pkoirala3 0:553fab92a347 180 wait(0.2);
pkoirala3 0:553fab92a347 181
pkoirala3 0:553fab92a347 182 //web page data
pkoirala3 0:553fab92a347 183 strcpy(cmdbuff,"conn:send('<!DOCTYPE html><html><body><h1>ESP8266 Mbed IoT Web Controller</h1>')\r\n");
pkoirala3 0:553fab92a347 184 SendCMD();
pkoirala3 0:553fab92a347 185 getreply();
pkoirala3 0:553fab92a347 186 wait(0.4);
pkoirala3 0:553fab92a347 187 strcpy(cmdbuff,"conn:send('<form method=\"POST\"')\r\n");
pkoirala3 0:553fab92a347 188 SendCMD();
pkoirala3 0:553fab92a347 189 getreply();
pkoirala3 0:553fab92a347 190 wait(0.3);
pkoirala3 0:553fab92a347 191 strcpy(cmdbuff, "conn:send('<p><input type=\"radio\" name=\"check\" value=\"BotFwd\"> Move Robot Forward')\r\n");
pkoirala3 0:553fab92a347 192 SendCMD();
pkoirala3 0:553fab92a347 193 getreply();
pkoirala3 0:553fab92a347 194 wait(0.3);
pkoirala3 0:553fab92a347 195 strcpy(cmdbuff, "conn:send('<p><input type=\"radio\" name=\"check\" value=\"BotRev\"> Move Robot Reverse')\r\n");
pkoirala3 0:553fab92a347 196 SendCMD();
pkoirala3 0:553fab92a347 197 getreply();
pkoirala3 0:553fab92a347 198 wait(0.3);
pkoirala3 0:553fab92a347 199 strcpy(cmdbuff, "conn:send('<p><input type=\"radio\" name=\"check\" value=\"BotStop\"> Stop Robot')\r\n");
pkoirala3 0:553fab92a347 200 SendCMD();
pkoirala3 0:553fab92a347 201 getreply();
pkoirala3 0:553fab92a347 202 wait(0.3);
pkoirala3 0:553fab92a347 203 strcpy(cmdbuff, "conn:send('<p><input type=\"radio\" name=\"check\" value=\"BotLeft\"> Turn Robot Left')\r\n");
pkoirala3 0:553fab92a347 204 SendCMD();
pkoirala3 0:553fab92a347 205 getreply();
pkoirala3 0:553fab92a347 206 wait(0.3);
pkoirala3 0:553fab92a347 207 strcpy(cmdbuff, "conn:send('<p><input type=\"radio\" name=\"check\" value=\"BotRight\"> Turn Robot Right')\r\n");
pkoirala3 0:553fab92a347 208 SendCMD();
pkoirala3 0:553fab92a347 209 getreply();
pkoirala3 0:553fab92a347 210 wait(0.3);
pkoirala3 0:553fab92a347 211 strcpy(cmdbuff,"conn:send('<p><input type=\"submit\" value=\"Send to Robot\"></form>')\r\n");
pkoirala3 0:553fab92a347 212 SendCMD();
pkoirala3 0:553fab92a347 213 getreply();
pkoirala3 0:553fab92a347 214 wait(0.3);
pkoirala3 0:553fab92a347 215 strcpy(cmdbuff, "conn:send('<p><h2>How to use:</h2><ul><li>Select a radiobutton </li><li>Click Send to Robot button</li></ul></body></html>')\r\n");
pkoirala3 0:553fab92a347 216 SendCMD();
pkoirala3 0:553fab92a347 217 getreply();
pkoirala3 0:553fab92a347 218 wait(0.5);
pkoirala3 0:553fab92a347 219 // end web page data
pkoirala3 0:553fab92a347 220 strcpy(cmdbuff, "conn:on(\"sent\",function(conn) conn:close() end)\r\n"); // close current connection
pkoirala3 0:553fab92a347 221 SendCMD();
pkoirala3 0:553fab92a347 222 getreply();
pkoirala3 0:553fab92a347 223 wait(0.3);
pkoirala3 0:553fab92a347 224 strcpy(cmdbuff, "end)\r\n");
pkoirala3 0:553fab92a347 225 SendCMD();
pkoirala3 0:553fab92a347 226 getreply();
pkoirala3 0:553fab92a347 227 wait(0.2);
pkoirala3 0:553fab92a347 228 strcpy(cmdbuff, "end)\r\n");
pkoirala3 0:553fab92a347 229 SendCMD();
pkoirala3 0:553fab92a347 230 getreply();
pkoirala3 0:553fab92a347 231 wait(0.2);
pkoirala3 0:553fab92a347 232
pkoirala3 0:553fab92a347 233 strcpy(cmdbuff, "tmr.alarm(0, 1000, 1, function()\r\n");
pkoirala3 0:553fab92a347 234 SendCMD();
pkoirala3 0:553fab92a347 235 getreply();
pkoirala3 0:553fab92a347 236 wait(0.2);
pkoirala3 0:553fab92a347 237 strcpy(cmdbuff, "if wifi.sta.getip() == nil then\r\n");
pkoirala3 0:553fab92a347 238 SendCMD();
pkoirala3 0:553fab92a347 239 getreply();
pkoirala3 0:553fab92a347 240 wait(0.2);
pkoirala3 0:553fab92a347 241 strcpy(cmdbuff, "print(\"Connecting to AP...\\n\")\r\n");
pkoirala3 0:553fab92a347 242 SendCMD();
pkoirala3 0:553fab92a347 243 getreply();
pkoirala3 0:553fab92a347 244 wait(0.2);
pkoirala3 0:553fab92a347 245 strcpy(cmdbuff, "else\r\n");
pkoirala3 0:553fab92a347 246 SendCMD();
pkoirala3 0:553fab92a347 247 getreply();
pkoirala3 0:553fab92a347 248 wait(0.2);
pkoirala3 0:553fab92a347 249 strcpy(cmdbuff, "ip, nm, gw=wifi.sta.getip()\r\n");
pkoirala3 0:553fab92a347 250 SendCMD();
pkoirala3 0:553fab92a347 251 getreply();
pkoirala3 0:553fab92a347 252 wait(0.2);
pkoirala3 0:553fab92a347 253 strcpy(cmdbuff,"print(\"IP Address: \",ip)\r\n");
pkoirala3 0:553fab92a347 254 SendCMD();
pkoirala3 0:553fab92a347 255 getreply();
pkoirala3 0:553fab92a347 256 wait(0.2);
pkoirala3 0:553fab92a347 257 strcpy(cmdbuff,"tmr.stop(0)\r\n");
pkoirala3 0:553fab92a347 258 SendCMD();
pkoirala3 0:553fab92a347 259 getreply();
pkoirala3 0:553fab92a347 260 wait(0.2);
pkoirala3 0:553fab92a347 261 strcpy(cmdbuff,"end\r\n");
pkoirala3 0:553fab92a347 262 SendCMD();
pkoirala3 0:553fab92a347 263 getreply();
pkoirala3 0:553fab92a347 264 wait(0.2);
pkoirala3 0:553fab92a347 265 strcpy(cmdbuff,"end)\r\n");
pkoirala3 0:553fab92a347 266 SendCMD();
pkoirala3 0:553fab92a347 267 getreply();
pkoirala3 0:553fab92a347 268 wait(0.2);
pkoirala3 0:553fab92a347 269 pc.printf("\n\nReady to go .....\r\n\n");
pkoirala3 0:553fab92a347 270 }
pkoirala3 0:553fab92a347 271
pkoirala3 0:553fab92a347 272
pkoirala3 0:553fab92a347 273 // ESP Command data send
pkoirala3 0:553fab92a347 274 void SendCMD()
pkoirala3 0:553fab92a347 275 {
pkoirala3 0:553fab92a347 276 int i;
pkoirala3 0:553fab92a347 277 char temp_char;
pkoirala3 0:553fab92a347 278 bool empty;
pkoirala3 0:553fab92a347 279 i = 0;
pkoirala3 0:553fab92a347 280 // Start Critical Section - don't interrupt while changing global buffer variables
pkoirala3 0:553fab92a347 281 NVIC_DisableIRQ(UART1_IRQn);
pkoirala3 0:553fab92a347 282 empty = (tx_in == tx_out);
pkoirala3 0:553fab92a347 283 while ((i==0) || (cmdbuff[i-1] != '\n')) {
pkoirala3 0:553fab92a347 284 // Wait if buffer full
pkoirala3 0:553fab92a347 285 if (((tx_in + 1) % buffer_size) == tx_out) {
pkoirala3 0:553fab92a347 286 // End Critical Section - need to let interrupt routine empty buffer by sending
pkoirala3 0:553fab92a347 287 NVIC_EnableIRQ(UART1_IRQn);
pkoirala3 0:553fab92a347 288 while (((tx_in + 1) % buffer_size) == tx_out) {
pkoirala3 0:553fab92a347 289 }
pkoirala3 0:553fab92a347 290 // Start Critical Section - don't interrupt while changing global buffer variables
pkoirala3 0:553fab92a347 291 NVIC_DisableIRQ(UART1_IRQn);
pkoirala3 0:553fab92a347 292 }
pkoirala3 0:553fab92a347 293 tx_buffer[tx_in] = cmdbuff[i];
pkoirala3 0:553fab92a347 294 i++;
pkoirala3 0:553fab92a347 295 tx_in = (tx_in + 1) % buffer_size;
pkoirala3 0:553fab92a347 296 }
pkoirala3 0:553fab92a347 297 if (esp.writeable() && (empty)) {
pkoirala3 0:553fab92a347 298 temp_char = tx_buffer[tx_out];
pkoirala3 0:553fab92a347 299 tx_out = (tx_out + 1) % buffer_size;
pkoirala3 0:553fab92a347 300 // Send first character to start tx interrupts, if stopped
pkoirala3 0:553fab92a347 301 esp.putc(temp_char);
pkoirala3 0:553fab92a347 302 }
pkoirala3 0:553fab92a347 303 // End Critical Section
pkoirala3 0:553fab92a347 304 NVIC_EnableIRQ(UART1_IRQn);
pkoirala3 0:553fab92a347 305 return;
pkoirala3 0:553fab92a347 306 }
pkoirala3 0:553fab92a347 307
pkoirala3 0:553fab92a347 308 // Get Command and ESP status replies
pkoirala3 0:553fab92a347 309 void getreply()
pkoirala3 0:553fab92a347 310 {
pkoirala3 0:553fab92a347 311 read_line();
pkoirala3 0:553fab92a347 312 sscanf(rx_line,replybuff);
pkoirala3 0:553fab92a347 313 }
pkoirala3 0:553fab92a347 314
pkoirala3 0:553fab92a347 315 // Read a line from the large rx buffer from rx interrupt routine
pkoirala3 0:553fab92a347 316 void read_line()
pkoirala3 0:553fab92a347 317 {
pkoirala3 0:553fab92a347 318 int i;
pkoirala3 0:553fab92a347 319 i = 0;
pkoirala3 0:553fab92a347 320 // Start Critical Section - don't interrupt while changing global buffer variables
pkoirala3 0:553fab92a347 321 NVIC_DisableIRQ(UART1_IRQn);
pkoirala3 0:553fab92a347 322 // Loop reading rx buffer characters until end of line character
pkoirala3 0:553fab92a347 323 while ((i==0) || (rx_line[i-1] != '\r')) {
pkoirala3 0:553fab92a347 324 // Wait if buffer empty
pkoirala3 0:553fab92a347 325 if (rx_in == rx_out) {
pkoirala3 0:553fab92a347 326 // End Critical Section - need to allow rx interrupt to get new characters for buffer
pkoirala3 0:553fab92a347 327 NVIC_EnableIRQ(UART1_IRQn);
pkoirala3 0:553fab92a347 328 while (rx_in == rx_out) {
pkoirala3 0:553fab92a347 329 }
pkoirala3 0:553fab92a347 330 // Start Critical Section - don't interrupt while changing global buffer variables
pkoirala3 0:553fab92a347 331 NVIC_DisableIRQ(UART1_IRQn);
pkoirala3 0:553fab92a347 332 }
pkoirala3 0:553fab92a347 333 rx_line[i] = rx_buffer[rx_out];
pkoirala3 0:553fab92a347 334 i++;
pkoirala3 0:553fab92a347 335 rx_out = (rx_out + 1) % buffer_size;
pkoirala3 0:553fab92a347 336 }
pkoirala3 0:553fab92a347 337 // End Critical Section
pkoirala3 0:553fab92a347 338 NVIC_EnableIRQ(UART1_IRQn);
pkoirala3 0:553fab92a347 339 rx_line[i-1] = 0;
pkoirala3 0:553fab92a347 340 return;
pkoirala3 0:553fab92a347 341 }
pkoirala3 0:553fab92a347 342
pkoirala3 0:553fab92a347 343
pkoirala3 0:553fab92a347 344 // Interupt Routine to read in data from serial port
pkoirala3 0:553fab92a347 345 void Rx_interrupt()
pkoirala3 0:553fab92a347 346 {
pkoirala3 0:553fab92a347 347 DataRX=1;
pkoirala3 0:553fab92a347 348 // Loop just in case more than one character is in UART's receive FIFO buffer
pkoirala3 0:553fab92a347 349 // Stop if buffer full
pkoirala3 0:553fab92a347 350 while ((esp.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
pkoirala3 0:553fab92a347 351 rx_buffer[rx_in] = esp.getc();
pkoirala3 0:553fab92a347 352 // Uncomment to Echo to USB serial to watch data flow
pkoirala3 0:553fab92a347 353 pc.putc(rx_buffer[rx_in]);
pkoirala3 0:553fab92a347 354 rx_in = (rx_in + 1) % buffer_size;
pkoirala3 0:553fab92a347 355 }
pkoirala3 0:553fab92a347 356 return;
pkoirala3 0:553fab92a347 357 }
pkoirala3 0:553fab92a347 358
pkoirala3 0:553fab92a347 359 // Interupt Routine to write out data to serial port
pkoirala3 0:553fab92a347 360 void Tx_interrupt()
pkoirala3 0:553fab92a347 361 {
pkoirala3 0:553fab92a347 362 // Loop to fill more than one character in UART's transmit FIFO buffer
pkoirala3 0:553fab92a347 363 // Stop if buffer empty
pkoirala3 0:553fab92a347 364 while ((esp.writeable()) && (tx_in != tx_out)) {
pkoirala3 0:553fab92a347 365 esp.putc(tx_buffer[tx_out]);
pkoirala3 0:553fab92a347 366 tx_out = (tx_out + 1) % buffer_size;
pkoirala3 0:553fab92a347 367 }
pkoirala3 0:553fab92a347 368 return;
pkoirala3 0:553fab92a347 369 }