Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed MbedJSONValue mbed-rtos 4DGL-uLCD-SE ESP8266NodeMCUInterface
Revision 8:d323c6406b47, committed 2019-04-01
- Comitter:
- alexhrao
- Date:
- Mon Apr 01 17:00:17 2019 +0000
- Parent:
- 7:fbbd416151ff
- Child:
- 9:299eb69af04e
- Commit message:
- Update ESP8226 link
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- 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();
}