Fork from Alex

Dependencies:   mbed MbedJSONValue mbed-rtos 4DGL-uLCD-SE ESP8266NodeMCUInterface

Revision:
1:0620ba35d2e8
Parent:
0:4ffa136585a2
Child:
2:f7d19812bdc5
diff -r 4ffa136585a2 -r 0620ba35d2e8 main.cpp
--- a/main.cpp	Mon Mar 25 23:19:58 2019 +0000
+++ b/main.cpp	Fri Mar 29 13:12:49 2019 +0000
@@ -1,12 +1,229 @@
 #include "mbed.h"
+#include "uLCD_4DGL.h"
+#include "ESP8266Interface.h"
+#include "TCPSocketConnection.h"
+#include "rtos.h"
+
+// We need this for being able to reset the MBED (similar to watch dogs)
+extern "C" void mbed_reset();
+
+// LCD Screen
+uLCD_4DGL uLCD(p9, p10, p11);
+Mutex lcd_lock;
+
+// File System
+LocalFileSystem fs("local");
+
+// Bluetooth
+RawSerial pc(USBTX, USBRX);
+RawSerial dev(p28,p27);
+Thread dev_thread;
+
+// Error LED
+DigitalOut err_led(LED1);
+
+// WiFi
+ESP8266Interface wifi(p13, p14, p15, 9600, 10000);
+
+// Time
+Thread time_thread;
+
+// Weather
+Thread weather_thread;
+char* forecast_link;
 
-DigitalOut myled(LED1);
+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 = 6;
+    char ftime[max_time_len];
+    
+    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, max_time_len, "%H:%M", ltm); 
+            // Update time! Lock the lcd mutex
+            lcd_lock.lock();
+            uLCD.text_width(2);
+            uLCD.text_height(2);
+            uLCD.text_string(ftime, 0, 2, FONT_8X8, GREEN);
+            // Done updating - unlock!
+            lcd_lock.unlock();
+            min = ltm->tm_min;
+        }
+        // Wait 1 second
+        Thread::wait(1.0f);
+    }   
+}
+
+void weather_updater() {
+    // We can take as long as we want
+    while (true) {
+        // get the weather
+        // we'll always want to update the LCD - don't worry about the previous
+        // weather
+        int curr_temp = 0;
+        int high_temp = 0;
+        int low_temp = 0;
+        char buf[12];
+        sprintf(buf, "%d %d/%d", curr_temp, high_temp, low_temp);
+        // lock
+        lcd_lock.lock();
+        uLCD.text_width(2);
+        uLCD.text_height(2);
+        // include null!
+        uLCD.text_string(buf, 0, 5, FONT_7X8, WHITE);
+        // done! unlock
+        lcd_lock.unlock();
+        Thread::wait(3600);
+    }
+}
+
+void dev_recv() {
+    // Continually check if we have stuff...
+    char buf[1024];
+    int ind = 0;
+    while (true) {
+        while (true) {
+            // get stuff. If we encounter \r or \n, that's a complete command!
+            char tmp = dev.getc();
+            if (tmp == '\n' || tmp == '\r') {
+                break;
+            }
+            buf[ind++] = tmp;
+            Thread::wait(0.01);
+        }
+        buf[ind] = '\0';
+        // read command and respond
+        if (strcmp(buf, "reset") == 0) {
+            dev.printf("Are you sure? y/[n]\n");
+        }
+        buf[0] = '\0';
+        ind = 0;
+        //if (strcmp(buf, "reset") != 0) {
+        Thread::wait(0.01);
+    }
+}       
 
 int main() {
-    while(1) {
-        myled = 1;
-        wait(0.2);
-        myled = 0;
-        wait(0.2);
+    // Set up bluetooth
+    dev.baud(9600);
+    pc.baud(9600);
+    // Tell user we're initializing...
+    lcd_lock.lock();
+    uLCD.cls();
+    uLCD.text_height(2);
+    uLCD.text_string("PLEASE WAIT", 0, 2, FONT_7X8, WHITE);
+    lcd_lock.unlock();
+    // Need to get wifi settings. If we don't have local file, then ask!
+    FILE* fid = NULL;//fopen("/local/settings.txt", "r");
+    // TODO: Get username and password
+    char ssid[256];
+    char pass[256];
+    if (fid == NULL) {
+        
+        //fclose(fid);
+    } else {
+        lcd_lock.lock();
+        uLCD.cls();
+        uLCD.text_height(2);
+        uLCD.text_width(2);
+        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();
+            if (tmp == '\n' || tmp == '\r') {
+                break;
+            }
+            ssid[ind++] = tmp;
+            wait(0.01);
+        }
+        ssid[ind] = '\0';
+        
+        // flush device
+        while (dev.readable()) {
+            dev.getc();
+            wait(0.01);
+        }
+        
+        dev.printf("Please provide the password\n");
+        while (!dev.readable()) {
+            wait(0.001);
+        }
+        ind = 0;
+        while (ind < 255) {
+            char tmp = dev.getc();
+            if (tmp == '\n' || tmp == '\r') {
+                break;
+            }
+            pass[ind++] = tmp;
+            wait(0.01);
+        }
+        pass[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 
+        // this in "real life"**
+        //fid = fopen("/local/settings.txt", "w");
+        //fprintf(fid, "ssid: %s\npass: %s\n", ssid, pass);
+        //fclose(fid);
+    }
+    
+    bool res = wifi.init();
+    //dev.printf("Reset: %d\n", res);
+    // Set up the WiFi Access Point
+    dev.printf("Connecting to WiFi %s with Password %s\n", ssid, pass);
+    res = wifi.connect("Alex's iPhone", "mbedlookhere");
+    //if (!res) {
+    //    dev.printf("Connection Failed... Resetting Device\n");
+        // mbed_reset();
+    //}
+    dev.printf("Is Connected: %d\n", wifi.is_connected());
+    dev.printf("IP Address: %s\n", wifi.getIPAddress());
+    TCPSocketConnection tcp;
+    int tcp_res = tcp.connect("13.58.105.158", 80);
+    dev.printf("Connection: %d\n", tcp_res);
+    // Where are we & What time is it?
+    // Create the TCP connection, request from ipstack. Get the request,
+    // and store the current time (FORMAT?)
+    set_time(1256729737);
+    // Now that we know what time it is, set up our Time Thread
+    time_thread.start(time_updater);
+    // Now, make a single request to nws and get the forecast link - we can 
+    // store this link for later!
+    lcd_lock.lock();
+    uLCD.cls();
+    lcd_lock.unlock();
+    
+    // Start up weather service!
+    weather_thread.start(weather_updater);
+    
+    //weather_ticker.attach(&weather_tick, 900000.0f);
+    // Listen on bluetooth.
+    dev_thread.start(dev_recv);
+    while(true) {
+        err_led = !err_led;
+        //dev.printf("Connection Status: %d\n", wifi.is_connected());
+        wait(0.5);
     }
 }