From d5930380b4579c59727176d5bb3af8c5414f65c5 Mon Sep 17 00:00:00 2001 From: richonguzman Date: Wed, 17 Sep 2025 16:53:09 -0300 Subject: [PATCH] testing new config init validation --- src/LoRa_APRS_iGate.cpp | 4 +- src/configuration.cpp | 95 ++++++++++++++++++++++++++++++++++++----- src/web_utils.cpp | 3 +- 3 files changed, 88 insertions(+), 14 deletions(-) diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index 7ecaf3c..90a6507 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -67,8 +67,8 @@ ___________________________________________________________________*/ #endif -String versionDate = "2025-09-14"; -String versionNumber = "3.1.1"; +String versionDate = "2025-09-17"; +String versionNumber = "3.1.2"; Configuration Config; WiFiClient aprsIsClient; WiFiClient mqttClient; diff --git a/src/configuration.cpp b/src/configuration.cpp index 2dbc513..da9970f 100644 --- a/src/configuration.cpp +++ b/src/configuration.cpp @@ -27,7 +27,7 @@ bool shouldSleepStop = true; bool Configuration::writeFile() { - Serial.println("Saving config..."); + Serial.println("Saving configuration..."); StaticJsonDocument<3584> data; File configFile = SPIFFS.open("/igate_conf.json", "w"); @@ -151,8 +151,6 @@ bool Configuration::writeFile() { serializeJson(data, configFile); configFile.close(); - - Serial.println("Config saved"); return true; } catch (...) { Serial.println("Error: Exception occurred while saving config"); @@ -163,10 +161,10 @@ bool Configuration::writeFile() { bool Configuration::readFile() { Serial.println("Reading config.."); - File configFile = SPIFFS.open("/igate_conf.json", "r"); if (configFile) { + bool needsRewrite = false; StaticJsonDocument<3584> data; DeserializationError error = deserializeJson(data, configFile); @@ -183,12 +181,21 @@ bool Configuration::readFile() { wifiAPs.push_back(wifiap); } + if (!data["wifi"]["autoAP"].containsKey("password") || + !data["wifi"]["autoAP"].containsKey("timeout")) needsRewrite = true; wifiAutoAP.password = data["wifi"]["autoAP"]["password"] | "1234567890"; wifiAutoAP.timeout = data["wifi"]["autoAP"]["timeout"] | 10; + if (!data.containsKey("callsign")) needsRewrite = true; callsign = data["callsign"] | "NOCALL-10"; - + if (!data["aprs_is"].containsKey("active") || + !data["aprs_is"].containsKey("passcode") || + !data["aprs_is"].containsKey("server") || + !data["aprs_is"].containsKey("port") || + !data["aprs_is"].containsKey("filter") || + !data["aprs_is"].containsKey("messagesToRF") || + !data["aprs_is"].containsKey("objectsToRF")) needsRewrite = true; aprs_is.active = data["aprs_is"]["active"] | false; aprs_is.passcode = data["aprs_is"]["passcode"] | "XYZWV"; aprs_is.server = data["aprs_is"]["server"] | "rotate.aprs2.net"; @@ -197,7 +204,19 @@ bool Configuration::readFile() { aprs_is.messagesToRF = data["aprs_is"]["messagesToRF"] | false; aprs_is.objectsToRF = data["aprs_is"]["objectsToRF"] | false; - + if (!data["beacon"].containsKey("latitude") || + !data["beacon"].containsKey("longitude") || + !data["beacon"].containsKey("comment") || + !data["beacon"].containsKey("interval") || + !data["beacon"].containsKey("overlay") || + !data["beacon"].containsKey("symbol") || + !data["beacon"].containsKey("path") || + !data["beacon"].containsKey("sendViaAPRSIS") || + !data["beacon"].containsKey("sendViaRF") || + !data["beacon"].containsKey("statusActive") || + !data["beacon"].containsKey("statusPacket") || + !data["beacon"].containsKey("gpsActive") || + !data["beacon"].containsKey("gpsAmbiguity")) needsRewrite = true; beacon.latitude = data["beacon"]["latitude"] | 0.0; beacon.longitude = data["beacon"]["longitude"] | 0.0; beacon.comment = data["beacon"]["comment"] | "LoRa APRS"; @@ -207,17 +226,19 @@ bool Configuration::readFile() { beacon.path = data["beacon"]["path"] | "WIDE1-1"; beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"] | false; beacon.sendViaRF = data["beacon"]["sendViaRF"] | false; - beacon.statusActive = data["beacon"]["statusActive"] | false; beacon.statusPacket = data["beacon"]["statusPacket"] | ""; - beacon.gpsActive = data["beacon"]["gpsActive"] | false; beacon.gpsAmbiguity = data["beacon"]["gpsAmbiguity"] | false; + if (!data.containsKey("personalNote")) needsRewrite = true; personalNote = data["personalNote"] | "personal note here"; + if (!data.containsKey("blacklist")) needsRewrite = true; blacklist = data["blacklist"] | "station callsign"; + if (!data["digi"].containsKey("mode") || + !data["digi"].containsKey("ecoMode")) needsRewrite = true; digi.mode = data["digi"]["mode"] | 0; digi.ecoMode = data["digi"]["ecoMode"] | 0; if (digi.ecoMode == 1) shouldSleepStop = false; @@ -226,6 +247,14 @@ bool Configuration::readFile() { if (digi.ecoMode == 1) digi.ecoMode = 2; #endif + if (!data["lora"].containsKey("txFreq") || + !data["lora"].containsKey("rxFreq") || + !data["lora"].containsKey("spreadingFactor") || + !data["lora"].containsKey("signalBandwidth") || + !data["lora"].containsKey("codingRate4") || + !data["lora"].containsKey("power") || + !data["lora"].containsKey("txActive") || + !data["lora"].containsKey("rxActive")) needsRewrite = true; loramodule.txFreq = data["lora"]["txFreq"] | 433775000; loramodule.rxFreq = data["lora"]["rxFreq"] | 433775000; loramodule.spreadingFactor = data["lora"]["spreadingFactor"] | 12; @@ -235,36 +264,63 @@ bool Configuration::readFile() { loramodule.txActive = data["lora"]["txActive"] | false; loramodule.rxActive = data["lora"]["rxActive"] | false; + if (!data["display"].containsKey("alwaysOn") || + !data["display"].containsKey("timeout") || + !data["display"].containsKey("turn180")) needsRewrite = true; display.alwaysOn = data["display"]["alwaysOn"] | true; display.timeout = data["display"]["timeout"] | 4; display.turn180 = data["display"]["turn180"] | false; + if (!data["battery"].containsKey("sendInternalVoltage") || + !data["battery"].containsKey("monitorInternalVoltage") || + !data["battery"].containsKey("internalSleepVoltage") || + !data["battery"].containsKey("sendExternalVoltage") || + !data["battery"].containsKey("externalVoltagePin") || + !data["battery"].containsKey("monitorExternalVoltage") || + !data["battery"].containsKey("externalSleepVoltage") || + !data["battery"].containsKey("voltageDividerR1") || + !data["battery"].containsKey("voltageDividerR2") || + !data["battery"].containsKey("sendVoltageAsTelemetry")) needsRewrite = true; battery.sendInternalVoltage = data["battery"]["sendInternalVoltage"] | false; battery.monitorInternalVoltage = data["battery"]["monitorInternalVoltage"] | false; battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"] | 2.9; - battery.sendExternalVoltage = data["battery"]["sendExternalVoltage"] | false; battery.externalVoltagePin = data["battery"]["externalVoltagePin"] | 34; battery.monitorExternalVoltage = data["battery"]["monitorExternalVoltage"] | false; battery.externalSleepVoltage = data["battery"]["externalSleepVoltage"] | 10.9; battery.voltageDividerR1 = data["battery"]["voltageDividerR1"] | 100.0; battery.voltageDividerR2 = data["battery"]["voltageDividerR2"] | 27.0; - battery.sendVoltageAsTelemetry = data["battery"]["sendVoltageAsTelemetry"] | false; + if (!data["wxsensor"].containsKey("active") || + !data["wxsensor"].containsKey("heightCorrection") || + !data["wxsensor"].containsKey("temperatureCorrection")) needsRewrite = true; wxsensor.active = data["wxsensor"]["active"] | false; wxsensor.heightCorrection = data["wxsensor"]["heightCorrection"] | 0; wxsensor.temperatureCorrection = data["wxsensor"]["temperatureCorrection"] | 0.0; + if (!data["syslog"].containsKey("active") || + !data["syslog"].containsKey("server") || + !data["syslog"].containsKey("port") || + !data["syslog"].containsKey("logBeaconOverTCPIP")) needsRewrite = true; syslog.active = data["syslog"]["active"] | false; syslog.server = data["syslog"]["server"] | "lora.link9.net"; syslog.port = data["syslog"]["port"] | 1514; syslog.logBeaconOverTCPIP = data["syslog"]["logBeaconOverTCPIP"] | false; + if (!data["tnc"].containsKey("enableServer") || + !data["tnc"].containsKey("enableSerial") || + !data["tnc"].containsKey("acceptOwn")) needsRewrite = true; tnc.enableServer = data["tnc"]["enableServer"] | false; tnc.enableSerial = data["tnc"]["enableSerial"] | false; tnc.acceptOwn = data["tnc"]["acceptOwn"] | false; + if (!data["mqtt"].containsKey("active") || + !data["mqtt"].containsKey("server") || + !data["mqtt"].containsKey("topic") || + !data["mqtt"].containsKey("username") || + !data["mqtt"].containsKey("password") || + !data["mqtt"].containsKey("port")) needsRewrite = true; mqtt.active = data["mqtt"]["active"] | false; mqtt.server = data["mqtt"]["server"] | ""; mqtt.topic = data["mqtt"]["topic"] | "aprs-igate"; @@ -272,23 +328,35 @@ bool Configuration::readFile() { mqtt.password = data["mqtt"]["password"] | ""; mqtt.port = data["mqtt"]["port"] | 1883; + if (!data["ota"].containsKey("username") || + !data["ota"].containsKey("password")) needsRewrite = true; ota.username = data["ota"]["username"] | ""; ota.password = data["ota"]["password"] | ""; + if (!data["webadmin"].containsKey("active") || + !data["webadmin"].containsKey("username") || + !data["webadmin"].containsKey("password")) needsRewrite = true; webadmin.active = data["webadmin"]["active"] | false; webadmin.username = data["webadmin"]["username"] | "admin"; webadmin.password = data["webadmin"]["password"] | ""; + if (!data["remoteManagement"].containsKey("managers") || + !data["remoteManagement"].containsKey("rfOnly")) needsRewrite = true; remoteManagement.managers = data["remoteManagement"]["managers"] | ""; remoteManagement.rfOnly = data["remoteManagement"]["rfOnly"] | true; + if (!data["ntp"].containsKey("gmtCorrection")) needsRewrite = true; ntp.gmtCorrection = data["ntp"]["gmtCorrection"] | 0.0; + if (!data["other"].containsKey("rebootMode") || + !data["other"].containsKey("rebootModeTime")) needsRewrite = true; rebootMode = data["other"]["rebootMode"] | false; rebootModeTime = data["other"]["rebootModeTime"] | 6; + if (!data["other"].containsKey("rememberStationTime")) needsRewrite = true; rememberStationTime = data["other"]["rememberStationTime"] | 30; + if (!data["other"].containsKey("backupDigiMode")) needsRewrite = true; backupDigiMode = data["other"]["backupDigiMode"] | false; if (wifiAPs.size() == 0) { // If we don't have any WiFi's from config we need to add "empty" SSID for AUTO AP @@ -299,6 +367,13 @@ bool Configuration::readFile() { wifiAPs.push_back(wifiap); } configFile.close(); + + if (needsRewrite) { + Serial.println("Config JSON incomplete, rewriting..."); + writeFile(); + delay(1000); + ESP.restart(); + } Serial.println("Config read successfuly"); return true; } else { diff --git a/src/web_utils.cpp b/src/web_utils.cpp index 69cf528..661c342 100644 --- a/src/web_utils.cpp +++ b/src/web_utils.cpp @@ -115,7 +115,7 @@ namespace WEB_Utils { } void handleWriteConfiguration(AsyncWebServerRequest *request) { - Serial.println("Got new config from www"); + Serial.println("Got new Configuration Data from www"); auto getParamStringSafe = [&](const String& name, const String& defaultValue = "") -> String { if (request->hasParam(name, true)) { @@ -287,7 +287,6 @@ namespace WEB_Utils { Config.backupDigiMode = request->hasParam("other.backupDigiMode", true); - Serial.println("Saving configuration..."); bool saveSuccess = Config.writeFile(); if (saveSuccess) {