2020-10-11 22:09:34 +00:00
# include <map>
2020-03-18 18:49:59 +00:00
# include <APRS-IS.h>
2021-03-12 22:21:45 +00:00
# include <BoardFinder.h>
2021-03-21 21:29:31 +00:00
# include <System.h>
2021-01-03 21:43:35 +00:00
# include <TaskManager.h>
2022-11-16 20:45:48 +00:00
# include <esp_task_wdt.h>
2021-03-12 22:21:45 +00:00
# include <logger.h>
# include <power_management.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-02-06 13:07:10 +00:00
# define VERSION "23.06.0"
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
DisplayTask displayTask ;
2022-04-02 01:20:16 +00:00
// ModemTask modemTask(fromModem, toModem);
RadiolibTask modemTask ( fromModem , toModem ) ;
EthTask ethTask ;
WifiTask wifiTask ;
OTATask otaTask ;
NTPTask ntpTask ;
FTPTask ftpTask ;
MQTTTask mqttTask ( toMQTT ) ;
AprsIsTask aprsIsTask ( toAprsIs ) ;
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 ( ) ) ;
2021-03-12 22:21:45 +00:00
delay ( 500 ) ;
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 ) ;
2021-03-12 22:21:45 +00:00
2021-05-18 22:43:59 +00:00
std : : list < BoardConfig const * > boardConfigs ;
boardConfigs . push_back ( & TTGO_LORA32_V1 ) ;
boardConfigs . push_back ( & TTGO_LORA32_V2 ) ;
boardConfigs . push_back ( & TTGO_T_Beam_V0_7 ) ;
boardConfigs . push_back ( & TTGO_T_Beam_V1_0 ) ;
2023-02-10 21:01:31 +00:00
boardConfigs . push_back ( & LILYGO_POE_ETH_BOARD ) ;
boardConfigs . push_back ( & WT32_ETH_BOARD ) ;
2021-05-18 22:43:59 +00:00
boardConfigs . push_back ( & TRACKERD ) ;
boardConfigs . push_back ( & HELTEC_WIFI_LORA_32_V1 ) ;
boardConfigs . push_back ( & HELTEC_WIFI_LORA_32_V2 ) ;
2022-04-21 18:24:16 +00:00
boardConfigs . push_back ( & GUALTHERIUS_LORAHAM_v100 ) ;
boardConfigs . push_back ( & GUALTHERIUS_LORAHAM_v106 ) ;
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
2021-05-18 22:47:10 +00:00
BoardFinder finder ( boardConfigs ) ;
BoardConfig const * boardConfig = finder . getBoardConfig ( userConfig . board ) ;
2021-05-25 20:33:00 +00:00
if ( ! boardConfig ) {
2022-03-19 23:22:19 +00:00
boardConfig = finder . searchBoardConfig ( LoRaSystem . getLogger ( ) ) ;
2021-05-25 20:33:00 +00:00
if ( ! boardConfig ) {
2022-03-19 23:03:43 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_ERROR , MODULE_NAME , " Board config not set and search failed! " ) ;
2021-05-21 20:22:50 +00:00
while ( true )
;
2021-05-25 20:33:00 +00:00
} else {
userConfig . board = boardConfig - > Name ;
2022-03-19 23:37:29 +00:00
confmg . writeConfiguration ( LoRaSystem . getLogger ( ) , userConfig ) ;
2022-03-19 23:03:43 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " will restart board now! " ) ;
2021-05-25 20:33:00 +00:00
ESP . restart ( ) ;
2021-03-12 22:21:45 +00:00
}
}
2021-05-25 20:33:00 +00:00
2022-03-20 09:56:06 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " Board %s loaded. " , boardConfig - > Name . c_str ( ) ) ;
2021-03-12 22:21:45 +00:00
2023-01-23 10:12:32 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " Will start watchdog now... " ) ;
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! " ) ;
}
}
2021-03-12 22:21:45 +00:00
if ( boardConfig - > Type = = eTTGO_T_Beam_V1_0 ) {
2023-02-10 21:01:31 +00:00
Wire . begin ( boardConfig - > Oled . Sda , boardConfig - > Oled . Scl ) ;
2021-05-18 22:51:05 +00:00
PowerManagement powerManagement ;
if ( ! powerManagement . begin ( Wire ) ) {
2022-03-19 23:03:43 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " AXP192 init done! " ) ;
2021-03-12 22:21:45 +00:00
} else {
2022-03-19 23:03:43 +00:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_ERROR , MODULE_NAME , " AXP192 init failed! " ) ;
2021-03-12 22:21:45 +00:00
}
2021-05-18 22:51:05 +00:00
powerManagement . activateLoRa ( ) ;
powerManagement . activateOLED ( ) ;
2022-03-26 21:27:43 +00:00
if ( userConfig . beacon . use_gps ) {
2022-03-20 12:39:45 +00:00
powerManagement . activateGPS ( ) ;
} else {
powerManagement . deactivateGPS ( ) ;
}
2021-03-12 22:21:45 +00:00
}
2021-05-18 22:47:10 +00:00
LoRaSystem . setBoardConfig ( boardConfig ) ;
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-02-10 21:01:31 +00:00
if ( boardConfig - > Ethernet . isEthernetBoard ( ) ) {
2022-03-27 01:02:37 +00:00
LoRaSystem . getTaskManager ( ) . addAlwaysRunTask ( & ethTask ) ;
tcpip = true ;
}
if ( tcpip ) {
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
}
2022-10-25 22:43:57 +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
2021-05-18 22:44:37 +00:00
LoRaSystem . getDisplay ( ) . showSpashScreen ( " LoRa APRS iGate " , VERSION ) ;
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 ) {
esp_task_wdt_reset ( ) ;
}
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 ( ) {
2022-10-25 22:43:57 +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
}