From a0ef0aaf632584a0d2347e22d613ddf654e8acfd Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Mon, 12 Apr 2021 17:50:22 +0000 Subject: [PATCH] code cleanup; --- dmr/Control.cpp | 8 +- dmr/ControlPacket.cpp | 237 +++++++++++++++++++++++++++++++++++++--- dmr/ControlPacket.h | 12 ++- dmr/Slot.cpp | 243 ++---------------------------------------- dmr/Slot.h | 20 ++-- 5 files changed, 253 insertions(+), 267 deletions(-) diff --git a/dmr/Control.cpp b/dmr/Control.cpp index 29020809..6c26ac4b 100644 --- a/dmr/Control.cpp +++ b/dmr/Control.cpp @@ -244,10 +244,10 @@ void Control::writeRF_Ext_Func(uint32_t slotNo, uint32_t func, uint32_t arg, uin { switch (slotNo) { case 1U: - m_slot1->writeRF_Ext_Func(func, arg, dstId); + m_slot1->control()->writeRF_Ext_Func(func, arg, dstId); break; case 2U: - m_slot2->writeRF_Ext_Func(func, arg, dstId); + m_slot2->control()->writeRF_Ext_Func(func, arg, dstId); break; default: LogError(LOG_NET, "DMR, invalid slot, slotNo = %u", slotNo); @@ -265,10 +265,10 @@ void Control::writeRF_Call_Alrt(uint32_t slotNo, uint32_t srcId, uint32_t dstId) { switch (slotNo) { case 1U: - m_slot1->writeRF_Call_Alrt(srcId, dstId); + m_slot1->control()->writeRF_Call_Alrt(srcId, dstId); break; case 2U: - m_slot2->writeRF_Call_Alrt(srcId, dstId); + m_slot2->control()->writeRF_Call_Alrt(srcId, dstId); break; default: LogError(LOG_NET, "DMR, invalid slot, slotNo = %u", slotNo); diff --git a/dmr/ControlPacket.cpp b/dmr/ControlPacket.cpp index c91cc879..60b4914c 100644 --- a/dmr/ControlPacket.cpp +++ b/dmr/ControlPacket.cpp @@ -49,6 +49,7 @@ using namespace dmr; // --------------------------------------------------------------------------- // Macros // --------------------------------------------------------------------------- + // Don't process RF frames if the network isn't in a idle state. #define CHECK_TRAFFIC_COLLISION(_DST_ID) \ if (m_slot->m_netState != RS_NET_IDLE && _DST_ID == m_slot->m_netLastDstId) { \ @@ -56,13 +57,6 @@ using namespace dmr; return false; \ } -#define CHECK_TRAFFIC_COLLISION_DELLC(_DST_ID) \ - if (m_slot->m_netState != RS_NET_IDLE && _DST_ID == m_slot->m_netLastDstId) { \ - LogWarning(LOG_RF, "DMR Slot %u, Traffic collision detect, preempting new RF traffic to existing network traffic!", m_slot->m_slotNo); \ - delete lc; \ - return false; \ - } - #define CHECK_TG_HANG(_DST_ID) \ if (m_slot->m_rfLastDstId != 0U) { \ if (m_slot->m_rfLastDstId != _DST_ID && (m_slot->m_rfTGHang.isRunning() && !m_slot->m_rfTGHang.hasExpired())) { \ @@ -70,14 +64,6 @@ using namespace dmr; } \ } -#define CHECK_TG_HANG_DELLC(_DST_ID) \ - if (m_slot->m_rfLastDstId != 0U) { \ - if (m_slot->m_rfLastDstId != _DST_ID && (m_slot->m_rfTGHang.isRunning() && !m_slot->m_rfTGHang.hasExpired())) { \ - delete lc; \ - return; \ - } \ - } - // --------------------------------------------------------------------------- // Public Class Members // --------------------------------------------------------------------------- @@ -386,6 +372,113 @@ void ControlPacket::processNetwork(const data::Data & dmrData) } } +/// +/// Helper to write a extended function packet on the RF interface. +/// +/// Extended function opcode. +/// Extended function argument. +/// Destination radio ID. +void ControlPacket::writeRF_Ext_Func(uint32_t func, uint32_t arg, uint32_t dstId) +{ + if (m_verbose) { + LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_EXT_FNCT (Extended Function), op = $%02X, arg = %u, tgt = %u", + m_slot->m_slotNo, func, arg, dstId); + } + + // generate activity log entry + if (func == DMR_EXT_FNCT_CHECK) { + ::ActivityLog("DMR", true, "Slot %u radio check request from %u to %u", m_slot->m_slotNo, arg, dstId); + } + else if (func == DMR_EXT_FNCT_INHIBIT) { + ::ActivityLog("DMR", true, "Slot %u radio inhibit request from %u to %u", m_slot->m_slotNo, arg, dstId); + } + else if (func == DMR_EXT_FNCT_UNINHIBIT) { + ::ActivityLog("DMR", true, "Slot %u radio uninhibit request from %u to %u", m_slot->m_slotNo, arg, dstId); + } + + uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; + ::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES); + + SlotType slotType; + slotType.setColorCode(m_slot->m_colorCode); + slotType.setDataType(DT_CSBK); + + lc::CSBK csbk = lc::CSBK(); + csbk.setVerbose(m_dumpCSBKData); + csbk.setCSBKO(CSBKO_EXT_FNCT); + csbk.setFID(FID_DMRA); + + csbk.setGI(false); + csbk.setCBF(func); + csbk.setSrcId(arg); + csbk.setDstId(dstId); + + // Regenerate the CSBK data + csbk.encode(data + 2U); + + // Regenerate the Slot Type + slotType.encode(data + 2U); + + // Convert the Data Sync to be from the BS or MS as needed + Sync::addDMRDataSync(data + 2U, m_slot->m_duplex); + + m_slot->m_rfSeqNo = 0U; + + data[0U] = TAG_DATA; + data[1U] = 0x00U; + + if (m_slot->m_duplex) + m_slot->writeQueueRF(data); +} + +/// +/// Helper to write a call alert packet on the RF interface. +/// +/// Source radio ID. +/// Destination radio ID. +void ControlPacket::writeRF_Call_Alrt(uint32_t srcId, uint32_t dstId) +{ + if (m_verbose) { + LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_CALL_ALRT (Call Alert), src = %u, dst = %u", + m_slot->m_slotNo, srcId, dstId); + } + + ::ActivityLog("DMR", true, "Slot %u call alert request from %u to %u", m_slot->m_slotNo, srcId, dstId); + + uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; + ::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES); + + SlotType slotType; + slotType.setColorCode(m_slot->m_colorCode); + slotType.setDataType(DT_CSBK); + + lc::CSBK csbk = lc::CSBK(); + csbk.setVerbose(m_dumpCSBKData); + csbk.setCSBKO(CSBKO_CALL_ALRT); + csbk.setFID(FID_DMRA); + + csbk.setGI(false); + csbk.setSrcId(srcId); + csbk.setDstId(dstId); + + // Regenerate the CSBK data + csbk.encode(data + 2U); + + // Regenerate the Slot Type + slotType.encode(data + 2U); + + // Convert the Data Sync to be from the BS or MS as needed + Sync::addDMRDataSync(data + 2U, m_slot->m_duplex); + + m_slot->m_rfSeqNo = 0U; + + data[0U] = TAG_DATA; + data[1U] = 0x00U; + + if (m_slot->m_duplex) + m_slot->writeQueueRF(data); +} + // --------------------------------------------------------------------------- // Private Class Members // --------------------------------------------------------------------------- @@ -413,3 +506,117 @@ ControlPacket::~ControlPacket() { /* stub */ } + +/// +/// Helper to write a TSCC Ann-Wd broadcast packet on the RF interface. +/// +/// +/// +void ControlPacket::writeRF_TSCC_Bcast_Ann_Wd(uint32_t channelNo, bool annWd) +{ + if (m_verbose) { + LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_BROADCAST (Broadcast), BCAST_ANNC_ANN_WD_TSCC (Announce-WD TSCC Channel), channelNo = %u, annWd = %u", + m_slot->m_slotNo, channelNo, annWd); + } + + m_slot->m_rfSeqNo = 0U; + + SlotType slotType; + slotType.setColorCode(m_slot->m_colorCode); + slotType.setDataType(DT_CSBK); + + lc::CSBK csbk = lc::CSBK(); + csbk.setVerbose(m_dumpCSBKData); + csbk.setCSBKO(CSBKO_BROADCAST); + csbk.setFID(FID_ETSI); + + csbk.setAnncType(BCAST_ANNC_ANN_WD_TSCC); + csbk.setSiteData(m_slot->m_siteData); + csbk.setLogicalCh1(channelNo); + csbk.setAnnWdCh1(annWd); + + uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; + ::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES); + + // MBC frame 1 + csbk.setLastBlock(false); + + // Regenerate the CSBK data + csbk.encode(data + 2U); + + // Regenerate the Slot Type + slotType.encode(data + 2U); + + // Convert the Data Sync to be from the BS or MS as needed + Sync::addDMRDataSync(data + 2U, m_slot->m_duplex); + + data[0U] = TAG_DATA; + data[1U] = 0x00U; + + if (m_slot->m_duplex) + m_slot->writeQueueRF(data); + + ::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES); + + // MBC frame 2 + csbk.setLastBlock(false); + csbk.setCdef(true); + csbk.setIdenTable(m_slot->m_idenEntry); + + // Regenerate the CSBK data + csbk.encode(data + 2U); + + // Regenerate the Slot Type + slotType.encode(data + 2U); + + // Convert the Data Sync to be from the BS or MS as needed + Sync::addDMRDataSync(data + 2U, m_slot->m_duplex); + + data[0U] = TAG_DATA; + data[1U] = 0x00U; + + if (m_slot->m_duplex) + m_slot->writeQueueRF(data); +} + +/// +/// Helper to write a TSCC Sys_Parm broadcast packet on the RF interface. +/// +void ControlPacket::writeRF_TSCC_Bcast_Sys_Parm() +{ + if (m_verbose) { + LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_BROADCAST (Broadcast), BCAST_ANNC_SITE_PARMS (Announce Site Parms)", m_slot->m_slotNo); + } + + uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; + ::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES); + + SlotType slotType; + slotType.setColorCode(m_slot->m_colorCode); + slotType.setDataType(DT_CSBK); + + lc::CSBK csbk = lc::CSBK(); + csbk.setVerbose(m_dumpCSBKData); + csbk.setCSBKO(CSBKO_BROADCAST); + csbk.setFID(FID_ETSI); + + csbk.setAnncType(BCAST_ANNC_SITE_PARMS); + csbk.setSiteData(m_slot->m_siteData); + + // Regenerate the CSBK data + csbk.encode(data + 2U); + + // Regenerate the Slot Type + slotType.encode(data + 2U); + + // Convert the Data Sync to be from the BS or MS as needed + Sync::addDMRDataSync(data + 2U, m_slot->m_duplex); + + m_slot->m_rfSeqNo = 0U; + + data[0U] = TAG_DATA; + data[1U] = 0x00U; + + if (m_slot->m_duplex) + m_slot->writeQueueRF(data); +} diff --git a/dmr/ControlPacket.h b/dmr/ControlPacket.h index 1ce59e20..742b5889 100644 --- a/dmr/ControlPacket.h +++ b/dmr/ControlPacket.h @@ -51,7 +51,6 @@ namespace dmr // --------------------------------------------------------------------------- // Class Prototypes // --------------------------------------------------------------------------- - class HOST_SW_API DataPacket; class HOST_SW_API Slot; // --------------------------------------------------------------------------- @@ -66,8 +65,12 @@ namespace dmr /// Process a data frame from the network. void processNetwork(const data::Data& dmrData); + /// Helper to write a extended function packet on the RF interface. + void writeRF_Ext_Func(uint32_t func, uint32_t arg, uint32_t dstId); + /// Helper to write a call alert packet on the RF interface. + void writeRF_Call_Alrt(uint32_t srcId, uint32_t dstId); + private: - friend class DataPacket; friend class Slot; Slot* m_slot; @@ -79,6 +82,11 @@ namespace dmr ControlPacket(Slot* slot, network::BaseNetwork* network, bool dumpCSBKData, bool debug, bool verbose); /// Finalizes a instance of the DataPacket class. ~ControlPacket(); + + /// Helper to write a TSCC Ann-Wd broadcast packet on the RF interface. + void writeRF_TSCC_Bcast_Ann_Wd(uint32_t channelNo, bool annWd); + /// Helper to write a TSCC Sys_Parm broadcast packet on the RF interface. + void writeRF_TSCC_Bcast_Sys_Parm(); }; } // namespace dmr diff --git a/dmr/Slot.cpp b/dmr/Slot.cpp index 8320c5e9..7dfe6c06 100644 --- a/dmr/Slot.cpp +++ b/dmr/Slot.cpp @@ -428,6 +428,17 @@ void Slot::clock() } } +/// +/// Helper to change the debug and verbose state. +/// +/// Flag indicating whether DMR debug is enabled. +/// Flag indicating whether DMR verbose logging is enabled. +void Slot::setDebugVerbose(bool debug, bool verbose) +{ + m_debug = m_voice->m_debug = m_data->m_debug = debug = m_control->m_debug; + m_verbose = m_voice->m_verbose = m_data->m_verbose = verbose = m_control->m_verbose; +} + /// /// Helper to initialize the DMR slot processor. /// @@ -513,17 +524,6 @@ void Slot::setSiteData(uint32_t netId, uint8_t siteId, uint8_t channelId, uint32 // --------------------------------------------------------------------------- // Private Class Members // --------------------------------------------------------------------------- -/// -/// Helper to change the debug and verbose state. -/// -/// Flag indicating whether DMR debug is enabled. -/// Flag indicating whether DMR verbose logging is enabled. -void Slot::setDebugVerbose(bool debug, bool verbose) -{ - m_debug = m_voice->m_debug = m_data->m_debug = debug; - m_verbose = m_voice->m_verbose = m_data->m_verbose = verbose; -} - /// /// Write data processed from RF to the data ring buffer. /// @@ -622,227 +622,6 @@ void Slot::writeNetworkRF(const uint8_t* data, uint8_t dataType, uint8_t flco, u m_network->writeDMR(dmrData); } -/// -/// Helper to write a extended function packet on the RF interface. -/// -/// Extended function opcode. -/// Extended function argument. -/// Destination radio ID. -void Slot::writeRF_Ext_Func(uint32_t func, uint32_t arg, uint32_t dstId) -{ - if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_EXT_FNCT (Extended Function), op = $%02X, arg = %u, tgt = %u", - m_slotNo, func, arg, dstId); - } - - // generate activity log entry - if (func == DMR_EXT_FNCT_CHECK) { - ::ActivityLog("DMR", true, "Slot %u radio check request from %u to %u", m_slotNo, arg, dstId); - } - else if (func == DMR_EXT_FNCT_INHIBIT) { - ::ActivityLog("DMR", true, "Slot %u radio inhibit request from %u to %u", m_slotNo, arg, dstId); - } - else if (func == DMR_EXT_FNCT_UNINHIBIT) { - ::ActivityLog("DMR", true, "Slot %u radio uninhibit request from %u to %u", m_slotNo, arg, dstId); - } - - uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; - ::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES); - - SlotType slotType; - slotType.setColorCode(m_colorCode); - slotType.setDataType(DT_CSBK); - - lc::CSBK csbk = lc::CSBK(); - csbk.setVerbose(m_dumpCSBKData); - csbk.setCSBKO(CSBKO_EXT_FNCT); - csbk.setFID(FID_DMRA); - - csbk.setGI(false); - csbk.setCBF(func); - csbk.setSrcId(arg); - csbk.setDstId(dstId); - - // Regenerate the CSBK data - csbk.encode(data + 2U); - - // Regenerate the Slot Type - slotType.encode(data + 2U); - - // Convert the Data Sync to be from the BS or MS as needed - Sync::addDMRDataSync(data + 2U, m_duplex); - - m_rfSeqNo = 0U; - - data[0U] = TAG_DATA; - data[1U] = 0x00U; - - if (m_duplex) - writeQueueRF(data); -} - -/// -/// Helper to write a call alert packet on the RF interface. -/// -/// Source radio ID. -/// Destination radio ID. -void Slot::writeRF_Call_Alrt(uint32_t srcId, uint32_t dstId) -{ - if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_CALL_ALRT (Call Alert), src = %u, dst = %u", - m_slotNo, srcId, dstId); - } - - ::ActivityLog("DMR", true, "Slot %u call alert request from %u to %u", m_slotNo, srcId, dstId); - - uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; - ::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES); - - SlotType slotType; - slotType.setColorCode(m_colorCode); - slotType.setDataType(DT_CSBK); - - lc::CSBK csbk = lc::CSBK(); - csbk.setVerbose(m_dumpCSBKData); - csbk.setCSBKO(CSBKO_CALL_ALRT); - csbk.setFID(FID_DMRA); - - csbk.setGI(false); - csbk.setSrcId(srcId); - csbk.setDstId(dstId); - - // Regenerate the CSBK data - csbk.encode(data + 2U); - - // Regenerate the Slot Type - slotType.encode(data + 2U); - - // Convert the Data Sync to be from the BS or MS as needed - Sync::addDMRDataSync(data + 2U, m_duplex); - - m_rfSeqNo = 0U; - - data[0U] = TAG_DATA; - data[1U] = 0x00U; - - if (m_duplex) - writeQueueRF(data); -} - -/// -/// Helper to write a TSCC Ann-Wd broadcast packet on the RF interface. -/// -/// -/// -void Slot::writeRF_TSCC_Bcast_Ann_Wd(uint32_t channelNo, bool annWd) -{ - if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_BROADCAST (Broadcast), BCAST_ANNC_ANN_WD_TSCC (Announce-WD TSCC Channel), channelNo = %u, annWd = %u", - m_slotNo, channelNo, annWd); - } - - m_rfSeqNo = 0U; - - SlotType slotType; - slotType.setColorCode(m_colorCode); - slotType.setDataType(DT_CSBK); - - lc::CSBK csbk = lc::CSBK(); - csbk.setVerbose(m_dumpCSBKData); - csbk.setCSBKO(CSBKO_BROADCAST); - csbk.setFID(FID_ETSI); - - csbk.setAnncType(BCAST_ANNC_ANN_WD_TSCC); - csbk.setSiteData(m_siteData); - csbk.setLogicalCh1(channelNo); - csbk.setAnnWdCh1(annWd); - - uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; - ::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES); - - // MBC frame 1 - csbk.setLastBlock(false); - - // Regenerate the CSBK data - csbk.encode(data + 2U); - - // Regenerate the Slot Type - slotType.encode(data + 2U); - - // Convert the Data Sync to be from the BS or MS as needed - Sync::addDMRDataSync(data + 2U, m_duplex); - - data[0U] = TAG_DATA; - data[1U] = 0x00U; - - if (m_duplex) - writeQueueRF(data); - - ::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES); - - // MBC frame 2 - csbk.setLastBlock(false); - csbk.setCdef(true); - csbk.setIdenTable(m_idenEntry); - - // Regenerate the CSBK data - csbk.encode(data + 2U); - - // Regenerate the Slot Type - slotType.encode(data + 2U); - - // Convert the Data Sync to be from the BS or MS as needed - Sync::addDMRDataSync(data + 2U, m_duplex); - - data[0U] = TAG_DATA; - data[1U] = 0x00U; - - if (m_duplex) - writeQueueRF(data); -} - -/// -/// Helper to write a TSCC Sys_Parm broadcast packet on the RF interface. -/// -void Slot::writeRF_TSCC_Bcast_Sys_Parm() -{ - if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_BROADCAST (Broadcast), BCAST_ANNC_SITE_PARMS (Announce Site Parms)", m_slotNo); - } - - uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; - ::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES); - - SlotType slotType; - slotType.setColorCode(m_colorCode); - slotType.setDataType(DT_CSBK); - - lc::CSBK csbk = lc::CSBK(); - csbk.setVerbose(m_dumpCSBKData); - csbk.setCSBKO(CSBKO_BROADCAST); - csbk.setFID(FID_ETSI); - - csbk.setAnncType(BCAST_ANNC_SITE_PARMS); - csbk.setSiteData(m_siteData); - - // Regenerate the CSBK data - csbk.encode(data + 2U); - - // Regenerate the Slot Type - slotType.encode(data + 2U); - - // Convert the Data Sync to be from the BS or MS as needed - Sync::addDMRDataSync(data + 2U, m_duplex); - - m_rfSeqNo = 0U; - - data[0U] = TAG_DATA; - data[1U] = 0x00U; - - if (m_duplex) - writeQueueRF(data); -} - /// /// Helper to write RF end of frame data. /// diff --git a/dmr/Slot.h b/dmr/Slot.h index f1237079..d0650a82 100644 --- a/dmr/Slot.h +++ b/dmr/Slot.h @@ -54,7 +54,6 @@ namespace dmr // --------------------------------------------------------------------------- // Class Prototypes // --------------------------------------------------------------------------- - class HOST_SW_API Control; class HOST_SW_API VoicePacket; class HOST_SW_API DataPacket; class HOST_SW_API ControlPacket; @@ -83,6 +82,12 @@ namespace dmr /// Updates the slot processor. void clock(); + /// + ControlPacket* control() { return m_control; } + + /// Helper to change the debug and verbose state. + void setDebugVerbose(bool debug, bool verbose); + /// Helper to initialize the slot processor. static void init(uint32_t colorCode, SiteData siteData, bool embeddedLCOnly, bool dumpTAData, uint32_t callHang, modem::Modem* modem, network::BaseNetwork* network, bool duplex, lookups::RadioIdLookup* ridLookup, lookups::TalkgroupIdLookup* tidLookup, @@ -91,7 +96,6 @@ namespace dmr static void setSiteData(uint32_t netId, uint8_t siteId, uint8_t channelId, uint32_t channelNo); private: - friend class Control; friend class VoicePacket; VoicePacket* m_voice; friend class DataPacket; @@ -183,9 +187,6 @@ namespace dmr static uint16_t m_tsccCnt; - /// Helper to change the debug and verbose state. - void setDebugVerbose(bool debug, bool verbose); - /// Write data processed from RF to the data ring buffer. void writeQueueRF(const uint8_t* data); /// Write data processed from the network to the data ring buffer. @@ -196,15 +197,6 @@ namespace dmr void writeNetworkRF(const uint8_t* data, uint8_t dataType, uint8_t flco, uint32_t srcId, uint32_t dstId, uint8_t errors = 0U); - /// Helper to write a extended function packet on the RF interface. - void writeRF_Ext_Func(uint32_t func, uint32_t arg, uint32_t dstId); - /// Helper to write a call alert packet on the RF interface. - void writeRF_Call_Alrt(uint32_t srcId, uint32_t dstId); - /// Helper to write a TSCC Ann-Wd broadcast packet on the RF interface. - void writeRF_TSCC_Bcast_Ann_Wd(uint32_t channelNo, bool annWd); - /// Helper to write a TSCC Sys_Parm broadcast packet on the RF interface. - void writeRF_TSCC_Bcast_Sys_Parm(); - /// Helper to write RF end of frame data. void writeEndRF(bool writeEnd = false); /// Helper to write network end of frame data.