#12 add APRSUnit and callbacks

pull/32/head
Geoffrey Merck 4 years ago
parent 11b9469f45
commit 707491d836

@ -47,7 +47,7 @@ m_idFrameProvider(nullptr)
assert(!gateway.empty());
assert(!password.empty());
m_thread = new CAPRSHandlerThread(gateway, password, address, hostname, port);
m_thread = new CAPRSHandlerThread(gateway, password, address, hostname, port, "m/20");
m_gateway = gateway;
m_gateway = m_gateway.substr(0, LONG_CALLSIGN_LENGTH - 1U);
@ -244,3 +244,8 @@ void CAPRSHandler::close()
m_thread->stop();
}
void CAPRSHandler::addReadAPRSCallback(IReadAPRSFrameCallback* cb)
{
m_thread->addReadAPRSCallback(cb);
}

@ -58,6 +58,8 @@ public:
void close();
void addReadAPRSCallback(IReadAPRSFrameCallback* cb);
private:
CAPRSHandlerThread* m_thread;
std::string m_gateway;

@ -46,7 +46,7 @@ m_connected(false),
m_reconnectTimer(1000U),
m_tries(0U),
m_APRSReadCallbacks(),
m_filter(""),
m_filter(),
m_clientName(FULL_PRODUCT_NAME)
{
assert(!callsign.empty());
@ -61,7 +61,7 @@ m_clientName(FULL_PRODUCT_NAME)
m_ssid = m_ssid.substr(LONG_CALLSIGN_LENGTH - 1U, 1);
}
CAPRSHandlerThread::CAPRSHandlerThread(const std::string& callsign, const std::string& password, const std::string& address, const std::string& hostname, unsigned int port, const std::string& filter, const std::string& clientName) :
CAPRSHandlerThread::CAPRSHandlerThread(const std::string& callsign, const std::string& password, const std::string& address, const std::string& hostname, unsigned int port, const std::string& filter) :
CThread(),
m_username(callsign),
m_password(password),
@ -74,7 +74,7 @@ m_reconnectTimer(1000U),
m_tries(0U),
m_APRSReadCallbacks(),
m_filter(filter),
m_clientName(clientName)
m_clientName(FULL_PRODUCT_NAME)
{
assert(!callsign.empty());
assert(!password.empty());
@ -90,15 +90,11 @@ m_clientName(clientName)
CAPRSHandlerThread::~CAPRSHandlerThread()
{
std::vector<CReadAPRSFrameCallback *> callBacksCopy;
std::vector<IReadAPRSFrameCallback *> callBacksCopy;
callBacksCopy.assign(m_APRSReadCallbacks.begin(), m_APRSReadCallbacks.end());
m_APRSReadCallbacks.clear();
for(auto cb : callBacksCopy) {
delete cb;
}
callBacksCopy.clear();
m_username.clear();
@ -177,7 +173,7 @@ void* CAPRSHandlerThread::Entry()
if(CAPRSParser::parseFrame(line, readFrame)) {
for(auto cb : m_APRSReadCallbacks) {
CAPRSFrame f(readFrame);
cb->readAprsFrame(f);
cb->readAPRSFrame(f);
}
}
}
@ -207,7 +203,7 @@ void* CAPRSHandlerThread::Entry()
return NULL;
}
void CAPRSHandlerThread::addReadAPRSCallback(CReadAPRSFrameCallback * cb)
void CAPRSHandlerThread::addReadAPRSCallback(IReadAPRSFrameCallback * cb)
{
assert(cb != nullptr);
m_APRSReadCallbacks.push_back(cb);

@ -32,7 +32,7 @@
class CAPRSHandlerThread : public CThread {
public:
CAPRSHandlerThread(const std::string& callsign, const std::string& password, const std::string& address, const std::string& hostname, unsigned int port);
CAPRSHandlerThread(const std::string& callsign, const std::string& password, const std::string& address, const std::string& hostname, unsigned int port, const std::string& filter, const std::string& clientName);
CAPRSHandlerThread(const std::string& callsign, const std::string& password, const std::string& address, const std::string& hostname, unsigned int port, const std::string& filter);
virtual ~CAPRSHandlerThread();
bool start();
@ -47,7 +47,7 @@ public:
void clock(unsigned int ms);
void addReadAPRSCallback(CReadAPRSFrameCallback* cb);
void addReadAPRSCallback(IReadAPRSFrameCallback* cb);
private:
std::string m_username;
@ -59,7 +59,7 @@ private:
bool m_connected;
CTimer m_reconnectTimer;
unsigned int m_tries;
std::vector<CReadAPRSFrameCallback *> m_APRSReadCallbacks;
std::vector<IReadAPRSFrameCallback *> m_APRSReadCallbacks;
std::string m_filter;
std::string m_clientName;

@ -16,18 +16,99 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <boost/algorithm/string.hpp>
#include "APRSUnit.h"
#include "APRSFrame.h"
#include "APRSParser.h"
#include "APRSFormater.h"
#include "StringUtils.h"
#include "APRSUtils.h"
#include "SlowDataEncoder.h"
CAPRSUnit::CAPRSUnit()
CAPRSUnit::CAPRSUnit(IRepeaterCallback * repeaterHandler) :
m_frameBuffer(20U),
m_status(APS_IDLE),
m_repeaterHandler(repeaterHandler),
m_headerData(nullptr),
m_timer(1000U, 2U)
{
m_timer.start();
}
void CAPRSUnit::writeFrame(CAPRSFrame& frame)
{
auto frameCopy = new CAPRSFrame(frame);
frameCopy->getPath().clear();//path is of no use for us, just clear it
m_frameBuffer.push_back(frameCopy);
}
bool CAPRSUnit::readAprsFrame(const std::string& aprsFrame)
void CAPRSUnit::clock(unsigned int ms)
{
auto bla = aprsFrame;
return false;
m_timer.clock(ms);
if(m_status == APS_IDLE && !m_frameBuffer.empty() && m_timer.hasExpired()) {
auto frame = m_frameBuffer.front();
m_id = CHeaderData::createId();
m_headerData = new CHeaderData();
m_headerData->setMyCall1(frame->getSource());
m_headerData->setMyCall2("APRS");
m_headerData->setYourCall("CQCQCQ ");
m_headerData->setId(m_id);
m_repeaterHandler->process(*m_headerData, DIR_INCOMING, AS_INFO);
m_status = APS_TRANSMIT;
}
if(m_status == APS_TRANSMIT && !m_frameBuffer.empty())
{
auto frame = m_frameBuffer.front();
std::string frameString;
CAPRSFormater::frameToString(frameString, *frame);
boost::trim_right_if(frameString, [](char c) { return c == '\n' || c == '\r'; });
frameString.push_back('\r');
std::string crc = CStringUtils::string_format("$$CRC%04X", CAPRSUtils::calcGPSAIcomCRC(frameString));
frameString.insert(0, crc);
CSlowDataEncoder encoder;
encoder.setHeaderData(*m_headerData);
encoder.setGPSData(frameString);
encoder.setTextData("APRS to DPRS");
CAMBEData data;
data.setId(m_id);
unsigned int out = 0U;
unsigned int dataOut = 0U;
unsigned int needed = (encoder.getInterleavedDataLength() / (DATA_FRAME_LENGTH_BYTES)) * 2U;
unsigned char buffer[DV_FRAME_LENGTH_BYTES];
while (dataOut < needed) {
data.setSeq(out);
::memcpy(buffer + 0U, NULL_AMBE_DATA_BYTES, VOICE_FRAME_LENGTH_BYTES);
// Insert sync bytes when the sequence number is zero, slow data otherwise
if (out == 0U) {
::memcpy(buffer + VOICE_FRAME_LENGTH_BYTES, DATA_SYNC_BYTES, DATA_FRAME_LENGTH_BYTES);
} else {
encoder.getInterleavedData(buffer + VOICE_FRAME_LENGTH_BYTES);
dataOut++;
}
data.setData(buffer, DV_FRAME_LENGTH_BYTES);
m_repeaterHandler->process(data, DIR_INCOMING, AS_INFO);
out++;
if (out == 21U) out = 0U;
}
m_frameBuffer.pop_front();
delete frame;
m_status = APS_IDLE;
m_timer.start();
}
}

@ -18,16 +18,34 @@
#pragma once
#include "ReadAPRSFrameCallback.h"
#include <string>
#include <boost/circular_buffer.hpp>
class CAPRSUnit : public CReadAPRSFrameCallback
#include "APRSFrame.h"
#include "RepeaterCallback.h"
#include "Timer.h"
enum APRSUNIT_STATUS {
APS_IDLE,
APS_WAIT,
APS_TRANSMIT
};
class CAPRSUnit
{
public:
CAPRSUnit();
bool readAprsFrame(const std::string& aprsFrame);
CAPRSUnit(IRepeaterCallback * repeaterHandler);
void writeFrame(CAPRSFrame& aprsFrame);
void clock(unsigned ms);
private:
// CRingBuffer<CAPRSFrame *> m_frameBuffer;
boost::circular_buffer<CAPRSFrame *> m_frameBuffer;
APRSUNIT_STATUS m_status;
IRepeaterCallback * m_repeaterHandler;
unsigned int m_id;
CHeaderData * m_headerData;
CTimer m_timer;
};

@ -33,7 +33,7 @@ void CAPRSUtils::dstarCallsignToAPRS(std::string& dstarCallsign)
}
}
unsigned int CAPRSUtils::calcIcomCRC(const std::string& gpsa)
unsigned int CAPRSUtils::calcGPSAIcomCRC(const std::string& gpsa)
{
unsigned int icomcrc = 0xFFFFU;
@ -54,4 +54,4 @@ unsigned int CAPRSUtils::calcIcomCRC(const std::string& gpsa)
}
return ~icomcrc & 0xFFFFU;
}
}

