diff --git a/Common/DummyAPRSHandlerThread.cpp b/Common/DummyAPRSHandlerThread.cpp new file mode 100644 index 0000000..1c9f007 --- /dev/null +++ b/Common/DummyAPRSHandlerThread.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2021, 2022 by Geoffrey Merck F4FXL / KC3FRA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "DummyAPRSHandlerThread.h" + +CDummyAPRSHandlerThread::CDummyAPRSHandlerThread() +{ + +} + +CDummyAPRSHandlerThread::~CDummyAPRSHandlerThread() +{ + +} + +bool CDummyAPRSHandlerThread::start() +{ + return true; +} + +bool CDummyAPRSHandlerThread::isConnected() const +{ + return true; +} + +void CDummyAPRSHandlerThread::write(CAPRSFrame &) +{ +} + +void CDummyAPRSHandlerThread::clock(unsigned int) +{ +} + +void CDummyAPRSHandlerThread::stop() +{ +} + +void CDummyAPRSHandlerThread::addReadAPRSCallback(IReadAPRSFrameCallback *) +{ +} \ No newline at end of file diff --git a/Common/DummyAPRSHandlerThread.h b/Common/DummyAPRSHandlerThread.h new file mode 100644 index 0000000..94ff2e1 --- /dev/null +++ b/Common/DummyAPRSHandlerThread.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2021, 2022 by Geoffrey Merck F4FXL / KC3FRA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#pragma once + +#include "IAPRSHandlerThread.h" + +class CDummyAPRSHandlerThread : public IAPRSHandlerThread +{ +public: + CDummyAPRSHandlerThread(); + ~CDummyAPRSHandlerThread(); + + bool start(); + bool isConnected() const; + void write(CAPRSFrame& frame); + void clock(unsigned int ms); + void stop(); + void addReadAPRSCallback(IReadAPRSFrameCallback* cb); +}; \ No newline at end of file diff --git a/Common/RepeaterHandler.cpp b/Common/RepeaterHandler.cpp index c66e95f..4c119c2 100644 --- a/Common/RepeaterHandler.cpp +++ b/Common/RepeaterHandler.cpp @@ -59,7 +59,8 @@ bool CRepeaterHandler::m_dtmfEnabled = true; CHeaderLogger* CRepeaterHandler::m_headerLogger = NULL; -CAPRSHandler* CRepeaterHandler::m_aprsWriter = NULL; +CAPRSHandler* CRepeaterHandler::m_outgoingAprsWriter = NULL; +CAPRSHandler* CRepeaterHandler::m_incomingAprsWriter = NULL; CCallsignList* CRepeaterHandler::m_restrictList = NULL; @@ -352,9 +353,10 @@ void CRepeaterHandler::setHeaderLogger(CHeaderLogger* logger) m_headerLogger = logger; } -void CRepeaterHandler::setAPRSWriter(CAPRSHandler* writer) +void CRepeaterHandler::setAPRSWriters(CAPRSHandler* outgoingAprsWriter, CAPRSHandler* incomingAprsWriter) { - m_aprsWriter = writer; + m_outgoingAprsWriter = outgoingAprsWriter; + m_incomingAprsWriter = incomingAprsWriter; } void CRepeaterHandler::setLocalAddress(const std::string& address) @@ -613,8 +615,8 @@ void CRepeaterHandler::processRepeater(CHeaderData& header) m_text.clear(); // Reset the APRS Writer if it's enabled - if (m_aprsWriter != NULL) - m_aprsWriter->writeHeader(m_rptCallsign, header); + if (m_outgoingAprsWriter != NULL) + m_outgoingAprsWriter->writeHeader(m_rptCallsign, header); // Write to Header.log if it's enabled if (m_headerLogger != NULL) @@ -823,8 +825,8 @@ void CRepeaterHandler::processRepeater(CAMBEData& data) if (m_drats != NULL) m_drats->writeData(data); - if (m_aprsWriter != NULL) - m_aprsWriter->writeData(m_rptCallsign, data); + if (m_outgoingAprsWriter != NULL) + m_outgoingAprsWriter->writeData(m_rptCallsign, data); if (m_text.empty() && !data.isEnd()) { m_textCollector.writeData(data); @@ -1173,6 +1175,9 @@ bool CRepeaterHandler::process(CHeaderData& header, DIRECTION, AUDIO_SOURCE sour if (source == AS_DUP) return true; + if(m_incomingAprsWriter != nullptr) + m_incomingAprsWriter->writeHeader(m_rptCallsign, header); + sendToIncoming(header); #ifdef USE_CCS @@ -1212,6 +1217,9 @@ bool CRepeaterHandler::process(CAMBEData& data, DIRECTION, AUDIO_SOURCE source) m_repeaterHandler->writeAMBE(data); + if(m_incomingAprsWriter != nullptr) + m_incomingAprsWriter->writeData(m_rptCallsign, data); + sendToIncoming(data); #ifdef USE_CCS @@ -2413,8 +2421,8 @@ void CRepeaterHandler::startupInt() m_irc->rptrQTH(callsign, m_latitude, m_longitude, m_description1, m_description2, m_url); } - if(m_aprsWriter != nullptr) { - m_aprsWriter->addReadAPRSCallback(this); + if(m_outgoingAprsWriter != nullptr) { + m_outgoingAprsWriter->addReadAPRSCallback(this); } #ifdef USE_CCS @@ -2564,8 +2572,8 @@ void CRepeaterHandler::writeLinkingTo(const std::string &callsign) m_infoAudio->setStatus(m_linkStatus, m_linkRepeater, text); triggerInfo(); - if(m_aprsWriter != nullptr) - m_aprsWriter->writeStatus(m_rptCallsign, text); + if(m_outgoingAprsWriter != nullptr) + m_outgoingAprsWriter->writeStatus(m_rptCallsign, text); #ifdef USE_CCS m_ccsHandler->setReflector(); @@ -2619,8 +2627,8 @@ void CRepeaterHandler::writeLinkedTo(const std::string &callsign) m_infoAudio->setStatus(m_linkStatus, m_linkRepeater, text); triggerInfo(); - if(m_aprsWriter != nullptr) - m_aprsWriter->writeStatus(m_rptCallsign, text); + if(m_outgoingAprsWriter != nullptr) + m_outgoingAprsWriter->writeStatus(m_rptCallsign, text); #ifdef USE_CCS m_ccsHandler->setReflector(callsign); @@ -2674,8 +2682,8 @@ void CRepeaterHandler::writeNotLinked() m_infoAudio->setStatus(m_linkStatus, m_linkRepeater, text); triggerInfo(); - if(m_aprsWriter != nullptr) - m_aprsWriter->writeStatus(m_rptCallsign, text); + if(m_outgoingAprsWriter != nullptr) + m_outgoingAprsWriter->writeStatus(m_rptCallsign, text); #ifdef USE_CCS m_ccsHandler->setReflector(); @@ -2745,8 +2753,8 @@ void CRepeaterHandler::writeIsBusy(const std::string& callsign) m_infoAudio->setTempStatus(m_linkStatus, m_linkRepeater, tempText); triggerInfo(); - if(m_aprsWriter != nullptr) - m_aprsWriter->writeStatus(m_rptCallsign, text); + if(m_outgoingAprsWriter != nullptr) + m_outgoingAprsWriter->writeStatus(m_rptCallsign, text); #ifdef USE_CCS m_ccsHandler->setReflector(); diff --git a/Common/RepeaterHandler.h b/Common/RepeaterHandler.h index e0422c4..5c34d3c 100644 --- a/Common/RepeaterHandler.h +++ b/Common/RepeaterHandler.h @@ -74,7 +74,7 @@ public: static void setDPlusEnabled(bool enabled); static void setDCSEnabled(bool enabled); static void setHeaderLogger(CHeaderLogger* logger); - static void setAPRSWriter(CAPRSHandler* writer); + static void setAPRSWriters(CAPRSHandler* outgoingAprsWriter, CAPRSHandler* incomingAprsWriter); static void setInfoEnabled(bool enabled); static void setEchoEnabled(bool enabled); static void setDTMFEnabled(bool enabled); @@ -169,7 +169,8 @@ private: static CHeaderLogger* m_headerLogger; - static CAPRSHandler* m_aprsWriter; + static CAPRSHandler* m_outgoingAprsWriter; + static CAPRSHandler* m_incomingAprsWriter; static CCallsignList* m_whiteList; static CCallsignList* m_blackList; diff --git a/DStarGateway/DStarGatewayApp.cpp b/DStarGateway/DStarGatewayApp.cpp index 76f9c3b..2efc783 100644 --- a/DStarGateway/DStarGatewayApp.cpp +++ b/DStarGateway/DStarGatewayApp.cpp @@ -49,6 +49,7 @@ #include "APRSFixedIdFrameProvider.h" #include "Daemon.h" #include "APRSHandlerThread.h" +#include "DummyAPRSHandlerThread.h" CDStarGatewayApp * CDStarGatewayApp::g_app = nullptr; const std::string BANNER_1 = CStringUtils::string_format("%s Copyright (C) %s\n", FULL_PRODUCT_NAME.c_str(), VENDOR_NAME.c_str()); @@ -193,11 +194,15 @@ bool CDStarGatewayApp::createThread() // Setup APRS TAPRS aprsConfig; m_config->getAPRS(aprsConfig); - CAPRSHandler * aprsWriter = NULL; + CAPRSHandler * outgoingAprsWriter = nullptr; + CAPRSHandler * incomingAprsWriter = nullptr; if(aprsConfig.enabled && !aprsConfig.password.empty()) { CAPRSHandlerThread* thread = new CAPRSHandlerThread(gatewayConfig.callsign, aprsConfig.password, gatewayConfig.address, aprsConfig.hostname, aprsConfig.port); - aprsWriter = new CAPRSHandler((IAPRSHandlerThread *)thread); - if(aprsWriter->open()) { + outgoingAprsWriter = new CAPRSHandler((IAPRSHandlerThread *)thread); + + incomingAprsWriter = new CAPRSHandler((IAPRSHandlerThread *)new CDummyAPRSHandlerThread()); + + if(outgoingAprsWriter->open()) { #ifdef USE_GPSD CAPRSIdFrameProvider * idFrameProvider = aprsConfig.m_positionSource == POSSRC_GPSD ? (CAPRSIdFrameProvider *)new CAPRSGPSDIdFrameProvider(gatewayConfig.callsign, gpsdConfig.m_address, gpsdConfig.m_port) : new CAPRSFixedIdFrameProvider(gatewayConfig.callsign); @@ -205,12 +210,12 @@ bool CDStarGatewayApp::createThread() CAPRSIdFrameProvider * idFrameProvider = new CAPRSFixedIdFrameProvider(gatewayConfig.callsign); #endif idFrameProvider->start(); - aprsWriter->setIdFrameProvider(idFrameProvider); - m_thread->setAPRSWriter(aprsWriter); + outgoingAprsWriter->setIdFrameProvider(idFrameProvider); + m_thread->setAPRSWriters(outgoingAprsWriter, incomingAprsWriter); } else { - delete aprsWriter; - aprsWriter = NULL; + delete outgoingAprsWriter; + outgoingAprsWriter = NULL; } } @@ -280,7 +285,10 @@ bool CDStarGatewayApp::createThread() rptrConfig.band2, rptrConfig.band3); - aprsWriter->setPort(rptrConfig.callsign, rptrConfig.band, rptrConfig.frequency, rptrConfig.offset, rptrConfig.range, rptrConfig.latitude, rptrConfig.longitude, rptrConfig.agl); + if(outgoingAprsWriter != nullptr) + outgoingAprsWriter->setPort(rptrConfig.callsign, rptrConfig.band, rptrConfig.frequency, rptrConfig.offset, rptrConfig.range, rptrConfig.latitude, rptrConfig.longitude, rptrConfig.agl); + if(incomingAprsWriter != nullptr) + incomingAprsWriter->setPort(rptrConfig.callsign, rptrConfig.band, rptrConfig.frequency, rptrConfig.offset, rptrConfig.range, rptrConfig.latitude, rptrConfig.longitude, rptrConfig.agl); if(!ddEnabled) ddEnabled = rptrConfig.band.length() > 1U; } diff --git a/DStarGateway/DStarGatewayThread.cpp b/DStarGateway/DStarGatewayThread.cpp index 93b78bf..c7fd212 100644 --- a/DStarGateway/DStarGatewayThread.cpp +++ b/DStarGateway/DStarGatewayThread.cpp @@ -69,15 +69,16 @@ m_stopped(true), m_gatewayType(GT_REPEATER), m_gatewayCallsign(), m_gatewayAddress(), -m_icomRepeaterHandler(NULL), -m_hbRepeaterHandler(NULL), -m_dummyRepeaterHandler(NULL), -m_dextraPool(NULL), -m_dplusPool(NULL), -m_dcsPool(NULL), -m_g2HandlerPool(NULL), -m_aprsWriter(NULL), -m_irc(NULL), +m_icomRepeaterHandler(nullptr), +m_hbRepeaterHandler(nullptr), +m_dummyRepeaterHandler(nullptr), +m_dextraPool(nullptr), +m_dplusPool(nullptr), +m_dcsPool(nullptr), +m_g2HandlerPool(nullptr), +m_outgoingAprsWriter(nullptr), +m_incomingAprsWriter(nullptr), +m_irc(nullptr), m_cache(), m_language(TL_ENGLISH_UK), m_dextraEnabled(true), @@ -110,9 +111,9 @@ m_status4(), m_status5(), m_latitude(0.0), m_longitude(0.0), -m_whiteList(NULL), -m_blackList(NULL), -m_restrictList(NULL) +m_whiteList(nullptr), +m_blackList(nullptr), +m_restrictList(nullptr) { CHeaderData::initialise(); CG2Handler::initialise(MAX_ROUTES); @@ -250,7 +251,7 @@ void* CDStarGatewayThread::Entry() CRepeaterHandler::setDPlusEnabled(m_dplusEnabled); CRepeaterHandler::setDCSEnabled(m_dcsEnabled); CRepeaterHandler::setHeaderLogger(headerLogger); - CRepeaterHandler::setAPRSWriter(m_aprsWriter); + CRepeaterHandler::setAPRSWriters(m_outgoingAprsWriter, m_incomingAprsWriter); CRepeaterHandler::setInfoEnabled(m_infoEnabled); CRepeaterHandler::setEchoEnabled(m_echoEnabled); CRepeaterHandler::setDTMFEnabled(m_dtmfEnabled); @@ -377,8 +378,8 @@ void* CDStarGatewayThread::Entry() m_statusFileTimer.start(); } - if (m_aprsWriter != NULL) - m_aprsWriter->clock(ms); + if (m_outgoingAprsWriter != NULL) + m_outgoingAprsWriter->clock(ms); if (m_logEnabled) { m_statusTimer1.clock(ms); @@ -469,9 +470,9 @@ void* CDStarGatewayThread::Entry() delete m_remote; } - if(m_aprsWriter != nullptr) { - m_aprsWriter->close(); - delete m_aprsWriter; + if(m_outgoingAprsWriter != nullptr) { + m_outgoingAprsWriter->close(); + delete m_outgoingAprsWriter; } if (headerLogger != NULL) { @@ -636,9 +637,10 @@ void CDStarGatewayThread::setLog(bool enabled) m_logEnabled = enabled; } -void CDStarGatewayThread::setAPRSWriter(CAPRSHandler* writer) +void CDStarGatewayThread::setAPRSWriters(CAPRSHandler* outgoingWriter, CAPRSHandler* incomingWriter) { - m_aprsWriter = writer; + m_outgoingAprsWriter = outgoingWriter; + m_incomingAprsWriter = incomingWriter; } void CDStarGatewayThread::setInfoEnabled(bool enabled) @@ -1244,8 +1246,8 @@ void CDStarGatewayThread::writeStatus() CDStarGatewayStatusData* CDStarGatewayThread::getStatus() const { bool aprsStatus = false; - if (m_aprsWriter != NULL) - aprsStatus = m_aprsWriter->isConnected(); + if (m_outgoingAprsWriter != NULL) + aprsStatus = m_outgoingAprsWriter->isConnected(); CDStarGatewayStatusData* status = new CDStarGatewayStatusData(m_lastStatus, aprsStatus); diff --git a/DStarGateway/DStarGatewayThread.h b/DStarGateway/DStarGatewayThread.h index 767a81d..83dddaf 100644 --- a/DStarGateway/DStarGatewayThread.h +++ b/DStarGateway/DStarGatewayThread.h @@ -66,7 +66,7 @@ public: virtual void setCCS(bool enabled, const std::string& host); #endif virtual void setLog(bool enabled); - virtual void setAPRSWriter(CAPRSHandler* writer); + virtual void setAPRSWriters(CAPRSHandler* outgoingAprsWriter, CAPRSHandler* incomingAPRSHandler); virtual void setInfoEnabled(bool enabled); virtual void setEchoEnabled(bool enabled); virtual void setDTMFEnabled(bool enabled); @@ -100,7 +100,8 @@ private: CDPlusProtocolHandlerPool* m_dplusPool; CDCSProtocolHandlerPool* m_dcsPool; CG2ProtocolHandlerPool* m_g2HandlerPool; - CAPRSHandler* m_aprsWriter; + CAPRSHandler* m_outgoingAprsWriter; + CAPRSHandler* m_incomingAprsWriter; CIRCDDB* m_irc; CCacheManager m_cache; TEXT_LANG m_language;