A program using ESP8266 Huzzah to receive message from Amazon AWS service and control a servo to flip on/off the mechanical light switch.

Dependencies:   RPCInterface Servo mbed

Fork of dotbot by Graham Miles

Committer:
AlanPig
Date:
Thu Dec 14 00:30:12 2017 +0000
Revision:
3:99303dc07632
Parent:
2:747b84e54088
Newly created program.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmiles3 0:1fb00e911fe6 1 #include "mbed.h"
AlanPig 3:99303dc07632 2 #include "Light.h"
gmiles3 0:1fb00e911fe6 3 #include "mywifi.h"
AlanPig 3:99303dc07632 4 #include "Servo.h"
gmiles3 0:1fb00e911fe6 5 #include "mbed_rpc.h"
gmiles3 0:1fb00e911fe6 6
gmiles3 0:1fb00e911fe6 7 Serial esp(p28, p27);
AlanPig 3:99303dc07632 8 Servo myservo(p22);
AlanPig 3:99303dc07632 9 char ssid[32] = "GTother";
AlanPig 3:99303dc07632 10 char pwd[32] = "GeorgeP@1927";
AlanPig 3:99303dc07632 11 char port[32] = "80"; // must be port forwarded
gmiles3 2:747b84e54088 12 char timeout[32] = "28800"; // 28800 is max
gmiles3 0:1fb00e911fe6 13 volatile int tx_in=0;
gmiles3 0:1fb00e911fe6 14 volatile int tx_out=0;
gmiles3 0:1fb00e911fe6 15 volatile int rx_in=0;
gmiles3 0:1fb00e911fe6 16 volatile int rx_out=0;
gmiles3 0:1fb00e911fe6 17 const int buffer_size = 4095;
gmiles3 0:1fb00e911fe6 18 char tx_buffer[buffer_size+1];
gmiles3 0:1fb00e911fe6 19 char rx_buffer[buffer_size+1];
gmiles3 0:1fb00e911fe6 20 char cmdbuff[1024];
gmiles3 0:1fb00e911fe6 21 char rx_line[1024];
gmiles3 0:1fb00e911fe6 22
gmiles3 0:1fb00e911fe6 23
gmiles3 0:1fb00e911fe6 24 DigitalOut led1(LED1);
gmiles3 0:1fb00e911fe6 25 DigitalOut led2(LED2);
gmiles3 0:1fb00e911fe6 26 DigitalOut led3(LED3);
gmiles3 0:1fb00e911fe6 27 DigitalOut led4(LED4);
gmiles3 0:1fb00e911fe6 28
AlanPig 3:99303dc07632 29 float range = 0.0005;
AlanPig 3:99303dc07632 30 float position = 0.5;
AlanPig 3:99303dc07632 31 RPCFunction rpcLightOn(&lightOn, "on");
AlanPig 3:99303dc07632 32 RPCFunction rpcLightOff(&lightOff, "off");
gmiles3 0:1fb00e911fe6 33
gmiles3 0:1fb00e911fe6 34 int main() {
gmiles3 0:1fb00e911fe6 35 esp.baud(9600);
gmiles3 0:1fb00e911fe6 36 led1=0,led2=0,led3=0,led4=0;
gmiles3 0:1fb00e911fe6 37 esp.attach(&Rx_interrupt, Serial::RxIrq);
gmiles3 0:1fb00e911fe6 38 esp.attach(&Tx_interrupt, Serial::TxIrq);
AlanPig 3:99303dc07632 39 wait(2);
gmiles3 0:1fb00e911fe6 40 connectToNetwork();
gmiles3 0:1fb00e911fe6 41 char rpc_in[256];
gmiles3 0:1fb00e911fe6 42 char rpc_out[256];
gmiles3 0:1fb00e911fe6 43 while (1) {
gmiles3 0:1fb00e911fe6 44 getReply();
gmiles3 0:1fb00e911fe6 45 memset(&rpc_in[0], 0, sizeof(rpc_in));
gmiles3 2:747b84e54088 46 memset(&rpc_out[0], 0, sizeof(rpc_out));
gmiles3 2:747b84e54088 47 int length = (int)rx_line[3] - 48; // bytes 0 to 2 are trash; byte 3 is length of message
AlanPig 3:99303dc07632 48 // pc.printf(" the length is %d, and rpc_in is %s\n",length,rpc_in);
gmiles3 0:1fb00e911fe6 49 if (length > 0 && length < 256) {
gmiles3 0:1fb00e911fe6 50 for (int i = 0; i < length; i++) {
gmiles3 2:747b84e54088 51 rpc_in[i] = rx_line[i+4]; // bytes 4 to length+3 are the valid data
gmiles3 0:1fb00e911fe6 52 }
gmiles3 0:1fb00e911fe6 53 RPC::call(rpc_in, rpc_out);
AlanPig 3:99303dc07632 54 // pc.printf("rpc _out is %s\n", rpc_out);
gmiles3 0:1fb00e911fe6 55 }
AlanPig 3:99303dc07632 56
gmiles3 2:747b84e54088 57 // lambda function is event-triggered and non-persistent
gmiles3 2:747b84e54088 58 // after it terminates, we need to close the existing connection and start another one
gmiles3 2:747b84e54088 59 strcpy(cmdbuff, "srv:close()\r\n");
gmiles3 0:1fb00e911fe6 60 sendCMD();
gmiles3 0:1fb00e911fe6 61 wait(.5);
gmiles3 0:1fb00e911fe6 62 getReply();
gmiles3 0:1fb00e911fe6 63 strcpy(cmdbuff, "srv=net.createServer(net.TCP,");
gmiles3 0:1fb00e911fe6 64 strcat(cmdbuff, timeout);
gmiles3 0:1fb00e911fe6 65 strcat(cmdbuff, ")\r\n");
gmiles3 0:1fb00e911fe6 66 sendCMD();
gmiles3 0:1fb00e911fe6 67 wait(.5);
gmiles3 0:1fb00e911fe6 68 getReply();
gmiles3 0:1fb00e911fe6 69 strcpy(cmdbuff, "srv:listen(");
gmiles3 0:1fb00e911fe6 70 strcat(cmdbuff, port);
gmiles3 0:1fb00e911fe6 71 strcat(cmdbuff, ",function(conn)\r\n");
gmiles3 0:1fb00e911fe6 72 sendCMD();
gmiles3 0:1fb00e911fe6 73 wait(.5);
gmiles3 0:1fb00e911fe6 74 getReply();
gmiles3 0:1fb00e911fe6 75 strcpy(cmdbuff, "conn:on(\"receive\", function(conn, payload) \r\n");
gmiles3 0:1fb00e911fe6 76 sendCMD();
gmiles3 0:1fb00e911fe6 77 wait(.5);
gmiles3 0:1fb00e911fe6 78 getReply();
gmiles3 0:1fb00e911fe6 79 strcpy(cmdbuff, "conn:send('");
gmiles3 0:1fb00e911fe6 80 strcat(cmdbuff, "')\r\n");
gmiles3 0:1fb00e911fe6 81 sendCMD();
gmiles3 0:1fb00e911fe6 82 wait(.5);
gmiles3 0:1fb00e911fe6 83 getReply();
gmiles3 0:1fb00e911fe6 84 strcpy(cmdbuff, "print(payload)\r\n");
gmiles3 0:1fb00e911fe6 85 sendCMD();
gmiles3 0:1fb00e911fe6 86 wait(.5);
gmiles3 0:1fb00e911fe6 87 getReply();
gmiles3 0:1fb00e911fe6 88 strcpy(cmdbuff, "end)\r\n");
gmiles3 0:1fb00e911fe6 89 sendCMD();
gmiles3 0:1fb00e911fe6 90 wait(.5);
gmiles3 0:1fb00e911fe6 91 getReply();
gmiles3 0:1fb00e911fe6 92 strcpy(cmdbuff, "end)\r\n");
gmiles3 0:1fb00e911fe6 93 sendCMD();
AlanPig 3:99303dc07632 94 led4 = 1;
gmiles3 0:1fb00e911fe6 95 wait(.5);
AlanPig 3:99303dc07632 96 led4 = 0;
gmiles3 0:1fb00e911fe6 97 getReply();
gmiles3 0:1fb00e911fe6 98 }
gmiles3 0:1fb00e911fe6 99 }
gmiles3 0:1fb00e911fe6 100
gmiles3 0:1fb00e911fe6 101
AlanPig 3:99303dc07632 102 void lightOff(Arguments *in, Reply *out) {
AlanPig 3:99303dc07632 103 led4=1;
AlanPig 3:99303dc07632 104 position = 0.11;
AlanPig 3:99303dc07632 105 myservo = position;
AlanPig 3:99303dc07632 106 wait(1);
AlanPig 3:99303dc07632 107 position = 0.5;
AlanPig 3:99303dc07632 108 myservo = position;
AlanPig 3:99303dc07632 109 led4=0;
gmiles3 0:1fb00e911fe6 110 }
gmiles3 0:1fb00e911fe6 111
AlanPig 3:99303dc07632 112 void lightOn(Arguments *in, Reply *out) {
AlanPig 3:99303dc07632 113 led1=1;
AlanPig 3:99303dc07632 114 position = 0.8;
AlanPig 3:99303dc07632 115 myservo = position;
AlanPig 3:99303dc07632 116 wait(1);
AlanPig 3:99303dc07632 117 position = 0.5;
AlanPig 3:99303dc07632 118 myservo = position;
AlanPig 3:99303dc07632 119 led1=0;
gmiles3 0:1fb00e911fe6 120 }
gmiles3 0:1fb00e911fe6 121
gmiles3 0:1fb00e911fe6 122 /* WIFI FUNCTIONS */
gmiles3 0:1fb00e911fe6 123
gmiles3 0:1fb00e911fe6 124 void connectToNetwork() {
AlanPig 3:99303dc07632 125 // pc.printf("# Resetting ESP\r\n");
gmiles3 0:1fb00e911fe6 126 strcpy(cmdbuff,"node.restart()\r\n");
gmiles3 0:1fb00e911fe6 127 sendCMD();
AlanPig 3:99303dc07632 128 wait(1);
gmiles3 0:1fb00e911fe6 129 getReply();
gmiles3 0:1fb00e911fe6 130
gmiles3 0:1fb00e911fe6 131 led1=1,led2=0,led3=0;
AlanPig 3:99303dc07632 132 // pc.printf("# Setting Mode\r\n");
gmiles3 0:1fb00e911fe6 133 strcpy(cmdbuff, "wifi.setmode(wifi.STATION)\r\n");
gmiles3 0:1fb00e911fe6 134 sendCMD();
gmiles3 0:1fb00e911fe6 135 getReply();
AlanPig 3:99303dc07632 136 wait(1);
AlanPig 3:99303dc07632 137
AlanPig 3:99303dc07632 138
AlanPig 3:99303dc07632 139 // pc.printf("\n---------- Listing Access Points ----------\r\n");
AlanPig 3:99303dc07632 140 strcpy(cmdbuff, "function listap(t)\r\n");
AlanPig 3:99303dc07632 141 sendCMD();
AlanPig 3:99303dc07632 142 wait(1);
AlanPig 3:99303dc07632 143 strcpy(cmdbuff, "for k,v in pairs(t) do\r\n");
AlanPig 3:99303dc07632 144 sendCMD();
AlanPig 3:99303dc07632 145 wait(1);
AlanPig 3:99303dc07632 146 strcpy(cmdbuff, "print(k..\" : \"..v)\r\n");
AlanPig 3:99303dc07632 147 sendCMD();
AlanPig 3:99303dc07632 148 wait(1);
AlanPig 3:99303dc07632 149 strcpy(cmdbuff, "end\r\n");
AlanPig 3:99303dc07632 150 sendCMD();
AlanPig 3:99303dc07632 151 wait(1);
AlanPig 3:99303dc07632 152 strcpy(cmdbuff, "end\r\n");
AlanPig 3:99303dc07632 153 sendCMD();
AlanPig 3:99303dc07632 154 wait(1);
AlanPig 3:99303dc07632 155 strcpy(cmdbuff, "wifi.sta.getap(listap)\r\n");
AlanPig 3:99303dc07632 156 sendCMD();
AlanPig 3:99303dc07632 157 wait(5);
AlanPig 3:99303dc07632 158 getReply();
gmiles3 0:1fb00e911fe6 159
gmiles3 0:1fb00e911fe6 160 led1=0,led2=1,led3=0;
AlanPig 3:99303dc07632 161 // pc.printf("# Connecting to AP\r\n");
AlanPig 3:99303dc07632 162 // pc.printf("# ssid = %s\t\tpwd = %s\r\n", ssid, pwd);
gmiles3 0:1fb00e911fe6 163 strcpy(cmdbuff, "wifi.sta.config(\"");
gmiles3 0:1fb00e911fe6 164 strcat(cmdbuff, ssid);
gmiles3 0:1fb00e911fe6 165 strcat(cmdbuff, "\",\"");
gmiles3 0:1fb00e911fe6 166 strcat(cmdbuff, pwd);
gmiles3 0:1fb00e911fe6 167 strcat(cmdbuff, "\")\r\n");
gmiles3 0:1fb00e911fe6 168 sendCMD();
AlanPig 3:99303dc07632 169 wait(12);
gmiles3 0:1fb00e911fe6 170 getReply();
gmiles3 0:1fb00e911fe6 171
AlanPig 3:99303dc07632 172
gmiles3 0:1fb00e911fe6 173 wait(2);
gmiles3 0:1fb00e911fe6 174 led1=0,led2=0,led3=1;
AlanPig 3:99303dc07632 175 // pc.printf("# Get IP Address\r\n");
gmiles3 0:1fb00e911fe6 176 strcpy(cmdbuff, "print(wifi.sta.getip())\r\n");
gmiles3 0:1fb00e911fe6 177 sendCMD();
AlanPig 3:99303dc07632 178 wait(3);
gmiles3 0:1fb00e911fe6 179 getReply();
AlanPig 3:99303dc07632 180
gmiles3 0:1fb00e911fe6 181
gmiles3 0:1fb00e911fe6 182 wait(2);
gmiles3 0:1fb00e911fe6 183 led1=1,led2=0,led3=0;
AlanPig 3:99303dc07632 184 // pc.printf("# Get Connection Status\r\n");
gmiles3 0:1fb00e911fe6 185 strcpy(cmdbuff, "print(wifi.sta.status())\r\n");
gmiles3 0:1fb00e911fe6 186 sendCMD();
gmiles3 0:1fb00e911fe6 187 getReply();
gmiles3 0:1fb00e911fe6 188
gmiles3 0:1fb00e911fe6 189 wait(2);
gmiles3 0:1fb00e911fe6 190 led1=0,led2=1,led3=0;
AlanPig 3:99303dc07632 191 // pc.printf("# Listen on Port\r\n");
gmiles3 0:1fb00e911fe6 192 strcpy(cmdbuff, "srv=net.createServer(net.TCP,");
gmiles3 0:1fb00e911fe6 193 strcat(cmdbuff, timeout);
gmiles3 0:1fb00e911fe6 194 strcat(cmdbuff, ")\r\n");
gmiles3 0:1fb00e911fe6 195 sendCMD();
gmiles3 0:1fb00e911fe6 196 getReply();
gmiles3 0:1fb00e911fe6 197
gmiles3 0:1fb00e911fe6 198 wait(2);
gmiles3 0:1fb00e911fe6 199 led1=0,led2=0,led3=1;
gmiles3 0:1fb00e911fe6 200 strcpy(cmdbuff, "srv:listen(");
gmiles3 0:1fb00e911fe6 201 strcat(cmdbuff, port);
gmiles3 0:1fb00e911fe6 202 strcat(cmdbuff, ",function(conn)\r\n");
gmiles3 0:1fb00e911fe6 203 sendCMD();
gmiles3 0:1fb00e911fe6 204 getReply();
gmiles3 0:1fb00e911fe6 205
AlanPig 3:99303dc07632 206 wait(.5);
gmiles3 0:1fb00e911fe6 207 led1=1,led2=0,led3=0;
gmiles3 0:1fb00e911fe6 208 strcpy(cmdbuff, "conn:on(\"receive\", function(conn, payload) \r\n");
gmiles3 0:1fb00e911fe6 209 sendCMD();
gmiles3 0:1fb00e911fe6 210 getReply();
gmiles3 0:1fb00e911fe6 211
AlanPig 3:99303dc07632 212 wait(.5);
gmiles3 0:1fb00e911fe6 213 led1=0,led2=1,led3=0;
AlanPig 3:99303dc07632 214 strcpy(cmdbuff, "conn:send(\"<h1> Hello, NodeMCU!!! </h1>\"");
AlanPig 3:99303dc07632 215 strcat(cmdbuff, ")\r\n");
gmiles3 0:1fb00e911fe6 216 sendCMD();
gmiles3 0:1fb00e911fe6 217 getReply();
gmiles3 0:1fb00e911fe6 218 led1=0,led2=0,led3=1;
gmiles3 0:1fb00e911fe6 219 strcpy(cmdbuff, "print(payload)\r\n");
gmiles3 0:1fb00e911fe6 220 sendCMD();
gmiles3 0:1fb00e911fe6 221 getReply();
gmiles3 0:1fb00e911fe6 222 led1=1,led2=0,led3=0;
gmiles3 0:1fb00e911fe6 223 strcpy(cmdbuff, "end)\r\n");
gmiles3 0:1fb00e911fe6 224 sendCMD();
gmiles3 0:1fb00e911fe6 225 getReply();
gmiles3 0:1fb00e911fe6 226 led1=0,led2=1,led3=0;
gmiles3 0:1fb00e911fe6 227 strcpy(cmdbuff, "end)\r\n");
gmiles3 0:1fb00e911fe6 228 sendCMD();
gmiles3 0:1fb00e911fe6 229 getReply();
AlanPig 3:99303dc07632 230 led1=0,led2=0,led3=0;
AlanPig 3:99303dc07632 231 // pc.printf("# Ready\r\n");
AlanPig 3:99303dc07632 232 wait(1);
AlanPig 3:99303dc07632 233 }
gmiles3 0:1fb00e911fe6 234
AlanPig 3:99303dc07632 235
AlanPig 3:99303dc07632 236
gmiles3 0:1fb00e911fe6 237
gmiles3 0:1fb00e911fe6 238 void sendCMD()
gmiles3 0:1fb00e911fe6 239 {
gmiles3 0:1fb00e911fe6 240 int i;
gmiles3 0:1fb00e911fe6 241 char temp_char;
gmiles3 0:1fb00e911fe6 242 bool empty;
gmiles3 0:1fb00e911fe6 243 i = 0;
gmiles3 0:1fb00e911fe6 244 // Start Critical Section - don't interrupt while changing global buffer variables
gmiles3 0:1fb00e911fe6 245 NVIC_DisableIRQ(UART1_IRQn);
gmiles3 0:1fb00e911fe6 246 empty = (tx_in == tx_out);
gmiles3 0:1fb00e911fe6 247 while ((i==0) || (cmdbuff[i-1] != '\n')) {
gmiles3 0:1fb00e911fe6 248 // Wait if buffer full
gmiles3 0:1fb00e911fe6 249 if (((tx_in + 1) % buffer_size) == tx_out) {
gmiles3 0:1fb00e911fe6 250 // End Critical Section - need to let interrupt routine empty buffer by sending
gmiles3 0:1fb00e911fe6 251 NVIC_EnableIRQ(UART1_IRQn);
gmiles3 0:1fb00e911fe6 252 while (((tx_in + 1) % buffer_size) == tx_out) {
gmiles3 0:1fb00e911fe6 253 }
gmiles3 0:1fb00e911fe6 254 // Start Critical Section - don't interrupt while changing global buffer variables
gmiles3 0:1fb00e911fe6 255 NVIC_DisableIRQ(UART1_IRQn);
gmiles3 0:1fb00e911fe6 256 }
gmiles3 0:1fb00e911fe6 257 tx_buffer[tx_in] = cmdbuff[i];
gmiles3 0:1fb00e911fe6 258 i++;
gmiles3 0:1fb00e911fe6 259 tx_in = (tx_in + 1) % buffer_size;
gmiles3 0:1fb00e911fe6 260 }
gmiles3 0:1fb00e911fe6 261 if (esp.writeable() && (empty)) {
gmiles3 0:1fb00e911fe6 262 temp_char = tx_buffer[tx_out];
gmiles3 0:1fb00e911fe6 263 tx_out = (tx_out + 1) % buffer_size;
gmiles3 0:1fb00e911fe6 264 // Send first character to start tx interrupts, if stopped
gmiles3 0:1fb00e911fe6 265 esp.putc(temp_char);
gmiles3 0:1fb00e911fe6 266 }
gmiles3 0:1fb00e911fe6 267 // End Critical Section
gmiles3 0:1fb00e911fe6 268 NVIC_EnableIRQ(UART1_IRQn);
gmiles3 0:1fb00e911fe6 269 return;
gmiles3 0:1fb00e911fe6 270 }
gmiles3 0:1fb00e911fe6 271
gmiles3 0:1fb00e911fe6 272 // Read a line from the large rx buffer from rx interrupt routine
gmiles3 0:1fb00e911fe6 273 void getReply() {
gmiles3 0:1fb00e911fe6 274 int i;
gmiles3 0:1fb00e911fe6 275 i = 0;
gmiles3 0:1fb00e911fe6 276 // Start Critical Section - don't interrupt while changing global buffer variables
gmiles3 0:1fb00e911fe6 277 NVIC_DisableIRQ(UART1_IRQn);
gmiles3 0:1fb00e911fe6 278 // Loop reading rx buffer characters until end of line character
gmiles3 0:1fb00e911fe6 279 while ((i==0) || (rx_line[i-1] != '\r')) {
gmiles3 0:1fb00e911fe6 280 // Wait if buffer empty
gmiles3 0:1fb00e911fe6 281 if (rx_in == rx_out) {
gmiles3 0:1fb00e911fe6 282 // End Critical Section - need to allow rx interrupt to get new characters for buffer
gmiles3 0:1fb00e911fe6 283 NVIC_EnableIRQ(UART1_IRQn);
gmiles3 0:1fb00e911fe6 284 while (rx_in == rx_out) {
gmiles3 0:1fb00e911fe6 285 }
gmiles3 0:1fb00e911fe6 286 // Start Critical Section - don't interrupt while changing global buffer variables
gmiles3 0:1fb00e911fe6 287 NVIC_DisableIRQ(UART1_IRQn);
gmiles3 0:1fb00e911fe6 288 }
gmiles3 0:1fb00e911fe6 289 rx_line[i] = rx_buffer[rx_out];
gmiles3 0:1fb00e911fe6 290 i++;
gmiles3 0:1fb00e911fe6 291 rx_out = (rx_out + 1) % buffer_size;
gmiles3 0:1fb00e911fe6 292 }
gmiles3 0:1fb00e911fe6 293 // End Critical Section
gmiles3 0:1fb00e911fe6 294 NVIC_EnableIRQ(UART1_IRQn);
gmiles3 0:1fb00e911fe6 295 rx_line[i-1] = 0;
gmiles3 0:1fb00e911fe6 296 return;
gmiles3 0:1fb00e911fe6 297 }
gmiles3 0:1fb00e911fe6 298
gmiles3 0:1fb00e911fe6 299
gmiles3 0:1fb00e911fe6 300 // Interupt Routine to read in data from serial port
gmiles3 0:1fb00e911fe6 301 void Rx_interrupt() {
gmiles3 0:1fb00e911fe6 302 //led3=1;
gmiles3 0:1fb00e911fe6 303 // Loop just in case more than one character is in UART's receive FIFO buffer
gmiles3 0:1fb00e911fe6 304 // Stop if buffer full
gmiles3 0:1fb00e911fe6 305 while ((esp.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
gmiles3 0:1fb00e911fe6 306 rx_buffer[rx_in] = esp.getc();
gmiles3 0:1fb00e911fe6 307 // Uncomment to Echo to USB serial to watch data flow
AlanPig 3:99303dc07632 308 // pc.putc(rx_buffer[rx_in]);
gmiles3 0:1fb00e911fe6 309 rx_in = (rx_in + 1) % buffer_size;
gmiles3 0:1fb00e911fe6 310 }
gmiles3 0:1fb00e911fe6 311 return;
gmiles3 0:1fb00e911fe6 312 }
gmiles3 0:1fb00e911fe6 313
gmiles3 0:1fb00e911fe6 314
gmiles3 0:1fb00e911fe6 315 // Interupt Routine to write out data to serial port
gmiles3 0:1fb00e911fe6 316 void Tx_interrupt() {
AlanPig 3:99303dc07632 317
gmiles3 0:1fb00e911fe6 318 // Loop to fill more than one character in UART's transmit FIFO buffer
gmiles3 0:1fb00e911fe6 319 // Stop if buffer empty
gmiles3 0:1fb00e911fe6 320 while ((esp.writeable()) && (tx_in != tx_out)) {
gmiles3 0:1fb00e911fe6 321 esp.putc(tx_buffer[tx_out]);
gmiles3 0:1fb00e911fe6 322 tx_out = (tx_out + 1) % buffer_size;
gmiles3 0:1fb00e911fe6 323 }
AlanPig 3:99303dc07632 324
gmiles3 0:1fb00e911fe6 325 return;
gmiles3 0:1fb00e911fe6 326 }