From 11d56992be8422a2d02e6c1d2867ab7eafe43df7 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Wed, 16 Aug 2017 10:18:43 +0100 Subject: [PATCH] Handle multiple AMBE blocks per payload. --- YSFGateway/DTMF.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++--- YSFGateway/DTMF.h | 9 +++++--- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/YSFGateway/DTMF.cpp b/YSFGateway/DTMF.cpp index 03579dc..a797dd5 100644 --- a/YSFGateway/DTMF.cpp +++ b/YSFGateway/DTMF.cpp @@ -54,7 +54,52 @@ CDTMF::~CDTMF() { } -WX_STATUS CDTMF::decodeVW(const unsigned char* ambe) +WX_STATUS CDTMF::decodeVW(const unsigned char* payload) +{ + assert(payload != NULL); + + payload += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; + + for (unsigned int offset = 0U; offset < 90U; offset += 18U) { + WX_STATUS status = decodeVWSlice(payload + offset); + if (status != WXS_NONE) + return status; + } + + return WXS_NONE; +} + +WX_STATUS CDTMF::decodeDN1(const unsigned char* payload) +{ + assert(payload != NULL); + + payload += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; + + for (unsigned int offset = 5U; offset < 90U; offset += 18U) { + WX_STATUS status = decodeDN1Slice(payload + offset); + if (status != WXS_NONE) + return status; + } + + return WXS_NONE; +} + +WX_STATUS CDTMF::decodeDN2(const unsigned char* payload) +{ + assert(payload != NULL); + + payload += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; + + for (unsigned int offset = 9U; offset < 90U; offset += 18U) { + WX_STATUS status = decodeDN2Slice(payload + offset); + if (status != WXS_NONE) + return status; + } + + return WXS_NONE; +} + +WX_STATUS CDTMF::decodeVWSlice(const unsigned char* ambe) { // DTMF begins with these byte values if ((ambe[0] & DTMF_MASK[0]) == DTMF_SIG[0] && (ambe[1] & DTMF_MASK[1]) == DTMF_SIG[1] && @@ -132,7 +177,7 @@ WX_STATUS CDTMF::decodeVW(const unsigned char* ambe) } } -WX_STATUS CDTMF::decodeDN1(const unsigned char* ambe) +WX_STATUS CDTMF::decodeDN1Slice(const unsigned char* ambe) { // DTMF begins with these byte values if ((ambe[0] & DTMF_MASK[0]) == DTMF_SIG[0] && (ambe[1] & DTMF_MASK[1]) == DTMF_SIG[1] && @@ -210,7 +255,7 @@ WX_STATUS CDTMF::decodeDN1(const unsigned char* ambe) } } -WX_STATUS CDTMF::decodeDN2(const unsigned char* ambe) +WX_STATUS CDTMF::decodeDN2Slice(const unsigned char* ambe) { // DTMF begins with these byte values if ((ambe[0] & DTMF_MASK[0]) == DTMF_SIG[0] && (ambe[1] & DTMF_MASK[1]) == DTMF_SIG[1] && diff --git a/YSFGateway/DTMF.h b/YSFGateway/DTMF.h index ef30457..a0429cf 100644 --- a/YSFGateway/DTMF.h +++ b/YSFGateway/DTMF.h @@ -28,9 +28,9 @@ public: CDTMF(); ~CDTMF(); - WX_STATUS decodeVW(const unsigned char* ambe); - WX_STATUS decodeDN1(const unsigned char* ambe); - WX_STATUS decodeDN2(const unsigned char* ambe); + WX_STATUS decodeVW(const unsigned char* payload); + WX_STATUS decodeDN1(const unsigned char* payload); + WX_STATUS decodeDN2(const unsigned char* payload); std::string getReflector(); @@ -44,6 +44,9 @@ private: unsigned int m_pressCount; char m_lastChar; + WX_STATUS decodeVWSlice(const unsigned char* ambe); + WX_STATUS decodeDN1Slice(const unsigned char* ambe); + WX_STATUS decodeDN2Slice(const unsigned char* ambe); WX_STATUS validate() const; };