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>
2021-03-12 22:21:45 +00:00
# include <TimeLib.h>
# 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"
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"
2021-05-09 19:19:13 +00:00
# include "TaskModem.h"
2021-01-03 21:43:35 +00:00
# include "TaskNTP.h"
# include "TaskOTA.h"
# include "TaskWifi.h"
2021-05-15 20:58:15 +00:00
# include "TaskRouter.h"
2021-03-12 22:21:45 +00:00
# include "project_configuration.h"
2020-10-11 22:09:34 +00:00
2021-04-09 22:43:18 +00:00
# define VERSION "21.14.0-dev"
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-03-21 21:29:31 +00:00
std : : shared_ptr < System > LoRaSystem ;
2020-05-08 21:09:44 +00:00
2021-05-15 20:58:15 +00:00
TaskQueue < std : : shared_ptr < APRSMessage > > toAprsIs ;
TaskQueue < std : : shared_ptr < APRSMessage > > fromModem ;
2020-05-29 19:13:11 +00:00
// cppcheck-suppress unusedFunction
2021-03-12 22:21:45 +00:00
void setup ( ) {
Serial . begin ( 115200 ) ;
Logger : : instance ( ) . setSerial ( & Serial ) ;
delay ( 500 ) ;
2021-05-09 21:09:07 +00:00
logPrintlnI ( " LoRa APRS iGate by OE5BPA (Peter Buchegger) " ) ;
logPrintlnI ( " Version: " VERSION ) ;
2021-03-12 22:21:45 +00:00
std : : list < std : : shared_ptr < BoardConfig > > boardConfigs ;
// clang-format off
boardConfigs . push_back ( std : : shared_ptr < BoardConfig > ( new BoardConfig ( " TTGO_LORA32_V1 " , eTTGO_LORA32_V1 , 4 , 15 , 0x3C , 0 , 5 , 19 , 27 , 18 , 14 , 26 ) ) ) ;
boardConfigs . push_back ( std : : shared_ptr < BoardConfig > ( new BoardConfig ( " TTGO_LORA32_V2 " , eTTGO_LORA32_V2 , 21 , 22 , 0x3C , 0 , 5 , 19 , 27 , 18 , 14 , 26 , true ) ) ) ;
boardConfigs . push_back ( std : : shared_ptr < BoardConfig > ( new BoardConfig ( " TTGO_T_Beam_V0_7 " , eTTGO_T_Beam_V0_7 , 21 , 22 , 0x3C , 0 , 5 , 19 , 27 , 18 , 14 , 26 , true ) ) ) ;
boardConfigs . push_back ( std : : shared_ptr < BoardConfig > ( new BoardConfig ( " TTGO_T_Beam_V1_0 " , eTTGO_T_Beam_V1_0 , 21 , 22 , 0x3C , 0 , 5 , 19 , 27 , 18 , 14 , 26 , true , true ) ) ) ;
boardConfigs . push_back ( std : : shared_ptr < BoardConfig > ( new BoardConfig ( " ETH_BOARD " , eETH_BOARD , 33 , 32 , 0x3C , 0 , 14 , 2 , 15 , 12 , 4 , 36 ) ) ) ;
boardConfigs . push_back ( std : : shared_ptr < BoardConfig > ( new BoardConfig ( " TRACKERD " , eTRACKERD , 5 , 4 , 0x3C , 0 , 18 , 19 , 23 , 16 , 14 , 26 ) ) ) ;
boardConfigs . push_back ( std : : shared_ptr < BoardConfig > ( new BoardConfig ( " HELTEC_WIFI_LORA_32_V1 " , eHELTEC_WIFI_LORA_32_V1 , 4 , 15 , 0x3C , 16 , 5 , 19 , 27 , 18 , 14 , 26 ) ) ) ;
boardConfigs . push_back ( std : : shared_ptr < BoardConfig > ( new BoardConfig ( " HELTEC_WIFI_LORA_32_V2 " , eHELTEC_WIFI_LORA_32_V2 , 4 , 15 , 0x3C , 16 , 5 , 19 , 27 , 18 , 14 , 26 ) ) ) ;
// clang-format on
2021-03-27 21:02:43 +00:00
ProjectConfigurationManagement confmg ;
std : : shared_ptr < Configuration > userConfig = confmg . readConfiguration ( ) ;
BoardFinder finder ( boardConfigs ) ;
std : : shared_ptr < BoardConfig > boardConfig = finder . getBoardConfig ( userConfig - > board ) ;
2021-03-12 22:21:45 +00:00
if ( boardConfig = = 0 ) {
boardConfig = finder . searchBoardConfig ( ) ;
if ( boardConfig = = 0 ) {
logPrintlnE ( " Board config not set and search failed! " ) ;
while ( true ) {
}
}
userConfig - > board = boardConfig - > Name ;
confmg . writeConfiguration ( userConfig ) ;
logPrintlnI ( " will restart board now! " ) ;
ESP . restart ( ) ;
}
logPrintI ( " Board " ) ;
logPrintI ( boardConfig - > Name ) ;
logPrintlnI ( " loaded. " ) ;
if ( boardConfig - > Type = = eTTGO_T_Beam_V1_0 ) {
Wire . begin ( boardConfig - > OledSda , boardConfig - > OledScl ) ;
std : : shared_ptr < PowerManagement > powerManagement = std : : shared_ptr < PowerManagement > ( new PowerManagement ) ;
if ( ! powerManagement - > begin ( Wire ) ) {
logPrintlnI ( " AXP192 init done! " ) ;
} else {
logPrintlnE ( " AXP192 init failed! " ) ;
}
powerManagement - > activateLoRa ( ) ;
powerManagement - > activateOLED ( ) ;
powerManagement - > deactivateGPS ( ) ;
}
2021-03-21 21:29:31 +00:00
LoRaSystem = std : : shared_ptr < System > ( new System ( boardConfig , userConfig ) ) ;
LoRaSystem - > getTaskManager ( ) . addTask ( std : : shared_ptr < Task > ( new DisplayTask ( ) ) ) ;
2021-05-15 20:58:15 +00:00
LoRaSystem - > getTaskManager ( ) . addTask ( std : : shared_ptr < Task > ( new ModemTask ( & fromModem ) ) ) ;
2021-03-12 22:21:45 +00:00
if ( boardConfig - > Type = = eETH_BOARD ) {
2021-04-09 19:33:40 +00:00
LoRaSystem - > getTaskManager ( ) . addAlwaysRunTask ( std : : shared_ptr < Task > ( new EthTask ( ) ) ) ;
2021-03-13 21:27:46 +00:00
} else {
2021-04-09 19:33:40 +00:00
LoRaSystem - > getTaskManager ( ) . addAlwaysRunTask ( std : : shared_ptr < Task > ( new WifiTask ( ) ) ) ;
2021-03-12 22:21:45 +00:00
}
2021-03-21 21:29:31 +00:00
LoRaSystem - > getTaskManager ( ) . addTask ( std : : shared_ptr < Task > ( new OTATask ( ) ) ) ;
LoRaSystem - > getTaskManager ( ) . addTask ( std : : shared_ptr < Task > ( new NTPTask ( ) ) ) ;
2021-03-12 22:21:45 +00:00
if ( userConfig - > ftp . active ) {
2021-03-21 21:29:31 +00:00
LoRaSystem - > getTaskManager ( ) . addTask ( std : : shared_ptr < Task > ( new FTPTask ( ) ) ) ;
2021-03-12 22:21:45 +00:00
}
2021-05-15 20:58:15 +00:00
LoRaSystem - > getTaskManager ( ) . addTask ( std : : shared_ptr < Task > ( new AprsIsTask ( & toAprsIs ) ) ) ;
LoRaSystem - > getTaskManager ( ) . addTask ( std : : shared_ptr < Task > ( new RouterTask ( & fromModem , & toAprsIs ) ) ) ;
2021-03-12 22:21:45 +00:00
2021-03-21 21:29:31 +00:00
LoRaSystem - > getTaskManager ( ) . setup ( LoRaSystem ) ;
2021-03-12 22:21:45 +00:00
2021-03-21 21:29:31 +00:00
LoRaSystem - > getDisplay ( ) . showSpashScreen ( " LoRa APRS iGate " , VERSION ) ;
2021-03-12 22:21:45 +00:00
2021-03-27 21:02:43 +00:00
if ( userConfig - > callsign = = " NOCALL-10 " ) {
logPrintlnE ( " You have to change your settings in 'data/is-cfg.json' and upload it via \" Upload File System image \" ! " ) ;
LoRaSystem - > getDisplay ( ) . showStatusScreen ( " ERROR " , " You have to change your settings in 'data/is-cfg.json' and upload it via \" Upload File System image \" ! " ) ;
while ( true )
;
}
2021-03-12 22:21:45 +00:00
if ( userConfig - > display . overwritePin ! = 0 ) {
pinMode ( userConfig - > display . overwritePin , INPUT ) ;
pinMode ( userConfig - > display . overwritePin , INPUT_PULLUP ) ;
}
delay ( 5000 ) ;
logPrintlnI ( " setup done... " ) ;
2020-03-18 18:49:59 +00:00
}
2020-05-29 19:13:11 +00:00
// cppcheck-suppress unusedFunction
2021-03-12 22:21:45 +00:00
void loop ( ) {
2021-03-21 21:29:31 +00:00
LoRaSystem - > getTaskManager ( ) . loop ( LoRaSystem ) ;
2020-11-03 22:35:19 +00:00
}
2021-03-12 22:21:45 +00:00
String create_lat_aprs ( double lat ) {
char str [ 20 ] ;
char n_s = ' N ' ;
if ( lat < 0 ) {
n_s = ' S ' ;
}
lat = std : : abs ( lat ) ;
sprintf ( str , " %02d%05.2f%c " , ( int ) lat , ( lat - ( double ) ( ( int ) lat ) ) * 60.0 , n_s ) ;
String lat_str ( str ) ;
return lat_str ;
2020-10-11 22:09:34 +00:00
}
2021-03-12 22:21:45 +00:00
String create_long_aprs ( double lng ) {
char str [ 20 ] ;
char e_w = ' E ' ;
if ( lng < 0 ) {
e_w = ' W ' ;
}
lng = std : : abs ( lng ) ;
sprintf ( str , " %03d%05.2f%c " , ( int ) lng , ( lng - ( double ) ( ( int ) lng ) ) * 60.0 , e_w ) ;
String lng_str ( str ) ;
return lng_str ;
2020-10-11 22:09:34 +00:00
}