store srcId from DMR payload channel activation; implement running timer to retry payload activation until either traffic starts or the payload activation is cleared;

3.56-maint
Bryan Biedenkapp 2 years ago
parent 9da279ac88
commit 262eb1c76c

@ -165,8 +165,10 @@ Slot::Slot(uint32_t slotNo, uint32_t timeout, uint32_t tgHang, uint32_t queueSiz
m_enableTSCC(false),
m_dedicatedTSCC(false),
m_tsccPayloadDstId(0U),
m_tsccPayloadSrcId(0U),
m_tsccPayloadGroup(false),
m_tsccPayloadVoice(true),
m_tsccPayloadActRetransmit(1000U, 1U),
m_disableGrantSrcIdCheck(false),
m_lastLateEntry(0U),
m_supervisor(false),
@ -493,6 +495,15 @@ 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_tsccPayloadActRetransmit.hasExpired()) {
m_control->writeRF_CSBK_Payload_Activate(m_tsccPayloadDstId, m_tsccPayloadSrcId, m_tsccPayloadGroup, m_tsccPayloadVoice);
m_tsccPayloadActRetransmit.start();
}
}
if ((m_dmr->m_tsccCnt % 2) > 0) {
setShortLC(m_slotNo, m_tsccPayloadDstId, m_tsccPayloadGroup ? FLCO_GROUP : FLCO_PRIVATE, m_tsccPayloadVoice);
}
@ -749,6 +760,7 @@ void Slot::setTSCC(bool enable, bool dedicated)
void Slot::setTSCCActivated(uint32_t dstId, uint32_t srcId, bool group, bool voice)
{
m_tsccPayloadDstId = dstId;
m_tsccPayloadSrcId = srcId;
m_tsccPayloadGroup = group;
m_tsccPayloadVoice = voice;
@ -757,7 +769,10 @@ 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);
m_control->writeRF_CSBK_Payload_Activate(dstId, srcId, group, voice, true);
if (m_tsccPayloadDstId != 0U && !m_tsccPayloadActRetransmit.isRunning()) {
m_tsccPayloadActRetransmit.start();
}
}
/// <summary>
@ -1410,6 +1425,19 @@ void Slot::writeRF_ControlData(uint16_t frameCnt, uint8_t n)
lc::CSBK::setVerbose(csbkVerbose);
}
/// <summary>
/// Clears the flag indicating whether the slot is a TSCC payload slot.
/// </summary>
void Slot::clearTSCCActivated()
{
m_tsccPayloadDstId = 0U;
m_tsccPayloadSrcId = 0U;
m_tsccPayloadGroup = false;
m_tsccPayloadVoice = true;
m_tsccPayloadActRetransmit.stop();
}
/// <summary>
///
/// </summary>

@ -218,8 +218,10 @@ namespace dmr
bool m_dedicatedTSCC;
uint32_t m_tsccPayloadDstId;
uint32_t m_tsccPayloadSrcId;
bool m_tsccPayloadGroup;
bool m_tsccPayloadVoice;
Timer m_tsccPayloadActRetransmit;
bool m_disableGrantSrcIdCheck;
@ -304,7 +306,7 @@ namespace dmr
void writeRF_ControlData(uint16_t frameCnt, uint8_t n);
/// <summary>Clears the flag indicating whether the slot is a TSCC payload slot.</summary>
void clearTSCCActivated() { m_tsccPayloadDstId = 0U; m_tsccPayloadGroup = false; m_tsccPayloadVoice = true; }
void clearTSCCActivated();
/// <summary>Helper to set the DMR short LC.</summary>
static void setShortLC(uint32_t slotNo, uint32_t id, uint8_t flco = FLCO_GROUP, bool voice = true);

@ -1360,7 +1360,8 @@ void ControlSignaling::writeRF_CSBK_Grant_LateEntry(uint32_t dstId, uint32_t src
/// <param name="srcId"></param>
/// <param name="grp"></param>
/// <param name="voice"></param>
void ControlSignaling::writeRF_CSBK_Payload_Activate(uint32_t dstId, uint32_t srcId, bool grp, bool voice)
/// <param name="imm"></param>
void ControlSignaling::writeRF_CSBK_Payload_Activate(uint32_t dstId, uint32_t srcId, bool grp, bool voice, bool imm)
{
std::unique_ptr<CSBK_P_GRANT> csbk = new_unique(CSBK_P_GRANT);
if (voice) {
@ -1394,10 +1395,8 @@ 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 < 2; i++) {
writeRF_CSBK(csbk.get(), false, true);
writeRF_CSBK(csbk.get());
}
for (uint8_t i = 0; i < 2U; i++)
writeRF_CSBK(csbk.get(), false, imm);
}
/// <summary>

@ -112,7 +112,7 @@ namespace dmr
/// <summary>Helper to write a TSCC late entry channel grant packet on the RF interface.</summary>
void writeRF_CSBK_Grant_LateEntry(uint32_t dstId, uint32_t srcId, bool grp);
/// <summary>Helper to write a payload random access to a TSCC payload channel on the RF interface.</summary>
void writeRF_CSBK_Payload_Activate(uint32_t dstId, uint32_t srcId, bool grp, bool voice);
void writeRF_CSBK_Payload_Activate(uint32_t dstId, uint32_t srcId, bool grp, bool voice, bool imm = false);
/// <summary>Helper to write a TSCC Aloha broadcast packet on the RF interface.</summary>
void writeRF_TSCC_Aloha();

@ -186,6 +186,10 @@ 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();
}
// validate the source RID
if (!acl::AccessControl::validateSrcId(srcId)) {
LogWarning(LOG_RF, "DMR Slot %u, DT_DATA_HEADER denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId);
@ -407,6 +411,10 @@ 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();
}
m_slot->m_netFrames = dataHeader->getBlocks();
m_slot->m_netLC = new_unique(lc::LC, gi ? FLCO_GROUP : FLCO_PRIVATE, srcId, dstId);

@ -133,6 +133,10 @@ 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();
}
// validate source RID
if (!acl::AccessControl::validateSrcId(srcId)) {
if (m_slot->m_data->m_lastRejectId == 0U || m_slot->m_data->m_lastRejectId == srcId) {
@ -679,6 +683,10 @@ 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 (dstId != dmrData.getDstId() || srcId != dmrData.getSrcId() || flco != dmrData.getFLCO())
LogWarning(LOG_NET, "DMR Slot %u, DT_VOICE_LC_HEADER, header doesn't match the DMR RF header: %u->%s%u %u->%s%u", m_slot->m_slotNo,
dmrData.getSrcId(), dmrData.getFLCO() == FLCO_GROUP ? "TG" : "", dmrData.getDstId(),

Loading…
Cancel
Save

Powered by TurnKey Linux.