diff --git a/src/dmr/Slot.cpp b/src/dmr/Slot.cpp index 1f82af18..84e2aeb1 100644 --- a/src/dmr/Slot.cpp +++ b/src/dmr/Slot.cpp @@ -1371,12 +1371,13 @@ void Slot::writeRF_ControlData(uint16_t frameCnt, uint8_t n) if (j == m_lastLateEntry) { uint32_t dstId = entry.first; uint32_t srcId = m_affiliations->getGrantedSrcId(dstId); + bool grp = m_affiliations->isGroup(dstId); if (m_debug) { LogDebug(LOG_DMR, "writeRF_ControlData, frameCnt = %u, seq = %u, late entry, dstId = %u, srcId = %u", frameCnt, n, dstId, srcId); } - m_control->writeRF_CSBK_Grant_LateEntry(dstId, srcId); + m_control->writeRF_CSBK_Grant_LateEntry(dstId, srcId, grp); m_lastLateEntry = j++; break; } diff --git a/src/dmr/packet/ControlSignaling.cpp b/src/dmr/packet/ControlSignaling.cpp index 6c9974b6..2b2670ad 100644 --- a/src/dmr/packet/ControlSignaling.cpp +++ b/src/dmr/packet/ControlSignaling.cpp @@ -1323,21 +1323,34 @@ void ControlSignaling::writeRF_CSBK_U_Reg_Rsp(uint32_t srcId, uint8_t serviceOpt /// /// /// -void ControlSignaling::writeRF_CSBK_Grant_LateEntry(uint32_t dstId, uint32_t srcId) +/// +void ControlSignaling::writeRF_CSBK_Grant_LateEntry(uint32_t dstId, uint32_t srcId, bool grp) { Slot *m_tscc = m_slot->m_dmr->getTSCCSlot(); uint32_t chNo = m_tscc->m_affiliations->getGrantedCh(dstId); uint8_t slot = m_tscc->m_affiliations->getGrantedSlot(dstId); - std::unique_ptr csbk = new_unique(CSBK_TV_GRANT); - csbk->setLogicalCh1(chNo); - csbk->setSlotNo(slot); + if (grp) { + std::unique_ptr csbk = new_unique(CSBK_TV_GRANT); + csbk->setLogicalCh1(chNo); + csbk->setSlotNo(slot); - csbk->setSrcId(srcId); - csbk->setDstId(dstId); + csbk->setSrcId(srcId); + csbk->setDstId(dstId); - writeRF_CSBK(csbk.get()); + writeRF_CSBK(csbk.get()); + } + else { + std::unique_ptr csbk = new_unique(CSBK_PV_GRANT); + csbk->setLogicalCh1(chNo); + csbk->setSlotNo(slot); + + csbk->setSrcId(srcId); + csbk->setDstId(dstId); + + writeRF_CSBK(csbk.get()); + } } /// @@ -1381,10 +1394,9 @@ void ControlSignaling::writeRF_CSBK_Payload_Activate(uint32_t dstId, uint32_t sr } m_slot->setShortLC_Payload(m_slot->m_siteData, 1U); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 2; i++) { writeRF_CSBK(csbk.get(), false, true); - for (int i = 0; i < 3; i++) - writeRF_CSBK(csbk.get()); + writeRF_CSBK(csbk.get()); } } diff --git a/src/dmr/packet/ControlSignaling.h b/src/dmr/packet/ControlSignaling.h index ebc99647..4c88a353 100644 --- a/src/dmr/packet/ControlSignaling.h +++ b/src/dmr/packet/ControlSignaling.h @@ -110,7 +110,7 @@ namespace dmr void writeRF_CSBK_U_Reg_Rsp(uint32_t srcId, uint8_t serviceOptions); /// Helper to write a TSCC late entry channel grant packet on the RF interface. - void writeRF_CSBK_Grant_LateEntry(uint32_t dstId, uint32_t srcId); + void writeRF_CSBK_Grant_LateEntry(uint32_t dstId, uint32_t srcId, bool grp); /// Helper to write a payload random access to a TSCC payload channel on the RF interface. void writeRF_CSBK_Payload_Activate(uint32_t dstId, uint32_t srcId, bool grp, bool voice);