diff --git a/data/igate_conf.json b/data/igate_conf.json index 8e258a4..2863ff8 100644 --- a/data/igate_conf.json +++ b/data/igate_conf.json @@ -13,15 +13,8 @@ "Latitude": -33.0312492, "Longitude": -71.5796215 } - ] - }, - "network": { - "DHCP": false, - "ip": "192.168.0.50", - "subnet": "255.255.255.0", - "gateway": "192.168.0.1", - "dns1": "8.8.8.8", - "dns2": "8.8.4.4" + ], + "checkInterval": 30 }, "aprs_is": { "passcode": "23201", diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index de8ab9f..a96a84e 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -4,19 +4,23 @@ #include #include "pins_config.h" -#include "igate_config.h" +// +//#include "igate_config.h" +// +#include "configuration.h" #include "display.h" #include "lora_utils.h" +#include "wifi_utils.h" #include "utils.h" -#include +/*#include #include -#include +#include */ #define VERSION "2023.06.06" WiFiClient espClient; -AsyncWebServer server(80); +//AsyncWebServer server(80); String ConfigurationFilePath = "/igate_conf.json"; Configuration Config(ConfigurationFilePath); @@ -25,7 +29,7 @@ static bool beacon_update = true; unsigned long previousWiFiMillis = 0; static uint32_t lastRxTxTime = millis(); -static int myWiFiAPIndex = 0; +int myWiFiAPIndex = 0; int myWiFiAPSize = Config.wifiAPs.size(); WiFi_AP *currentWiFi = &Config.wifiAPs[myWiFiAPIndex]; bool statusAfterBoot = Config.statusAfterBoot; @@ -35,44 +39,6 @@ std::vector lastHeardStation_temp; String firstLine, secondLine, thirdLine, fourthLine, iGateLatitude, iGateLongitude; -/*void setup_wifi() { - int status = WL_IDLE_STATUS; - Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.print("' "); - show_display("", "Connecting to Wifi:", currentWiFi->ssid + " ...", 0); - WiFi.mode(WIFI_STA); - WiFi.disconnect(); - delay(100); - unsigned long start = millis(); - - /*if (Config.network.DHCP) { - WiFi.setHostname(Config.callsign.c_str()); - if (!WiFi.config(Config.network.ip, Config.network.gateway, Config.network.subnet, Config.network.dns1, Config.network.dns2)) { - Serial.println("STA Failed to configure"); - } - //WiFi.config(Config.network.ip, Config.network.gateway, Config.network.subnet, Config.network.dns1, Config.network.dns2); - } - - WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); - while (WiFi.status() != WL_CONNECTED) { - Serial.print('.'); - delay(1000); - if ((millis() - start) > 15000){ - if(myWiFiAPIndex >= (myWiFiAPSize-1)) { - myWiFiAPIndex = 0; - } else { - myWiFiAPIndex++; - } - currentWiFi = &Config.wifiAPs[myWiFiAPIndex]; - start = millis(); - Serial.print("\nConnect to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ..."); - show_display("", "Connect to Wifi:", currentWiFi->ssid + " ...", 0); - WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); - } - } - Serial.print("Connected as "); - Serial.println(WiFi.localIP()); -}*/ - void APRS_IS_connect(){ int count = 0; String aprsauth; @@ -341,16 +307,17 @@ void setup() { setup_display(); Serial.println("\nStarting iGate: " + Config.callsign + " Version: " + String(VERSION)); show_display(" LoRa APRS iGate", " Richonguzman", " -- CD2RXU --", " " VERSION, 4000); - setup_wifi(); + WIFI_Utils::setup(); + //setup_wifi(); btStop(); - server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { + /*server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(200, "text/plain", "Hi! I am ESP32."); }); AsyncElegantOTA.begin(&server); // Start ElegantOTA server.begin(); - Serial.println("HTTP server started"); + Serial.println("HTTP server started");*/ LoRaUtils::setup(); iGateLatitude = create_lat_aprs(currentWiFi->latitude); @@ -365,7 +332,7 @@ void loop() { fourthLine = ""; unsigned long currentWiFiMillis = millis(); - if ((WiFi.status() != WL_CONNECTED) && (currentWiFiMillis - previousWiFiMillis >= 30000)) { + if ((WiFi.status() != WL_CONNECTED) && (currentWiFiMillis - previousWiFiMillis >= currentWiFi->checkInterval*1000)) { Serial.print(millis()); Serial.println("Reconnecting to WiFi..."); WiFi.disconnect(); diff --git a/src/configuration.cpp b/src/configuration.cpp new file mode 100644 index 0000000..aed5a3b --- /dev/null +++ b/src/configuration.cpp @@ -0,0 +1,66 @@ +#include "configuration.h" + +Configuration::Configuration(const String &filePath) { + _filePath = filePath; + if (!SPIFFS.begin(false)) { + Serial.println("SPIFFS Mount Failed"); + return; + } + readFile(SPIFFS, _filePath.c_str()); +} + +void Configuration::readFile(fs::FS &fs, const char *fileName) { + StaticJsonDocument<1536> data; + File configFile = fs.open(fileName, "r"); + DeserializationError error = deserializeJson(data, configFile); + if (error) { + Serial.println("Failed to read file, using default configuration"); + } + + JsonArray WiFiArray = data["wifi"]["AP"]; + for (int i = 0; i < WiFiArray.size(); i++) { + WiFi_AP wifiap; + wifiap.ssid = WiFiArray[i]["SSID"].as(); + wifiap.password = WiFiArray[i]["Password"].as(); + wifiap.latitude = WiFiArray[i]["Latitude"].as(); + wifiap.longitude = WiFiArray[i]["Longitude"].as(); + wifiap.checkInterval = data["wifi"]["checkInterval"].as(); + + wifiAPs.push_back(wifiap); + } + + callsign = data["callsign"].as(); + comment = data["comment"].as(); + beaconInterval = data["other"]["beaconInterval"].as(); + statusAfterBoot = data["other"]["statusAfterBoot"].as(); + defaultStatus = data["other"]["defaultStatus"].as(); + + aprs_is.passcode = data["aprs_is"]["passcode"].as(); + aprs_is.server = data["aprs_is"]["server"].as(); + aprs_is.port = data["aprs_is"]["port"].as(); + aprs_is.softwareName = data["aprs_is"]["softwareName"].as(); + aprs_is.softwareVersion = data["aprs_is"]["softwareVersion"].as(); + aprs_is.reportingDistance = data["aprs_is"]["reportingDistance"].as(); + + loramodule.enableTx = data["lora"]["enableTx"].as(); + loramodule.frequency = data["lora"]["frequency"].as(); + loramodule.spreadingFactor = data["lora"]["spreadingFactor"].as(); + loramodule.signalBandwidth = data["lora"]["signalBandwidth"].as(); + loramodule.codingRate4 = data["lora"]["codingRate4"].as(); + loramodule.power = data["lora"]["power"].as(); + + display.alwaysOn = data["display"]["alwaysOn"].as(); + display.keepLastPacketOnScreen = data["display"]["keepLastPacketOnScreen"].as(); + display.timeout = data["display"]["timeout"].as(); + + configFile.close(); +} + +void Configuration::validateConfigFile(String currentBeaconCallsign) { + if (currentBeaconCallsign == "NOCALL-10") { + Serial.println("Change Callsign in /data/wx_report_config.json"); + while (true) { + delay(1000); + } + } +} \ No newline at end of file diff --git a/src/configuration.h b/src/configuration.h new file mode 100644 index 0000000..37fc2f0 --- /dev/null +++ b/src/configuration.h @@ -0,0 +1,69 @@ +#ifndef CONFIGURATION_H_ +#define CONFIGURATION_H_ + +#include +#include +#include +#include +#include + + +class WiFi_AP { +public: + String ssid; + String password; + double latitude; + double longitude; + int checkInterval; +}; + +class APRS_IS { +public: + String passcode; + String server; + int port; + String softwareName; + String softwareVersion; + int reportingDistance; +}; + +class LoraModule { +public: + bool enableTx; + long frequency; + int spreadingFactor; + long signalBandwidth; + int codingRate4; + int power; +}; + +class Display { +public: + bool alwaysOn; + bool keepLastPacketOnScreen; + int timeout; +}; + +class Configuration { +public: + + String callsign; + String comment; + int beaconInterval; + bool statusAfterBoot; + String defaultStatus; + std::vector wifiAPs; + APRS_IS aprs_is; + LoraModule loramodule; + Display display; + + + Configuration(const String &filePath); + void validateConfigFile(String currentBeaconCallsign); + +private: + Configuration() {}; // Hide default constructor + void readFile(fs::FS &fs, const char *fileName) ; + String _filePath; +}; +#endif \ No newline at end of file diff --git a/src/igate_config.h b/src/igate_config.h index d3205c3..670fd00 100644 --- a/src/igate_config.h +++ b/src/igate_config.h @@ -15,16 +15,6 @@ public: double longitude; }; -class Network { -public: - bool DHCP; - String ip; - String subnet; - String gateway; - String dns1; - String dns2; -}; - class APRS_IS { public: int passcode; @@ -61,7 +51,6 @@ public: bool statusAfterBoot; String defaultStatus; std::vector wifiAPs; - Network network; APRS_IS aprs_is; LoraModule loramodule; Display display; @@ -103,13 +92,6 @@ private: statusAfterBoot = data["other"]["statusAfterBoot"].as(); defaultStatus = data["other"]["defaultStatus"].as(); - network.DHCP = data["network"]["DHCP"].as(); - network.ip = data["network"]["ip"].as(); - network.subnet = data["network"]["subnet"].as(); - network.gateway = data["network"]["gateway"].as(); - network.dns1 = data["network"]["dns1"].as(); - network.dns2 = data["network"]["dns2"].as(); - aprs_is.passcode = data["aprs_is"]["passcode"].as(); aprs_is.server = data["aprs_is"]["server"].as(); aprs_is.port = data["aprs_is"]["port"].as(); diff --git a/src/lora_utils.cpp b/src/lora_utils.cpp index 8cd7ddf..89b1f32 100644 --- a/src/lora_utils.cpp +++ b/src/lora_utils.cpp @@ -1,5 +1,6 @@ #include -#include "igate_config.h" +//#include "igate_config.h" +#include "configuration.h" #include "display.h" extern Configuration Config; @@ -39,7 +40,6 @@ void sendNewPacket(const String &typeOfMessage, const String &newPacket) { Serial.println(newPacket); } - /*String receivePacket() { String loraPacket; int packetSize = LoRa.parsePacket(); // Listening for LoRa Packets @@ -53,6 +53,4 @@ void sendNewPacket(const String &typeOfMessage, const String &newPacket) { return loraPacket; }*/ - - } \ No newline at end of file diff --git a/src/lora_utils.h b/src/lora_utils.h index 34c3c79..745f828 100644 --- a/src/lora_utils.h +++ b/src/lora_utils.h @@ -8,4 +8,5 @@ void sendNewPacket(const String &typeOfMessage, const String &newPacket); //String receivePacket(); } + #endif \ No newline at end of file diff --git a/src/utils.cpp b/src/utils.cpp index 45e23fb..32a4921 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -1,6 +1,7 @@ #include #include -#include +//#include +#include "configuration.h" #include "utils.h" extern WiFiClient espClient; diff --git a/src/wifi_utils.cpp b/src/wifi_utils.cpp index 0400c1f..4244428 100644 --- a/src/wifi_utils.cpp +++ b/src/wifi_utils.cpp @@ -1,6 +1,7 @@ #include #include "wifi_utils.h" #include "configuration.h" +#include "display.h" extern Configuration Config; extern WiFi_AP *currentWiFi; @@ -15,6 +16,7 @@ void setup() { WiFi.disconnect(); delay(500); unsigned long start = millis(); + show_display("", "Connecting to Wifi:", currentWiFi->ssid + " ...", 0); Serial.print("\nConnecting to '"); Serial.print(currentWiFi->ssid); Serial.println("' WiFi ..."); WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); while (WiFi.status() != WL_CONNECTED) { @@ -29,6 +31,7 @@ void setup() { currentWiFi = &Config.wifiAPs[myWiFiAPIndex]; start = millis(); Serial.print("\nConnect to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ..."); + show_display("", "Connect to Wifi:", currentWiFi->ssid + " ...", 0); WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); } }