@ -24,5 +24,5 @@ class CAPRSUtils
{
public:
static void dstarCallsignToAPRS(std::string& dstarCallsign);
static unsigned int calcIcomCRC(const std::string& gpsa);
static unsigned int calcGPSAIcomCRC(const std::string& gpsa);
};

@ -19,12 +19,13 @@
#pragma once
#include <string>
#include <functional>
#include "APRSFrame.h"
class CReadAPRSFrameCallback
class IReadAPRSFrameCallback
{
public:
virtual ~CReadAPRSFrameCallback(){ }
virtual bool readAprsFrame(CAPRSFrame& aprsFrame) = 0;
virtual void readAPRSFrame(CAPRSFrame& aprsFrame) = 0;
};

@ -226,6 +226,7 @@ m_heardTimer(1000U, 0U, 100U) // 100ms
m_echo = new CEchoUnit(this, callsign);
m_infoAudio = new CAudioUnit(this, callsign);
m_version = new CVersionUnit(this, callsign);
m_aprsUnit = new CAPRSUnit(this);
#ifdef USE_DRATS
if (dratsEnabled) {
@ -1416,6 +1417,9 @@ void CRepeaterHandler::clockInt(unsigned int ms)
m_echo->clock(ms);
m_version->clock(ms);
if(m_aprsUnit != nullptr)
m_aprsUnit->clock(ms);
m_linkReconnectTimer.clock(ms);
m_watchdogTimer.clock(ms);
m_queryTimer.clock(ms);
@ -2422,6 +2426,10 @@ 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);
}
#ifdef USE_CCS
m_ccsHandler = new CCCSHandler(this, m_rptCallsign, m_index + 1U, m_latitude, m_longitude, m_frequency, m_offset, m_description1, m_description2, m_url, CCS_PORT + m_index);
#endif
@ -3069,6 +3077,13 @@ void CRepeaterHandler::triggerInfo()
}
}
void CRepeaterHandler::readAPRSFrame(CAPRSFrame& frame)
{
if(m_aprsUnit != nullptr) {
m_aprsUnit->writeFrame(frame);
}
}
#ifdef USE_CCS
bool CRepeaterHandler::isCCSCommand(const std::string& command) const
{

@ -58,11 +58,13 @@
#include "Timer.h"
#include "DTMF.h"
#include "Defs.h"
#include "ReadAPRSFrameCallback.h"
#include "APRSUnit.h"
#include <netinet/in.h>
class CRepeaterHandler : public IRepeaterCallback, public IReflectorCallback, public ICCSCallback {
class CRepeaterHandler : public IRepeaterCallback, public IReflectorCallback, public ICCSCallback, public IReadAPRSFrameCallback {
public:
static void initialise(unsigned int maxRepeaters);
@ -142,6 +144,8 @@ public:
virtual void ccsLinkFailed(const std::string& dtmf, DIRECTION direction);
virtual void ccsLinkEnded(const std::string& callsign, DIRECTION direction);
virtual void readAPRSFrame(CAPRSFrame& frame);
protected:
#ifdef USE_DRATS
CRepeaterHandler(const std::string& callsign, const std::string& band, const std::string& address, unsigned int port, HW_TYPE hwType, const std::string& reflector, bool atStartup, RECONNECT reconnect, bool dratsEnabled, double frequency, double offset, double range, double latitude, double longitude, double agl, const std::string& description1, const std::string& description2, const std::string& url, IRepeaterProtocolHandler* handler, unsigned char band1, unsigned char band2, unsigned char band3);
@ -275,6 +279,9 @@ private:
// Version information
CVersionUnit* m_version;
// APRS to DPRS
CAPRSUnit* m_aprsUnit;
#ifdef USE_DRATS
// D-RATS handler
CDRATSServer* m_drats;

Loading…
Cancel
Save

Powered by TurnKey Linux.