diff --git a/P25Control.cpp b/P25Control.cpp index bceff05..7e92ead 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(); @@ -225,7 +230,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) } else if (duid == P25_DUID_LDU1) { if (m_rfState == RS_RF_LISTENING) { - //m_rfData.reset(); + m_rfData.reset(); bool ret = m_rfData.decodeLDU1(data + 2U); if (!ret) { m_lastDUID = duid; @@ -279,7 +284,12 @@ 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; + LogWarning("P25, LDU1 undecodable LC, using last LDU1 LC"); + m_rfData = m_rfLastLDU1; + m_rfUndecodableLC++; + } + else { + m_rfLastLDU1 = m_rfData; } // Regenerate Sync @@ -328,7 +338,12 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) if (m_rfState == RS_RF_AUDIO) { bool ret = m_rfData.decodeLDU2(data + 2U); if (!ret) { - return false; + 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..0845a02 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,6 +73,8 @@ private: unsigned char m_lastDUID; CP25Audio m_audio; CP25Data m_rfData; + CP25Data m_rfLastLDU1; + CP25Data m_rfLastLDU2; CP25Data m_netData; CP25LowSpeedData m_rfLSD; CP25LowSpeedData m_netLSD; diff --git a/P25Data.cpp b/P25Data.cpp index e6378cd..7bc08cd 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 3d312d8..999155c 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);