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;

3.56-maint
Bryan Biedenkapp 2 years ago
parent 99e56b338a
commit 8c083a7bee

@ -168,7 +168,7 @@ Slot::Slot(uint32_t slotNo, uint32_t timeout, uint32_t tgHang, uint32_t queueSiz
m_tsccPayloadSrcId(0U), m_tsccPayloadSrcId(0U),
m_tsccPayloadGroup(false), m_tsccPayloadGroup(false),
m_tsccPayloadVoice(true), m_tsccPayloadVoice(true),
m_tsccPayloadActRetransmit(1000U, 1U), m_tsccPayloadActRetry(1000U, 0U, 250U),
m_disableGrantSrcIdCheck(false), m_disableGrantSrcIdCheck(false),
m_lastLateEntry(0U), m_lastLateEntry(0U),
m_supervisor(false), m_supervisor(false),
@ -495,12 +495,12 @@ void Slot::clock()
if (m_dmr->m_tsccPayloadActive) { if (m_dmr->m_tsccPayloadActive) {
if (m_rfState == RS_RF_LISTENING && m_netState == RS_NET_IDLE) { if (m_rfState == RS_RF_LISTENING && m_netState == RS_NET_IDLE) {
if (m_tsccPayloadDstId > 0U) { if (m_tsccPayloadDstId > 0U) {
if (m_tsccPayloadActRetransmit.isRunning()) { if (m_tsccPayloadActRetry.isRunning()) {
m_tsccPayloadActRetransmit.clock(ms); m_tsccPayloadActRetry.clock(ms);
if (m_tsccPayloadActRetransmit.hasExpired()) { if (m_tsccPayloadActRetry.hasExpired()) {
m_control->writeRF_CSBK_Payload_Activate(m_tsccPayloadDstId, m_tsccPayloadSrcId, m_tsccPayloadGroup, m_tsccPayloadVoice); m_control->writeRF_CSBK_Payload_Activate(m_tsccPayloadDstId, m_tsccPayloadSrcId, m_tsccPayloadGroup, m_tsccPayloadVoice, true);
m_tsccPayloadActRetransmit.start(); 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_modem->writeDMRStart(true);
} }
m_control->writeRF_CSBK_Payload_Activate(dstId, srcId, group, voice, true); if (m_tsccPayloadDstId != 0U && !m_tsccPayloadActRetry.isRunning()) {
if (m_tsccPayloadDstId != 0U && !m_tsccPayloadActRetransmit.isRunning()) { m_tsccPayloadActRetry.start();
m_tsccPayloadActRetransmit.start();
} }
} }
@ -1435,7 +1434,7 @@ void Slot::clearTSCCActivated()
m_tsccPayloadGroup = false; m_tsccPayloadGroup = false;
m_tsccPayloadVoice = true; m_tsccPayloadVoice = true;
m_tsccPayloadActRetransmit.stop(); m_tsccPayloadActRetry.stop();
} }
/// <summary> /// <summary>

@ -221,7 +221,7 @@ namespace dmr
uint32_t m_tsccPayloadSrcId; uint32_t m_tsccPayloadSrcId;
bool m_tsccPayloadGroup; bool m_tsccPayloadGroup;
bool m_tsccPayloadVoice; bool m_tsccPayloadVoice;
Timer m_tsccPayloadActRetransmit; Timer m_tsccPayloadActRetry;
bool m_disableGrantSrcIdCheck; bool m_disableGrantSrcIdCheck;

@ -186,8 +186,8 @@ bool Data::process(uint8_t* data, uint32_t len)
CHECK_AUTHORITATIVE(dstId); CHECK_AUTHORITATIVE(dstId);
CHECK_TRAFFIC_COLLISION(dstId); CHECK_TRAFFIC_COLLISION(dstId);
if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetransmit.isRunning()) { if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetry.isRunning()) {
m_slot->m_tsccPayloadActRetransmit.stop(); m_slot->m_tsccPayloadActRetry.stop();
} }
// validate the source RID // validate the source RID
@ -411,8 +411,8 @@ void Data::processNetwork(const data::Data& dmrData)
CHECK_NET_AUTHORITATIVE(dstId); CHECK_NET_AUTHORITATIVE(dstId);
CHECK_TG_HANG(dstId); CHECK_TG_HANG(dstId);
if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetransmit.isRunning()) { if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetry.isRunning()) {
m_slot->m_tsccPayloadActRetransmit.stop(); m_slot->m_tsccPayloadActRetry.stop();
} }
m_slot->m_netFrames = dataHeader->getBlocks(); m_slot->m_netFrames = dataHeader->getBlocks();

@ -133,8 +133,8 @@ bool Voice::process(uint8_t* data, uint32_t len)
CHECK_AUTHORITATIVE(dstId); CHECK_AUTHORITATIVE(dstId);
CHECK_TRAFFIC_COLLISION(dstId); CHECK_TRAFFIC_COLLISION(dstId);
if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetransmit.isRunning()) { if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetry.isRunning()) {
m_slot->m_tsccPayloadActRetransmit.stop(); m_slot->m_tsccPayloadActRetry.stop();
} }
// validate source RID // validate source RID
@ -683,8 +683,8 @@ void Voice::processNetwork(const data::Data& dmrData)
CHECK_NET_AUTHORITATIVE(dstId); CHECK_NET_AUTHORITATIVE(dstId);
CHECK_NET_TRAFFIC_COLLISION(dstId); CHECK_NET_TRAFFIC_COLLISION(dstId);
if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetransmit.isRunning()) { if (m_slot->m_tsccPayloadDstId != 0U && m_slot->m_tsccPayloadActRetry.isRunning()) {
m_slot->m_tsccPayloadActRetransmit.stop(); m_slot->m_tsccPayloadActRetry.stop();
} }
if (dstId != dmrData.getDstId() || srcId != dmrData.getSrcId() || flco != dmrData.getFLCO()) if (dstId != dmrData.getDstId() || srcId != dmrData.getSrcId() || flco != dmrData.getFLCO())

Loading…
Cancel
Save

Powered by TurnKey Linux.