Fork from Alex

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

Committer:
alexhrao
Date:
Fri Mar 29 13:12:49 2019 +0000
Revision:
1:0620ba35d2e8
Parent:
0:4ffa136585a2
Child:
2:f7d19812bdc5
Get TCP Connection to work

Who changed what in which revision?

UserRevisionLine numberNew 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 1:0620ba35d2e8 6
alexhrao 1:0620ba35d2e8 7 // We need this for being able to reset the MBED (similar to watch dogs)
alexhrao 1:0620ba35d2e8 8 extern "C" void mbed_reset();
alexhrao 1:0620ba35d2e8 9
alexhrao 1:0620ba35d2e8 10 // LCD Screen
alexhrao 1:0620ba35d2e8 11 uLCD_4DGL uLCD(p9, p10, p11);
alexhrao 1:0620ba35d2e8 12 Mutex lcd_lock;
alexhrao 1:0620ba35d2e8 13
alexhrao 1:0620ba35d2e8 14 // File System
alexhrao 1:0620ba35d2e8 15 LocalFileSystem fs("local");
alexhrao 1:0620ba35d2e8 16
alexhrao 1:0620ba35d2e8 17 // Bluetooth
alexhrao 1:0620ba35d2e8 18 RawSerial pc(USBTX, USBRX);
alexhrao 1:0620ba35d2e8 19 RawSerial dev(p28,p27);
alexhrao 1:0620ba35d2e8 20 Thread dev_thread;
alexhrao 1:0620ba35d2e8 21
alexhrao 1:0620ba35d2e8 22 // Error LED
alexhrao 1:0620ba35d2e8 23 DigitalOut err_led(LED1);
alexhrao 1:0620ba35d2e8 24
alexhrao 1:0620ba35d2e8 25 // WiFi
alexhrao 1:0620ba35d2e8 26 ESP8266Interface wifi(p13, p14, p15, 9600, 10000);
alexhrao 1:0620ba35d2e8 27
alexhrao 1:0620ba35d2e8 28 // Time
alexhrao 1:0620ba35d2e8 29 Thread time_thread;
alexhrao 1:0620ba35d2e8 30
alexhrao 1:0620ba35d2e8 31 // Weather
alexhrao 1:0620ba35d2e8 32 Thread weather_thread;
alexhrao 1:0620ba35d2e8 33 char* forecast_link;
alexhrao 0:4ffa136585a2 34
alexhrao 1:0620ba35d2e8 35 void time_updater() {
alexhrao 1:0620ba35d2e8 36 // We're not an interrupt, so take as much time as we need. Infinite loop
alexhrao 1:0620ba35d2e8 37 // but wait 1 second between each loop
alexhrao 1:0620ba35d2e8 38 struct tm* ltm;
alexhrao 1:0620ba35d2e8 39 time_t now;
alexhrao 1:0620ba35d2e8 40
alexhrao 1:0620ba35d2e8 41 now = time(NULL);
alexhrao 1:0620ba35d2e8 42 ltm = localtime(&now);
alexhrao 1:0620ba35d2e8 43
alexhrao 1:0620ba35d2e8 44 // Buffer for time string. Max length is 23:59 + \0
alexhrao 1:0620ba35d2e8 45 int max_time_len = 6;
alexhrao 1:0620ba35d2e8 46 char ftime[max_time_len];
alexhrao 1:0620ba35d2e8 47
alexhrao 1:0620ba35d2e8 48 int min = -1;
alexhrao 1:0620ba35d2e8 49
alexhrao 1:0620ba35d2e8 50 while (true) {
alexhrao 1:0620ba35d2e8 51 // if the minute has changed, update.
alexhrao 1:0620ba35d2e8 52 now = time(NULL);
alexhrao 1:0620ba35d2e8 53 ltm = localtime(&now);
alexhrao 1:0620ba35d2e8 54 if(ltm->tm_min != min) {
alexhrao 1:0620ba35d2e8 55 // Get the new time
alexhrao 1:0620ba35d2e8 56 strftime(ftime, max_time_len, "%H:%M", ltm);
alexhrao 1:0620ba35d2e8 57 // Update time! Lock the lcd mutex
alexhrao 1:0620ba35d2e8 58 lcd_lock.lock();
alexhrao 1:0620ba35d2e8 59 uLCD.text_width(2);
alexhrao 1:0620ba35d2e8 60 uLCD.text_height(2);
alexhrao 1:0620ba35d2e8 61 uLCD.text_string(ftime, 0, 2, FONT_8X8, GREEN);
alexhrao 1:0620ba35d2e8 62 // Done updating - unlock!
alexhrao 1:0620ba35d2e8 63 lcd_lock.unlock();
alexhrao 1:0620ba35d2e8 64 min = ltm->tm_min;
alexhrao 1:0620ba35d2e8 65 }
alexhrao 1:0620ba35d2e8 66 // Wait 1 second
alexhrao 1:0620ba35d2e8 67 Thread::wait(1.0f);
alexhrao 1:0620ba35d2e8 68 }
alexhrao 1:0620ba35d2e8 69 }
alexhrao 1:0620ba35d2e8 70
alexhrao 1:0620ba35d2e8 71 void weather_updater() {
alexhrao 1:0620ba35d2e8 72 // We can take as long as we want
alexhrao 1:0620ba35d2e8 73 while (true) {
alexhrao 1:0620ba35d2e8 74 // get the weather
alexhrao 1:0620ba35d2e8 75 // we'll always want to update the LCD - don't worry about the previous
alexhrao 1:0620ba35d2e8 76 // weather
alexhrao 1:0620ba35d2e8 77 int curr_temp = 0;
alexhrao 1:0620ba35d2e8 78 int high_temp = 0;
alexhrao 1:0620ba35d2e8 79 int low_temp = 0;
alexhrao 1:0620ba35d2e8 80 char buf[12];
alexhrao 1:0620ba35d2e8 81 sprintf(buf, "%d %d/%d", curr_temp, high_temp, low_temp);
alexhrao 1:0620ba35d2e8 82 // lock
alexhrao 1:0620ba35d2e8 83 lcd_lock.lock();
alexhrao 1:0620ba35d2e8 84 uLCD.text_width(2);
alexhrao 1:0620ba35d2e8 85 uLCD.text_height(2);
alexhrao 1:0620ba35d2e8 86 // include null!
alexhrao 1:0620ba35d2e8 87 uLCD.text_string(buf, 0, 5, FONT_7X8, WHITE);
alexhrao 1:0620ba35d2e8 88 // done! unlock
alexhrao 1:0620ba35d2e8 89 lcd_lock.unlock();
alexhrao 1:0620ba35d2e8 90 Thread::wait(3600);
alexhrao 1:0620ba35d2e8 91 }
alexhrao 1:0620ba35d2e8 92 }
alexhrao 1:0620ba35d2e8 93
alexhrao 1:0620ba35d2e8 94 void dev_recv() {
alexhrao 1:0620ba35d2e8 95 // Continually check if we have stuff...
alexhrao 1:0620ba35d2e8 96 char buf[1024];
alexhrao 1:0620ba35d2e8 97 int ind = 0;
alexhrao 1:0620ba35d2e8 98 while (true) {
alexhrao 1:0620ba35d2e8 99 while (true) {
alexhrao 1:0620ba35d2e8 100 // get stuff. If we encounter \r or \n, that's a complete command!
alexhrao 1:0620ba35d2e8 101 char tmp = dev.getc();
alexhrao 1:0620ba35d2e8 102 if (tmp == '\n' || tmp == '\r') {
alexhrao 1:0620ba35d2e8 103 break;
alexhrao 1:0620ba35d2e8 104 }
alexhrao 1:0620ba35d2e8 105 buf[ind++] = tmp;
alexhrao 1:0620ba35d2e8 106 Thread::wait(0.01);
alexhrao 1:0620ba35d2e8 107 }
alexhrao 1:0620ba35d2e8 108 buf[ind] = '\0';
alexhrao 1:0620ba35d2e8 109 // read command and respond
alexhrao 1:0620ba35d2e8 110 if (strcmp(buf, "reset") == 0) {
alexhrao 1:0620ba35d2e8 111 dev.printf("Are you sure? y/[n]\n");
alexhrao 1:0620ba35d2e8 112 }
alexhrao 1:0620ba35d2e8 113 buf[0] = '\0';
alexhrao 1:0620ba35d2e8 114 ind = 0;
alexhrao 1:0620ba35d2e8 115 //if (strcmp(buf, "reset") != 0) {
alexhrao 1:0620ba35d2e8 116 Thread::wait(0.01);
alexhrao 1:0620ba35d2e8 117 }
alexhrao 1:0620ba35d2e8 118 }
alexhrao 0:4ffa136585a2 119
alexhrao 0:4ffa136585a2 120 int main() {
alexhrao 1:0620ba35d2e8 121 // Set up bluetooth
alexhrao 1:0620ba35d2e8 122 dev.baud(9600);
alexhrao 1:0620ba35d2e8 123 pc.baud(9600);
alexhrao 1:0620ba35d2e8 124 // Tell user we're initializing...
alexhrao 1:0620ba35d2e8 125 lcd_lock.lock();
alexhrao 1:0620ba35d2e8 126 uLCD.cls();
alexhrao 1:0620ba35d2e8 127 uLCD.text_height(2);
alexhrao 1:0620ba35d2e8 128 uLCD.text_string("PLEASE WAIT", 0, 2, FONT_7X8, WHITE);
alexhrao 1:0620ba35d2e8 129 lcd_lock.unlock();
alexhrao 1:0620ba35d2e8 130 // Need to get wifi settings. If we don't have local file, then ask!
alexhrao 1:0620ba35d2e8 131 FILE* fid = NULL;//fopen("/local/settings.txt", "r");
alexhrao 1:0620ba35d2e8 132 // TODO: Get username and password
alexhrao 1:0620ba35d2e8 133 char ssid[256];
alexhrao 1:0620ba35d2e8 134 char pass[256];
alexhrao 1:0620ba35d2e8 135 if (fid == NULL) {
alexhrao 1:0620ba35d2e8 136
alexhrao 1:0620ba35d2e8 137 //fclose(fid);
alexhrao 1:0620ba35d2e8 138 } else {
alexhrao 1:0620ba35d2e8 139 lcd_lock.lock();
alexhrao 1:0620ba35d2e8 140 uLCD.cls();
alexhrao 1:0620ba35d2e8 141 uLCD.text_height(2);
alexhrao 1:0620ba35d2e8 142 uLCD.text_width(2);
alexhrao 1:0620ba35d2e8 143 uLCD.text_string("SEE", 0, 2, FONT_7X8, RED);
alexhrao 1:0620ba35d2e8 144 uLCD.text_string("DEVICE", 0, 5, FONT_7X8, RED);
alexhrao 1:0620ba35d2e8 145 lcd_lock.unlock();
alexhrao 1:0620ba35d2e8 146 // Ask!
alexhrao 1:0620ba35d2e8 147 dev.printf("Please provide the name of a WiFi Network\n");
alexhrao 1:0620ba35d2e8 148 // Wait for them to respond
alexhrao 1:0620ba35d2e8 149 while (!dev.readable()) {
alexhrao 1:0620ba35d2e8 150 wait(0.001);
alexhrao 1:0620ba35d2e8 151 }
alexhrao 1:0620ba35d2e8 152 int ind = 0;
alexhrao 1:0620ba35d2e8 153 // Read response
alexhrao 1:0620ba35d2e8 154 while (ind < 255) {
alexhrao 1:0620ba35d2e8 155 char tmp = dev.getc();
alexhrao 1:0620ba35d2e8 156 if (tmp == '\n' || tmp == '\r') {
alexhrao 1:0620ba35d2e8 157 break;
alexhrao 1:0620ba35d2e8 158 }
alexhrao 1:0620ba35d2e8 159 ssid[ind++] = tmp;
alexhrao 1:0620ba35d2e8 160 wait(0.01);
alexhrao 1:0620ba35d2e8 161 }
alexhrao 1:0620ba35d2e8 162 ssid[ind] = '\0';
alexhrao 1:0620ba35d2e8 163
alexhrao 1:0620ba35d2e8 164 // flush device
alexhrao 1:0620ba35d2e8 165 while (dev.readable()) {
alexhrao 1:0620ba35d2e8 166 dev.getc();
alexhrao 1:0620ba35d2e8 167 wait(0.01);
alexhrao 1:0620ba35d2e8 168 }
alexhrao 1:0620ba35d2e8 169
alexhrao 1:0620ba35d2e8 170 dev.printf("Please provide the password\n");
alexhrao 1:0620ba35d2e8 171 while (!dev.readable()) {
alexhrao 1:0620ba35d2e8 172 wait(0.001);
alexhrao 1:0620ba35d2e8 173 }
alexhrao 1:0620ba35d2e8 174 ind = 0;
alexhrao 1:0620ba35d2e8 175 while (ind < 255) {
alexhrao 1:0620ba35d2e8 176 char tmp = dev.getc();
alexhrao 1:0620ba35d2e8 177 if (tmp == '\n' || tmp == '\r') {
alexhrao 1:0620ba35d2e8 178 break;
alexhrao 1:0620ba35d2e8 179 }
alexhrao 1:0620ba35d2e8 180 pass[ind++] = tmp;
alexhrao 1:0620ba35d2e8 181 wait(0.01);
alexhrao 1:0620ba35d2e8 182 }
alexhrao 1:0620ba35d2e8 183 pass[ind] = '\0';
alexhrao 1:0620ba35d2e8 184 // Because this is a simple proof of concept, we store the password in
alexhrao 1:0620ba35d2e8 185 // plaintext. It should be noted, however, that you **should never do
alexhrao 1:0620ba35d2e8 186 // this in "real life"**
alexhrao 1:0620ba35d2e8 187 //fid = fopen("/local/settings.txt", "w");
alexhrao 1:0620ba35d2e8 188 //fprintf(fid, "ssid: %s\npass: %s\n", ssid, pass);
alexhrao 1:0620ba35d2e8 189 //fclose(fid);
alexhrao 1:0620ba35d2e8 190 }
alexhrao 1:0620ba35d2e8 191
alexhrao 1:0620ba35d2e8 192 bool res = wifi.init();
alexhrao 1:0620ba35d2e8 193 //dev.printf("Reset: %d\n", res);
alexhrao 1:0620ba35d2e8 194 // Set up the WiFi Access Point
alexhrao 1:0620ba35d2e8 195 dev.printf("Connecting to WiFi %s with Password %s\n", ssid, pass);
alexhrao 1:0620ba35d2e8 196 res = wifi.connect("Alex's iPhone", "mbedlookhere");
alexhrao 1:0620ba35d2e8 197 //if (!res) {
alexhrao 1:0620ba35d2e8 198 // dev.printf("Connection Failed... Resetting Device\n");
alexhrao 1:0620ba35d2e8 199 // mbed_reset();
alexhrao 1:0620ba35d2e8 200 //}
alexhrao 1:0620ba35d2e8 201 dev.printf("Is Connected: %d\n", wifi.is_connected());
alexhrao 1:0620ba35d2e8 202 dev.printf("IP Address: %s\n", wifi.getIPAddress());
alexhrao 1:0620ba35d2e8 203 TCPSocketConnection tcp;
alexhrao 1:0620ba35d2e8 204 int tcp_res = tcp.connect("13.58.105.158", 80);
alexhrao 1:0620ba35d2e8 205 dev.printf("Connection: %d\n", tcp_res);
alexhrao 1:0620ba35d2e8 206 // Where are we & What time is it?
alexhrao 1:0620ba35d2e8 207 // Create the TCP connection, request from ipstack. Get the request,
alexhrao 1:0620ba35d2e8 208 // and store the current time (FORMAT?)
alexhrao 1:0620ba35d2e8 209 set_time(1256729737);
alexhrao 1:0620ba35d2e8 210 // Now that we know what time it is, set up our Time Thread
alexhrao 1:0620ba35d2e8 211 time_thread.start(time_updater);
alexhrao 1:0620ba35d2e8 212 // Now, make a single request to nws and get the forecast link - we can
alexhrao 1:0620ba35d2e8 213 // store this link for later!
alexhrao 1:0620ba35d2e8 214 lcd_lock.lock();
alexhrao 1:0620ba35d2e8 215 uLCD.cls();
alexhrao 1:0620ba35d2e8 216 lcd_lock.unlock();
alexhrao 1:0620ba35d2e8 217
alexhrao 1:0620ba35d2e8 218 // Start up weather service!
alexhrao 1:0620ba35d2e8 219 weather_thread.start(weather_updater);
alexhrao 1:0620ba35d2e8 220
alexhrao 1:0620ba35d2e8 221 //weather_ticker.attach(&weather_tick, 900000.0f);
alexhrao 1:0620ba35d2e8 222 // Listen on bluetooth.
alexhrao 1:0620ba35d2e8 223 dev_thread.start(dev_recv);
alexhrao 1:0620ba35d2e8 224 while(true) {
alexhrao 1:0620ba35d2e8 225 err_led = !err_led;
alexhrao 1:0620ba35d2e8 226 //dev.printf("Connection Status: %d\n", wifi.is_connected());
alexhrao 1:0620ba35d2e8 227 wait(0.5);
alexhrao 0:4ffa136585a2 228 }
alexhrao 0:4ffa136585a2 229 }