From 8c083a7beefab4af83ba85091d9a44c3c01a86a6 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Wed, 13 Dec 2023 14:13:25 -0500 Subject: [PATCH] don't issue a P_GRANT immediately after TSCC payload activation, instead wait 250ms and then issue P_GRANT, then if traffic has not started issue P_GRANT every 500ms until either traffic starts or the payload activation is cleared; --- src/dmr/Slot.cpp | 19 +++++++++---------- src/dmr/Slot.h | 2 +- src/dmr/packet/Data.cpp | 8 ++++---- src/dmr/packet/Voice.cpp | 8 ++++---- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/dmr/Slot.cpp b/src/dmr/Slot.cpp index a497bb00..7b7099a1 100644 --- a/src/dmr/Slot.cpp +++ b/src/dmr/Slot.cpp @@ -168,7 +168,7 @@ Slot::Slot(uint32_t slotNo, uint32_t timeout, uint32_t tgHang, uint32_t queueSiz m_tsccPayloadSrcId(0U), m_tsccPayloadGroup(false), m_tsccPayloadVoice(true), - m_tsccPayloadActRetransmit(1000U, 1U), + m_tsccPayloadActRetry(1000U, 0U, 250U), m_disableGrantSrcIdCheck(false), m_lastLateEntry(0U), m_supervisor(false), @@ -495,12 +495,12 @@ void Slot::clock() if (m_dmr->m_tsccPayloadActive) { if (m_rfState == RS_RF_LISTENING && m_netState == RS_NET_IDLE) { if (m_tsccPayloadDstId > 0U) { - if (m_tsccPayloadActRetransmit.isRunning()) { - m_tsccPayloadActRetransmit.clock(ms); + if (m_tsccPayloadActRetry.isRunning()) { + m_tsccPayloadActRetry.clock(ms); - if (m_tsccPayloadActRetransmit.hasExpired()) { - m_control->writeRF_CSBK_Payload_Activate(m_tsccPayloadDstId, m_tsccPayloadSrcId, m_tsccPayloadGroup, m_tsccPayloadVoice); - m_tsccPayloadActRetransmit.start(); + if (m_tsccPayloadActRetry.hasExpired()) { + m_control->writeRF_CSBK_Payload_Activate(m_tsccPayloadDstId, m_tsccPayloadSrcId, m_tsccPayloadGroup, m_tsccPayloadVoice, true); + m_tsccPayloadActRetry.start(0U, 500U); } } @@ -769,9 +769,8 @@ void Slot::setTSCCActivated(uint32_t dstId, uint32_t srcId, bool group, bool voi m_modem->writeDMRStart(true); } - m_control->writeRF_CSBK_Payload_Activate(dstId, srcId, group, voice, true); - if (m_tsccPayloadDstId != 0U && !m_tsccPayloadActRetransmit.isRunning()) { - m_tsccPayloadActRetransmit.start(); + if (m_tsccPayloadDstId != 0U && !m_tsccPayloadActRetry.isRunning()) { + m_tsccPayloadActRetry.start(); } } @@ -1435,7 +1434,7 @@ void Slot::clearTSCCActivated() m_tsccPayloadGroup = false; m_tsccPayloadVoice = true; - m_tsccPayloadActRetransmit.stop(); + m_tsccPayloadActRetry.stop(); } /// diff --git a/src/dmr/Slot.h b/src/dmr/Slot.h index fff70ba4..efc220fd 100644 --- a/src/dmr/Slot.h +++ b/src/dmr/Slot.h @@ -221,7 +221,7 @@ namespace dmr uint32_t m_tsccPayloadSrcId; bool m_tsccPayloadGroup; bool m_tsccPayloadVoice; - Timer m_tsccPayloadActRetransmit; + Timer m_tsccPayloadActRetry; bool m_disableGrantSrcIdCheck; diff --git a/src/dmr/packet/Data.cpp b/src/dmr/packet/Data.cpp index 76796194..75834629 100644 --- a/src/dmr/packet/Data.cpp +++ b/src/dmr/packet/Data.cpp @@ -186,8 +186,8 @@ bool Data::process(uint8_t* data, uint32_t len) CHECK_AUTHORITATIVE(dstId); CHECK_TRAFFIC_COLLISION(dstId); - if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetransmit.isRunning()) { - m_slot->m_tsccPayloadActRetransmit.stop(); + if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetry.isRunning()) { + m_slot->m_tsccPayloadActRetry.stop(); } // validate the source RID @@ -411,8 +411,8 @@ void Data::processNetwork(const data::Data& dmrData) CHECK_NET_AUTHORITATIVE(dstId); CHECK_TG_HANG(dstId); - if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetransmit.isRunning()) { - m_slot->m_tsccPayloadActRetransmit.stop(); + if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetry.isRunning()) { + m_slot->m_tsccPayloadActRetry.stop(); } m_slot->m_netFrames = dataHeader->getBlocks(); diff --git a/src/dmr/packet/Voice.cpp b/src/dmr/packet/Voice.cpp index 1c66d334..b505348a 100644 --- a/src/dmr/packet/Voice.cpp +++ b/src/dmr/packet/Voice.cpp @@ -133,8 +133,8 @@ bool Voice::process(uint8_t* data, uint32_t len) CHECK_AUTHORITATIVE(dstId); CHECK_TRAFFIC_COLLISION(dstId); - if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetransmit.isRunning()) { - m_slot->m_tsccPayloadActRetransmit.stop(); + if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetry.isRunning()) { + m_slot->m_tsccPayloadActRetry.stop(); } // validate source RID @@ -683,8 +683,8 @@ void Voice::processNetwork(const data::Data& dmrData) CHECK_NET_AUTHORITATIVE(dstId); CHECK_NET_TRAFFIC_COLLISION(dstId); - if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetransmit.isRunning()) { - m_slot->m_tsccPayloadActRetransmit.stop(); + if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetry.isRunning()) { + m_slot->m_tsccPayloadActRetry.stop(); } if (dstId != dmrData.getDstId() || srcId != dmrData.getSrcId() || flco != dmrData.getFLCO())