From 907567ec33e087591d3453a12598404df0830006 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Thu, 23 Mar 2023 12:51:06 -0400 Subject: [PATCH] fix issue with DMR site information calculations; correct slot number (range for packets is 0 - 1, not 1 - 2); fix missing clock call to the DMR affiliations class; --- src/dmr/DMRUtils.h | 8 ++++---- src/dmr/SiteData.h | 18 +++++++++--------- src/dmr/Slot.cpp | 6 ++++++ src/dmr/edac/Trellis.cpp | 2 +- src/dmr/packet/ControlSignaling.cpp | 8 ++++---- 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/dmr/DMRUtils.h b/src/dmr/DMRUtils.h index d8493c3e..84c159a0 100644 --- a/src/dmr/DMRUtils.h +++ b/src/dmr/DMRUtils.h @@ -80,15 +80,15 @@ namespace dmr break; case SITE_MODEL_LARGE: { - if (id > 0xFFU) { // clamp to $FF - id = 0xFFU; + if (id > 0x7FU) { // clamp to $7F + id = 0x7FU; } } break; case SITE_MODEL_HUGE: { - if (id > 0x7FFU) { // clamp to $7FF - id = 0x7FFU; + if (id > 0x3FFU) { // clamp to $3FF + id = 0x3FFU; } } break; diff --git a/src/dmr/SiteData.h b/src/dmr/SiteData.h index 704842d6..f0eab21e 100644 --- a/src/dmr/SiteData.h +++ b/src/dmr/SiteData.h @@ -103,32 +103,32 @@ namespace dmr { case SITE_MODEL_TINY: { - value = (value << 9) + m_netId; - value = (value << 3) + m_siteId; + value = (value << 9) + (m_netId & 0x1FFU); + value = (value << 3) + (m_siteId & 0x07U); } break; case SITE_MODEL_SMALL: { - value = (value << 7) + m_netId; - value = (value << 5) + m_siteId; + value = (value << 7) + (m_netId & 0x7FU); + value = (value << 5) + (m_siteId & 0x1FU); } break; case SITE_MODEL_LARGE: { - value = (value << 5) + m_netId; - value = (value << 7) + m_siteId; + value = (value << 5) + (m_netId & 0x1FU); + value = (value << 7) + (m_siteId & 0x7FU); } break; case SITE_MODEL_HUGE: { - value = (value << 2) + m_netId; - value = (value << 10) + m_siteId; + value = (value << 2) + (m_netId & 0x03U); + value = (value << 10) + (m_siteId & 0x3FFU); } break; } if (!msb) { - value = (value << 2) + m_parId; + value = (value << 2) + (m_parId & 0x03U); } return value & 0xFFFFU; diff --git a/src/dmr/Slot.cpp b/src/dmr/Slot.cpp index 9493661d..5c335054 100644 --- a/src/dmr/Slot.cpp +++ b/src/dmr/Slot.cpp @@ -416,6 +416,9 @@ void Slot::clock() // if we have control enabled; do clocking to generate a CC data stream if (m_enableTSCC) { + // clock all the grant timers + m_affiliations->clock(ms); + if (m_ccRunning && !m_ccPacketInterval.isRunning()) { m_ccPacketInterval.start(); } @@ -1119,6 +1122,9 @@ void Slot::setShortLC_TSCC(SiteData siteData, uint16_t counter) lc[3U] = (uint8_t)((lcValue >> 0) & 0xFFU); lc[4U] = edac::CRC::crc8(lc, 4U); + //LogDebug(LOG_DMR, "setShortLC_TSCC, netId = %02X, siteId = %02X", siteData.netId(), siteData.siteId()); + //Utils::dump(1U, "shortLC_TSCC", lc, 5U); + uint8_t sLC[9U]; lc::ShortLC shortLC; diff --git a/src/dmr/edac/Trellis.cpp b/src/dmr/edac/Trellis.cpp index 9ad790ce..9dd51a71 100644 --- a/src/dmr/edac/Trellis.cpp +++ b/src/dmr/edac/Trellis.cpp @@ -411,7 +411,7 @@ bool Trellis::fixCode(uint8_t* points, uint32_t failPos, uint8_t* payload) const uint32_t pos = checkCode(points, tribits); if (pos == 999U) { #if DEBUG_TRELLIS - ::LogDebug(LOG_HOST, "Trellis::fixCode34() fixed, failPos = %u, pos = %u, val = %01X", failPos, bestPos, bestVal); + ::LogDebug(LOG_HOST, "Trellis::fixCode() fixed, failPos = %u, pos = %u, val = %01X", failPos, bestPos, bestVal); #endif tribitsToBits(tribits, payload); return true; diff --git a/src/dmr/packet/ControlSignaling.cpp b/src/dmr/packet/ControlSignaling.cpp index 03d4dacc..6bf96a45 100644 --- a/src/dmr/packet/ControlSignaling.cpp +++ b/src/dmr/packet/ControlSignaling.cpp @@ -852,7 +852,7 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (broadcast) csbk->setCSBKO(CSBKO_BTV_GRANT); csbk->setLogicalCh1(chNo); - csbk->setSlotNo(slot); + csbk->setSlotNo(slot - 1U); if (m_verbose) { LogMessage((net) ? LOG_NET : LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_GRP_VOICE_CALL (Group Voice Call), emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", @@ -888,7 +888,7 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ std::unique_ptr csbk = new_unique(CSBK_PV_GRANT); csbk->setLogicalCh1(chNo); - csbk->setSlotNo(slot); + csbk->setSlotNo(slot - 1U); if (m_verbose) { LogMessage((net) ? LOG_NET : LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_IND_VOICE_CALL (Individual Voice Call), emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", @@ -1020,7 +1020,7 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u std::unique_ptr csbk = new_unique(CSBK_TD_GRANT); csbk->setLogicalCh1(chNo); - csbk->setSlotNo(slot); + csbk->setSlotNo(slot - 1U); if (m_verbose) { LogMessage((net) ? LOG_NET : LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_GRP_DATA_CALL (Group Data Call), emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", @@ -1041,7 +1041,7 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u std::unique_ptr csbk = new_unique(CSBK_PD_GRANT); csbk->setLogicalCh1(chNo); - csbk->setSlotNo(slot); + csbk->setSlotNo(slot - 1U); if (m_verbose) { LogMessage((net) ? LOG_NET : LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_IND_DATA_CALL (Individual Data Call), emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u",