Real-time bike tracker using Adafruit Ultimate GPS, Huzzah wifi, and Pubnub

Dependencies:   MBed_Adafruit-GPS-Library mbed

Committer:
ECE4180
Date:
Sun Apr 23 15:24:21 2017 +0000
Revision:
6:5bc3eeabdca3
Parent:
3:ceca81e8ac2b
For Notebook Page

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ECE4180 1:0701bf58c9fa 1 #include "Huzzah.h"
ECE4180 1:0701bf58c9fa 2
ECE4180 1:0701bf58c9fa 3
ECE4180 1:0701bf58c9fa 4 extern Serial pc;
ECE4180 1:0701bf58c9fa 5 extern volatile int tx_in;
ECE4180 1:0701bf58c9fa 6 extern volatile int tx_out;
ECE4180 1:0701bf58c9fa 7 extern volatile int rx_in;
ECE4180 1:0701bf58c9fa 8 extern volatile int rx_out;
ECE4180 1:0701bf58c9fa 9 extern char tx_buffer[4096];
ECE4180 1:0701bf58c9fa 10 extern char rx_buffer[4096];
ECE4180 1:0701bf58c9fa 11
ECE4180 1:0701bf58c9fa 12
ECE4180 1:0701bf58c9fa 13 Huzzah::Huzzah(PinName tx_pin, PinName rx_pin, string ssid, string pwd)
ECE4180 1:0701bf58c9fa 14 :esp(tx_pin, rx_pin), ssid(ssid), pwd(pwd)
ECE4180 1:0701bf58c9fa 15 {
ECE4180 1:0701bf58c9fa 16 tx_in=0;
ECE4180 1:0701bf58c9fa 17 tx_out=0;
ECE4180 1:0701bf58c9fa 18 rx_in=0;
ECE4180 1:0701bf58c9fa 19 rx_out=0;
ECE4180 1:0701bf58c9fa 20 esp.baud(9600);
ECE4180 3:ceca81e8ac2b 21 socket = false;
ECE4180 1:0701bf58c9fa 22 }
ECE4180 1:0701bf58c9fa 23
ECE4180 1:0701bf58c9fa 24
ECE4180 1:0701bf58c9fa 25 Huzzah::Huzzah(PinName tx_pin, PinName rx_pin)
ECE4180 1:0701bf58c9fa 26 :esp(tx_pin, rx_pin), ssid(""), pwd("")
ECE4180 1:0701bf58c9fa 27 {
ECE4180 1:0701bf58c9fa 28 tx_in=0;
ECE4180 1:0701bf58c9fa 29 tx_out=0;
ECE4180 1:0701bf58c9fa 30 rx_in=0;
ECE4180 1:0701bf58c9fa 31 rx_out=0;
ECE4180 1:0701bf58c9fa 32 esp.baud(9600);
ECE4180 3:ceca81e8ac2b 33 socket = false;
ECE4180 1:0701bf58c9fa 34 }
ECE4180 1:0701bf58c9fa 35
ECE4180 1:0701bf58c9fa 36
ECE4180 1:0701bf58c9fa 37 void Huzzah::setssid(string s)
ECE4180 1:0701bf58c9fa 38 {
ECE4180 1:0701bf58c9fa 39 ssid = s;
ECE4180 1:0701bf58c9fa 40 }
ECE4180 1:0701bf58c9fa 41
ECE4180 1:0701bf58c9fa 42
ECE4180 1:0701bf58c9fa 43 void Huzzah::setpwd(string s)
ECE4180 1:0701bf58c9fa 44 {
ECE4180 1:0701bf58c9fa 45 pwd = s;
ECE4180 1:0701bf58c9fa 46 }
ECE4180 1:0701bf58c9fa 47
ECE4180 1:0701bf58c9fa 48
ECE4180 1:0701bf58c9fa 49 string Huzzah::get_ip()
ECE4180 1:0701bf58c9fa 50 {
ECE4180 1:0701bf58c9fa 51 strcpy(cmdbuff, "print(wifi.sta.getip())\r\n");
ECE4180 1:0701bf58c9fa 52 send_cmd();
ECE4180 1:0701bf58c9fa 53 getreply();
ECE4180 1:0701bf58c9fa 54 string s(replybuff);
ECE4180 1:0701bf58c9fa 55 return s;
ECE4180 1:0701bf58c9fa 56 }
ECE4180 1:0701bf58c9fa 57
ECE4180 1:0701bf58c9fa 58
ECE4180 3:ceca81e8ac2b 59 void Huzzah::open_socket(string host, string port)
ECE4180 1:0701bf58c9fa 60 {
ECE4180 3:ceca81e8ac2b 61 pc.printf("opening socket!\r\n");
ECE4180 1:0701bf58c9fa 62 string conn("conn:connect(");
ECE4180 1:0701bf58c9fa 63 conn += port + "\,\"" + host + "\")\r\n";
ECE4180 1:0701bf58c9fa 64
ECE4180 2:834f8d2ebe3f 65 sprintf(cmdbuff, "conn=net.createConnection(net.TCP, false)\r\n");
ECE4180 1:0701bf58c9fa 66 send_cmd();
ECE4180 1:0701bf58c9fa 67 getreply();
ECE4180 1:0701bf58c9fa 68 wait(0.2);
ECE4180 1:0701bf58c9fa 69 sprintf(cmdbuff, "print(conn)\r\n" );
ECE4180 1:0701bf58c9fa 70 send_cmd();
ECE4180 1:0701bf58c9fa 71 getreply();
ECE4180 1:0701bf58c9fa 72 wait(0.2);
ECE4180 1:0701bf58c9fa 73 sprintf(cmdbuff, "conn:on(\"receive\", function(conn, pl) print(pl) end)\r\n");
ECE4180 1:0701bf58c9fa 74 send_cmd();
ECE4180 1:0701bf58c9fa 75 getreply();
ECE4180 1:0701bf58c9fa 76 wait(0.2);
ECE4180 1:0701bf58c9fa 77 sprintf(cmdbuff, conn.c_str());
ECE4180 1:0701bf58c9fa 78 send_cmd();
ECE4180 1:0701bf58c9fa 79 getreply();
ECE4180 6:5bc3eeabdca3 80 wait(1.0);
ECE4180 3:ceca81e8ac2b 81
ECE4180 3:ceca81e8ac2b 82 this->socket = true;
ECE4180 3:ceca81e8ac2b 83 pc.printf("socket opened\r\n");
ECE4180 3:ceca81e8ac2b 84
ECE4180 3:ceca81e8ac2b 85 }
ECE4180 3:ceca81e8ac2b 86
ECE4180 3:ceca81e8ac2b 87
ECE4180 3:ceca81e8ac2b 88 void Huzzah::http_get(string request, string host, string port)
ECE4180 3:ceca81e8ac2b 89 {
ECE4180 3:ceca81e8ac2b 90
ECE4180 3:ceca81e8ac2b 91 if (!this->socket) {
ECE4180 3:ceca81e8ac2b 92 this->open_socket(host, port);
ECE4180 3:ceca81e8ac2b 93 }
ECE4180 3:ceca81e8ac2b 94
ECE4180 3:ceca81e8ac2b 95 string r("conn:send(\"");
ECE4180 3:ceca81e8ac2b 96 r += request + "\")\r\n";
ECE4180 3:ceca81e8ac2b 97
ECE4180 3:ceca81e8ac2b 98 string conn("conn:connect(");
ECE4180 3:ceca81e8ac2b 99 conn += port + "\,\"" + host + "\")\r\n";
ECE4180 3:ceca81e8ac2b 100
ECE4180 3:ceca81e8ac2b 101 sprintf(cmdbuff, "conn=net.createConnection(net.TCP, false)\r\n");
ECE4180 3:ceca81e8ac2b 102 send_cmd();
ECE4180 3:ceca81e8ac2b 103 getreply();
ECE4180 3:ceca81e8ac2b 104 wait(0.2);
ECE4180 3:ceca81e8ac2b 105 sprintf(cmdbuff, "print(conn)\r\n" );
ECE4180 3:ceca81e8ac2b 106 send_cmd();
ECE4180 3:ceca81e8ac2b 107 getreply();
ECE4180 3:ceca81e8ac2b 108 wait(0.2);
ECE4180 3:ceca81e8ac2b 109 sprintf(cmdbuff, "conn:on(\"receive\", function(conn, pl) print(pl) end)\r\n");
ECE4180 3:ceca81e8ac2b 110 send_cmd();
ECE4180 3:ceca81e8ac2b 111 getreply();
ECE4180 3:ceca81e8ac2b 112 wait(0.2);
ECE4180 3:ceca81e8ac2b 113 sprintf(cmdbuff, conn.c_str());
ECE4180 3:ceca81e8ac2b 114 send_cmd();
ECE4180 3:ceca81e8ac2b 115 getreply();
ECE4180 6:5bc3eeabdca3 116 wait(0.5);
ECE4180 3:ceca81e8ac2b 117
ECE4180 1:0701bf58c9fa 118 sprintf(cmdbuff, r.c_str());
ECE4180 1:0701bf58c9fa 119 send_cmd();
ECE4180 6:5bc3eeabdca3 120 wait(0.5);
ECE4180 1:0701bf58c9fa 121 send_cmd();
ECE4180 1:0701bf58c9fa 122 getreply();
ECE4180 2:834f8d2ebe3f 123 wait(0.5);
ECE4180 3:ceca81e8ac2b 124
ECE4180 3:ceca81e8ac2b 125 sprintf(cmdbuff, "conn:close()\r\n");
ECE4180 2:834f8d2ebe3f 126 send_cmd();
ECE4180 2:834f8d2ebe3f 127 getreply();
ECE4180 3:ceca81e8ac2b 128 wait(0.5);
ECE4180 3:ceca81e8ac2b 129 sprintf(cmdbuff, "conn = nil\r\n");
ECE4180 3:ceca81e8ac2b 130 send_cmd();
ECE4180 3:ceca81e8ac2b 131 getreply();
ECE4180 3:ceca81e8ac2b 132
ECE4180 1:0701bf58c9fa 133 }
ECE4180 1:0701bf58c9fa 134
ECE4180 1:0701bf58c9fa 135
ECE4180 1:0701bf58c9fa 136 void Huzzah::send_cmd()
ECE4180 1:0701bf58c9fa 137 {
ECE4180 1:0701bf58c9fa 138 int i;
ECE4180 1:0701bf58c9fa 139 char temp_char;
ECE4180 1:0701bf58c9fa 140 bool empty;
ECE4180 1:0701bf58c9fa 141 i = 0;
ECE4180 1:0701bf58c9fa 142 // Start Critical Section - don't interrupt while changing global buffer variables
ECE4180 1:0701bf58c9fa 143 NVIC_DisableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 144 empty = (tx_in == tx_out);
ECE4180 1:0701bf58c9fa 145 while ((i==0) || (cmdbuff[i-1] != '\n')) {
ECE4180 1:0701bf58c9fa 146 // Wait if buffer full
ECE4180 1:0701bf58c9fa 147 if (((tx_in + 1) % buffer_size) == tx_out) {
ECE4180 1:0701bf58c9fa 148 // End Critical Section - need to let interrupt routine empty buffer by sending
ECE4180 1:0701bf58c9fa 149 NVIC_EnableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 150 while (((tx_in + 1) % buffer_size) == tx_out) {
ECE4180 1:0701bf58c9fa 151 }
ECE4180 1:0701bf58c9fa 152 // Start Critical Section - don't interrupt while changing global buffer variables
ECE4180 1:0701bf58c9fa 153 NVIC_DisableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 154 }
ECE4180 1:0701bf58c9fa 155 tx_buffer[tx_in] = cmdbuff[i];
ECE4180 1:0701bf58c9fa 156 i++;
ECE4180 1:0701bf58c9fa 157 tx_in = (tx_in + 1) % buffer_size;
ECE4180 1:0701bf58c9fa 158 }
ECE4180 1:0701bf58c9fa 159 if (esp.writeable() && (empty)) {
ECE4180 1:0701bf58c9fa 160 temp_char = tx_buffer[tx_out];
ECE4180 1:0701bf58c9fa 161 tx_out = (tx_out + 1) % buffer_size;
ECE4180 1:0701bf58c9fa 162 // Send first character to start tx interrupts, if stopped
ECE4180 1:0701bf58c9fa 163 esp.putc(temp_char);
ECE4180 1:0701bf58c9fa 164 }
ECE4180 1:0701bf58c9fa 165 // End Critical Section
ECE4180 1:0701bf58c9fa 166 NVIC_EnableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 167 return;
ECE4180 1:0701bf58c9fa 168 }
ECE4180 1:0701bf58c9fa 169
ECE4180 1:0701bf58c9fa 170
ECE4180 1:0701bf58c9fa 171 void Huzzah::getreply()
ECE4180 1:0701bf58c9fa 172 {
ECE4180 1:0701bf58c9fa 173 read_line();
ECE4180 1:0701bf58c9fa 174 sscanf(rx_line,replybuff);
ECE4180 1:0701bf58c9fa 175 }
ECE4180 1:0701bf58c9fa 176
ECE4180 1:0701bf58c9fa 177
ECE4180 1:0701bf58c9fa 178 void Huzzah::read_line()
ECE4180 1:0701bf58c9fa 179 {
ECE4180 1:0701bf58c9fa 180 int i;
ECE4180 1:0701bf58c9fa 181 i = 0;
ECE4180 1:0701bf58c9fa 182 // Start Critical Section - don't interrupt while changing global buffer variables
ECE4180 1:0701bf58c9fa 183 NVIC_DisableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 184 // Loop reading rx buffer characters until end of line character
ECE4180 1:0701bf58c9fa 185 while ((i==0) || (rx_line[i-1] != '\r')) {
ECE4180 1:0701bf58c9fa 186 // Wait if buffer empty
ECE4180 1:0701bf58c9fa 187 if (rx_in == rx_out) {
ECE4180 1:0701bf58c9fa 188 // End Critical Section - need to allow rx interrupt to get new characters for buffer
ECE4180 1:0701bf58c9fa 189 NVIC_EnableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 190 while (rx_in == rx_out) {
ECE4180 1:0701bf58c9fa 191 }
ECE4180 1:0701bf58c9fa 192 // Start Critical Section - don't interrupt while changing global buffer variables
ECE4180 1:0701bf58c9fa 193 NVIC_DisableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 194 }
ECE4180 1:0701bf58c9fa 195 rx_line[i] = rx_buffer[rx_out];
ECE4180 1:0701bf58c9fa 196 i++;
ECE4180 1:0701bf58c9fa 197 rx_out = (rx_out + 1) % buffer_size;
ECE4180 1:0701bf58c9fa 198 }
ECE4180 1:0701bf58c9fa 199 // End Critical Section
ECE4180 1:0701bf58c9fa 200 NVIC_EnableIRQ(UART1_IRQn);
ECE4180 1:0701bf58c9fa 201 rx_line[i-1] = 0;
ECE4180 1:0701bf58c9fa 202 return;
ECE4180 1:0701bf58c9fa 203 }
ECE4180 1:0701bf58c9fa 204
ECE4180 1:0701bf58c9fa 205
ECE4180 1:0701bf58c9fa 206 void Huzzah::espsendcmd()
ECE4180 1:0701bf58c9fa 207 {
ECE4180 1:0701bf58c9fa 208 esp.printf("%s", configsnd);
ECE4180 1:0701bf58c9fa 209 }
ECE4180 1:0701bf58c9fa 210
ECE4180 1:0701bf58c9fa 211
ECE4180 1:0701bf58c9fa 212 void Huzzah::espgetreply()
ECE4180 1:0701bf58c9fa 213 {
ECE4180 1:0701bf58c9fa 214 Timer t;
ECE4180 1:0701bf58c9fa 215 memset(configbuf, '\0', sizeof(configbuf));
ECE4180 1:0701bf58c9fa 216 t.start();
ECE4180 1:0701bf58c9fa 217 ended=0;
ECE4180 1:0701bf58c9fa 218 count=0;
ECE4180 1:0701bf58c9fa 219 while(!ended) {
ECE4180 1:0701bf58c9fa 220 if(esp.readable()) {
ECE4180 1:0701bf58c9fa 221 configbuf[count] = esp.getc();
ECE4180 1:0701bf58c9fa 222 count++;
ECE4180 1:0701bf58c9fa 223 }
ECE4180 1:0701bf58c9fa 224 if(t.read() > timeout) {
ECE4180 1:0701bf58c9fa 225 ended = 1;
ECE4180 1:0701bf58c9fa 226 t.stop();
ECE4180 1:0701bf58c9fa 227 t.reset();
ECE4180 1:0701bf58c9fa 228 }
ECE4180 1:0701bf58c9fa 229 }
ECE4180 1:0701bf58c9fa 230 }
ECE4180 1:0701bf58c9fa 231
ECE4180 1:0701bf58c9fa 232
ECE4180 1:0701bf58c9fa 233 void Huzzah::espconfig()
ECE4180 1:0701bf58c9fa 234 {
ECE4180 1:0701bf58c9fa 235 wait(5);
ECE4180 1:0701bf58c9fa 236 pc.printf("\f---------- Starting ESP Config ----------\r\n\n");
ECE4180 1:0701bf58c9fa 237 pc.printf("---------- Reset & get Firmware ----------\r\n");
ECE4180 1:0701bf58c9fa 238 strcpy(configsnd,"node.restart()\r\n");
ECE4180 1:0701bf58c9fa 239 espsendcmd();
ECE4180 1:0701bf58c9fa 240 timeout=5;
ECE4180 1:0701bf58c9fa 241 espgetreply();
ECE4180 1:0701bf58c9fa 242 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 243
ECE4180 1:0701bf58c9fa 244 wait(2);
ECE4180 1:0701bf58c9fa 245
ECE4180 1:0701bf58c9fa 246 pc.printf("\n---------- Get Version ----------\r\n");
ECE4180 1:0701bf58c9fa 247 strcpy(configsnd,"print(node.info())\r\n");
ECE4180 1:0701bf58c9fa 248 espsendcmd();
ECE4180 1:0701bf58c9fa 249 timeout=4;
ECE4180 1:0701bf58c9fa 250 espgetreply();
ECE4180 1:0701bf58c9fa 251 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 252
ECE4180 1:0701bf58c9fa 253 wait(3);
ECE4180 1:0701bf58c9fa 254
ECE4180 1:0701bf58c9fa 255 // set CWMODE to 1=Station,2=AP,3=BOTH, default mode 1 (Station)
ECE4180 1:0701bf58c9fa 256 pc.printf("\n---------- Setting Mode ----------\r\n");
ECE4180 1:0701bf58c9fa 257 strcpy(configsnd, "wifi.setmode(wifi.STATION)\r\n");
ECE4180 1:0701bf58c9fa 258 espsendcmd();
ECE4180 1:0701bf58c9fa 259 timeout=4;
ECE4180 1:0701bf58c9fa 260 espgetreply();
ECE4180 1:0701bf58c9fa 261 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 262
ECE4180 1:0701bf58c9fa 263 wait(2);
ECE4180 1:0701bf58c9fa 264
ECE4180 1:0701bf58c9fa 265 pc.printf("\n---------- Listing Access Points ----------\r\n");
ECE4180 1:0701bf58c9fa 266 strcpy(configsnd, "function listap(t) \r\n");
ECE4180 1:0701bf58c9fa 267 espsendcmd();
ECE4180 1:0701bf58c9fa 268 wait(1);
ECE4180 1:0701bf58c9fa 269 strcpy(configsnd, "for k,v in pairs(t) do \r\n");
ECE4180 1:0701bf58c9fa 270 espsendcmd();
ECE4180 1:0701bf58c9fa 271 wait(1);
ECE4180 1:0701bf58c9fa 272 strcpy(configsnd, "print(k..\" : \"..v)\r\n");
ECE4180 1:0701bf58c9fa 273 espsendcmd();
ECE4180 1:0701bf58c9fa 274 wait(1);
ECE4180 1:0701bf58c9fa 275 strcpy(configsnd, "end\r\n");
ECE4180 1:0701bf58c9fa 276 espsendcmd();
ECE4180 1:0701bf58c9fa 277 wait(1);
ECE4180 1:0701bf58c9fa 278 strcpy(configsnd, "end\r\n");
ECE4180 1:0701bf58c9fa 279 espsendcmd();
ECE4180 1:0701bf58c9fa 280 wait(1);
ECE4180 1:0701bf58c9fa 281 strcpy(configsnd, "wifi.sta.getap(listap) \r\n");
ECE4180 1:0701bf58c9fa 282 espsendcmd();
ECE4180 1:0701bf58c9fa 283 wait(1);
ECE4180 1:0701bf58c9fa 284 timeout=15;
ECE4180 1:0701bf58c9fa 285 espgetreply();
ECE4180 1:0701bf58c9fa 286 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 287
ECE4180 1:0701bf58c9fa 288 wait(2);
ECE4180 1:0701bf58c9fa 289
ECE4180 1:0701bf58c9fa 290 pc.printf("\n---------- Connecting to AP ----------\r\n");
ECE4180 1:0701bf58c9fa 291 pc.printf("ssid = %s pwd = %s\r\n",ssid.c_str(),pwd.c_str());
ECE4180 1:0701bf58c9fa 292 strcpy(configsnd, "wifi.sta.config(\"");
ECE4180 1:0701bf58c9fa 293 strcat(configsnd, ssid.c_str());
ECE4180 1:0701bf58c9fa 294 strcat(configsnd, "\",\"");
ECE4180 1:0701bf58c9fa 295 strcat(configsnd, pwd.c_str());
ECE4180 1:0701bf58c9fa 296 strcat(configsnd, "\")\r\n");
ECE4180 1:0701bf58c9fa 297 espsendcmd();
ECE4180 1:0701bf58c9fa 298 timeout=10;
ECE4180 1:0701bf58c9fa 299 espgetreply();
ECE4180 1:0701bf58c9fa 300 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 301
ECE4180 1:0701bf58c9fa 302 wait(10);
ECE4180 1:0701bf58c9fa 303
ECE4180 1:0701bf58c9fa 304 pc.printf("\n---------- Get IP's ----------\r\n");
ECE4180 1:0701bf58c9fa 305 strcpy(configsnd, "print(wifi.sta.getip())\r\n");
ECE4180 1:0701bf58c9fa 306 espsendcmd();
ECE4180 1:0701bf58c9fa 307 timeout=3;
ECE4180 1:0701bf58c9fa 308 espgetreply();
ECE4180 1:0701bf58c9fa 309 pc.printf(configbuf);
ECE4180 1:0701bf58c9fa 310
ECE4180 1:0701bf58c9fa 311 wait(1);
ECE4180 2:834f8d2ebe3f 312 return;
ECE4180 1:0701bf58c9fa 313 }