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