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": [
{ "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
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 = <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]
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

View file

@ -12,17 +12,19 @@
#include <FTPFilesystem.h>
#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> boardConfig;
APRS_IS * aprs_is = 0;
LoRa_APRS lora_aprs;
LoRa_APRS * lora_aprs;
std::shared_ptr<APRSMessage> 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<uint, std::shared_ptr<APRSMessage>> 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<APRSMessage> msg = lora_aprs.getMessage();
std::shared_ptr<APRSMessage> 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);

View file

@ -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<String>();
if(data.containsKey("board"))
conf->board = data["board"].as<String>();
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;
}

View file

@ -95,7 +95,7 @@ public:
std::list<User> 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