From a06dbf9d552f0f6003d8d13a4e0ba072ff95eeee Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Mon, 12 Nov 2018 13:22:18 -0500 Subject: [PATCH 1/3] 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 bceff0552..f1fd7a800 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 fa069d39d..988ed44bf 100644 --- a/P25Control.h +++ b/P25Control.h @@ -65,6 +65,7 @@ class CP25Control { 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 @@ class CP25Control { 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; From 1c1462e71e3e0a00dc2c9cc1a74606726c260097 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Mon, 12 Nov 2018 13:25:24 -0500 Subject: [PATCH 2/3] correct file formatting to be tabs and not spaces; --- P25Control.cpp | 76 +++++++++++++++++++++++++------------------------- P25Control.h | 8 +++--- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/P25Control.cpp b/P25Control.cpp index f1fd7a800..7e92ead11 100644 --- a/P25Control.cpp +++ b/P25Control.cpp @@ -126,7 +126,7 @@ 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)); + 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(); @@ -213,23 +213,23 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) m_rssiCount++; } - 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) { + 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.decodeLDU1(data + 2U); if (!ret) { @@ -283,14 +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) { - LogWarning("P25, LDU1 undecodable LC, using last LDU1 LC"); - m_rfData = m_rfLastLDU1; - m_rfUndecodableLC++; - } - else { - m_rfLastLDU1 = m_rfData; - } + 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); @@ -337,14 +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) { - LogWarning("P25, LDU2 undecodable LC, using last LDU2 LC"); - m_rfData = m_rfLastLDU2; - m_rfUndecodableLC++; - } - else { - m_rfLastLDU2 = m_rfData; - } + 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); @@ -494,7 +494,7 @@ 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)); + 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(); @@ -953,9 +953,9 @@ void CP25Control::createRFHeader() m_rfFrames = 0U; m_rfErrs = 0U; - m_rfUndecodableLC = 0U; - m_rfLastLDU1.reset(); - m_rfLastLDU2.reset(); + 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 988ed44bf..0845a02cb 100644 --- a/P25Control.h +++ b/P25Control.h @@ -65,7 +65,7 @@ class CP25Control { unsigned int m_rfFrames; unsigned int m_rfBits; unsigned int m_rfErrs; - unsigned int m_rfUndecodableLC; + unsigned int m_rfUndecodableLC; unsigned int m_netFrames; unsigned int m_netLost; unsigned int m_rfDataFrames; @@ -73,9 +73,9 @@ class CP25Control { unsigned char m_lastDUID; CP25Audio m_audio; CP25Data m_rfData; - CP25Data m_rfLastLDU1; - CP25Data m_rfLastLDU2; - CP25Data m_netData; + CP25Data m_rfLastLDU1; + CP25Data m_rfLastLDU2; + CP25Data m_netData; CP25LowSpeedData m_rfLSD; CP25LowSpeedData m_netLSD; unsigned char* m_netLDU1; From b8de542acd404a1e171bd17918a75cd1ed006be1 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Mon, 12 Nov 2018 13:27:49 -0500 Subject: [PATCH 3/3] add proper data copy override for the = operator to CP25Data; --- P25Data.cpp | 19 +++++++++++++++++++ P25Data.h | 2 ++ 2 files changed, 21 insertions(+) diff --git a/P25Data.cpp b/P25Data.cpp index e6378cde0..7bc08cdc5 100644 --- a/P25Data.cpp +++ b/P25Data.cpp @@ -55,6 +55,25 @@ CP25Data::~CP25Data() delete[] m_mi; } +CP25Data& CP25Data::operator=(const CP25Data& data) +{ + if (this != &data) { + m_mfId = data.m_mfId; + + m_srcId = data.m_srcId; + m_dstId = data.m_dstId; + + m_emergency = data.m_emergency; + + m_algId = data.m_algId; + m_kId = data.m_kId; + + ::memcpy(m_mi, data.m_mi, P25_MI_LENGTH_BYTES); + } + + return *this; +} + bool CP25Data::decodeHeader(const unsigned char* data) { assert(data != NULL); diff --git a/P25Data.h b/P25Data.h index 3d312d8a6..999155c84 100644 --- a/P25Data.h +++ b/P25Data.h @@ -27,6 +27,8 @@ class CP25Data { public: CP25Data(); ~CP25Data(); + + CP25Data& operator=(const CP25Data& data); bool decodeHeader(const unsigned char* data); void encodeHeader(unsigned char* data);