diff --git a/nxdn/Control.cpp b/nxdn/Control.cpp
index cf636cf4..c2e38f56 100644
--- a/nxdn/Control.cpp
+++ b/nxdn/Control.cpp
@@ -118,7 +118,7 @@ Control::Control(uint32_t ran, uint32_t callHang, uint32_t queueSize, uint32_t t
m_rfTGHang(1000U, tgHang),
m_netTimeout(1000U, timeout),
m_networkWatchdog(1000U, 0U, 1500U),
- m_ccPacketInterval(1000U, 0U, 40U),
+ m_ccPacketInterval(1000U, 0U, 80U),
m_ccFrameCnt(0U),
m_ccSeq(0U),
m_siteData(),
@@ -678,7 +678,8 @@ bool Control::writeRF_ControlData()
return false;
}
- const uint8_t maxSeq = 6U;
+ const uint8_t maxSeq = m_trunk->m_rfLC.getBcchCnt() + (m_trunk->m_rfLC.getCcchPagingCnt() + m_trunk->m_rfLC.getCcchMultiCnt()) *
+ m_trunk->m_rfLC.getRcchGroupingCnt() * m_trunk->m_rfLC.getRcchIterateCount();
if (m_ccSeq == maxSeq) {
m_ccSeq = 0U;
}
diff --git a/nxdn/lc/RCCH.cpp b/nxdn/lc/RCCH.cpp
index b622158d..7334f2fb 100644
--- a/nxdn/lc/RCCH.cpp
+++ b/nxdn/lc/RCCH.cpp
@@ -229,6 +229,11 @@ RCCH::RCCH(SiteData siteData) :
m_transmissionMode(TRANSMISSION_MODE_4800),
m_siteData(siteData),
m_siteIdenEntry(),
+ m_bcchCnt(1U),
+ m_rcchGroupingCnt(1U),
+ m_ccchPagingCnt(2U),
+ m_ccchMultiCnt(2U),
+ m_rcchIterateCnt(2U),
m_data(NULL)
{
m_data = new uint8_t[NXDN_RCCH_LC_LENGTH_BYTES];
@@ -373,12 +378,12 @@ void RCCH::encodeLC(uint8_t* data)
m_data[1U] = (m_siteData.locId() >> 16) & 0xFFU; // Location ID
m_data[2U] = (m_siteData.locId() >> 8) & 0xFFU; // ...
m_data[3U] = (m_siteData.locId() >> 0) & 0xFFU; // ...
-
- // bryanb: this is currently fixed -- maybe dynamic in the future
- m_data[4U] = (2 << 6) + // Channel Structure - Number of BCCH (2)
- (1 << 3) + // ... - Number of Grouping (1)
- (2 << 0); // ... - Number of Paging Frames (2)
- m_data[5U] = (3 << 0); // ... - Number of Iteration (3)
+ m_data[4U] = ((m_bcchCnt & 0x03U) << 6) + // Channel Structure - Number of BCCH
+ ((m_rcchGroupingCnt & 0x07U) << 3) + // ... - Number of Grouping
+ (((m_ccchPagingCnt >> 1) & 0x07U) << 0); // ... - Number of Paging Frames
+ m_data[5U] = ((m_ccchPagingCnt & 0x01U) << 7) + // ... - Number of Paging Frames
+ ((m_ccchMultiCnt & 0x07U) << 4) + // ... - Number of Multipurpose Frames
+ ((m_rcchIterateCnt & 0x0FU) << 0); // ... - Number of Iteration
m_data[6U] = m_siteData.serviceClass(); // Service Information
m_data[7U] = (m_siteData.netActive() ? NXDN_SIF2_IP_NETWORK : 0x00U); // ...
@@ -468,5 +473,11 @@ void RCCH::copy(const RCCH& data)
m_siteCallsign = callsign;
+ m_bcchCnt = data.m_bcchCnt;
+ m_rcchGroupingCnt = data.m_rcchGroupingCnt;
+ m_ccchPagingCnt = data.m_ccchPagingCnt;
+ m_ccchMultiCnt = data.m_ccchMultiCnt;
+ m_rcchIterateCnt = data.m_rcchIterateCnt;
+
decodeLC(m_data);
}
diff --git a/nxdn/lc/RCCH.h b/nxdn/lc/RCCH.h
index 238c0553..2579368c 100644
--- a/nxdn/lc/RCCH.h
+++ b/nxdn/lc/RCCH.h
@@ -121,6 +121,18 @@ namespace nxdn
/// Local Site Identity Entry.
__PROPERTY_PLAIN(lookups::IdenTable, siteIdenEntry, siteIdenEntry);
+ /** Channel Structure Data */
+ /// Count of BCCH frames per RCCH superframe.
+ __PROPERTY(uint8_t, bcchCnt, BcchCnt);
+ /// Count of RCCH frame groupings per RCCH superframe.
+ __PROPERTY(uint8_t, rcchGroupingCnt, RcchGroupingCnt);
+ /// Count of CCCH/UPCH paging frames per RCCH superframe.
+ __PROPERTY(uint8_t, ccchPagingCnt, CcchPagingCnt);
+ /// Count of CCCH/UPCH multi-purpose frames per RCCH superframe.
+ __PROPERTY(uint8_t, ccchMultiCnt, CcchMultiCnt);
+ /// Count of group iterations per RCCH superframe.
+ __PROPERTY(uint8_t, rcchIterateCnt, RcchIterateCount);
+
private:
/// Initializes a new instance of the RCCH class.
RCCH();
diff --git a/nxdn/packet/Trunk.cpp b/nxdn/packet/Trunk.cpp
index d62175ba..5487f2fe 100644
--- a/nxdn/packet/Trunk.cpp
+++ b/nxdn/packet/Trunk.cpp
@@ -354,7 +354,6 @@ void Trunk::writeRF_ControlData(uint8_t frameCnt, uint8_t n, bool adjSS)
switch (n)
{
- case 1:
case 0:
writeRF_CC_Message_Site_Info();
break;
@@ -708,7 +707,7 @@ void Trunk::writeRF_CC_Message_Site_Info()
channel::CAC cac;
cac.setVerbose(m_dumpRCCH);
cac.setRAN(m_nxdn->m_ran);
- cac.setStructure(NXDN_SR_RCCH_SINGLE);
+ cac.setStructure(NXDN_SR_RCCH_HEAD_SINGLE);
cac.setData(buffer);
cac.encode(data + 2U);