diff --git a/Common/APRSCollector.cpp b/Common/APRSCollector.cpp index c44a0a8..f6ab546 100644 --- a/Common/APRSCollector.cpp +++ b/Common/APRSCollector.cpp @@ -57,12 +57,15 @@ CAPRSCollector::~CAPRSCollector() delete[] m_buffer; } -bool CAPRSCollector::writeData(const wxString& callsign, const unsigned char* data) +void CAPRSCollector::writeHeader(const wxString& callsign) +{ + m_callsign = callsign; +} + +bool CAPRSCollector::writeData(const unsigned char* data) { wxASSERT(data != NULL); - m_callsign = callsign; - switch (m_slowData) { case SS_FIRST: m_buffer[0U] = data[0U] ^ SCRAMBLER_BYTE1; @@ -415,13 +418,7 @@ unsigned int CAPRSCollector::convertNMEA1(unsigned char* data, unsigned int) return 0U; char callsign[10U]; - ::memset(callsign, ' ', 10U); - for (unsigned int i = 0U; i < m_callsign.Len(); i++) - callsign[i] = m_callsign.GetChar(i); - - // This can't fail! - char* p = ::strchr(callsign, ' '); - *p = '\0'; + dstarCallsignToAPRS(m_callsign, callsign); ::sprintf((char*)data, "%s>APDPRS,DSTAR*:!%.7s%s%c%.8s%s%c", callsign, pGGA[2U], pGGA[3U], APRS_OVERLAY, pGGA[4U], pGGA[5U], APRS_SYMBOL); @@ -434,7 +431,7 @@ unsigned int CAPRSCollector::convertNMEA1(unsigned char* data, unsigned int) str = (char*)m_rmcData; for (;;) { - p = mystrsep(&str, ",\r\n"); + char* p = mystrsep(&str, ",\r\n"); pRMC[nRMC++] = p; if (p == NULL) @@ -484,13 +481,7 @@ unsigned int CAPRSCollector::convertNMEA2(unsigned char* data, unsigned int) return 0U; char callsign[10U]; - ::memset(callsign, ' ', 10U); - for (unsigned int i = 0U; i < m_callsign.Len(); i++) - callsign[i] = m_callsign.GetChar(i); - - // This can't fail! - char* p = ::strchr(callsign, ' '); - *p = '\0'; + dstarCallsignToAPRS(m_callsign, callsign); ::sprintf((char*)data, "%s>APDPRS,DSTAR*:!%.7s%s%c%.8s%s%c", callsign, pRMC[3U], pRMC[4U], APRS_OVERLAY, pRMC[5U], pRMC[6U], APRS_SYMBOL); @@ -504,6 +495,29 @@ unsigned int CAPRSCollector::convertNMEA2(unsigned char* data, unsigned int) return ::strlen((char*)data); } +void CAPRSCollector::dstarCallsignToAPRS(const wxString& dstarCallsign, char* aprsCallsign) const +{ + wxASSERT(aprsCallsign != NULL); + + wxString first = dstarCallsign.BeforeFirst(wxT(' ')); + wxString last = dstarCallsign.AfterLast(wxT(' ')); + + if (first.IsSameAs(last)) { + unsigned int n = 0U; + for (unsigned int i = 0U; i < dstarCallsign.Len(); i++) + aprsCallsign[n++] = dstarCallsign.GetChar(i); + aprsCallsign[n++] = '\0'; + } else { + unsigned int n = 0U; + for (unsigned int i = 0U; i < first.Len(); i++) + aprsCallsign[n++] = first.GetChar(i); + aprsCallsign[n++] = '-'; + for (unsigned int i = 0U; i < last.Len(); i++) + aprsCallsign[n++] = last.GetChar(i); + aprsCallsign[n++] = '\0'; + } +} + // Source found at char* CAPRSCollector::mystrsep(char** sp, const char* sep) const { diff --git a/Common/APRSCollector.h b/Common/APRSCollector.h index 85bd3da..16557cf 100644 --- a/Common/APRSCollector.h +++ b/Common/APRSCollector.h @@ -35,12 +35,14 @@ public: CAPRSCollector(); ~CAPRSCollector(); - bool writeData(const wxString& callsign, const unsigned char* data); + void writeHeader(const wxString& callsign); - void sync(); + bool writeData(const unsigned char* data); void reset(); + void sync(); + unsigned int getData(unsigned char* data, unsigned int length); private: @@ -74,6 +76,8 @@ private: unsigned int convertNMEA1(unsigned char* data, unsigned int length); unsigned int convertNMEA2(unsigned char* data, unsigned int length); + void dstarCallsignToAPRS(const wxString& dstarCallsign, char* aprsCallsign) const; + char* mystrsep(char** sp, const char* sep) const; }; diff --git a/Common/APRSWriter.cpp b/Common/APRSWriter.cpp index d34ab3c..279f4ab 100644 --- a/Common/APRSWriter.cpp +++ b/Common/APRSWriter.cpp @@ -158,6 +158,21 @@ bool CAPRSWriter::open() return m_thread->start(); } +void CAPRSWriter::writeHeader(const wxString& callsign, const CHeaderData& header) +{ + CAPRSEntry* entry = m_array[callsign]; + if (entry == NULL) { + wxLogError(wxT("Cannot find the callsign \"%s\" in the APRS array"), callsign.c_str()); + return; + } + + entry->reset(); + + CAPRSCollector* collector = entry->getCollector(); + + collector->writeHeader(header.getMyCall1()); +} + void CAPRSWriter::writeData(const wxString& callsign, const CAMBEData& data) { if (data.isEnd()) @@ -179,7 +194,7 @@ void CAPRSWriter::writeData(const wxString& callsign, const CAMBEData& data) unsigned char buffer[400U]; data.getData(buffer, DV_FRAME_MAX_LENGTH_BYTES); - bool complete = collector->writeData(callsign, buffer + VOICE_FRAME_LENGTH_BYTES); + bool complete = collector->writeData(buffer + VOICE_FRAME_LENGTH_BYTES); if (!complete) return; @@ -230,17 +245,6 @@ void CAPRSWriter::writeData(const wxString& callsign, const CAMBEData& data) collector->reset(); } -void CAPRSWriter::reset(const wxString& callsign) -{ - CAPRSEntry* entry = m_array[callsign]; - if (entry == NULL) { - wxLogError(wxT("Cannot find the callsign \"%s\" in the APRS array"), callsign.c_str()); - return; - } - - entry->reset(); -} - void CAPRSWriter::clock(unsigned int ms) { m_idTimer.clock(ms); diff --git a/Common/APRSWriter.h b/Common/APRSWriter.h index bf7f607..2a5485c 100644 --- a/Common/APRSWriter.h +++ b/Common/APRSWriter.h @@ -22,6 +22,7 @@ #include "APRSWriterThread.h" #include "APRSCollector.h" #include "DStarDefines.h" +#include "HeaderData.h" #include "AMBEData.h" #include "Timer.h" #include "Defs.h" @@ -73,9 +74,9 @@ public: void setPort(const wxString& callsign, const wxString& band, double frequency, double offset, double range, double latitude, double longitude, double agl); - void writeData(const wxString& callsign, const CAMBEData& data); + void writeHeader(const wxString& callsign, const CHeaderData& header); - void reset(const wxString& callsign); + void writeData(const wxString& callsign, const CAMBEData& data); bool isConnected() const; diff --git a/Common/RepeaterHandler.cpp b/Common/RepeaterHandler.cpp index 497c4c7..215e0dd 100644 --- a/Common/RepeaterHandler.cpp +++ b/Common/RepeaterHandler.cpp @@ -594,7 +594,7 @@ void CRepeaterHandler::processRepeater(CHeaderData& header) // Reset the APRS Writer if it's enabled if (m_aprsWriter != NULL) - m_aprsWriter->reset(m_rptCallsign); + m_aprsWriter->writeHeader(m_rptCallsign, header); // Write to Header.log if it's enabled if (m_headerLogger != NULL)