diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 7e85fe8a4..d0d0d9214 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -31,8 +31,8 @@ along with this program. If not, see . #include "graphics/images.h" #include "main.h" #include "mesh-pb-constants.h" -#include "utils.h" #include "meshwifi/meshwifi.h" +#include "utils.h" using namespace meshtastic; /** @todo remove */ @@ -715,7 +715,6 @@ void Screen::drawDebugInfoWiFiTrampoline(OLEDDisplay *display, OLEDDisplayUiStat screen->debugInfo.drawFrameWiFi(display, state, x, y); } - // restore our regular frame list void Screen::setFrames() { @@ -854,12 +853,17 @@ void DebugInfo::drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, i if (radioConfig.preferences.wifi_ap_mode) { display->drawString(x, y, String("WiFi - Software AP")); - } else if ( WiFi.status() != WL_CONNECTED ) { + } else if (WiFi.status() != WL_CONNECTED) { display->drawString(x, y, String("WiFi - Not Connected")); } else { display->drawString(x, y, String("WiFi - Connected")); + + display->drawString(x + SCREEN_WIDTH - display->getStringWidth("RSSI " + String(WiFi.RSSI())), y, + "RSSI " + String(WiFi.RSSI())); + } + if (radioConfig.preferences.wifi_ap_mode) { display->drawString(x, y + FONT_HEIGHT * 1, "IP " + String(WiFi.softAPIP().toString().c_str())); } else { @@ -868,7 +872,7 @@ void DebugInfo::drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, i display->drawString(x, y + FONT_HEIGHT * 2, "SSID " + String(wifiName)); display->drawString(x, y + FONT_HEIGHT * 3, "PWD " + String(wifiPsw)); - + /* Display a heartbeat pixel that blinks every time the frame is redrawn */ #ifdef SHOW_REDRAWS if (heartbeat) @@ -878,7 +882,6 @@ void DebugInfo::drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, i #endif } - void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { displayedNodeNum = 0; // Not currently showing a node pane @@ -889,29 +892,21 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat display->setTextAlignment(TEXT_ALIGN_LEFT); char batStr[20]; - if (powerStatus->getHasBattery()) - { + if (powerStatus->getHasBattery()) { int batV = powerStatus->getBatteryVoltageMv() / 1000; int batCv = (powerStatus->getBatteryVoltageMv() % 1000) / 10; - snprintf(batStr, sizeof(batStr), "B %01d.%02dV %3d%% %c%c", - batV, - batCv, - powerStatus->getBatteryChargePercent(), - powerStatus->getIsCharging() ? '+' : ' ', - powerStatus->getHasUSB() ? 'U' : ' '); + snprintf(batStr, sizeof(batStr), "B %01d.%02dV %3d%% %c%c", batV, batCv, powerStatus->getBatteryChargePercent(), + powerStatus->getIsCharging() ? '+' : ' ', powerStatus->getHasUSB() ? 'U' : ' '); // Line 1 display->drawString(x, y, batStr); - } - else - { + } else { // Line 1 display->drawString(x, y, String("USB")); - } + } - - //TODO: Display status of the BT radio + // TODO: Display status of the BT radio // display->drawString(x + SCREEN_WIDTH - display->getStringWidth("BT On"), y, "BT On"); // Line 2 @@ -925,20 +920,15 @@ void DebugInfo::drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *stat minutes %= 60; hours %= 24; - display->drawString(x, y + FONT_HEIGHT * 1, String(days) + "d " - + (hours < 10 ? "0" : "") + String(hours) + ":" - + (minutes < 10 ? "0" : "") + String(minutes) + ":" - + (seconds < 10 ? "0" : "") + String(seconds)); - display->drawString(x + SCREEN_WIDTH - display->getStringWidth("Mode " + String(channelSettings.modem_config)), y + FONT_HEIGHT * 1, "Mode " + String(channelSettings.modem_config)); - - // Line 3 - // TODO: Use this line for WiFi information. - // display->drawString(x + (SCREEN_WIDTH - (display->getStringWidth("WiFi: 192.168.0.100"))) / 2, y + FONT_HEIGHT * 2, "WiFi: 192.168.0.100"); + display->drawString(x, y + FONT_HEIGHT * 1, + String(days) + "d " + (hours < 10 ? "0" : "") + String(hours) + ":" + (minutes < 10 ? "0" : "") + + String(minutes) + ":" + (seconds < 10 ? "0" : "") + String(seconds)); + display->drawString(x + SCREEN_WIDTH - display->getStringWidth("Mode " + String(channelSettings.modem_config)), + y + FONT_HEIGHT * 1, "Mode " + String(channelSettings.modem_config)); // Line 4 drawGPScoordinates(display, x, y + FONT_HEIGHT * 3, gpsStatus); - /* Display a heartbeat pixel that blinks every time the frame is redrawn */ #ifdef SHOW_REDRAWS if (heartbeat) diff --git a/src/meshwifi/meshhttp.cpp b/src/meshwifi/meshhttp.cpp index c2f6ed342..6b3776730 100644 --- a/src/meshwifi/meshhttp.cpp +++ b/src/meshwifi/meshhttp.cpp @@ -8,6 +8,24 @@ WebServer webserver(80); +const uint16_t maxMessages = 50; + +struct message_t { + char sender[10]; + char message[250]; + int32_t gpsLat; + int32_t gpsLong; + uint32_t time; + bool fromMe; +}; + +struct messages_t +{ + message_t history[maxMessages]; // 900 positions to save up to 1200 seconds (15 minutes). uInt for each temerature sensor, Input and Setpoint. +}; + +messages_t messages_history; + String something = ""; String sender = ""; @@ -27,15 +45,19 @@ void handleWebResponse() void initWebServer() { webserver.onNotFound(handleNotFound); - // webserver.on("/", handleJSONChatHistory); - // webserver.on("/json/chat/history", handleJSONChatHistory); + webserver.on("/json/chat/send/channel", handleJSONChatHistory); + webserver.on("/json/chat/send/user", handleJSONChatHistory); + webserver.on("/json/chat/history/channel", handleJSONChatHistory); + webserver.on("/json/chat/history/user", handleJSONChatHistory); + webserver.on("/json/stats", handleJSONChatHistory); webserver.on("/hotspot-detect.html", handleHotspot); - webserver.on("/", []() { webserver.send(200, "text/plain", "Everything is awesome!"); }); + webserver.on("/", handleRoot); webserver.begin(); } void handleJSONChatHistory() { + int i; String out = ""; out += "{\n"; @@ -47,6 +69,14 @@ void handleJSONChatHistory() out += "\"" + something + "\""; out += "]\n"; + for (i = 0; i < maxMessages; i++) { + out += "["; + out += "\"" + String(messages_history.history[i].sender) + "\""; + out += ","; + out += "\"" + String(messages_history.history[i].message) + "\""; + out += "]\n"; + } + out += "\n"; out += " }\n"; out += "}\n"; @@ -57,7 +87,8 @@ void handleJSONChatHistory() void handleNotFound() { - String message = "File Not Found\n\n"; + String message = ""; + message += "File Not Found\n\n"; message += "URI: "; message += webserver.uri(); message += "\nMethod: "; @@ -71,8 +102,6 @@ void handleNotFound() } Serial.println(message); webserver.send(404, "text/plain", message); - /* - */ } /* @@ -82,6 +111,11 @@ void handleHotspot() { DEBUG_MSG("Hotspot Request\n"); + /* + If we don't do a redirect, be sure to return a "Success" message + otherwise iOS will have trouble detecting that the connection to the SoftAP worked. + */ + String out = ""; // out += "Success\n"; out += "\n"; @@ -89,6 +123,61 @@ void handleHotspot() return; } +void handleRoot() +{ + DEBUG_MSG("Hotspot Request\n"); + + /* + If we don't do a redirect, be sure to return a "Success" message + otherwise iOS will have trouble detecting that the connection to the SoftAP worked. + */ + + String out = ""; + // out += "Success\n"; + out += "\n" + "\n" + "\n" + "\n" + "Meshtastic - WebUI\n" + "\n" + "\n" + "\n" + "
\n" + "
\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
Meshtastic - WebUI (Pre-Alpha)
\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "
Channels:
\n" + "
\n" + " #general
\n" + " #stuff
\n" + " #things
\n" + "
Everything is awesome!
\n" + "
\n" + "
\n" + "
\n" + "\n" + "\n"; + webserver.send(200, "text/html", out); + return; +} + void notifyWebUI() { DEBUG_MSG("************ Got a message! ************\n"); diff --git a/src/meshwifi/meshhttp.h b/src/meshwifi/meshhttp.h index 8c607f6fd..b1a5dbb94 100644 --- a/src/meshwifi/meshhttp.h +++ b/src/meshwifi/meshhttp.h @@ -14,3 +14,5 @@ void handleJSONChatHistory(); void notifyWebUI(); void handleHotspot(); + +void handleRoot(); \ No newline at end of file diff --git a/src/meshwifi/meshwifi.cpp b/src/meshwifi/meshwifi.cpp index f395ff7b0..e31065ef9 100644 --- a/src/meshwifi/meshwifi.cpp +++ b/src/meshwifi/meshwifi.cpp @@ -3,19 +3,22 @@ #include "configuration.h" #include "main.h" #include "meshwifi/meshhttp.h" -#include #include +#include static void WiFiEvent(WiFiEvent_t event); DNSServer dnsServer; -bool isWifiAvailable() +bool isWifiAvailable() { const char *wifiName = radioConfig.preferences.wifi_ssid; const char *wifiPsw = radioConfig.preferences.wifi_password; if (*wifiName && *wifiPsw) { + + // Once every 10 seconds, try to reconnect. + return 1; } else { return 0; @@ -26,7 +29,7 @@ bool isWifiAvailable() void deinitWifi() { /* - Note from Jm (Sept 16, 2020): + Note from Jm (jm@casler.org - Sept 16, 2020): A bug in the ESP32 SDK was introduced in Oct 2019 that keeps the WiFi radio from turning back on after it's shut off. See: @@ -38,7 +41,7 @@ void deinitWifi() WiFi.mode(WIFI_MODE_NULL); DEBUG_MSG("WiFi Turned Off\n"); - WiFi.printDiag(Serial); + // WiFi.printDiag(Serial); } // Startup WiFi @@ -53,7 +56,7 @@ void initWifi() const char *wifiPsw = radioConfig.preferences.wifi_password; /* - if (1) { + if (0) { radioConfig.preferences.wifi_ap_mode = 1; strcpy(radioConfig.preferences.wifi_ssid, "MeshTest2"); strcpy(radioConfig.preferences.wifi_password, "12345678"); @@ -62,11 +65,11 @@ void initWifi() strcpy(radioConfig.preferences.wifi_ssid, "meshtastic"); strcpy(radioConfig.preferences.wifi_password, "meshtastic!"); } - */ + */ if (*wifiName && *wifiPsw) { if (radioConfig.preferences.wifi_ap_mode) { - + IPAddress apIP(192, 168, 42, 1); WiFi.onEvent(WiFiEvent); @@ -76,7 +79,6 @@ void initWifi() dnsServer.start(53, "*", apIP); - } else { WiFi.mode(WIFI_MODE_STA); WiFi.onEvent(WiFiEvent); @@ -116,9 +118,9 @@ static void WiFiEvent(WiFiEvent_t event) break; case SYSTEM_EVENT_STA_DISCONNECTED: DEBUG_MSG("Disconnected from WiFi access point\n"); + // Event 5 - // Reconnect WiFi - initWifi(); + reconnectWiFi(); break; case SYSTEM_EVENT_STA_AUTHMODE_CHANGE: DEBUG_MSG("Authentication mode of access point has changed\n"); @@ -189,12 +191,29 @@ static void WiFiEvent(WiFiEvent_t event) break; default: break; - } } -void handleDNSResponse() { +void handleDNSResponse() +{ if (radioConfig.preferences.wifi_ap_mode) { dnsServer.processNextRequest(); } +} + +void reconnectWiFi() +{ + const char *wifiName = radioConfig.preferences.wifi_ssid; + const char *wifiPsw = radioConfig.preferences.wifi_password; + + if (radioConfig.has_preferences) { + + if (*wifiName && *wifiPsw) { + + DEBUG_MSG("... Reconnecting to WiFi access point"); + + WiFi.mode(WIFI_MODE_STA); + WiFi.begin(wifiName, wifiPsw); + } + } } \ No newline at end of file diff --git a/src/meshwifi/meshwifi.h b/src/meshwifi/meshwifi.h index 44fff707f..bcafa700a 100644 --- a/src/meshwifi/meshwifi.h +++ b/src/meshwifi/meshwifi.h @@ -5,8 +5,8 @@ #include #ifdef HAS_WIFI -#include #include +#include #endif void initWifi(); @@ -14,3 +14,5 @@ void deinitWifi(); bool isWifiAvailable(); void handleDNSResponse(); + +void reconnectWiFi();