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_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();
}
/// <summary>

@ -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;

@ -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();

@ -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())

Loading…
Cancel
Save

Powered by TurnKey Linux.