2023-02-18 10:51:39 +00:00
# ifndef UNIT_TEST
2020-10-11 22:09:34 +00:00
# include <map>
2023-10-22 10:39:20 +00:00
# include <esp_task_wdt.h>
# include <logger.h>
2023-09-23 13:37:35 +00:00
# include "APRS-IS/APRS-IS.h"
2023-10-22 10:39:20 +00:00
# include "Board.h"
2023-09-23 13:37:35 +00:00
# include "PowerManagement/power_management.h"
# include "System/System.h"
# include "System/TaskManager.h"
2020-03-18 18:49:59 +00:00
2021-01-03 21:43:35 +00:00
# include "TaskAprsIs.h"
2022-03-20 12:39:45 +00:00
# include "TaskBeacon.h"
2021-01-19 22:12:55 +00:00
# include "TaskDisplay.h"
2021-01-03 21:43:35 +00:00
# include "TaskEth.h"
# include "TaskFTP.h"
2022-02-24 15:02:28 +00:00
# include "TaskMQTT.h"
2021-01-03 21:43:35 +00:00
# include "TaskNTP.h"
# include "TaskOTA.h"
2022-04-02 01:38:51 +00:00
# include "TaskRadiolib.h"
2021-05-15 20:58:15 +00:00
# include "TaskRouter.h"
2021-05-15 21:10:24 +00:00
# include "TaskWifi.h"
2021-03-12 22:21:45 +00:00
# include "project_configuration.h"
2020-10-11 22:09:34 +00:00
2023-08-06 20:54:20 +00:00
# define VERSION "23.31.01"
2022-03-19 23:03:43 +00:00
# define MODULE_NAME "Main"
2021-01-30 21:47:24 +00:00
2020-10-11 22:09:34 +00:00
String create_lat_aprs ( double lat ) ;
String create_long_aprs ( double lng ) ;
2020-03-19 12:29:21 +00:00
2021-05-15 20:58:15 +00:00
TaskQueue < std : : shared_ptr < APRSMessage > > toAprsIs ;
TaskQueue < std : : shared_ptr < APRSMessage > > fromModem ;
2021-05-24 13:12:31 +00:00
TaskQueue < std : : shared_ptr < APRSMessage > > toModem ;
2022-02-23 18:40:31 +00:00
TaskQueue < std : : shared_ptr < APRSMessage > > toMQTT ;
2021-05-15 20:58:15 +00:00
2021-05-18 23:29:08 +00:00
System LoRaSystem ;
Configuration userConfig ;
2021-05-18 23:01:10 +00:00
2023-09-27 19:31:35 +00:00
# ifdef HAS_AXP192
AXP192 axp ;
PowerManagement * powerManagement = & axp ;
# endif
# ifdef HAS_AXP2101
AXP2101 axp ;
PowerManagement * powerManagement = & axp ;
# endif
2021-05-18 23:01:10 +00:00
DisplayTask displayTask ;
2023-04-28 16:01:50 +00:00
// ModemTask modemTask(fromModem, toModem);
2022-04-02 01:20:16 +00:00
RadiolibTask modemTask ( fromModem , toModem ) ;
EthTask ethTask ;
WifiTask wifiTask ;
OTATask otaTask ;
NTPTask ntpTask ;
FTPTask ftpTask ;
MQTTTask mqttTask ( toMQTT ) ;
2023-04-20 15:46:56 +00:00
AprsIsTask aprsIsTask ( toAprsIs , toModem ) ;
2022-04-02 01:20:16 +00:00
RouterTask routerTask ( fromModem , toModem , toAprsIs , toMQTT ) ;
BeaconTask beaconTask ( toModem , toAprsIs ) ;
2021-05-18 23:01:10 +00:00
2021-03-12 22:21:45 +00:00
void setup ( ) {
Serial . begin ( 115200 ) ;
2022-03-19 23:03:43 +00:00
LoRaSystem . getLogger ( ) . setSerial ( & Serial ) ;
2022-03-20 00:03:42 +00:00
setWiFiLogger ( & LoRaSystem . getLogger ( ) ) ;
2023-10-22 10:39:20 +00:00
delay ( 1000 ) ;
2022-03-19 23:03:43 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " LoRa APRS iGate by OE5BPA (Peter Buchegger) " ) ;
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " Version: %s " , VERSION ) ;
2023-10-22 10:39:20 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " Board: %s " , getBoardName ( ) . c_str ( ) ) ;
2021-03-12 22:21:45 +00:00
2022-03-19 23:37:29 +00:00
ProjectConfigurationManagement confmg ( LoRaSystem . getLogger ( ) ) ;
confmg . readConfiguration ( LoRaSystem . getLogger ( ) , userConfig ) ;
2021-05-18 22:44:37 +00:00
2023-10-22 10:39:20 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " Will start watchdog now... " ) ;
2023-01-23 10:12:32 +00:00
if ( esp_task_wdt_init ( 10 , true ) ! = ESP_OK ) {
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_WARN , MODULE_NAME , " Watchdog init failed! " ) ;
} else {
if ( esp_task_wdt_add ( NULL ) ! = ESP_OK ) {
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_WARN , MODULE_NAME , " Watchdog add failed! " ) ;
}
2023-10-22 10:39:20 +00:00
}
2023-01-23 10:12:32 +00:00
2023-09-27 19:31:35 +00:00
# if defined(HAS_AXP192) || defined(HAS_AXP2101)
2023-09-26 17:31:32 +00:00
Wire . begin ( SDA , SCL ) ;
2023-09-27 19:31:35 +00:00
if ( powerManagement - > begin ( Wire ) ) {
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , " PMU " , " init done! " ) ;
2023-09-26 17:31:32 +00:00
} else {
2023-09-27 19:31:35 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_ERROR , " PMU " , " init failed! " ) ;
2023-09-26 17:31:32 +00:00
}
2023-09-27 19:31:35 +00:00
powerManagement - > activateLoRa ( ) ;
powerManagement - > activateOLED ( ) ;
2023-09-26 17:31:32 +00:00
if ( userConfig . beacon . use_gps ) {
2023-09-27 19:31:35 +00:00
powerManagement - > activateGPS ( ) ;
2023-09-26 17:31:32 +00:00
} else {
2023-09-27 19:31:35 +00:00
powerManagement - > deactivateGPS ( ) ;
2021-03-12 22:21:45 +00:00
}
2023-09-27 19:31:35 +00:00
// powerManagement->activateMeasurement();
2023-09-26 17:31:32 +00:00
# endif
2021-03-12 22:21:45 +00:00
2021-05-18 22:44:37 +00:00
LoRaSystem . setUserConfig ( & userConfig ) ;
2021-05-18 23:01:10 +00:00
LoRaSystem . getTaskManager ( ) . addTask ( & displayTask ) ;
LoRaSystem . getTaskManager ( ) . addTask ( & modemTask ) ;
2021-05-26 20:34:09 +00:00
LoRaSystem . getTaskManager ( ) . addTask ( & routerTask ) ;
2022-03-20 12:39:45 +00:00
LoRaSystem . getTaskManager ( ) . addTask ( & beaconTask ) ;
2021-05-26 20:34:09 +00:00
2022-03-27 01:02:37 +00:00
bool tcpip = false ;
if ( userConfig . wifi . active ) {
LoRaSystem . getTaskManager ( ) . addAlwaysRunTask ( & wifiTask ) ;
tcpip = true ;
2022-04-07 09:12:45 +00:00
}
2023-09-26 17:31:32 +00:00
2023-09-27 19:31:35 +00:00
# ifdef T_INTERNET_POE
2023-09-26 17:31:32 +00:00
LoRaSystem . getTaskManager ( ) . addAlwaysRunTask ( & ethTask ) ;
2023-12-31 10:06:59 +00:00
tcpip = true ; // cppcheck-suppress redundantAssignment
2023-09-26 17:31:32 +00:00
# endif
2022-03-27 01:02:37 +00:00
2023-12-31 10:06:59 +00:00
if ( tcpip ) { // cppcheck-suppress knownConditionTrueFalse
2021-05-26 20:34:09 +00:00
LoRaSystem . getTaskManager ( ) . addTask ( & otaTask ) ;
LoRaSystem . getTaskManager ( ) . addTask ( & ntpTask ) ;
if ( userConfig . ftp . active ) {
LoRaSystem . getTaskManager ( ) . addTask ( & ftpTask ) ;
}
2021-03-12 22:21:45 +00:00
2022-03-27 01:02:37 +00:00
if ( userConfig . aprs_is . active ) {
LoRaSystem . getTaskManager ( ) . addTask ( & aprsIsTask ) ;
}
if ( userConfig . mqtt . active ) {
LoRaSystem . getTaskManager ( ) . addTask ( & mqttTask ) ;
}
2022-02-23 18:40:31 +00:00
}
2023-10-22 10:39:20 +00:00
esp_task_wdt_reset ( ) ;
2021-05-18 22:44:37 +00:00
LoRaSystem . getTaskManager ( ) . setup ( LoRaSystem ) ;
2021-03-12 22:21:45 +00:00
2023-10-22 10:39:20 +00:00
LoRaSystem . getDisplay ( ) . showSpashScreen ( " LoRa APRS iGate " , VERSION , getBoardName ( ) ) ;
2021-03-12 22:21:45 +00:00
2021-05-18 22:44:37 +00:00
if ( userConfig . callsign = = " NOCALL-10 " ) {
2022-03-19 23:03:43 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_ERROR , MODULE_NAME , " You have to change your settings in 'data/is-cfg.json' and upload it via 'Upload File System image'! " ) ;
2021-05-18 22:44:37 +00:00
LoRaSystem . getDisplay ( ) . showStatusScreen ( " ERROR " , " You have to change your settings in 'data/is-cfg.json' and upload it via \" Upload File System image \" ! " ) ;
2023-01-23 10:12:32 +00:00
while ( true ) {
2023-10-22 10:39:20 +00:00
esp_task_wdt_reset ( ) ;
2023-01-23 10:12:32 +00:00
}
2021-03-27 21:02:43 +00:00
}
2021-05-26 20:26:41 +00:00
if ( ( ! userConfig . aprs_is . active ) & & ! ( userConfig . digi . active ) ) {
2022-03-19 23:03:43 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_ERROR , MODULE_NAME , " No mode selected (iGate or Digi)! You have to activate one of iGate or Digi. " ) ;
2021-05-26 20:26:41 +00:00
LoRaSystem . getDisplay ( ) . showStatusScreen ( " ERROR " , " No mode selected (iGate or Digi)! You have to activate one of iGate or Digi. " ) ;
while ( true )
;
}
2021-03-27 21:02:43 +00:00
2021-05-18 22:44:37 +00:00
if ( userConfig . display . overwritePin ! = 0 ) {
pinMode ( userConfig . display . overwritePin , INPUT ) ;
pinMode ( userConfig . display . overwritePin , INPUT_PULLUP ) ;
2021-03-12 22:21:45 +00:00
}
2022-03-19 23:03:43 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " setup done... " ) ;
2020-03-18 18:49:59 +00:00
}
2022-03-20 12:38:24 +00:00
volatile bool syslogSet = false ;
2021-03-12 22:21:45 +00:00
void loop ( ) {
2023-10-22 10:39:20 +00:00
esp_task_wdt_reset ( ) ;
2021-05-18 22:44:37 +00:00
LoRaSystem . getTaskManager ( ) . loop ( LoRaSystem ) ;
2022-06-28 19:26:53 +00:00
if ( LoRaSystem . isWifiOrEthConnected ( ) & & LoRaSystem . getUserConfig ( ) - > syslog . active & & ! syslogSet ) {
2022-03-20 12:38:24 +00:00
LoRaSystem . getLogger ( ) . setSyslogServer ( LoRaSystem . getUserConfig ( ) - > syslog . server , LoRaSystem . getUserConfig ( ) - > syslog . port , LoRaSystem . getUserConfig ( ) - > callsign ) ;
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " System connected after a restart to the network, syslog server set " ) ;
syslogSet = true ;
2022-03-20 11:16:37 +00:00
}
2020-11-03 22:35:19 +00:00
}
2023-02-18 10:51:39 +00:00
# endif