From ce8b7a7ea75b8ef51430d05de54b159cd1f96ca6 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Sun, 4 Oct 2026 10:07:00 -0400 Subject: [PATCH] add similar support from TSBK to CSBK to treat CRC errors as warnings; --- src/common/dmr/lc/CSBK.cpp | 11 +++++++++-- src/common/dmr/lc/CSBK.h | 7 +++++++ src/common/dmr/lc/csbk/CSBKFactory.cpp | 11 +++++++++-- src/common/dmr/lc/csbk/CSBKFactory.h | 7 +++++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/common/dmr/lc/CSBK.cpp b/src/common/dmr/lc/CSBK.cpp index a07886c3..03a9ca52 100644 --- a/src/common/dmr/lc/CSBK.cpp +++ b/src/common/dmr/lc/CSBK.cpp @@ -25,6 +25,8 @@ using namespace dmr::lc; // Static Class Members // --------------------------------------------------------------------------- +bool CSBK::s_warnCRC = false; + bool CSBK::s_verbose = false; SiteData CSBK::s_siteData = SiteData(); @@ -262,8 +264,13 @@ bool CSBK::decode(const uint8_t* data, uint8_t* payload) bool valid = edac::CRC::checkCCITT162(csbk, DMR_CSBK_LENGTH_BYTES); if (!valid) { - LogError(LOG_DMR, "CSBK::decode(), failed CRC CCITT-162 check"); - return false; + if (s_warnCRC) { + LogWarning(LOG_DMR, "CSBK::decode(), failed CRC CCITT-162 check"); + } + else { + LogError(LOG_DMR, "CSBK::decode(), failed CRC CCITT-162 check"); + return false; + } } // restore the checksum diff --git a/src/common/dmr/lc/CSBK.h b/src/common/dmr/lc/CSBK.h index d7351678..f8b2c91f 100644 --- a/src/common/dmr/lc/CSBK.h +++ b/src/common/dmr/lc/CSBK.h @@ -95,6 +95,12 @@ namespace dmr */ static void setVerbose(bool verbose) { s_verbose = verbose; } + /** + * @brief Sets whether CRC errors warn and allow decoding to continue. + * @param warnCRC Flag indicating CRC errors should be warnings. + */ + static void setWarnCRC(bool warnCRC) { s_warnCRC = warnCRC; } + /** @name Local Site data */ /** * @brief Gets the local site data. @@ -227,6 +233,7 @@ namespace dmr protected: static bool s_verbose; + static bool s_warnCRC; // Local Site data static SiteData s_siteData; diff --git a/src/common/dmr/lc/csbk/CSBKFactory.cpp b/src/common/dmr/lc/csbk/CSBKFactory.cpp index b4fbff83..27de9f30 100644 --- a/src/common/dmr/lc/csbk/CSBKFactory.cpp +++ b/src/common/dmr/lc/csbk/CSBKFactory.cpp @@ -21,6 +21,8 @@ using namespace dmr::lc::csbk; #include +bool CSBKFactory::s_warnCRC = false; + // --------------------------------------------------------------------------- // Public Class Members // --------------------------------------------------------------------------- @@ -64,8 +66,13 @@ std::unique_ptr CSBKFactory::createCSBK(const uint8_t* data, DataType::E d bool valid = edac::CRC::checkCCITT162(csbk, DMR_CSBK_LENGTH_BYTES); if (!valid) { - LogError(LOG_DMR, "CSBKFactory::createCSBK(), failed CRC CCITT-162 check"); - return nullptr; + if (s_warnCRC) { + LogWarning(LOG_DMR, "CSBKFactory::createCSBK(), failed CRC CCITT-162 check"); + } + else { + LogError(LOG_DMR, "CSBKFactory::createCSBK(), failed CRC CCITT-162 check"); + return nullptr; + } } // restore the checksum diff --git a/src/common/dmr/lc/csbk/CSBKFactory.h b/src/common/dmr/lc/csbk/CSBKFactory.h index ab11398a..431644e9 100644 --- a/src/common/dmr/lc/csbk/CSBKFactory.h +++ b/src/common/dmr/lc/csbk/CSBKFactory.h @@ -77,7 +77,14 @@ namespace dmr */ static std::unique_ptr createCSBK(const uint8_t* data, defines::DataType::E dataType); + /** + * @brief Sets whether CRC errors warn and allow decoding to continue. + * @param warnCRC Flag indicating CRC errors should be warnings. + */ + static void setWarnCRC(bool warnCRC) { s_warnCRC = warnCRC; } + private: + static bool s_warnCRC; /** * @brief Decode a CSBK. * @param csbk Instance of a CSBK.