From fe362d6e2d92cb02e7a665d9088336b928319136 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Mon, 22 Feb 2016 22:27:03 +0000 Subject: [PATCH] Finally fix the (re)generation of Full LC PDUs. --- DMRFullLC.cpp | 7 ++----- DMRLC.cpp | 22 +++++++++++++++++++++- DMRLC.h | 2 ++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/DMRFullLC.cpp b/DMRFullLC.cpp index 3f5b85b..dbcd6cc 100644 --- a/DMRFullLC.cpp +++ b/DMRFullLC.cpp @@ -21,6 +21,7 @@ #include "DMRDefines.h" #include "RS129.h" +#include "Utils.h" #include "Log.h" #include @@ -60,12 +61,8 @@ CDMRLC* CDMRFullLC::decode(const unsigned char* data, unsigned char type) return NULL; } - if (!CRS129::check(lcData)) { - ::LogDebug("Checksum failed for the LC"); - CDMRLC lc(lcData); - LogDebug("Invalid LC, src = %u, dst = %s%u", lc.getSrcId(), lc.getFLCO() == FLCO_GROUP ? "TG " : "", lc.getDstId()); + if (!CRS129::check(lcData)) return NULL; - } return new CDMRLC(lcData); } diff --git a/DMRLC.cpp b/DMRLC.cpp index 93a6ff1..acb3280 100644 --- a/DMRLC.cpp +++ b/DMRLC.cpp @@ -25,8 +25,10 @@ CDMRLC::CDMRLC(FLCO flco, unsigned int srcId, unsigned int dstId) : m_PF(false), +m_R(false), m_FLCO(flco), m_FID(0U), +m_options(0U), m_srcId(srcId), m_dstId(dstId) { @@ -34,41 +36,52 @@ m_dstId(dstId) CDMRLC::CDMRLC(const unsigned char* bytes) : m_PF(false), +m_R(false), m_FLCO(FLCO_GROUP), m_FID(0U), +m_options(0U), m_srcId(0U), m_dstId(0U) { assert(bytes != NULL); m_PF = (bytes[0U] & 0x80U) == 0x80U; + m_R = (bytes[0U] & 0x40U) == 0x40U; m_FLCO = FLCO(bytes[0U] & 0x3FU); m_FID = bytes[1U]; + m_options = bytes[2U]; + m_dstId = bytes[3U] << 16 | bytes[4U] << 8 | bytes[5U]; m_srcId = bytes[6U] << 16 | bytes[7U] << 8 | bytes[8U]; } CDMRLC::CDMRLC(const bool* bits) : m_PF(false), +m_R(false), m_FLCO(FLCO_GROUP), m_FID(0U), +m_options(0U), m_srcId(0U), m_dstId(0U) { assert(bits != NULL); m_PF = bits[0U]; + m_R = bits[1U]; - unsigned char temp1, temp2; + unsigned char temp1, temp2, temp3; CUtils::bitsToByteBE(bits + 0U, temp1); m_FLCO = FLCO(temp1 & 0x3FU); CUtils::bitsToByteBE(bits + 8U, temp2); m_FID = temp2; + CUtils::bitsToByteBE(bits + 16U, temp3); + m_options = temp3; + unsigned char d1, d2, d3; CUtils::bitsToByteBE(bits + 24U, d1); CUtils::bitsToByteBE(bits + 32U, d2); @@ -85,8 +98,10 @@ m_dstId(0U) CDMRLC::CDMRLC() : m_PF(false), +m_R(false), m_FLCO(FLCO_GROUP), m_FID(0U), +m_options(0U), m_srcId(0U), m_dstId(0U) { @@ -105,8 +120,13 @@ void CDMRLC::getData(unsigned char* bytes) const if (m_PF) bytes[0U] |= 0x80U; + if (m_R) + bytes[0U] |= 0x40U; + bytes[1U] = m_FID; + bytes[2U] = m_options; + bytes[3U] = m_dstId >> 16; bytes[4U] = m_dstId >> 8; bytes[5U] = m_dstId >> 0; diff --git a/DMRLC.h b/DMRLC.h index 81b6785..9f3a464 100644 --- a/DMRLC.h +++ b/DMRLC.h @@ -50,8 +50,10 @@ public: private: bool m_PF; + bool m_R; FLCO m_FLCO; unsigned char m_FID; + unsigned char m_options; unsigned int m_srcId; unsigned int m_dstId; };