transmit P_CLEAR at the end of a TSCC call;

3.56-maint
Bryan Biedenkapp 2 years ago
parent 8c083a7bee
commit 1d498fc48f

@ -509,9 +509,6 @@ void Slot::clock()
}
}
}
else {
clearTSCCActivated();
}
}
// handle timeouts and hang timers
@ -1429,6 +1426,10 @@ void Slot::writeRF_ControlData(uint16_t frameCnt, uint8_t n)
/// </summary>
void Slot::clearTSCCActivated()
{
if (m_tsccPayloadDstId != 0U && m_tsccPayloadSrcId != 0U) {
m_control->writeRF_CSBK_Payload_Clear(m_tsccPayloadDstId, m_tsccPayloadSrcId, m_tsccPayloadGroup);
}
m_tsccPayloadDstId = 0U;
m_tsccPayloadSrcId = 0U;
m_tsccPayloadGroup = false;

@ -82,7 +82,7 @@ namespace dmr
/// <summary>DMR access color code.</summary>
__PROTECTED_PROPERTY(uint8_t, colorCode, ColorCode);
/// <summary>Flag indicating this is the last TSBK in a sequence of TSBKs.</summary>
/// <summary>Flag indicating this is the last CSBK in a sequence of CSBKs.</summary>
__PROTECTED_PROPERTY(bool, lastBlock, LastBlock);
/// <summary>Flag indicating whether the CSBK is a Cdef block.</summary>
__PROTECTED_PROPERTY(bool, Cdef, Cdef);

@ -1367,7 +1367,7 @@ void ControlSignaling::writeRF_CSBK_Grant_LateEntry(uint32_t dstId, uint32_t src
}
/// <summary>
/// Helper to write a payload random access to a TSCC payload channel on the RF interface.
/// Helper to write a payload activation to a TSCC payload channel on the RF interface.
/// </summary>
/// <param name="dstId"></param>
/// <param name="srcId"></param>
@ -1412,6 +1412,36 @@ void ControlSignaling::writeRF_CSBK_Payload_Activate(uint32_t dstId, uint32_t sr
writeRF_CSBK(csbk.get(), false, imm);
}
/// <summary>
/// Helper to write a payload clear to a TSCC payload channel on the RF interface.
/// </summary>
/// <param name="dstId"></param>
/// <param name="srcId"></param>
/// <param name="grp"></param>
/// <param name="imm"></param>
void ControlSignaling::writeRF_CSBK_Payload_Clear(uint32_t dstId, uint32_t srcId, bool grp, bool imm)
{
std::unique_ptr<CSBK_P_CLEAR> csbk = new_unique(CSBK_P_CLEAR);
csbk->setGI(grp);
csbk->setLastBlock(true);
csbk->setLogicalCh1(m_slot->m_channelNo);
csbk->setSlotNo(m_slot->m_slotNo);
csbk->setSrcId(srcId);
csbk->setDstId(dstId);
if (m_verbose) {
LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s, group = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u",
m_slot->m_slotNo, csbk->toString().c_str(), csbk->getGI(), csbk->getLogicalCh1(), csbk->getSlotNo(), srcId, dstId);
}
for (uint8_t i = 0; i < 2U; i++)
writeRF_CSBK(csbk.get(), false, imm);
}
/// <summary>
/// Helper to write a TSCC Aloha broadcast packet on the RF interface.
/// </summary>

@ -111,8 +111,10 @@ 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>
/// <summary>Helper to write a payload activation 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, bool imm = false);
/// <summary>Helper to write a payload clear to a TSCC payload channel on the RF interface.</summary>
void writeRF_CSBK_Payload_Clear(uint32_t dstId, uint32_t srcId, bool grp, bool imm = false);
/// <summary>Helper to write a TSCC Aloha broadcast packet on the RF interface.</summary>
void writeRF_TSCC_Aloha();

@ -141,6 +141,7 @@ bool Data::process(uint8_t* data, uint32_t len)
if (m_tscc != nullptr) {
if (m_tscc->m_enableTSCC) {
m_tscc->m_affiliations->releaseGrant(m_slot->m_rfLC->getDstId(), false);
m_slot->clearTSCCActivated();
}
}
@ -382,6 +383,15 @@ void Data::processNetwork(const data::Data& dmrData)
LogMessage(LOG_RF, DMR_DT_TERMINATOR_WITH_LC ", slot = %u, dstId = %u", m_slot->m_slotNo, m_slot->m_netLC->getDstId());
}
// release trunked grant (if necessary)
Slot *m_tscc = m_slot->m_dmr->getTSCCSlot();
if (m_tscc != nullptr) {
if (m_tscc->m_enableTSCC) {
m_tscc->m_affiliations->releaseGrant(m_slot->m_rfLC->getDstId(), false);
m_slot->clearTSCCActivated();
}
}
// We've received the voice header and terminator haven't we?
m_slot->m_netFrames += 2U;
::ActivityLog("DMR", false, "Slot %u network end of voice transmission, %.1f seconds, %u%% packet loss, BER: %.1f%%",

Loading…
Cancel
Save

Powered by TurnKey Linux.