From c97bd32695b708b261d1ebb90f4541e2af287e94 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 28 Jun 2025 08:17:17 -1000 Subject: [PATCH 1/7] OTA: Add periodic display of OTA firmware update state --- Firmware/RTK_Everywhere/menuFirmware.ino | 11 +++++++++++ Firmware/RTK_Everywhere/menuSystem.ino | 5 +++++ Firmware/RTK_Everywhere/settings.h | 2 ++ 3 files changed, 18 insertions(+) diff --git a/Firmware/RTK_Everywhere/menuFirmware.ino b/Firmware/RTK_Everywhere/menuFirmware.ino index ea98b4e80..f10980eea 100644 --- a/Firmware/RTK_Everywhere/menuFirmware.ino +++ b/Firmware/RTK_Everywhere/menuFirmware.ino @@ -922,6 +922,17 @@ void otaUpdate() break; } } + + // Periodically display the state + if (PERIODIC_DISPLAY(PD_OTA_STATE)) + { + char line[30]; + const char * state; + + PERIODIC_CLEAR(PD_OTA_STATE); + state = otaStateNameGet(otaState, line); + systemPrintf("OTA Firmware Update state: %s\r\n", state); + } } //---------------------------------------- diff --git a/Firmware/RTK_Everywhere/menuSystem.ino b/Firmware/RTK_Everywhere/menuSystem.ino index eec453914..c1c082f53 100644 --- a/Firmware/RTK_Everywhere/menuSystem.ino +++ b/Firmware/RTK_Everywhere/menuSystem.ino @@ -1232,6 +1232,9 @@ void menuPeriodicPrint() systemPrint("59) WebServer state: "); systemPrintf("%s\r\n", PERIODIC_SETTING(PD_WEB_SERVER_STATE) ? "Enabled" : "Disabled"); + systemPrint("60) OTA firmware update state: "); + systemPrintf("%s\r\n", PERIODIC_SETTING(PD_OTA_STATE) ? "Enabled" : "Disabled"); + systemPrintln("------- Tasks ------"); systemPrint("70) btReadTask state: "); systemPrintf("%s\r\n", PERIODIC_SETTING(PD_TASK_BLUETOOTH_READ) ? "Enabled" : "Disabled"); @@ -1339,6 +1342,8 @@ void menuPeriodicPrint() PERIODIC_TOGGLE(PD_UDP_SERVER_BROADCAST_DATA); else if (incoming == 59) PERIODIC_TOGGLE(PD_WEB_SERVER_STATE); + else if (incoming == 60) + PERIODIC_TOGGLE(PD_OTA_STATE); else if (incoming == 70) PERIODIC_TOGGLE(PD_TASK_BLUETOOTH_READ); diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 3a8957865..ae8281353 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -332,6 +332,8 @@ enum PeriodDisplayValues PD_GNSS_DATA_RX_BYTE_COUNT, // 38 PD_WEB_SERVER_STATE, // 39 + + PD_OTA_STATE, // 40 // Add new values before this line }; From a2210b1929143ee38a51fa1683bfbd98715a1ea1 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 28 Jun 2025 09:51:17 -1000 Subject: [PATCH 2/7] menuFirmware: Declare any major version >= 99 as DEVELOPER --- Firmware/RTK_Everywhere/menuFirmware.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/menuFirmware.ino b/Firmware/RTK_Everywhere/menuFirmware.ino index f10980eea..f92b72b64 100644 --- a/Firmware/RTK_Everywhere/menuFirmware.ino +++ b/Firmware/RTK_Everywhere/menuFirmware.ino @@ -137,7 +137,7 @@ void firmwareVersionFormat(uint8_t major, uint8_t minor, char *buffer, int buffe char prefix; // Construct the full or release candidate version number - prefix = ENABLE_DEVELOPER ? 'd' : 'v'; + prefix = (ENABLE_DEVELOPER || (major >= 99)) ? 'd' : 'v'; if (enableRCFirmware && (bufferLength >= 21)) // 123456789012345678901 // pxxx.yyy-dd-mmm-yyyy0 From 1ec0f7f6da9a7e2afc52ad788e1f331176ba1c44 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 28 Jun 2025 09:54:13 -1000 Subject: [PATCH 3/7] WebServer: When internet available or not AP, call networkConsumerAdd --- Firmware/RTK_Everywhere/WebServer.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/WebServer.ino b/Firmware/RTK_Everywhere/WebServer.ino index 7ecb91078..163df1a7c 100644 --- a/Firmware/RTK_Everywhere/WebServer.ino +++ b/Firmware/RTK_Everywhere/WebServer.ino @@ -1144,9 +1144,9 @@ void webServerStart() systemPrintln("Web Server: Starting"); // Start the network - if (settings.wifiConfigOverAP == false) + if ((settings.wifiConfigOverAP == false) || networkHasInternet()) networkConsumerAdd(NETCONSUMER_WEB_CONFIG, NETWORK_ANY, __FILE__, __LINE__); - else + if (settings.wifiConfigOverAP) networkSoftApConsumerAdd(NETCONSUMER_WEB_CONFIG, __FILE__, __LINE__); webServerSetState(WEBSERVER_STATE_WAIT_FOR_NETWORK); } From 150afbfe38e75bac57e55a9f5823325d92deefd5 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 28 Jun 2025 13:50:27 -1000 Subject: [PATCH 4/7] settings: Add PASSWORD_LENGTH --- Firmware/RTK_Everywhere/settings.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index ae8281353..8368152a1 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -398,11 +398,12 @@ typedef enum } BluetoothRadioType_e; #define SSID_LENGTH 50 +#define PASSWORD_LENGTH 50 typedef struct WiFiNetwork { char ssid[SSID_LENGTH]; - char password[50]; + char password[PASSWORD_LENGTH]; } WiFiNetwork; #define MAX_WIFI_NETWORKS 4 From c572b229170e7602ab6b4e430980fa8f173f3774 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 28 Jun 2025 13:54:39 -1000 Subject: [PATCH 5/7] WiFi: Periodically display the WiFi state --- Firmware/RTK_Everywhere/WiFi.ino | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Firmware/RTK_Everywhere/WiFi.ino b/Firmware/RTK_Everywhere/WiFi.ino index c4c71867f..43e5d8986 100644 --- a/Firmware/RTK_Everywhere/WiFi.ino +++ b/Firmware/RTK_Everywhere/WiFi.ino @@ -756,7 +756,7 @@ bool wifiStationEnabled(const char ** reason) // Verify that at least one SSID value is set if (wifiStationSsidSet == false) { - *reason = "SSID not available"; + *reason = ", SSID not available"; break; } @@ -764,7 +764,7 @@ bool wifiStationEnabled(const char ** reason) if (wifiStationRestart) { wifiStationRestart = false; - *reason = "restart requested"; + *reason = ", restart requested"; break; } @@ -778,19 +778,19 @@ bool wifiStationEnabled(const char ** reason) // Build the reason if (reasonBuffer) { - sprintf(reasonBuffer,"is lower priority than %s", networkGetCurrentInterfaceName()); + sprintf(reasonBuffer,", is lower priority than %s", networkGetCurrentInterfaceName()); *reason = reasonBuffer; } // Allocation failed else - *reason = "is lower priority"; + *reason = ", is lower priority"; break; } // WiFi should start and continue running enabled = true; - *reason = "is enabled"; + *reason = ", is enabled"; } while (0); return enabled; } @@ -1056,6 +1056,14 @@ void wifiStationUpdate() case WIFI_STATION_STATE_STABLE: break; } + + // Periodically display the WiFi state + if (PERIODIC_DISPLAY(PD_WIFI_STATE)) + { + systemPrintf("WiFi station state: %s%s\r\n", + wifiStationStateName[wifiStationState], reason); + PERIODIC_CLEAR(PD_WIFI_STATE); + } } //********************************************************************* From 8344c82ec7136d6455e838415f035acadcf9c881 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Sat, 28 Jun 2025 13:58:45 -1000 Subject: [PATCH 6/7] WebServer: Restart the web server when the WiFi parameters change --- Firmware/RTK_Everywhere/States.ino | 10 +++++++++ Firmware/RTK_Everywhere/WebServer.ino | 30 +++++++++++++++++++++++++++ Firmware/RTK_Everywhere/WiFi.ino | 23 ++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino index 6de1201ac..8e4ad1dd4 100644 --- a/Firmware/RTK_Everywhere/States.ino +++ b/Firmware/RTK_Everywhere/States.ino @@ -445,6 +445,8 @@ void stateUpdate() // Allow for 750ms before we parse buffer for all data to arrive if (millis() - timeSinceLastIncomingSetting > 750) { + bool changed; + currentlyParsingData = true; // Disallow new data to flow from websocket while we are parsing the current data @@ -453,17 +455,25 @@ void stateUpdate() systemWrite(incomingSettings[x]); systemPrintln(); + webServerSettingsClone(); parseIncomingSettings(); settings.gnssConfiguredOnce = false; // On the next boot, reapply all settings settings.gnssConfiguredBase = false; settings.gnssConfiguredRover = false; recordSystemSettings(); // Record these settings to unit + changed = webServerSettingsCheckAndFree(); // Clear buffer incomingSettingsSpot = 0; memset(incomingSettings, 0, AP_CONFIG_SETTING_SIZE); currentlyParsingData = false; // Allow new data from websocket + if (changed) + { + // Restart the web server if the WiFi parameters changed + webServerStop(); + changeState(STATE_WEB_CONFIG_NOT_STARTED); // Return to rover mode to avoid being in fixed base mode + } } } diff --git a/Firmware/RTK_Everywhere/WebServer.ino b/Firmware/RTK_Everywhere/WebServer.ino index 163df1a7c..1e1f46846 100644 --- a/Firmware/RTK_Everywhere/WebServer.ino +++ b/Firmware/RTK_Everywhere/WebServer.ino @@ -52,6 +52,7 @@ static const char *const webServerStateNames[] = { static const int webServerStateEntries = sizeof(webServerStateNames) / sizeof(webServerStateNames[0]); static uint8_t webServerState; +static struct Settings * webServerPreviousSettings; // Once connected to the access point for WiFi Config, the ESP32 sends current setting values in one long string to // websocket After user clicks 'save', data is validated via main.js and a long string of values is returned. @@ -1125,6 +1126,35 @@ void webServerSetState(uint8_t newState) reportFatalError("Web Server: Invalid web config state"); } +//---------------------------------------- +// Check the web server settings and free the settings structure +//---------------------------------------- +bool webServerSettingsCheckAndFree() +{ + bool changed; + + changed = false; + if (webServerPreviousSettings) + { + changed = wifiCheckSettings(webServerPreviousSettings); + rtkFree(webServerPreviousSettings, "WebServer previous settings"); + webServerPreviousSettings = nullptr; + } + return changed; +} + +//---------------------------------------- +// Allocate the settings structure and clone the settings +//---------------------------------------- +void webServerSettingsClone() +{ + webServerPreviousSettings = (struct Settings *) rtkMalloc(sizeof(settings), "WebServer previous settings"); + if (webServerPreviousSettings == nullptr) + systemPrintln("ERROR: Web Server failed to allocate previous settings!\r\n"); + else + memcpy(webServerPreviousSettings, &settings, sizeof(settings)); +} + //---------------------------------------- // Start the Web Server state machine //---------------------------------------- diff --git a/Firmware/RTK_Everywhere/WiFi.ino b/Firmware/RTK_Everywhere/WiFi.ino index 43e5d8986..0f958710b 100644 --- a/Firmware/RTK_Everywhere/WiFi.ino +++ b/Firmware/RTK_Everywhere/WiFi.ino @@ -460,6 +460,29 @@ void menuWiFi() clearBuffer(); // Empty buffer of any newline chars } +//********************************************************************* +// Check for setting differences +bool wifiCheckSettings(struct Settings * newSettings) +{ + bool changed; + + // Determine if any of the WiFi station SSID or password changes + changed = (memcmp(newSettings->wifiNetworks[0].ssid, settings.wifiNetworks[0].ssid, SSID_LENGTH) != 0) + || (memcmp(newSettings->wifiNetworks[0].password, settings.wifiNetworks[0].password, PASSWORD_LENGTH) != 0) + || (memcmp(newSettings->wifiNetworks[1].ssid, settings.wifiNetworks[1].ssid, SSID_LENGTH) != 0) + || (memcmp(newSettings->wifiNetworks[1].password, settings.wifiNetworks[1].password, PASSWORD_LENGTH) != 0) + || (memcmp(newSettings->wifiNetworks[2].ssid, settings.wifiNetworks[2].ssid, SSID_LENGTH) != 0) + || (memcmp(newSettings->wifiNetworks[2].password, settings.wifiNetworks[2].password, PASSWORD_LENGTH) != 0) + || (memcmp(newSettings->wifiNetworks[3].ssid, settings.wifiNetworks[3].ssid, SSID_LENGTH) != 0) + || (memcmp(newSettings->wifiNetworks[3].password, settings.wifiNetworks[3].password, PASSWORD_LENGTH) != 0); + if (changed) + { + // Update the WiFi settings + wifiUpdateSettings(); + } + return changed; +} + //********************************************************************* // Display the soft AP details void wifiDisplayNetworkData() From fbfdbb1eafb2673cb1686cd4a2d7e836b9cc4a72 Mon Sep 17 00:00:00 2001 From: Lee Leahy Date: Fri, 4 Jul 2025 06:49:02 -1000 Subject: [PATCH 7/7] Network: Add networkUseDefaultInterface routine --- Firmware/RTK_Everywhere/HTTP_Client.ino | 1 + Firmware/RTK_Everywhere/MQTT_Client.ino | 1 + Firmware/RTK_Everywhere/Network.ino | 19 +++++++++++++++++++ Firmware/RTK_Everywhere/NtripClient.ino | 1 + Firmware/RTK_Everywhere/TcpClient.ino | 1 + 5 files changed, 23 insertions(+) diff --git a/Firmware/RTK_Everywhere/HTTP_Client.ino b/Firmware/RTK_Everywhere/HTTP_Client.ino index 9820c4579..0005f5ac3 100644 --- a/Firmware/RTK_Everywhere/HTTP_Client.ino +++ b/Firmware/RTK_Everywhere/HTTP_Client.ino @@ -356,6 +356,7 @@ void httpClientUpdate() // Connect to the HTTP server case HTTP_CLIENT_CONNECTING_2_SERVER: { // Allocate the httpSecureClient structure + networkUseDefaultInterface(); httpSecureClient = new NetworkClientSecure(); if (!httpSecureClient) { diff --git a/Firmware/RTK_Everywhere/MQTT_Client.ino b/Firmware/RTK_Everywhere/MQTT_Client.ino index 980e827ef..8de1d561e 100644 --- a/Firmware/RTK_Everywhere/MQTT_Client.ino +++ b/Firmware/RTK_Everywhere/MQTT_Client.ino @@ -884,6 +884,7 @@ void mqttClientUpdate() // Connect to the MQTT broker case MQTT_CLIENT_CONNECTING_2_BROKER: { // Allocate the mqttSecureClient structure + networkUseDefaultInterface(); mqttSecureClient = new NetworkClientSecure(); if (!mqttSecureClient) { diff --git a/Firmware/RTK_Everywhere/Network.ino b/Firmware/RTK_Everywhere/Network.ino index d6dcc649f..d8ff33117 100644 --- a/Firmware/RTK_Everywhere/Network.ino +++ b/Firmware/RTK_Everywhere/Network.ino @@ -2451,6 +2451,25 @@ void networkUpdate() } } +//---------------------------------------- +// Set the default network interface +//---------------------------------------- +void networkUseDefaultInterface() +{ + NetIndex_t index; + bool isDefault; + + // Get the network index + index = networkGetCurrentInterfaceIndex(); + if (index < NETWORK_OFFLINE) + { + // Get the default network interface + isDefault = networkInterfaceTable[index].netif->isDefault(); + if (!isDefault) + networkInterfaceTable[index].netif->setDefault(); + } +} + //---------------------------------------- // Add a network user //---------------------------------------- diff --git a/Firmware/RTK_Everywhere/NtripClient.ino b/Firmware/RTK_Everywhere/NtripClient.ino index deca38352..a166abafe 100644 --- a/Firmware/RTK_Everywhere/NtripClient.ino +++ b/Firmware/RTK_Everywhere/NtripClient.ino @@ -658,6 +658,7 @@ void ntripClientUpdate() if (connected) { // Allocate the ntripClient structure + networkUseDefaultInterface(); ntripClient = new NetworkClient(); if (!ntripClient) { diff --git a/Firmware/RTK_Everywhere/TcpClient.ino b/Firmware/RTK_Everywhere/TcpClient.ino index 0e67fdd91..1e2ff2706 100644 --- a/Firmware/RTK_Everywhere/TcpClient.ino +++ b/Firmware/RTK_Everywhere/TcpClient.ino @@ -306,6 +306,7 @@ bool tcpClientStart() NetworkClient *client; // Allocate the TCP client + networkUseDefaultInterface(); client = new NetworkClient(); if (client) {