Fork from Alex
Dependencies: mbed MbedJSONValue mbed-rtos 4DGL-uLCD-SE ESP8266NodeMCUInterface
Diff: main.cpp
- Revision:
- 8:d323c6406b47
- Parent:
- 6:ec7829f7cd38
- Child:
- 9:299eb69af04e
diff -r fbbd416151ff -r d323c6406b47 main.cpp --- a/main.cpp Mon Apr 01 16:56:49 2019 +0000 +++ b/main.cpp Mon Apr 01 17:00:17 2019 +0000 @@ -42,29 +42,30 @@ char time_api_key[256]; char weather_api_key[256]; -void time_updater() { +void time_updater() +{ // We're not an interrupt, so take as much time as we need. Infinite loop // but wait 1 second between each loop struct tm* ltm; time_t now; - + now = time(NULL); ltm = localtime(&now); - + // Buffer for time string. Max length is 23:59 + \0 int max_time_len = 8; char ftime[max_time_len]; ftime[0] = ' '; ftime[1] = ' '; int min = -1; - + while (true) { // if the minute has changed, update. now = time(NULL); ltm = localtime(&now); if(ltm->tm_min != min) { // Get the new time - strftime(ftime + 2, max_time_len, "%H:%M", ltm); + strftime(ftime + 2, max_time_len, "%H:%M", ltm); // Update time! Lock the lcd mutex lcd_lock.lock(); uLCD.text_width(2); @@ -76,10 +77,11 @@ } // Wait 1 second Thread::wait(1.0f); - } + } } -void dev_recv() { +void dev_recv() +{ // Continually check if we have stuff... char buf[1024]; int ind = 0; @@ -105,15 +107,17 @@ } } -int kelvin2farenheit(int temp) { - return (int)((((temp - 273.15f) * 9.0f) / 5.0f) + 32.0f); +int kelvin2farenheit(int temp) +{ + return (int)((((temp - 273.15f) * 9.0f) / 5.0f) + 32.0f); } -void clock_init() { +void clock_init() +{ // Set up bluetooth dev.baud(9600); pc.baud(9600); - + // Tell user we're initializing... lcd_lock.lock(); uLCD.cls(); @@ -122,15 +126,15 @@ uLCD.text_string("PLEASE", 0, 2, FONT_7X8, WHITE); uLCD.text_string("WAIT", 0, 5, FONT_7X8, WHITE); lcd_lock.unlock(); - + // Need to get wifi settings. If we don't have local file, then ask! FILE* fid = fopen("/local/settings.txt", "r"); - + if (fid != NULL) { // Read WiFi Settings char settings_buf[1024]; // Guaranteed to be 5 lines - // + // fgets(settings_buf, 1024, fid); // find \n int settings_ind = 0; @@ -176,16 +180,16 @@ uLCD.text_string("SEE", 0, 2, FONT_7X8, RED); uLCD.text_string("DEVICE", 0, 5, FONT_7X8, RED); lcd_lock.unlock(); - + // Ask! dev.printf("Please provide the name of a WiFi Network\n"); - + // Wait for them to respond while (!dev.readable()) { wait(0.001); } int ind = 0; - + // Read response while (ind < 255) { char tmp = dev.getc(); @@ -196,13 +200,13 @@ wait(0.01); } ssid[ind] = '\0'; - + // flush device while (dev.readable()) { dev.getc(); wait(0.01); } - + // Get the password dev.printf("Please provide the password\n"); while (!dev.readable()) { @@ -218,7 +222,7 @@ wait(0.01); } pass[ind] = '\0'; - + // Get the API key dev.printf("Please provide the IP Stack API key\n"); while (!dev.readable()) { @@ -235,7 +239,7 @@ } ip_api_key[ind] = '\0'; - + dev.printf("Please provide the TimeZoneDB API key\n"); while (!dev.readable()) { wait(0.001); @@ -250,7 +254,7 @@ wait(0.01); } time_api_key[ind] = '\0'; - + dev.printf("Please provide the OpenWeather API key\n"); while (!dev.readable()) { wait(0.001); @@ -266,10 +270,10 @@ } weather_api_key[ind] = '\0'; - - - // Because this is a simple proof of concept, we store the password in - // plaintext. It should be noted, however, that you **should never do + + + // Because this is a simple proof of concept, we store the password in + // plaintext. It should be noted, however, that you **should never do // this in "real life"** fid = fopen("/local/settings.txt", "w"); fprintf(fid, "%s\n%s\n%s\n%s\n%s\n", ssid, pass, ip_api_key, time_api_key, weather_api_key); @@ -287,18 +291,18 @@ // Set up the WiFi Access Point dev.printf("Connecting to WiFi %s with Password %s\n", ssid, pass); - + res = wifi.connect(ssid, pass); if (!res) { dev.printf("Connection Failed... Resetting Device\n"); err_led = 1; mbed_reset(); } - + dev.printf("Connected with IP Address: %s\n", wifi.getIPAddress()); - + /** API REQUESTS **/ - + int header_ind = 0; int footer_ind = 0; int read_len = 0; @@ -307,25 +311,25 @@ TCPSocketConnection tcp; tcp.connect("api.ipstack.com", 80); - - sprintf(cmd, - "GET /check?access_key=%s HTTP/1.1\r\nHost: api.ipstack.com\r\n\r\n", - ip_api_key); + + sprintf(cmd, + "GET /check?access_key=%s HTTP/1.1\r\nHost: api.ipstack.com\r\n\r\n", + ip_api_key); tcp.send_all(cmd, strlen(cmd)); - + wait(5); - + read_len = wifi.recv(buffer, BUF_SIZE - 1, 0); buffer[read_len] = '\0'; - + // Cleanup - + while (header_ind < read_len) { // if we are \r, look ahead to see \n\r\n: if(buffer[header_ind] == '\r' && - buffer[header_ind+1] == '\n' && - buffer[header_ind+2] == '\r' && - buffer[header_ind+3] == '\n') { + buffer[header_ind+1] == '\n' && + buffer[header_ind+2] == '\r' && + buffer[header_ind+3] == '\n') { // Increment header_ind, look for JSON // Now just look for { header_ind += 4; @@ -349,7 +353,7 @@ MbedJSONValue parser; parse(parser, buffer + header_ind); - + latitude = parser["latitude"].get<double>(); longitude = parser["longitude"].get<double>(); @@ -359,10 +363,10 @@ time_tcp.connect("api.timezonedb.com", 80); sprintf(cmd, - "GET /v2.1/get-time-zone?key=%s&format=json&by=position&lat=%0.4f&lng=%0.4f HTTP/1.1\r\nHost: api.timezonedb.com\r\n\r\n", - time_api_key, - latitude, - longitude); + "GET /v2.1/get-time-zone?key=%s&format=json&by=position&lat=%0.4f&lng=%0.4f HTTP/1.1\r\nHost: api.timezonedb.com\r\n\r\n", + time_api_key, + latitude, + longitude); time_tcp.send_all(cmd, strlen(cmd)); @@ -370,18 +374,18 @@ read_len = wifi.recv(buffer, BUF_SIZE - 1, 0); buffer[read_len] = '\0'; - + // Cleanup - + // Clean up front // Read through headers (\r\n\r\n) header_ind = 0; while (header_ind < read_len) { // if we are \r, look ahead to see \n\r\n: if(buffer[header_ind] == '\r' && - buffer[header_ind+1] == '\n' && - buffer[header_ind+2] == '\r' && - buffer[header_ind+3] == '\n') { + buffer[header_ind+1] == '\n' && + buffer[header_ind+2] == '\r' && + buffer[header_ind+3] == '\n') { // Increment header_ind, look for JSON // Now just look for { header_ind += 4; @@ -403,7 +407,7 @@ } } buffer[footer_ind + 1] = '\0'; - + MbedJSONValue time_parser; parse(time_parser, buffer + header_ind); @@ -412,21 +416,21 @@ set_time(time_parser["timestamp"].get<int>() + 5 + 3); // Now that we know what time it is, set up our Time Thread time_thread.start(time_updater); - + TCPSocketConnection forecast_sck; forecast_sck.connect("api.openweathermap.org", 80); sprintf(cmd, - "GET /data/2.5/weather?lat=%0.4f&lon=%0.4f&APPID=%s&cnt=8\r\nHost: api.openweathermap.org\r\n\r\n", - latitude, longitude, weather_api_key); + "GET /data/2.5/weather?lat=%0.4f&lon=%0.4f&APPID=%s&cnt=8\r\nHost: api.openweathermap.org\r\n\r\n", + latitude, longitude, weather_api_key); forecast_sck.send_all(cmd, strlen(cmd)); wait(5); read_len wifi.recv(buffer, BUF_SIZE - 1, 0); buffer[read_len] = '\0'; - + // We don't have enough memory for another parser (why?), so just // look for the word "temp" 0 hopefully won't have a city named "temp"! char* ind = strstr(buffer, "temp"); @@ -453,7 +457,7 @@ temp = kelvin2farenheit(temp); char temp_buf[12]; sprintf(temp_buf, " %dF", temp); - + lcd_lock.lock(); uLCD.text_width(2); uLCD.text_height(2); @@ -466,8 +470,8 @@ // Wait for 60 seconds if ((prev_time + 60) < curr_time) { sprintf(cmd, - "GET /data/2.5/weather?lat=%0.4f&lon=%0.4f&APPID=%s\r\nHost: api.openweathermap.org\r\n\r\n", - latitude, longitude, weather_api_key); + "GET /data/2.5/weather?lat=%0.4f&lon=%0.4f&APPID=%s\r\nHost: api.openweathermap.org\r\n\r\n", + latitude, longitude, weather_api_key); forecast_sck.connect("api.openweathermap.org", 80); wait(10); forecast_sck.send_all(cmd, strlen(cmd)); @@ -509,6 +513,7 @@ } } -int main() { +int main() +{ clock_init(); }