diff --git a/data/is-cfg.json b/data/is-cfg.json index 8c3ed65..0fdfdb5 100644 --- a/data/is-cfg.json +++ b/data/is-cfg.json @@ -53,5 +53,6 @@ "user": [ { "name":"ftp", "password":"ftp" } ] - } + }, + "ntp_server": "pool.ntp.org" } diff --git a/lib/common b/lib/common index 3a244e5..b93d7b8 160000 --- a/lib/common +++ b/lib/common @@ -1 +1 @@ -Subproject commit 3a244e533140c3447a081e032614b6684d433499 +Subproject commit b93d7b8a5bcab57d4bf453ba6ce1352b61e5cd37 diff --git a/platformio.ini b/platformio.ini index 847f21e..e3808e9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,7 @@ lib_deps = sandeepmistry/LoRa @ 0.7.2 peterus/APRS-Decoder-Lib @ 0.0.5 peterus/APRS-IS-Lib @ 0.0.7 - peterus/ESP-FTP-Server-Lib @ 0.9.4 + peterus/ESP-FTP-Server-Lib @ 0.9.5 check_tool = cppcheck check_flags = cppcheck: --suppress=*:*.pio\* --inline-suppr lib/common/src @@ -21,38 +21,7 @@ monitor_flags = --raw #upload_protocol = espota #upload_port = .local -[env:heltec_wifi_lora_32_v1] -board = ttgo-lora32-v1 -build_flags = -Werror -Wall -DHELTEC_WIFI_LORA_32_V1 -[env:heltec_wifi_lora_32_v2] -board = ttgo-lora32-v1 -build_flags = -Werror -Wall -DHELTEC_WIFI_LORA_32_V2 - -[env:ttgo-lora32-v1] -board = ttgo-lora32-v1 -build_flags = -Werror -Wall -DTTGO_LORA32_V1 - -[env:ttgo-lora32-v2] -board = ttgo-lora32-v1 -build_flags = -Werror -Wall -DTTGO_LORA32_V2 - -[env:ttgo-t-beam-v1] -board = ttgo-t-beam -build_flags = -Werror -Wall -DTTGO_T_Beam_V1_0 - -[env:ttgo-t-beam-v0_7] -board = ttgo-t-beam -build_flags = -Werror -Wall -DTTGO_T_Beam_V0_7 - -[env:TrackerD-OE1ACM] +[env:lora_board] board = esp32doit-devkit-v1 -build_flags = -Werror -Wall -DTRACKERD - -[env:ttgo-poe-v1_0] -board = esp32doit-devkit-v1 -build_flags = -Werror -Wall -DETH_BOARD -DETH_BOARD_V1_0 - -[env:ttgo-poe-v1_2] -board = esp32doit-devkit-v1 -build_flags = -Werror -Wall -DETH_BOARD -DETH_BOARD_V1_2 +build_flags = -Werror -Wall -DNO_GLOBAL_INSTANCES diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index bde09dc..431337e 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -12,17 +12,19 @@ #include #include "logger.h" - +#include "BoardFinder.h" #include "LoRa_APRS.h" - #include "pins.h" #include "display.h" #include "project_configuration.h" -#if defined(ARDUINO_T_Beam) && !defined(ARDUINO_T_Beam_V0_7) +#ifdef NO_GLOBAL_INSTANCES +HardwareSerial Serial(0); +ArduinoOTAClass ArduinoOTA; +#endif + #include "power_management.h" PowerManagement powerManagement; -#endif portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; hw_timer_t * timer = NULL; @@ -33,11 +35,12 @@ volatile uint secondsSinceDisplay = 0; WiFiMulti WiFiMulti; WiFiUDP ntpUDP; -NTPClient timeClient(ntpUDP, 60*60); +NTPClient * timeClient; FTPServer ftpServer; Configuration * Config; +std::shared_ptr boardConfig; APRS_IS * aprs_is = 0; -LoRa_APRS lora_aprs; +LoRa_APRS * lora_aprs; std::shared_ptr BeaconMsg; volatile bool eth_connected = false; @@ -45,11 +48,8 @@ volatile bool eth_connected = false; String create_lat_aprs(double lat); String create_long_aprs(double lng); -#ifdef ETH_BOARD void setup_eth(); -#else void setup_wifi(); -#endif void load_config(); void setup_wifi(); @@ -66,52 +66,83 @@ std::map> lastMessages; void setup() { Serial.begin(115200); - -#if defined(ARDUINO_T_Beam) && !defined(ARDUINO_T_Beam_V0_7) - Wire.begin(SDA, SCL); - if (!powerManagement.begin(Wire)) - { - logPrintlnI("AXP192 init done!"); - } - else - { - logPrintlnE("AXP192 init failed!"); - } - powerManagement.activateLoRa(); - powerManagement.activateOLED(); - powerManagement.deactivateGPS(); -#endif - + Logger::instance().setSerial(&Serial); delay(500); - logPrintlnA("LoRa APRS iGate & Digi by OE5BPA (Peter Buchegger)"); - logPrintlnA("Version: 20.49.0-dev"); - setup_display(); + + ProjectConfigurationManagement confmg; + Config = confmg.readConfiguration(); + + BoardFinder finder; + boardConfig = finder.getBoardConfig(Config->board); + if(boardConfig == 0) + { + boardConfig = finder.searchBoardConfig(); + if(boardConfig == 0) + { + logPrintlnE("Board config not set and search failed!"); + while (true) + { + } + } + Config->board = boardConfig->Name; + confmg.writeConfiguration(Config); + logPrintlnI("will restart board now!"); + ESP.restart(); + } + logPrintI("Board "); + logPrintI(boardConfig->Name); + logPrintlnI(" loaded."); + + if(boardConfig->Type == eTTGO_T_Beam_V1_0) + { + TwoWire wire(0); + wire.begin(boardConfig->OledSda, boardConfig->OledScl); + if (!powerManagement.begin(wire)) + { + logPrintlnI("AXP192 init done!"); + } + else + { + logPrintlnE("AXP192 init failed!"); + } + powerManagement.activateLoRa(); + powerManagement.activateOLED(); + powerManagement.deactivateGPS(); + } + + logPrintlnW("LoRa APRS iGate & Digi by OE5BPA (Peter Buchegger)"); + logPrintlnW("Version: 20.49.0-dev"); + setup_display(boardConfig); show_display("OE5BPA", "LoRa APRS iGate & Digi", "by Peter Buchegger", "20.49.0-dev", 3000); load_config(); setup_lora(); -#ifdef ETH_BOARD - setup_eth(); - setup_ota(); - setup_ntp(); - setup_ftp(); - setup_aprs_is(); -#else - if(Config->wifi.active) + timeClient = new NTPClient(ntpUDP, Config->ntpServer.c_str()); + if(boardConfig->Type == eETH_BOARD) { - setup_wifi(); + setup_eth(); setup_ota(); setup_ntp(); setup_ftp(); + setup_aprs_is(); } else { - // make sure wifi and bt is off if we don't need it: - WiFi.mode(WIFI_OFF); - btStop(); + if(Config->wifi.active) + { + setup_wifi(); + setup_ota(); + setup_ntp(); + setup_ftp(); + } + else + { + // make sure wifi and bt is off if we don't need it: + WiFi.mode(WIFI_OFF); + btStop(); + } + if(Config->aprs_is.active) setup_aprs_is(); } - if(Config->aprs_is.active) setup_aprs_is(); -#endif setup_timer(); if(Config->display.overwritePin != 0) @@ -133,7 +164,7 @@ void loop() { secondsSinceDisplay = 0; display_is_on = true; - setup_display(); + setup_display(boardConfig); } else if(!Config->display.alwaysOn && secondsSinceDisplay > Config->display.timeout && display_is_on) { @@ -178,7 +209,7 @@ void loop() if(Config->wifi.active || eth_connected) ArduinoOTA.handle(); if(Config->wifi.active && WiFiMulti.run() != WL_CONNECTED) { - setup_display(); secondsSinceDisplay = 0; display_is_on = true; + setup_display(boardConfig); secondsSinceDisplay = 0; display_is_on = true; logPrintlnE("WiFi not connected!"); show_display("ERROR", "WiFi not connected!"); delay(1000); @@ -186,7 +217,7 @@ void loop() } if((eth_connected && !aprs_is->connected()) || (Config->aprs_is.active && !aprs_is->connected())) { - setup_display(); secondsSinceDisplay = 0; display_is_on = true; + setup_display(boardConfig); secondsSinceDisplay = 0; display_is_on = true; logPrintI("connecting to APRS-IS server: "); logPrintI(Config->aprs_is.server); logPrintI(" on port: "); @@ -205,22 +236,22 @@ void loop() if(Config->aprs_is.active && aprs_is->available() > 0) { String str = aprs_is->getMessage(); - logPrintD("[" + timeClient.getFormattedTime() + "] "); + logPrintD("[" + timeClient->getFormattedTime() + "] "); logPrintlnD(str); } - if(lora_aprs.hasMessage()) + if(lora_aprs->hasMessage()) { - std::shared_ptr msg = lora_aprs.getMessage(); + std::shared_ptr msg = lora_aprs->getMessage(); - setup_display(); secondsSinceDisplay = 0; display_is_on = true; - show_display(Config->callsign, timeClient.getFormattedTime() + " LoRa", "RSSI: " + String(lora_aprs.packetRssi()) + ", SNR: " + String(lora_aprs.packetSnr()), msg->toString()); - logPrintD("[" + timeClient.getFormattedTime() + "] "); + setup_display(boardConfig); secondsSinceDisplay = 0; display_is_on = true; + show_display(Config->callsign, timeClient->getFormattedTime() + " LoRa", "RSSI: " + String(lora_aprs->packetRssi()) + ", SNR: " + String(lora_aprs->packetSnr()), msg->toString()); + logPrintD("[" + timeClient->getFormattedTime() + "] "); logPrintD(" Received packet '"); logPrintD(msg->toString()); logPrintD("' with RSSI "); - logPrintD(String(lora_aprs.packetRssi())); + logPrintD(String(lora_aprs->packetRssi())); logPrintD(" and SNR "); - logPrintlnD(String(lora_aprs.packetSnr())); + logPrintlnD(String(lora_aprs->packetSnr())); if(Config->aprs_is.active) { @@ -233,9 +264,9 @@ void loop() logPrintD("Message already received as repeater: '"); logPrintD(msg->toString()); logPrintD("' with RSSI "); - logPrintD(String(lora_aprs.packetRssi())); + logPrintD(String(lora_aprs->packetRssi())); logPrintD(" and SNR "); - logPrintlnD(String(lora_aprs.packetSnr())); + logPrintlnD(String(lora_aprs->packetSnr())); return; } @@ -253,16 +284,16 @@ void loop() if(foundMsg == lastMessages.end()) { - setup_display(); secondsSinceDisplay = 0; display_is_on = true; - show_display(Config->callsign, "RSSI: " + String(lora_aprs.packetRssi()) + ", SNR: " + String(lora_aprs.packetSnr()), msg->toString(), 0); + setup_display(boardConfig); secondsSinceDisplay = 0; display_is_on = true; + show_display(Config->callsign, "RSSI: " + String(lora_aprs->packetRssi()) + ", SNR: " + String(lora_aprs->packetSnr()), msg->toString(), 0); logPrintD("Received packet '"); logPrintD(msg->toString()); logPrintD("' with RSSI "); - logPrintD(String(lora_aprs.packetRssi())); + logPrintD(String(lora_aprs->packetRssi())); logPrintD(" and SNR "); - logPrintlnD(String(lora_aprs.packetSnr())); + logPrintlnD(String(lora_aprs->packetSnr())); msg->setPath(String(Config->callsign) + "*"); - lora_aprs.sendMessage(msg); + lora_aprs->sendMessage(msg); lastMessages.insert({secondsSinceStartup, msg}); } else @@ -270,9 +301,9 @@ void loop() logPrintD("Message already received (timeout): '"); logPrintD(msg->toString()); logPrintD("' with RSSI "); - logPrintD(String(lora_aprs.packetRssi())); + logPrintD(String(lora_aprs->packetRssi())); logPrintD(" and SNR "); - logPrintlnD(String(lora_aprs.packetSnr())); + logPrintlnD(String(lora_aprs->packetSnr())); } return; } @@ -294,20 +325,20 @@ void loop() if(beacon_digi) { beacon_digi = false; - setup_display(); secondsSinceDisplay = 0; display_is_on = true; + setup_display(boardConfig); secondsSinceDisplay = 0; display_is_on = true; show_display(Config->callsign, "Beacon to HF..."); - logPrintD("[" + timeClient.getFormattedTime() + "] "); + logPrintD("[" + timeClient->getFormattedTime() + "] "); logPrintlnD(BeaconMsg->encode()); - lora_aprs.sendMessage(BeaconMsg); + lora_aprs->sendMessage(BeaconMsg); logPrintlnD("finished TXing..."); show_display(Config->callsign, "Standby..."); } if(beacon_aprs_is) { beacon_aprs_is = false; - setup_display(); secondsSinceDisplay = 0; display_is_on = true; + setup_display(boardConfig); secondsSinceDisplay = 0; display_is_on = true; show_display(Config->callsign, "Beacon to APRS-IS Server..."); - logPrintD("[" + timeClient.getFormattedTime() + "] "); + logPrintD("[" + timeClient->getFormattedTime() + "] "); logPrintlnD(BeaconMsg->encode()); aprs_is->sendMessage(BeaconMsg); show_display(Config->callsign, "Standby..."); @@ -326,15 +357,13 @@ void load_config() {} } -#ifndef ETH_BOARD - if(Config->aprs_is.active && !Config->wifi.active) + if(boardConfig->Type != eETH_BOARD && Config->aprs_is.active && !Config->wifi.active) { logPrintlnE("You have to activate Wifi for APRS IS to work, please check your settings!"); show_display("ERROR", "You have to activate Wifi for APRS IS to work, please check your settings!"); while (true) {} } -#endif if(KEY_BUILTIN != 0 && Config->display.overwritePin == 0) { @@ -343,7 +372,6 @@ void load_config() logPrintlnI("Configuration loaded!"); } -#ifdef ETH_BOARD void WiFiEvent(WiFiEvent_t event) { switch (event) { @@ -384,14 +412,23 @@ void setup_eth() { WiFi.onEvent(WiFiEvent); - pinMode(NRST, OUTPUT); - digitalWrite(NRST, 0); + #define ETH_POWER_PIN -1 + #define ETH_TYPE ETH_PHY_LAN8720 + #define ETH_ADDR 0 + #define ETH_MDC_PIN 23 + #define ETH_MDIO_PIN 18 + #define ETH_NRST 5 + #define ETH_CLK ETH_CLOCK_GPIO17_OUT // TTGO PoE V1.0 + //#define ETH_CLK ETH_CLOCK_GPIO0_OUT // TTGO PoE V1.2 + + pinMode(ETH_NRST, OUTPUT); + digitalWrite(ETH_NRST, 0); delay(200); - digitalWrite(NRST, 1); + digitalWrite(ETH_NRST, 1); delay(200); - digitalWrite(NRST, 0); + digitalWrite(ETH_NRST, 0); delay(200); - digitalWrite(NRST, 1); + digitalWrite(ETH_NRST, 1); ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE, ETH_CLK); while(!eth_connected) @@ -399,7 +436,7 @@ void setup_eth() sleep(1); } } -#else + void setup_wifi() { WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); @@ -422,7 +459,6 @@ void setup_wifi() logPrintlnD(WiFi.localIP().toString()); show_display("INFO", "WiFi connected", "IP: ", WiFi.localIP().toString(), 2000); } -#endif void setup_ota() { @@ -466,18 +502,20 @@ void setup_ota() void setup_lora() { - lora_aprs.setRxFrequency(Config->lora.frequencyRx); - lora_aprs.setTxFrequency(Config->lora.frequencyTx); - if (!lora_aprs.begin(lora_aprs.getRxFrequency())) + lora_aprs = new LoRa_APRS(boardConfig); + if (!lora_aprs->begin(lora_aprs->getRxFrequency())) { logPrintlnE("Starting LoRa failed!"); show_display("ERROR", "Starting LoRa failed!"); while (1); } - lora_aprs.setTxPower(Config->lora.power); - lora_aprs.setSpreadingFactor(Config->lora.spreadingFactor); - lora_aprs.setSignalBandwidth(Config->lora.signalBandwidth); - lora_aprs.setCodingRate4(Config->lora.codingRate4); + lora_aprs->setRxFrequency(Config->lora.frequencyRx); + lora_aprs->setTxFrequency(Config->lora.frequencyTx); + lora_aprs->setTxPower(Config->lora.power); + lora_aprs->setSpreadingFactor(Config->lora.spreadingFactor); + lora_aprs->setSignalBandwidth(Config->lora.signalBandwidth); + lora_aprs->setCodingRate4(Config->lora.codingRate4); + lora_aprs->enableCrc(); logPrintlnI("LoRa init done!"); show_display("INFO", "LoRa init done!", 2000); @@ -491,8 +529,8 @@ void setup_lora() void setup_ntp() { - timeClient.begin(); - while(!timeClient.forceUpdate()) + timeClient->begin(); + while(!timeClient->forceUpdate()) { logPrintlnW("NTP Client force update issue! Waiting 1 sek..."); show_display("WARN", "NTP Client force update issue! Waiting 1 sek...", 1000); diff --git a/src/project_configuration.cpp b/src/project_configuration.cpp index 6cfaec8..4adc06d 100644 --- a/src/project_configuration.cpp +++ b/src/project_configuration.cpp @@ -61,6 +61,11 @@ Configuration * ProjectConfigurationManagement::readProjectConfiguration(Dynamic us.password = "ftp"; conf->ftp.users.push_back(us); } + if(data.containsKey("ntp_server")) + conf->ntpServer = data["ntp_server"].as(); + + if(data.containsKey("board")) + conf->board = data["board"].as(); return conf; } @@ -106,4 +111,7 @@ void ProjectConfigurationManagement::writeProjectConfiguration(Configuration * c v["name"] = u.name; v["password"] = u.password; } + data["ntp_server"] = conf->ntpServer; + + data["board"] = conf->board; } diff --git a/src/project_configuration.h b/src/project_configuration.h index 1e8a71a..65cd6bb 100644 --- a/src/project_configuration.h +++ b/src/project_configuration.h @@ -95,7 +95,7 @@ public: std::list users; }; - Configuration() : callsign("NOCALL-10") {}; + Configuration() : callsign("NOCALL-10"), board(""), ntpServer("pool.ntp.org") {}; String callsign; Wifi wifi; @@ -105,6 +105,8 @@ public: LoRa lora; Display display; Ftp ftp; + String board; + String ntpServer; }; class ProjectConfigurationManagement : public ConfigurationManagement