From a06dbf9d552f0f6003d8d13a4e0ba072ff95eeee Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Mon, 12 Nov 2018 13:22:18 -0500 Subject: [PATCH] implement logic to reuse the last properly decoded LC's instead of dropping the entire LDU; add undecodable LC counter; --- P25Control.cpp | 66 ++++++++++++++++++++++++++++++++------------------ P25Control.h | 5 +++- 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/P25Control.cpp b/P25Control.cpp index bceff05..f1fd7a8 100644 --- a/P25Control.cpp +++ b/P25Control.cpp @@ -57,6 +57,7 @@ m_networkWatchdog(1000U, 0U, 1500U), m_rfFrames(0U), m_rfBits(0U), m_rfErrs(0U), +m_rfUndecodableLC(0U), m_netFrames(0U), m_netLost(0U), m_rfDataFrames(0U), @@ -64,6 +65,8 @@ m_nid(nac), m_lastDUID(P25_DUID_TERM), m_audio(), m_rfData(), +m_rfLastLDU1(), +m_rfLastLDU2(), m_netData(), m_rfLSD(), m_netLSD(), @@ -123,6 +126,8 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) else LogMessage("P25, transmission lost, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits)); + LogMessage("P25, total frames: %d, bits: %d, undecodable LC: %d, errors: %d, BER: %.4f%%", m_rfFrames, m_rfBits, m_rfUndecodableLC, m_rfErrs, float(m_rfErrs * 100U) / float(m_rfBits)); + if (m_netState == RS_NET_IDLE) m_display->clearP25(); @@ -208,24 +213,24 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) m_rssiCount++; } - if (duid == P25_DUID_HEADER) { - if (m_rfState == RS_RF_LISTENING) { + if (duid == P25_DUID_HEADER) { + if (m_rfState == RS_RF_LISTENING) { + m_rfData.reset(); + bool ret = m_rfData.decodeHeader(data + 2U); + if (!ret) { + m_lastDUID = duid; + return false; + } + + LogMessage("P25, received RF header"); + + m_lastDUID = duid; + return true; + } + } + else if (duid == P25_DUID_LDU1) { + if (m_rfState == RS_RF_LISTENING) { m_rfData.reset(); - bool ret = m_rfData.decodeHeader(data + 2U); - if (!ret) { - m_lastDUID = duid; - return false; - } - - LogMessage("P25, received RF header"); - - m_lastDUID = duid; - return true; - } - } - else if (duid == P25_DUID_LDU1) { - if (m_rfState == RS_RF_LISTENING) { - //m_rfData.reset(); bool ret = m_rfData.decodeLDU1(data + 2U); if (!ret) { m_lastDUID = duid; @@ -278,9 +283,14 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) if (m_rfState == RS_RF_AUDIO) { bool ret = m_rfData.decodeLDU1(data + 2U); - if (!ret) { - return false; - } + if (!ret) { + LogWarning("P25, LDU1 undecodable LC, using last LDU1 LC"); + m_rfData = m_rfLastLDU1; + m_rfUndecodableLC++; + } + else { + m_rfLastLDU1 = m_rfData; + } // Regenerate Sync CSync::addP25Sync(data + 2U); @@ -327,9 +337,14 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) } else if (duid == P25_DUID_LDU2) { if (m_rfState == RS_RF_AUDIO) { bool ret = m_rfData.decodeLDU2(data + 2U); - if (!ret) { - return false; - } + if (!ret) { + LogWarning("P25, LDU2 undecodable LC, using last LDU2 LC"); + m_rfData = m_rfLastLDU2; + m_rfUndecodableLC++; + } + else { + m_rfLastLDU2 = m_rfData; + } writeNetwork(m_rfLDU, m_lastDUID, false); @@ -479,6 +494,8 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) else LogMessage("P25, received RF end of voice transmission, %.1f seconds, BER: %.1f%%", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits)); + LogMessage("P25, total frames: %d, bits: %d, undecodable LC: %d, errors: %d, BER: %.4f%%", m_rfFrames, m_rfBits, m_rfUndecodableLC, m_rfErrs, float(m_rfErrs * 100U) / float(m_rfBits)); + m_display->clearP25(); #if defined(DUMP_P25) @@ -936,6 +953,9 @@ void CP25Control::createRFHeader() m_rfFrames = 0U; m_rfErrs = 0U; + m_rfUndecodableLC = 0U; + m_rfLastLDU1.reset(); + m_rfLastLDU2.reset(); m_rfBits = 1U; m_rfTimeout.start(); m_lastDUID = P25_DUID_HEADER; diff --git a/P25Control.h b/P25Control.h index fa069d3..988ed44 100644 --- a/P25Control.h +++ b/P25Control.h @@ -65,6 +65,7 @@ private: unsigned int m_rfFrames; unsigned int m_rfBits; unsigned int m_rfErrs; + unsigned int m_rfUndecodableLC; unsigned int m_netFrames; unsigned int m_netLost; unsigned int m_rfDataFrames; @@ -72,7 +73,9 @@ private: unsigned char m_lastDUID; CP25Audio m_audio; CP25Data m_rfData; - CP25Data m_netData; + CP25Data m_rfLastLDU1; + CP25Data m_rfLastLDU2; + CP25Data m_netData; CP25LowSpeedData m_rfLSD; CP25LowSpeedData m_netLSD; unsigned char* m_netLDU1;