ini:
- update ftp lib to 0.9.5
- remove all board configs

config:
- add ntp server seetting
- add board config

code:
- add board finder
- NO_GLOBAL_INSTANCES
- ntp server config
- modem config update (not found bugs fixed)

libs:
- update common lib
- update ntp lib
This commit is contained in:
Peter Buchegger 2020-12-17 22:13:06 +01:00
parent 42d735fade
commit 7a0f3661dc
6 changed files with 142 additions and 124 deletions

View file

@ -53,5 +53,6 @@
"user": [ "user": [
{ "name":"ftp", "password":"ftp" } { "name":"ftp", "password":"ftp" }
] ]
} },
"ntp_server": "pool.ntp.org"
} }

@ -1 +1 @@
Subproject commit 3a244e533140c3447a081e032614b6684d433499 Subproject commit b93d7b8a5bcab57d4bf453ba6ce1352b61e5cd37

View file

@ -12,7 +12,7 @@ lib_deps =
sandeepmistry/LoRa @ 0.7.2 sandeepmistry/LoRa @ 0.7.2
peterus/APRS-Decoder-Lib @ 0.0.5 peterus/APRS-Decoder-Lib @ 0.0.5
peterus/APRS-IS-Lib @ 0.0.7 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_tool = cppcheck
check_flags = check_flags =
cppcheck: --suppress=*:*.pio\* --inline-suppr lib/common/src cppcheck: --suppress=*:*.pio\* --inline-suppr lib/common/src
@ -21,38 +21,7 @@ monitor_flags = --raw
#upload_protocol = espota #upload_protocol = espota
#upload_port = <CALLSIGN>.local #upload_port = <CALLSIGN>.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] [env:lora_board]
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]
board = esp32doit-devkit-v1 board = esp32doit-devkit-v1
build_flags = -Werror -Wall -DTRACKERD build_flags = -Werror -Wall -DNO_GLOBAL_INSTANCES
[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

View file

@ -12,17 +12,19 @@
#include <FTPFilesystem.h> #include <FTPFilesystem.h>
#include "logger.h" #include "logger.h"
#include "BoardFinder.h"
#include "LoRa_APRS.h" #include "LoRa_APRS.h"
#include "pins.h" #include "pins.h"
#include "display.h" #include "display.h"
#include "project_configuration.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" #include "power_management.h"
PowerManagement powerManagement; PowerManagement powerManagement;
#endif
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
hw_timer_t * timer = NULL; hw_timer_t * timer = NULL;
@ -33,11 +35,12 @@ volatile uint secondsSinceDisplay = 0;
WiFiMulti WiFiMulti; WiFiMulti WiFiMulti;
WiFiUDP ntpUDP; WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, 60*60); NTPClient * timeClient;
FTPServer ftpServer; FTPServer ftpServer;
Configuration * Config; Configuration * Config;
std::shared_ptr<BoardConfig> boardConfig;
APRS_IS * aprs_is = 0; APRS_IS * aprs_is = 0;
LoRa_APRS lora_aprs; LoRa_APRS * lora_aprs;
std::shared_ptr<APRSMessage> BeaconMsg; std::shared_ptr<APRSMessage> BeaconMsg;
volatile bool eth_connected = false; volatile bool eth_connected = false;
@ -45,11 +48,8 @@ volatile bool eth_connected = false;
String create_lat_aprs(double lat); String create_lat_aprs(double lat);
String create_long_aprs(double lng); String create_long_aprs(double lng);
#ifdef ETH_BOARD
void setup_eth(); void setup_eth();
#else
void setup_wifi(); void setup_wifi();
#endif
void load_config(); void load_config();
void setup_wifi(); void setup_wifi();
@ -66,52 +66,83 @@ std::map<uint, std::shared_ptr<APRSMessage>> lastMessages;
void setup() void setup()
{ {
Serial.begin(115200); Serial.begin(115200);
Logger::instance().setSerial(&Serial);
#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
delay(500); delay(500);
logPrintlnA("LoRa APRS iGate & Digi by OE5BPA (Peter Buchegger)");
logPrintlnA("Version: 20.49.0-dev"); ProjectConfigurationManagement confmg;
setup_display(); 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); show_display("OE5BPA", "LoRa APRS iGate & Digi", "by Peter Buchegger", "20.49.0-dev", 3000);
load_config(); load_config();
setup_lora(); setup_lora();
#ifdef ETH_BOARD timeClient = new NTPClient(ntpUDP, Config->ntpServer.c_str());
setup_eth(); if(boardConfig->Type == eETH_BOARD)
setup_ota();
setup_ntp();
setup_ftp();
setup_aprs_is();
#else
if(Config->wifi.active)
{ {
setup_wifi(); setup_eth();
setup_ota(); setup_ota();
setup_ntp(); setup_ntp();
setup_ftp(); setup_ftp();
setup_aprs_is();
} }
else else
{ {
// make sure wifi and bt is off if we don't need it: if(Config->wifi.active)
WiFi.mode(WIFI_OFF); {
btStop(); 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(); setup_timer();
if(Config->display.overwritePin != 0) if(Config->display.overwritePin != 0)
@ -133,7 +164,7 @@ void loop()
{ {
secondsSinceDisplay = 0; secondsSinceDisplay = 0;
display_is_on = true; display_is_on = true;
setup_display(); setup_display(boardConfig);
} else } else
if(!Config->display.alwaysOn && secondsSinceDisplay > Config->display.timeout && display_is_on) 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 || eth_connected) ArduinoOTA.handle();
if(Config->wifi.active && WiFiMulti.run() != WL_CONNECTED) 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!"); logPrintlnE("WiFi not connected!");
show_display("ERROR", "WiFi not connected!"); show_display("ERROR", "WiFi not connected!");
delay(1000); delay(1000);
@ -186,7 +217,7 @@ void loop()
} }
if((eth_connected && !aprs_is->connected()) || (Config->aprs_is.active && !aprs_is->connected())) 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("connecting to APRS-IS server: ");
logPrintI(Config->aprs_is.server); logPrintI(Config->aprs_is.server);
logPrintI(" on port: "); logPrintI(" on port: ");
@ -205,22 +236,22 @@ void loop()
if(Config->aprs_is.active && aprs_is->available() > 0) if(Config->aprs_is.active && aprs_is->available() > 0)
{ {
String str = aprs_is->getMessage(); String str = aprs_is->getMessage();
logPrintD("[" + timeClient.getFormattedTime() + "] "); logPrintD("[" + timeClient->getFormattedTime() + "] ");
logPrintlnD(str); logPrintlnD(str);
} }
if(lora_aprs.hasMessage()) if(lora_aprs->hasMessage())
{ {
std::shared_ptr<APRSMessage> msg = lora_aprs.getMessage(); std::shared_ptr<APRSMessage> msg = lora_aprs->getMessage();
setup_display(); secondsSinceDisplay = 0; display_is_on = true; 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()); show_display(Config->callsign, timeClient->getFormattedTime() + " LoRa", "RSSI: " + String(lora_aprs->packetRssi()) + ", SNR: " + String(lora_aprs->packetSnr()), msg->toString());
logPrintD("[" + timeClient.getFormattedTime() + "] "); logPrintD("[" + timeClient->getFormattedTime() + "] ");
logPrintD(" Received packet '"); logPrintD(" Received packet '");
logPrintD(msg->toString()); logPrintD(msg->toString());
logPrintD("' with RSSI "); logPrintD("' with RSSI ");
logPrintD(String(lora_aprs.packetRssi())); logPrintD(String(lora_aprs->packetRssi()));
logPrintD(" and SNR "); logPrintD(" and SNR ");
logPrintlnD(String(lora_aprs.packetSnr())); logPrintlnD(String(lora_aprs->packetSnr()));
if(Config->aprs_is.active) if(Config->aprs_is.active)
{ {
@ -233,9 +264,9 @@ void loop()
logPrintD("Message already received as repeater: '"); logPrintD("Message already received as repeater: '");
logPrintD(msg->toString()); logPrintD(msg->toString());
logPrintD("' with RSSI "); logPrintD("' with RSSI ");
logPrintD(String(lora_aprs.packetRssi())); logPrintD(String(lora_aprs->packetRssi()));
logPrintD(" and SNR "); logPrintD(" and SNR ");
logPrintlnD(String(lora_aprs.packetSnr())); logPrintlnD(String(lora_aprs->packetSnr()));
return; return;
} }
@ -253,16 +284,16 @@ void loop()
if(foundMsg == lastMessages.end()) if(foundMsg == lastMessages.end())
{ {
setup_display(); secondsSinceDisplay = 0; display_is_on = true; 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); show_display(Config->callsign, "RSSI: " + String(lora_aprs->packetRssi()) + ", SNR: " + String(lora_aprs->packetSnr()), msg->toString(), 0);
logPrintD("Received packet '"); logPrintD("Received packet '");
logPrintD(msg->toString()); logPrintD(msg->toString());
logPrintD("' with RSSI "); logPrintD("' with RSSI ");
logPrintD(String(lora_aprs.packetRssi())); logPrintD(String(lora_aprs->packetRssi()));
logPrintD(" and SNR "); logPrintD(" and SNR ");
logPrintlnD(String(lora_aprs.packetSnr())); logPrintlnD(String(lora_aprs->packetSnr()));
msg->setPath(String(Config->callsign) + "*"); msg->setPath(String(Config->callsign) + "*");
lora_aprs.sendMessage(msg); lora_aprs->sendMessage(msg);
lastMessages.insert({secondsSinceStartup, msg}); lastMessages.insert({secondsSinceStartup, msg});
} }
else else
@ -270,9 +301,9 @@ void loop()
logPrintD("Message already received (timeout): '"); logPrintD("Message already received (timeout): '");
logPrintD(msg->toString()); logPrintD(msg->toString());
logPrintD("' with RSSI "); logPrintD("' with RSSI ");
logPrintD(String(lora_aprs.packetRssi())); logPrintD(String(lora_aprs->packetRssi()));
logPrintD(" and SNR "); logPrintD(" and SNR ");
logPrintlnD(String(lora_aprs.packetSnr())); logPrintlnD(String(lora_aprs->packetSnr()));
} }
return; return;
} }
@ -294,20 +325,20 @@ void loop()
if(beacon_digi) if(beacon_digi)
{ {
beacon_digi = false; 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..."); show_display(Config->callsign, "Beacon to HF...");
logPrintD("[" + timeClient.getFormattedTime() + "] "); logPrintD("[" + timeClient->getFormattedTime() + "] ");
logPrintlnD(BeaconMsg->encode()); logPrintlnD(BeaconMsg->encode());
lora_aprs.sendMessage(BeaconMsg); lora_aprs->sendMessage(BeaconMsg);
logPrintlnD("finished TXing..."); logPrintlnD("finished TXing...");
show_display(Config->callsign, "Standby..."); show_display(Config->callsign, "Standby...");
} }
if(beacon_aprs_is) if(beacon_aprs_is)
{ {
beacon_aprs_is = false; 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..."); show_display(Config->callsign, "Beacon to APRS-IS Server...");
logPrintD("[" + timeClient.getFormattedTime() + "] "); logPrintD("[" + timeClient->getFormattedTime() + "] ");
logPrintlnD(BeaconMsg->encode()); logPrintlnD(BeaconMsg->encode());
aprs_is->sendMessage(BeaconMsg); aprs_is->sendMessage(BeaconMsg);
show_display(Config->callsign, "Standby..."); show_display(Config->callsign, "Standby...");
@ -326,15 +357,13 @@ void load_config()
{} {}
} }
#ifndef ETH_BOARD if(boardConfig->Type != eETH_BOARD && Config->aprs_is.active && !Config->wifi.active)
if(Config->aprs_is.active && !Config->wifi.active)
{ {
logPrintlnE("You have to activate Wifi for APRS IS to work, please check your settings!"); 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!"); show_display("ERROR", "You have to activate Wifi for APRS IS to work, please check your settings!");
while (true) while (true)
{} {}
} }
#endif
if(KEY_BUILTIN != 0 && Config->display.overwritePin == 0) if(KEY_BUILTIN != 0 && Config->display.overwritePin == 0)
{ {
@ -343,7 +372,6 @@ void load_config()
logPrintlnI("Configuration loaded!"); logPrintlnI("Configuration loaded!");
} }
#ifdef ETH_BOARD
void WiFiEvent(WiFiEvent_t event) void WiFiEvent(WiFiEvent_t event)
{ {
switch (event) { switch (event) {
@ -384,14 +412,23 @@ void setup_eth()
{ {
WiFi.onEvent(WiFiEvent); WiFi.onEvent(WiFiEvent);
pinMode(NRST, OUTPUT); #define ETH_POWER_PIN -1
digitalWrite(NRST, 0); #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); delay(200);
digitalWrite(NRST, 1); digitalWrite(ETH_NRST, 1);
delay(200); delay(200);
digitalWrite(NRST, 0); digitalWrite(ETH_NRST, 0);
delay(200); 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); ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE, ETH_CLK);
while(!eth_connected) while(!eth_connected)
@ -399,7 +436,7 @@ void setup_eth()
sleep(1); sleep(1);
} }
} }
#else
void setup_wifi() void setup_wifi()
{ {
WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
@ -422,7 +459,6 @@ void setup_wifi()
logPrintlnD(WiFi.localIP().toString()); logPrintlnD(WiFi.localIP().toString());
show_display("INFO", "WiFi connected", "IP: ", WiFi.localIP().toString(), 2000); show_display("INFO", "WiFi connected", "IP: ", WiFi.localIP().toString(), 2000);
} }
#endif
void setup_ota() void setup_ota()
{ {
@ -466,18 +502,20 @@ void setup_ota()
void setup_lora() void setup_lora()
{ {
lora_aprs.setRxFrequency(Config->lora.frequencyRx); lora_aprs = new LoRa_APRS(boardConfig);
lora_aprs.setTxFrequency(Config->lora.frequencyTx); if (!lora_aprs->begin(lora_aprs->getRxFrequency()))
if (!lora_aprs.begin(lora_aprs.getRxFrequency()))
{ {
logPrintlnE("Starting LoRa failed!"); logPrintlnE("Starting LoRa failed!");
show_display("ERROR", "Starting LoRa failed!"); show_display("ERROR", "Starting LoRa failed!");
while (1); while (1);
} }
lora_aprs.setTxPower(Config->lora.power); lora_aprs->setRxFrequency(Config->lora.frequencyRx);
lora_aprs.setSpreadingFactor(Config->lora.spreadingFactor); lora_aprs->setTxFrequency(Config->lora.frequencyTx);
lora_aprs.setSignalBandwidth(Config->lora.signalBandwidth); lora_aprs->setTxPower(Config->lora.power);
lora_aprs.setCodingRate4(Config->lora.codingRate4); 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!"); logPrintlnI("LoRa init done!");
show_display("INFO", "LoRa init done!", 2000); show_display("INFO", "LoRa init done!", 2000);
@ -491,8 +529,8 @@ void setup_lora()
void setup_ntp() void setup_ntp()
{ {
timeClient.begin(); timeClient->begin();
while(!timeClient.forceUpdate()) while(!timeClient->forceUpdate())
{ {
logPrintlnW("NTP Client force update issue! Waiting 1 sek..."); logPrintlnW("NTP Client force update issue! Waiting 1 sek...");
show_display("WARN", "NTP Client force update issue! Waiting 1 sek...", 1000); show_display("WARN", "NTP Client force update issue! Waiting 1 sek...", 1000);

View file

@ -61,6 +61,11 @@ Configuration * ProjectConfigurationManagement::readProjectConfiguration(Dynamic
us.password = "ftp"; us.password = "ftp";
conf->ftp.users.push_back(us); conf->ftp.users.push_back(us);
} }
if(data.containsKey("ntp_server"))
conf->ntpServer = data["ntp_server"].as<String>();
if(data.containsKey("board"))
conf->board = data["board"].as<String>();
return conf; return conf;
} }
@ -106,4 +111,7 @@ void ProjectConfigurationManagement::writeProjectConfiguration(Configuration * c
v["name"] = u.name; v["name"] = u.name;
v["password"] = u.password; v["password"] = u.password;
} }
data["ntp_server"] = conf->ntpServer;
data["board"] = conf->board;
} }

View file

@ -95,7 +95,7 @@ public:
std::list<User> users; std::list<User> users;
}; };
Configuration() : callsign("NOCALL-10") {}; Configuration() : callsign("NOCALL-10"), board(""), ntpServer("pool.ntp.org") {};
String callsign; String callsign;
Wifi wifi; Wifi wifi;
@ -105,6 +105,8 @@ public:
LoRa lora; LoRa lora;
Display display; Display display;
Ftp ftp; Ftp ftp;
String board;
String ntpServer;
}; };
class ProjectConfigurationManagement : public ConfigurationManagement class ProjectConfigurationManagement : public ConfigurationManagement