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
main.cpp@3:99303dc07632, 2017-12-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |