Fork from Alex
Dependencies: mbed MbedJSONValue mbed-rtos 4DGL-uLCD-SE ESP8266NodeMCUInterface
main.cpp@3:7bf41989ff8f, 2019-03-31 (annotated)
- Committer:
- alexhrao
- Date:
- Sun Mar 31 03:08:51 2019 +0000
- Revision:
- 3:7bf41989ff8f
- Parent:
- 2:f7d19812bdc5
- Child:
- 4:55f0c303f56a
Minor changes
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
alexhrao | 0:4ffa136585a2 | 1 | #include "mbed.h" |
alexhrao | 1:0620ba35d2e8 | 2 | #include "uLCD_4DGL.h" |
alexhrao | 1:0620ba35d2e8 | 3 | #include "ESP8266Interface.h" |
alexhrao | 1:0620ba35d2e8 | 4 | #include "TCPSocketConnection.h" |
alexhrao | 1:0620ba35d2e8 | 5 | #include "rtos.h" |
alexhrao | 3:7bf41989ff8f | 6 | #include "MbedJSONValue.h" |
alexhrao | 3:7bf41989ff8f | 7 | #include <string> |
alexhrao | 3:7bf41989ff8f | 8 | |
alexhrao | 3:7bf41989ff8f | 9 | #define BUF_SIZE 4096 |
alexhrao | 1:0620ba35d2e8 | 10 | |
alexhrao | 1:0620ba35d2e8 | 11 | // We need this for being able to reset the MBED (similar to watch dogs) |
alexhrao | 1:0620ba35d2e8 | 12 | extern "C" void mbed_reset(); |
alexhrao | 1:0620ba35d2e8 | 13 | |
alexhrao | 1:0620ba35d2e8 | 14 | // LCD Screen |
alexhrao | 1:0620ba35d2e8 | 15 | uLCD_4DGL uLCD(p9, p10, p11); |
alexhrao | 1:0620ba35d2e8 | 16 | Mutex lcd_lock; |
alexhrao | 1:0620ba35d2e8 | 17 | |
alexhrao | 1:0620ba35d2e8 | 18 | // File System |
alexhrao | 1:0620ba35d2e8 | 19 | LocalFileSystem fs("local"); |
alexhrao | 1:0620ba35d2e8 | 20 | |
alexhrao | 1:0620ba35d2e8 | 21 | // Bluetooth |
alexhrao | 1:0620ba35d2e8 | 22 | RawSerial pc(USBTX, USBRX); |
alexhrao | 1:0620ba35d2e8 | 23 | RawSerial dev(p28,p27); |
alexhrao | 1:0620ba35d2e8 | 24 | Thread dev_thread; |
alexhrao | 1:0620ba35d2e8 | 25 | |
alexhrao | 1:0620ba35d2e8 | 26 | // Error LED |
alexhrao | 1:0620ba35d2e8 | 27 | DigitalOut err_led(LED1); |
alexhrao | 1:0620ba35d2e8 | 28 | |
alexhrao | 1:0620ba35d2e8 | 29 | // WiFi |
alexhrao | 1:0620ba35d2e8 | 30 | ESP8266Interface wifi(p13, p14, p15, 9600, 10000); |
alexhrao | 1:0620ba35d2e8 | 31 | |
alexhrao | 1:0620ba35d2e8 | 32 | // Time |
alexhrao | 1:0620ba35d2e8 | 33 | Thread time_thread; |
alexhrao | 1:0620ba35d2e8 | 34 | |
alexhrao | 1:0620ba35d2e8 | 35 | // Weather |
alexhrao | 1:0620ba35d2e8 | 36 | Thread weather_thread; |
alexhrao | 3:7bf41989ff8f | 37 | char weather_api_key[256]; |
alexhrao | 3:7bf41989ff8f | 38 | |
alexhrao | 3:7bf41989ff8f | 39 | // Location |
alexhrao | 3:7bf41989ff8f | 40 | char ip_api_key[256]; |
alexhrao | 3:7bf41989ff8f | 41 | double latitude = 0; |
alexhrao | 3:7bf41989ff8f | 42 | double longitude = 0; |
alexhrao | 0:4ffa136585a2 | 43 | |
alexhrao | 1:0620ba35d2e8 | 44 | void time_updater() { |
alexhrao | 1:0620ba35d2e8 | 45 | // We're not an interrupt, so take as much time as we need. Infinite loop |
alexhrao | 1:0620ba35d2e8 | 46 | // but wait 1 second between each loop |
alexhrao | 1:0620ba35d2e8 | 47 | struct tm* ltm; |
alexhrao | 1:0620ba35d2e8 | 48 | time_t now; |
alexhrao | 1:0620ba35d2e8 | 49 | |
alexhrao | 1:0620ba35d2e8 | 50 | now = time(NULL); |
alexhrao | 1:0620ba35d2e8 | 51 | ltm = localtime(&now); |
alexhrao | 1:0620ba35d2e8 | 52 | |
alexhrao | 1:0620ba35d2e8 | 53 | // Buffer for time string. Max length is 23:59 + \0 |
alexhrao | 1:0620ba35d2e8 | 54 | int max_time_len = 6; |
alexhrao | 1:0620ba35d2e8 | 55 | char ftime[max_time_len]; |
alexhrao | 1:0620ba35d2e8 | 56 | |
alexhrao | 1:0620ba35d2e8 | 57 | int min = -1; |
alexhrao | 1:0620ba35d2e8 | 58 | |
alexhrao | 1:0620ba35d2e8 | 59 | while (true) { |
alexhrao | 1:0620ba35d2e8 | 60 | // if the minute has changed, update. |
alexhrao | 1:0620ba35d2e8 | 61 | now = time(NULL); |
alexhrao | 1:0620ba35d2e8 | 62 | ltm = localtime(&now); |
alexhrao | 1:0620ba35d2e8 | 63 | if(ltm->tm_min != min) { |
alexhrao | 1:0620ba35d2e8 | 64 | // Get the new time |
alexhrao | 1:0620ba35d2e8 | 65 | strftime(ftime, max_time_len, "%H:%M", ltm); |
alexhrao | 1:0620ba35d2e8 | 66 | // Update time! Lock the lcd mutex |
alexhrao | 1:0620ba35d2e8 | 67 | lcd_lock.lock(); |
alexhrao | 1:0620ba35d2e8 | 68 | uLCD.text_width(2); |
alexhrao | 1:0620ba35d2e8 | 69 | uLCD.text_height(2); |
alexhrao | 1:0620ba35d2e8 | 70 | uLCD.text_string(ftime, 0, 2, FONT_8X8, GREEN); |
alexhrao | 1:0620ba35d2e8 | 71 | // Done updating - unlock! |
alexhrao | 1:0620ba35d2e8 | 72 | lcd_lock.unlock(); |
alexhrao | 1:0620ba35d2e8 | 73 | min = ltm->tm_min; |
alexhrao | 1:0620ba35d2e8 | 74 | } |
alexhrao | 1:0620ba35d2e8 | 75 | // Wait 1 second |
alexhrao | 1:0620ba35d2e8 | 76 | Thread::wait(1.0f); |
alexhrao | 1:0620ba35d2e8 | 77 | } |
alexhrao | 1:0620ba35d2e8 | 78 | } |
alexhrao | 1:0620ba35d2e8 | 79 | |
alexhrao | 1:0620ba35d2e8 | 80 | void weather_updater() { |
alexhrao | 1:0620ba35d2e8 | 81 | // We can take as long as we want |
alexhrao | 3:7bf41989ff8f | 82 | return; |
alexhrao | 1:0620ba35d2e8 | 83 | while (true) { |
alexhrao | 1:0620ba35d2e8 | 84 | // get the weather |
alexhrao | 3:7bf41989ff8f | 85 | // first get the current weather |
alexhrao | 3:7bf41989ff8f | 86 | // Weather data is _long_ |
alexhrao | 3:7bf41989ff8f | 87 | |
alexhrao | 3:7bf41989ff8f | 88 | char forecast_buf[2]; |
alexhrao | 3:7bf41989ff8f | 89 | TCPSocketConnection sck; |
alexhrao | 3:7bf41989ff8f | 90 | // http://api.openweathermap.org/data/2.5/forecast?lat=33.7485&lon=-84.3871&appid=6971e1ebfcc60f29c8dcc617c532b1b6 |
alexhrao | 3:7bf41989ff8f | 91 | sck.connect("api.openweathermap.org", 80); |
alexhrao | 3:7bf41989ff8f | 92 | char cmd[1024]; |
alexhrao | 3:7bf41989ff8f | 93 | sprintf(cmd, |
alexhrao | 3:7bf41989ff8f | 94 | "GET /data/2.5/weather?lat=%0.4f&lon=%0.4f&APPID=%s\r\nHost: api.openweathermap.org\r\n\r\n", |
alexhrao | 3:7bf41989ff8f | 95 | latitude, longitude, weather_api_key); |
alexhrao | 3:7bf41989ff8f | 96 | sck.send_all(cmd, strlen(cmd)); |
alexhrao | 3:7bf41989ff8f | 97 | wait(10); |
alexhrao | 3:7bf41989ff8f | 98 | int buf_len = wifi.recv(forecast_buf, 16384 - 1, 0); |
alexhrao | 3:7bf41989ff8f | 99 | forecast_buf[buf_len] = '\0'; |
alexhrao | 3:7bf41989ff8f | 100 | |
alexhrao | 3:7bf41989ff8f | 101 | // Get current weather |
alexhrao | 3:7bf41989ff8f | 102 | char current_buf[8192]; |
alexhrao | 3:7bf41989ff8f | 103 | sprintf(cmd, |
alexhrao | 3:7bf41989ff8f | 104 | "GET /data/2.5/forecast?lat=%0.4f&lon=%0.4f&APPID=%s\r\nHost: api.openweathermap.org\r\n\r\n", |
alexhrao | 3:7bf41989ff8f | 105 | latitude, longitude, weather_api_key); |
alexhrao | 3:7bf41989ff8f | 106 | sck.send_all(cmd, strlen(cmd)); |
alexhrao | 3:7bf41989ff8f | 107 | wait(10); |
alexhrao | 3:7bf41989ff8f | 108 | buf_len = wifi.recv(current_buf, 8192 - 1, 0); |
alexhrao | 3:7bf41989ff8f | 109 | current_buf[buf_len] = '\0'; |
alexhrao | 1:0620ba35d2e8 | 110 | // we'll always want to update the LCD - don't worry about the previous |
alexhrao | 1:0620ba35d2e8 | 111 | // weather |
alexhrao | 1:0620ba35d2e8 | 112 | int curr_temp = 0; |
alexhrao | 1:0620ba35d2e8 | 113 | int high_temp = 0; |
alexhrao | 1:0620ba35d2e8 | 114 | int low_temp = 0; |
alexhrao | 1:0620ba35d2e8 | 115 | char buf[12]; |
alexhrao | 1:0620ba35d2e8 | 116 | sprintf(buf, "%d %d/%d", curr_temp, high_temp, low_temp); |
alexhrao | 1:0620ba35d2e8 | 117 | // lock |
alexhrao | 1:0620ba35d2e8 | 118 | lcd_lock.lock(); |
alexhrao | 1:0620ba35d2e8 | 119 | uLCD.text_width(2); |
alexhrao | 1:0620ba35d2e8 | 120 | uLCD.text_height(2); |
alexhrao | 1:0620ba35d2e8 | 121 | // include null! |
alexhrao | 1:0620ba35d2e8 | 122 | uLCD.text_string(buf, 0, 5, FONT_7X8, WHITE); |
alexhrao | 1:0620ba35d2e8 | 123 | // done! unlock |
alexhrao | 1:0620ba35d2e8 | 124 | lcd_lock.unlock(); |
alexhrao | 1:0620ba35d2e8 | 125 | } |
alexhrao | 1:0620ba35d2e8 | 126 | } |
alexhrao | 1:0620ba35d2e8 | 127 | |
alexhrao | 1:0620ba35d2e8 | 128 | void dev_recv() { |
alexhrao | 1:0620ba35d2e8 | 129 | // Continually check if we have stuff... |
alexhrao | 1:0620ba35d2e8 | 130 | char buf[1024]; |
alexhrao | 1:0620ba35d2e8 | 131 | int ind = 0; |
alexhrao | 1:0620ba35d2e8 | 132 | while (true) { |
alexhrao | 1:0620ba35d2e8 | 133 | while (true) { |
alexhrao | 1:0620ba35d2e8 | 134 | // get stuff. If we encounter \r or \n, that's a complete command! |
alexhrao | 1:0620ba35d2e8 | 135 | char tmp = dev.getc(); |
alexhrao | 1:0620ba35d2e8 | 136 | if (tmp == '\n' || tmp == '\r') { |
alexhrao | 1:0620ba35d2e8 | 137 | break; |
alexhrao | 1:0620ba35d2e8 | 138 | } |
alexhrao | 1:0620ba35d2e8 | 139 | buf[ind++] = tmp; |
alexhrao | 1:0620ba35d2e8 | 140 | Thread::wait(0.01); |
alexhrao | 1:0620ba35d2e8 | 141 | } |
alexhrao | 1:0620ba35d2e8 | 142 | buf[ind] = '\0'; |
alexhrao | 1:0620ba35d2e8 | 143 | // read command and respond |
alexhrao | 1:0620ba35d2e8 | 144 | if (strcmp(buf, "reset") == 0) { |
alexhrao | 1:0620ba35d2e8 | 145 | dev.printf("Are you sure? y/[n]\n"); |
alexhrao | 1:0620ba35d2e8 | 146 | } |
alexhrao | 1:0620ba35d2e8 | 147 | buf[0] = '\0'; |
alexhrao | 1:0620ba35d2e8 | 148 | ind = 0; |
alexhrao | 1:0620ba35d2e8 | 149 | //if (strcmp(buf, "reset") != 0) { |
alexhrao | 1:0620ba35d2e8 | 150 | Thread::wait(0.01); |
alexhrao | 1:0620ba35d2e8 | 151 | } |
alexhrao | 2:f7d19812bdc5 | 152 | } |
alexhrao | 0:4ffa136585a2 | 153 | |
alexhrao | 0:4ffa136585a2 | 154 | int main() { |
alexhrao | 1:0620ba35d2e8 | 155 | // Set up bluetooth |
alexhrao | 1:0620ba35d2e8 | 156 | dev.baud(9600); |
alexhrao | 1:0620ba35d2e8 | 157 | pc.baud(9600); |
alexhrao | 2:f7d19812bdc5 | 158 | |
alexhrao | 1:0620ba35d2e8 | 159 | // Tell user we're initializing... |
alexhrao | 1:0620ba35d2e8 | 160 | lcd_lock.lock(); |
alexhrao | 1:0620ba35d2e8 | 161 | uLCD.cls(); |
alexhrao | 1:0620ba35d2e8 | 162 | uLCD.text_height(2); |
alexhrao | 1:0620ba35d2e8 | 163 | uLCD.text_string("PLEASE WAIT", 0, 2, FONT_7X8, WHITE); |
alexhrao | 1:0620ba35d2e8 | 164 | lcd_lock.unlock(); |
alexhrao | 2:f7d19812bdc5 | 165 | |
alexhrao | 1:0620ba35d2e8 | 166 | // Need to get wifi settings. If we don't have local file, then ask! |
alexhrao | 1:0620ba35d2e8 | 167 | FILE* fid = NULL;//fopen("/local/settings.txt", "r"); |
alexhrao | 1:0620ba35d2e8 | 168 | char ssid[256]; |
alexhrao | 1:0620ba35d2e8 | 169 | char pass[256]; |
alexhrao | 2:f7d19812bdc5 | 170 | char api_key[256]; |
alexhrao | 3:7bf41989ff8f | 171 | |
alexhrao | 2:f7d19812bdc5 | 172 | if (true) { |
alexhrao | 1:0620ba35d2e8 | 173 | |
alexhrao | 2:f7d19812bdc5 | 174 | } else if (fid != NULL) { |
alexhrao | 2:f7d19812bdc5 | 175 | // Read WiFi Settings |
alexhrao | 2:f7d19812bdc5 | 176 | char settings_buf[1024]; |
alexhrao | 2:f7d19812bdc5 | 177 | // Guaranteed to be 256, 256, 512 AT MOST + two new lines |
alexhrao | 2:f7d19812bdc5 | 178 | // |
alexhrao | 2:f7d19812bdc5 | 179 | fgets(settings_buf, 1024, fid); |
alexhrao | 2:f7d19812bdc5 | 180 | // find \n |
alexhrao | 2:f7d19812bdc5 | 181 | int settings_ind = 0; |
alexhrao | 2:f7d19812bdc5 | 182 | int counter = 0; |
alexhrao | 2:f7d19812bdc5 | 183 | while (settings_buf[counter] != '\n') { |
alexhrao | 2:f7d19812bdc5 | 184 | ssid[settings_ind++] = settings_buf[counter++]; |
alexhrao | 2:f7d19812bdc5 | 185 | } |
alexhrao | 2:f7d19812bdc5 | 186 | ssid[settings_ind] = '\0'; |
alexhrao | 2:f7d19812bdc5 | 187 | settings_ind = 0; |
alexhrao | 2:f7d19812bdc5 | 188 | counter++; |
alexhrao | 2:f7d19812bdc5 | 189 | while (settings_buf[counter] != '\n') { |
alexhrao | 2:f7d19812bdc5 | 190 | pass[settings_ind++] = settings_buf[counter++]; |
alexhrao | 2:f7d19812bdc5 | 191 | } |
alexhrao | 2:f7d19812bdc5 | 192 | pass[settings_ind] = '\0'; |
alexhrao | 2:f7d19812bdc5 | 193 | settings_ind = 0; |
alexhrao | 2:f7d19812bdc5 | 194 | counter++; |
alexhrao | 2:f7d19812bdc5 | 195 | while (settings_buf[counter] != '\n') { |
alexhrao | 2:f7d19812bdc5 | 196 | api_key[settings_ind++] = settings_buf[counter++]; |
alexhrao | 2:f7d19812bdc5 | 197 | } |
alexhrao | 2:f7d19812bdc5 | 198 | api_key[settings_ind] = '\0'; |
alexhrao | 2:f7d19812bdc5 | 199 | fclose(fid); |
alexhrao | 1:0620ba35d2e8 | 200 | } else { |
alexhrao | 1:0620ba35d2e8 | 201 | lcd_lock.lock(); |
alexhrao | 1:0620ba35d2e8 | 202 | uLCD.cls(); |
alexhrao | 1:0620ba35d2e8 | 203 | uLCD.text_height(2); |
alexhrao | 1:0620ba35d2e8 | 204 | uLCD.text_width(2); |
alexhrao | 1:0620ba35d2e8 | 205 | uLCD.text_string("SEE", 0, 2, FONT_7X8, RED); |
alexhrao | 1:0620ba35d2e8 | 206 | uLCD.text_string("DEVICE", 0, 5, FONT_7X8, RED); |
alexhrao | 1:0620ba35d2e8 | 207 | lcd_lock.unlock(); |
alexhrao | 2:f7d19812bdc5 | 208 | |
alexhrao | 1:0620ba35d2e8 | 209 | // Ask! |
alexhrao | 1:0620ba35d2e8 | 210 | dev.printf("Please provide the name of a WiFi Network\n"); |
alexhrao | 2:f7d19812bdc5 | 211 | |
alexhrao | 1:0620ba35d2e8 | 212 | // Wait for them to respond |
alexhrao | 1:0620ba35d2e8 | 213 | while (!dev.readable()) { |
alexhrao | 1:0620ba35d2e8 | 214 | wait(0.001); |
alexhrao | 1:0620ba35d2e8 | 215 | } |
alexhrao | 1:0620ba35d2e8 | 216 | int ind = 0; |
alexhrao | 2:f7d19812bdc5 | 217 | |
alexhrao | 1:0620ba35d2e8 | 218 | // Read response |
alexhrao | 1:0620ba35d2e8 | 219 | while (ind < 255) { |
alexhrao | 1:0620ba35d2e8 | 220 | char tmp = dev.getc(); |
alexhrao | 1:0620ba35d2e8 | 221 | if (tmp == '\n' || tmp == '\r') { |
alexhrao | 1:0620ba35d2e8 | 222 | break; |
alexhrao | 1:0620ba35d2e8 | 223 | } |
alexhrao | 1:0620ba35d2e8 | 224 | ssid[ind++] = tmp; |
alexhrao | 1:0620ba35d2e8 | 225 | wait(0.01); |
alexhrao | 1:0620ba35d2e8 | 226 | } |
alexhrao | 1:0620ba35d2e8 | 227 | ssid[ind] = '\0'; |
alexhrao | 1:0620ba35d2e8 | 228 | |
alexhrao | 1:0620ba35d2e8 | 229 | // flush device |
alexhrao | 1:0620ba35d2e8 | 230 | while (dev.readable()) { |
alexhrao | 1:0620ba35d2e8 | 231 | dev.getc(); |
alexhrao | 1:0620ba35d2e8 | 232 | wait(0.01); |
alexhrao | 1:0620ba35d2e8 | 233 | } |
alexhrao | 1:0620ba35d2e8 | 234 | |
alexhrao | 2:f7d19812bdc5 | 235 | // Get the password |
alexhrao | 1:0620ba35d2e8 | 236 | dev.printf("Please provide the password\n"); |
alexhrao | 1:0620ba35d2e8 | 237 | while (!dev.readable()) { |
alexhrao | 1:0620ba35d2e8 | 238 | wait(0.001); |
alexhrao | 1:0620ba35d2e8 | 239 | } |
alexhrao | 1:0620ba35d2e8 | 240 | ind = 0; |
alexhrao | 1:0620ba35d2e8 | 241 | while (ind < 255) { |
alexhrao | 1:0620ba35d2e8 | 242 | char tmp = dev.getc(); |
alexhrao | 1:0620ba35d2e8 | 243 | if (tmp == '\n' || tmp == '\r') { |
alexhrao | 1:0620ba35d2e8 | 244 | break; |
alexhrao | 1:0620ba35d2e8 | 245 | } |
alexhrao | 1:0620ba35d2e8 | 246 | pass[ind++] = tmp; |
alexhrao | 1:0620ba35d2e8 | 247 | wait(0.01); |
alexhrao | 1:0620ba35d2e8 | 248 | } |
alexhrao | 1:0620ba35d2e8 | 249 | pass[ind] = '\0'; |
alexhrao | 2:f7d19812bdc5 | 250 | |
alexhrao | 2:f7d19812bdc5 | 251 | // Get the API key |
alexhrao | 2:f7d19812bdc5 | 252 | dev.printf("Please provide the API key\n"); |
alexhrao | 2:f7d19812bdc5 | 253 | while (!dev.readable()) { |
alexhrao | 2:f7d19812bdc5 | 254 | wait(0.001); |
alexhrao | 2:f7d19812bdc5 | 255 | } |
alexhrao | 2:f7d19812bdc5 | 256 | ind = 0; |
alexhrao | 2:f7d19812bdc5 | 257 | while (ind < 255) { |
alexhrao | 2:f7d19812bdc5 | 258 | char tmp = dev.getc(); |
alexhrao | 2:f7d19812bdc5 | 259 | if (tmp == '\n' || tmp == '\r') { |
alexhrao | 2:f7d19812bdc5 | 260 | break; |
alexhrao | 2:f7d19812bdc5 | 261 | } |
alexhrao | 2:f7d19812bdc5 | 262 | api_key[ind++] = tmp; |
alexhrao | 2:f7d19812bdc5 | 263 | wait(0.01); |
alexhrao | 2:f7d19812bdc5 | 264 | } |
alexhrao | 2:f7d19812bdc5 | 265 | api_key[ind] = '\0'; |
alexhrao | 1:0620ba35d2e8 | 266 | // Because this is a simple proof of concept, we store the password in |
alexhrao | 1:0620ba35d2e8 | 267 | // plaintext. It should be noted, however, that you **should never do |
alexhrao | 1:0620ba35d2e8 | 268 | // this in "real life"** |
alexhrao | 1:0620ba35d2e8 | 269 | //fid = fopen("/local/settings.txt", "w"); |
alexhrao | 2:f7d19812bdc5 | 270 | //fprintf(fid, "%s\n%s\n%s\n", ssid, pass, api_key); |
alexhrao | 1:0620ba35d2e8 | 271 | //fclose(fid); |
alexhrao | 1:0620ba35d2e8 | 272 | } |
alexhrao | 3:7bf41989ff8f | 273 | char* tmp = "af9319bf6435ddd9bb640f763ff64d34"; |
alexhrao | 3:7bf41989ff8f | 274 | for (int i = 0; i < strlen(tmp); i++) { |
alexhrao | 3:7bf41989ff8f | 275 | api_key[i] = tmp[i]; |
alexhrao | 3:7bf41989ff8f | 276 | } |
alexhrao | 1:0620ba35d2e8 | 277 | bool res = wifi.init(); |
alexhrao | 1:0620ba35d2e8 | 278 | //dev.printf("Reset: %d\n", res); |
alexhrao | 1:0620ba35d2e8 | 279 | // Set up the WiFi Access Point |
alexhrao | 1:0620ba35d2e8 | 280 | dev.printf("Connecting to WiFi %s with Password %s\n", ssid, pass); |
alexhrao | 1:0620ba35d2e8 | 281 | res = wifi.connect("Alex's iPhone", "mbedlookhere"); |
alexhrao | 2:f7d19812bdc5 | 282 | if (!res) { |
alexhrao | 2:f7d19812bdc5 | 283 | dev.printf("Connection Failed... Resetting Device\n"); |
alexhrao | 2:f7d19812bdc5 | 284 | err_led = 1; |
alexhrao | 2:f7d19812bdc5 | 285 | mbed_reset(); |
alexhrao | 2:f7d19812bdc5 | 286 | } |
alexhrao | 2:f7d19812bdc5 | 287 | dev.printf("Connected with IP Address: %s\n", wifi.getIPAddress()); |
alexhrao | 2:f7d19812bdc5 | 288 | |
alexhrao | 2:f7d19812bdc5 | 289 | // Get the time & location |
alexhrao | 3:7bf41989ff8f | 290 | dev.printf("Getting the current location...\n"); |
alexhrao | 3:7bf41989ff8f | 291 | TCPSocketConnection tcp; |
alexhrao | 3:7bf41989ff8f | 292 | tcp.connect("api.ipstack.com", 80); |
alexhrao | 3:7bf41989ff8f | 293 | |
alexhrao | 3:7bf41989ff8f | 294 | char tcp_cmd[256]; |
alexhrao | 3:7bf41989ff8f | 295 | sprintf(tcp_cmd, |
alexhrao | 3:7bf41989ff8f | 296 | "GET /check?access_key=af9319bf6435ddd9bb640f763ff64d34 HTTP/1.1\r\nHost: api.ipstack.com\r\n\r\n"); |
alexhrao | 3:7bf41989ff8f | 297 | tcp.send_all(tcp_cmd, strlen(tcp_cmd)); |
alexhrao | 3:7bf41989ff8f | 298 | |
alexhrao | 3:7bf41989ff8f | 299 | wait(10); |
alexhrao | 3:7bf41989ff8f | 300 | |
alexhrao | 3:7bf41989ff8f | 301 | char buffer[BUF_SIZE]; |
alexhrao | 3:7bf41989ff8f | 302 | int read_len = wifi.recv(buffer, BUF_SIZE - 1, 0); |
alexhrao | 3:7bf41989ff8f | 303 | buffer[read_len] = '\0'; |
alexhrao | 3:7bf41989ff8f | 304 | |
alexhrao | 3:7bf41989ff8f | 305 | MbedJSONValue parser; |
alexhrao | 3:7bf41989ff8f | 306 | parse(parser, buffer); |
alexhrao | 3:7bf41989ff8f | 307 | // for now, just print... |
alexhrao | 2:f7d19812bdc5 | 308 | |
alexhrao | 3:7bf41989ff8f | 309 | latitude = parser["latitude"].get<double>(); |
alexhrao | 3:7bf41989ff8f | 310 | longitude = parser["longitude"].get<double>(); |
alexhrao | 3:7bf41989ff8f | 311 | |
alexhrao | 3:7bf41989ff8f | 312 | /* |
alexhrao | 3:7bf41989ff8f | 313 | TCPSocketConnection weather_sck; |
alexhrao | 3:7bf41989ff8f | 314 | //http://api.openweathermap.org/data/2.5/weather?q=London,uk&APPID=6971e1ebfcc60f29c8dcc617c532b1b6 |
alexhrao | 3:7bf41989ff8f | 315 | //http://api.openweathermap.org/data/2.5/forecast?lat=33.7485&lon=-84.3871&appid=6971e1ebfcc60f29c8dcc617c532b1b6 |
alexhrao | 3:7bf41989ff8f | 316 | weather_sck.connect("api.openweathermap.org", 80); |
alexhrao | 3:7bf41989ff8f | 317 | sprintf(tcp_cmd, |
alexhrao | 3:7bf41989ff8f | 318 | "GET /data/2.5/weather?lat=%0.4f&lon=%0.4f&APPID=%s\r\nHost: api.openweathermap.org\r\n\r\n", |
alexhrao | 3:7bf41989ff8f | 319 | lat, lng, "6971e1ebfcc60f29c8dcc617c532b1b6"); |
alexhrao | 3:7bf41989ff8f | 320 | sprintf(weather_api_key, |
alexhrao | 3:7bf41989ff8f | 321 | "%s", "6971e1ebfcc60f29c8dcc617c532b1b6"); |
alexhrao | 3:7bf41989ff8f | 322 | weather_sck.send_all(tcp_cmd, strlen(tcp_cmd)); |
alexhrao | 3:7bf41989ff8f | 323 | wait(15); |
alexhrao | 3:7bf41989ff8f | 324 | int read_len = wifi.recv(buffer, BUF_SIZE - 1, 0); |
alexhrao | 3:7bf41989ff8f | 325 | buffer[read_len] = '\0'; |
alexhrao | 3:7bf41989ff8f | 326 | dev.printf(buffer); |
alexhrao | 3:7bf41989ff8f | 327 | */ |
alexhrao | 3:7bf41989ff8f | 328 | // dev.printf("Connection: %d\n", con_res); |
alexhrao | 3:7bf41989ff8f | 329 | //sprintf |
alexhrao | 3:7bf41989ff8f | 330 | //int con_res = weather_sck.connect("api.weather.gov", 443); |
alexhrao | 3:7bf41989ff8f | 331 | // dev.printf("Connection: %d\n", con_res); |
alexhrao | 3:7bf41989ff8f | 332 | //sprintf(tcp_cmd, |
alexhrao | 3:7bf41989ff8f | 333 | // "GET /points/%0.4f,%0.4f HTTP/1.1\r\nHost: api.weather.gov\r\n\r\n", |
alexhrao | 3:7bf41989ff8f | 334 | // lat, lng); |
alexhrao | 3:7bf41989ff8f | 335 | //weather_sck.send_all(tcp_cmd, strlen(tcp_cmd)); |
alexhrao | 3:7bf41989ff8f | 336 | //wait(5); |
alexhrao | 3:7bf41989ff8f | 337 | //wait(10); |
alexhrao | 3:7bf41989ff8f | 338 | //int read_len = wifi.recv(buffer, BUF_SIZE - 1, 0); |
alexhrao | 3:7bf41989ff8f | 339 | //buffer[read_len] = '\0'; |
alexhrao | 3:7bf41989ff8f | 340 | //dev.printf(buffer); |
alexhrao | 2:f7d19812bdc5 | 341 | set_time(1256729737); |
alexhrao | 2:f7d19812bdc5 | 342 | |
alexhrao | 2:f7d19812bdc5 | 343 | // Clear the LCD Screen first |
alexhrao | 2:f7d19812bdc5 | 344 | lcd_lock.lock(); |
alexhrao | 2:f7d19812bdc5 | 345 | uLCD.cls(); |
alexhrao | 2:f7d19812bdc5 | 346 | lcd_lock.unlock(); |
alexhrao | 2:f7d19812bdc5 | 347 | |
alexhrao | 2:f7d19812bdc5 | 348 | // Now that we know what time it is, set up our Time Thread |
alexhrao | 2:f7d19812bdc5 | 349 | time_thread.start(time_updater); |
alexhrao | 2:f7d19812bdc5 | 350 | |
alexhrao | 2:f7d19812bdc5 | 351 | // Make the request to get the forecast link |
alexhrao | 3:7bf41989ff8f | 352 | |
alexhrao | 1:0620ba35d2e8 | 353 | // Now, make a single request to nws and get the forecast link - we can |
alexhrao | 1:0620ba35d2e8 | 354 | // store this link for later! |
alexhrao | 1:0620ba35d2e8 | 355 | |
alexhrao | 1:0620ba35d2e8 | 356 | // Start up weather service! |
alexhrao | 3:7bf41989ff8f | 357 | //weather_thread.start(weather_updater); |
alexhrao | 1:0620ba35d2e8 | 358 | |
alexhrao | 1:0620ba35d2e8 | 359 | //weather_ticker.attach(&weather_tick, 900000.0f); |
alexhrao | 1:0620ba35d2e8 | 360 | // Listen on bluetooth. |
alexhrao | 1:0620ba35d2e8 | 361 | dev_thread.start(dev_recv); |
alexhrao | 3:7bf41989ff8f | 362 | dev.printf("Hello, World!\n"); |
alexhrao | 3:7bf41989ff8f | 363 | time_t prev_time = time(NULL); |
alexhrao | 1:0620ba35d2e8 | 364 | while(true) { |
alexhrao | 3:7bf41989ff8f | 365 | time_t curr_time = time(NULL); |
alexhrao | 3:7bf41989ff8f | 366 | // if it's been an hour (divide by 3600 >= 60), pause and get weather: |
alexhrao | 3:7bf41989ff8f | 367 | if (((int)(curr_time - prev_time) / 3600) >= 60) { |
alexhrao | 3:7bf41989ff8f | 368 | //weather_updater(); |
alexhrao | 3:7bf41989ff8f | 369 | prev_time = curr_time; |
alexhrao | 3:7bf41989ff8f | 370 | } |
alexhrao | 1:0620ba35d2e8 | 371 | err_led = !err_led; |
alexhrao | 1:0620ba35d2e8 | 372 | //dev.printf("Connection Status: %d\n", wifi.is_connected()); |
alexhrao | 1:0620ba35d2e8 | 373 | wait(0.5); |
alexhrao | 0:4ffa136585a2 | 374 | } |
alexhrao | 0:4ffa136585a2 | 375 | } |