2020-10-12 00:09:34 +02:00
# include <map>
2020-03-18 19:49:59 +01:00
# include <APRS-IS.h>
2021-03-12 23:21:45 +01:00
# include <BoardFinder.h>
2021-03-21 22:29:31 +01:00
# include <System.h>
2021-01-03 22:43:35 +01:00
# include <TaskManager.h>
2021-03-12 23:21:45 +01:00
# include <logger.h>
# include <power_management.h>
2020-03-18 19:49:59 +01:00
2021-01-03 22:43:35 +01:00
# include "TaskAprsIs.h"
2022-03-20 13:39:45 +01:00
# include "TaskBeacon.h"
2021-01-19 23:12:55 +01:00
# include "TaskDisplay.h"
2021-01-03 22:43:35 +01:00
# include "TaskEth.h"
# include "TaskFTP.h"
2022-02-24 16:02:28 +01:00
# include "TaskMQTT.h"
2021-05-09 21:19:13 +02:00
# include "TaskModem.h"
2021-01-03 22:43:35 +01:00
# include "TaskNTP.h"
# include "TaskOTA.h"
2021-05-15 22:58:15 +02:00
# include "TaskRouter.h"
2021-05-15 23:10:24 +02:00
# include "TaskWifi.h"
2021-03-12 23:21:45 +01:00
# include "project_configuration.h"
2020-10-12 00:09:34 +02:00
2022-03-31 03:36:34 +02:00
# define VERSION "22.13.3"
2022-03-20 00:03:43 +01:00
# define MODULE_NAME "Main"
2021-01-30 22:47:24 +01:00
2020-10-12 00:09:34 +02:00
String create_lat_aprs ( double lat ) ;
String create_long_aprs ( double lng ) ;
2020-03-19 13:29:21 +01:00
2021-05-15 22:58:15 +02:00
TaskQueue < std : : shared_ptr < APRSMessage > > toAprsIs ;
TaskQueue < std : : shared_ptr < APRSMessage > > fromModem ;
2021-05-24 15:12:31 +02:00
TaskQueue < std : : shared_ptr < APRSMessage > > toModem ;
2022-02-23 19:40:31 +01:00
TaskQueue < std : : shared_ptr < APRSMessage > > toMQTT ;
2021-05-15 22:58:15 +02:00
2021-05-19 01:29:08 +02:00
System LoRaSystem ;
Configuration userConfig ;
2021-05-19 01:01:10 +02:00
DisplayTask displayTask ;
2021-05-24 15:12:31 +02:00
ModemTask modemTask ( fromModem , toModem ) ;
2021-05-19 01:01:10 +02:00
EthTask ethTask ;
WifiTask wifiTask ;
OTATask otaTask ;
NTPTask ntpTask ;
FTPTask ftpTask ;
2022-02-23 19:40:31 +01:00
MQTTTask mqttTask ( toMQTT ) ;
2021-05-19 01:01:10 +02:00
AprsIsTask aprsIsTask ( toAprsIs ) ;
2022-02-23 19:40:31 +01:00
RouterTask routerTask ( fromModem , toModem , toAprsIs , toMQTT ) ;
2022-03-20 13:39:45 +01:00
BeaconTask beaconTask ( toModem , toAprsIs ) ;
2021-05-19 01:01:10 +02:00
2021-03-12 23:21:45 +01:00
void setup ( ) {
Serial . begin ( 115200 ) ;
2022-03-20 00:03:43 +01:00
LoRaSystem . getLogger ( ) . setSerial ( & Serial ) ;
2022-03-20 01:03:42 +01:00
setWiFiLogger ( & LoRaSystem . getLogger ( ) ) ;
2021-03-12 23:21:45 +01:00
delay ( 500 ) ;
2022-03-20 00:03:43 +01: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 23:21:45 +01:00
2021-05-19 00:43:59 +02: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 ) ;
boardConfigs . push_back ( & ETH_BOARD ) ;
boardConfigs . push_back ( & TRACKERD ) ;
boardConfigs . push_back ( & HELTEC_WIFI_LORA_32_V1 ) ;
boardConfigs . push_back ( & HELTEC_WIFI_LORA_32_V2 ) ;
2021-03-12 23:21:45 +01:00
2022-03-20 00:37:29 +01:00
ProjectConfigurationManagement confmg ( LoRaSystem . getLogger ( ) ) ;
confmg . readConfiguration ( LoRaSystem . getLogger ( ) , userConfig ) ;
2021-05-19 00:44:37 +02:00
2021-05-19 00:47:10 +02:00
BoardFinder finder ( boardConfigs ) ;
BoardConfig const * boardConfig = finder . getBoardConfig ( userConfig . board ) ;
2021-05-25 22:33:00 +02:00
if ( ! boardConfig ) {
2022-03-20 00:22:19 +01:00
boardConfig = finder . searchBoardConfig ( LoRaSystem . getLogger ( ) ) ;
2021-05-25 22:33:00 +02:00
if ( ! boardConfig ) {
2022-03-20 00:03:43 +01:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_ERROR , MODULE_NAME , " Board config not set and search failed! " ) ;
2021-05-21 22:22:50 +02:00
while ( true )
;
2021-05-25 22:33:00 +02:00
} else {
userConfig . board = boardConfig - > Name ;
2022-03-20 00:37:29 +01:00
confmg . writeConfiguration ( LoRaSystem . getLogger ( ) , userConfig ) ;
2022-03-20 00:03:43 +01:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " will restart board now! " ) ;
2021-05-25 22:33:00 +02:00
ESP . restart ( ) ;
2021-03-12 23:21:45 +01:00
}
}
2021-05-25 22:33:00 +02:00
2022-03-20 10:56:06 +01:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " Board %s loaded. " , boardConfig - > Name . c_str ( ) ) ;
2021-03-12 23:21:45 +01:00
if ( boardConfig - > Type = = eTTGO_T_Beam_V1_0 ) {
Wire . begin ( boardConfig - > OledSda , boardConfig - > OledScl ) ;
2021-05-19 00:51:05 +02:00
PowerManagement powerManagement ;
if ( ! powerManagement . begin ( Wire ) ) {
2022-03-20 00:03:43 +01:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " AXP192 init done! " ) ;
2021-03-12 23:21:45 +01:00
} else {
2022-03-20 00:03:43 +01:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_ERROR , MODULE_NAME , " AXP192 init failed! " ) ;
2021-03-12 23:21:45 +01:00
}
2021-05-19 00:51:05 +02:00
powerManagement . activateLoRa ( ) ;
powerManagement . activateOLED ( ) ;
2022-03-26 22:27:43 +01:00
if ( userConfig . beacon . use_gps ) {
2022-03-20 13:39:45 +01:00
powerManagement . activateGPS ( ) ;
} else {
powerManagement . deactivateGPS ( ) ;
}
2021-03-12 23:21:45 +01:00
}
2021-05-19 00:47:10 +02:00
LoRaSystem . setBoardConfig ( boardConfig ) ;
2021-05-19 00:44:37 +02:00
LoRaSystem . setUserConfig ( & userConfig ) ;
2021-05-19 01:01:10 +02:00
LoRaSystem . getTaskManager ( ) . addTask ( & displayTask ) ;
LoRaSystem . getTaskManager ( ) . addTask ( & modemTask ) ;
2021-05-26 22:34:09 +02:00
LoRaSystem . getTaskManager ( ) . addTask ( & routerTask ) ;
2022-03-20 13:39:45 +01:00
LoRaSystem . getTaskManager ( ) . addTask ( & beaconTask ) ;
2021-05-26 22:34:09 +02:00
2022-03-27 03:02:37 +02:00
bool tcpip = false ;
if ( userConfig . wifi . active ) {
LoRaSystem . getTaskManager ( ) . addAlwaysRunTask ( & wifiTask ) ;
2021-05-26 22:34:09 +02:00
LoRaSystem . getTaskManager ( ) . addTask ( & otaTask ) ;
2022-03-27 03:02:37 +02:00
tcpip = true ;
} else if ( boardConfig - > Type = = eETH_BOARD ) {
LoRaSystem . getTaskManager ( ) . addAlwaysRunTask ( & ethTask ) ;
tcpip = true ;
}
if ( tcpip ) {
2021-05-26 22:34:09 +02:00
LoRaSystem . getTaskManager ( ) . addTask ( & ntpTask ) ;
if ( userConfig . ftp . active ) {
LoRaSystem . getTaskManager ( ) . addTask ( & ftpTask ) ;
}
2021-03-12 23:21:45 +01:00
2022-03-27 03:02:37 +02:00
if ( userConfig . aprs_is . active ) {
LoRaSystem . getTaskManager ( ) . addTask ( & aprsIsTask ) ;
}
if ( userConfig . mqtt . active ) {
LoRaSystem . getTaskManager ( ) . addTask ( & mqttTask ) ;
}
2022-02-23 19:40:31 +01:00
}
2021-05-19 00:44:37 +02:00
LoRaSystem . getTaskManager ( ) . setup ( LoRaSystem ) ;
2021-03-12 23:21:45 +01:00
2021-05-19 00:44:37 +02:00
LoRaSystem . getDisplay ( ) . showSpashScreen ( " LoRa APRS iGate " , VERSION ) ;
2021-03-12 23:21:45 +01:00
2021-05-19 00:44:37 +02:00
if ( userConfig . callsign = = " NOCALL-10 " ) {
2022-03-20 00:03:43 +01: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-19 00:44:37 +02:00
LoRaSystem . getDisplay ( ) . showStatusScreen ( " ERROR " , " You have to change your settings in 'data/is-cfg.json' and upload it via \" Upload File System image \" ! " ) ;
2021-03-27 22:02:43 +01:00
while ( true )
;
}
2021-05-26 22:26:41 +02:00
if ( ( ! userConfig . aprs_is . active ) & & ! ( userConfig . digi . active ) ) {
2022-03-20 00:03:43 +01: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 22:26:41 +02: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 22:02:43 +01:00
2021-05-19 00:44:37 +02:00
if ( userConfig . display . overwritePin ! = 0 ) {
pinMode ( userConfig . display . overwritePin , INPUT ) ;
pinMode ( userConfig . display . overwritePin , INPUT_PULLUP ) ;
2021-03-12 23:21:45 +01:00
}
delay ( 5000 ) ;
2022-03-20 00:03:43 +01:00
LoRaSystem . getLogger ( ) . log ( logging : : LoggerLevel : : LOGGER_LEVEL_INFO , MODULE_NAME , " setup done... " ) ;
2020-03-18 19:49:59 +01:00
}
2022-03-20 13:38:24 +01:00
volatile bool syslogSet = false ;
2021-03-12 23:21:45 +01:00
void loop ( ) {
2021-05-19 00:44:37 +02:00
LoRaSystem . getTaskManager ( ) . loop ( LoRaSystem ) ;
2022-03-20 13:38:24 +01:00
if ( LoRaSystem . isWifiEthConnected ( ) & & LoRaSystem . getUserConfig ( ) - > syslog . active & & ! syslogSet ) {
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 12:16:37 +01:00
}
2020-11-03 23:35:19 +01:00
}