From 0d331ecb7886cf05581d451899ea0158500f6a7f Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Fri, 12 Aug 2022 22:25:55 -0400 Subject: [PATCH] continued NXDN CAC work; minor refactor to remove get/set data functions; --- nxdn/Control.cpp | 4 ++-- nxdn/NXDNDefines.h | 6 ++--- nxdn/SiteData.h | 8 +++---- nxdn/channel/CAC.cpp | 14 +++++------ nxdn/lc/RCCH.cpp | 54 +++++++++++++------------------------------ nxdn/lc/RCCH.h | 5 ---- nxdn/lc/RTCH.cpp | 31 ++++--------------------- nxdn/lc/RTCH.h | 5 ---- nxdn/packet/Trunk.cpp | 15 ++++++------ nxdn/packet/Voice.cpp | 12 +++++----- 10 files changed, 50 insertions(+), 104 deletions(-) diff --git a/nxdn/Control.cpp b/nxdn/Control.cpp index 2fd88cad..cf636cf4 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, 10U), + m_ccPacketInterval(1000U, 0U, 40U), m_ccFrameCnt(0U), m_ccSeq(0U), m_siteData(), @@ -678,7 +678,7 @@ bool Control::writeRF_ControlData() return false; } - const uint8_t maxSeq = 8U; + const uint8_t maxSeq = 6U; if (m_ccSeq == maxSeq) { m_ccSeq = 0U; } diff --git a/nxdn/NXDNDefines.h b/nxdn/NXDNDefines.h index 5eab24f1..d0bb0032 100644 --- a/nxdn/NXDNDefines.h +++ b/nxdn/NXDNDefines.h @@ -104,13 +104,12 @@ namespace nxdn const uint32_t NXDN_UDCH_CRC_LENGTH_BYTES = (NXDN_UDCH_CRC_LENGTH_BITS / 8U) + 1U; const uint32_t NXDN_UDCH_LENGTH_BITS = 184U; - const uint32_t NXDN_CAC_FRAME_LENGTH_BITS = 348U; - const uint32_t NXDN_CAC_FRAME_LENGTH_BYTES = (NXDN_CAC_FRAME_LENGTH_BITS / 8U) + 1U; const uint32_t NXDN_CAC_FEC_LENGTH_BITS = 300U; // Puncture and Interleave Length const uint32_t NXDN_CAC_FEC_LENGTH_BYTES = (NXDN_CAC_FEC_LENGTH_BITS / 8U) + 1U; const uint32_t NXDN_CAC_FEC_CONV_LENGTH_BITS = 350U; // Convolution Length const uint32_t NXDN_CAC_FEC_CONV_LENGTH_BYTES = (NXDN_CAC_FEC_CONV_LENGTH_BITS / 8U) + 1U; const uint32_t NXDN_CAC_CRC_LENGTH_BITS = 175U; // Data + CRC-16 + 4-bit NULL + const uint32_t NXDN_CAC_CRC_LENGTH_BYTES = (NXDN_CAC_CRC_LENGTH_BITS / 8U) + 1U; const uint32_t NXDN_CAC_LENGTH_BITS = 155U; const uint32_t NXDN_CAC_E_POST_FIELD_BITS = 24U; @@ -123,7 +122,8 @@ namespace nxdn const uint32_t NXDN_CAC_SHORT_CRC_LENGTH_BITS = 126U; // Data + CRC-16 + 4-bit NULL const uint32_t NXDN_CAC_SHORT_LENGTH_BITS = 106U; - const uint32_t NXDN_RTCH_LC_LENGTH_BYTES = 22U; // this is really the UDCH size... + const uint32_t NXDN_RTCH_LC_LENGTH_BITS = 176U; + const uint32_t NXDN_RTCH_LC_LENGTH_BYTES = (NXDN_RTCH_LC_LENGTH_BITS / 8U); const uint32_t NXDN_RCCH_LC_LENGTH_BITS = 144U; const uint32_t NXDN_RCCH_LC_LENGTH_BYTES = (NXDN_RCCH_LC_LENGTH_BITS / 8U); diff --git a/nxdn/SiteData.h b/nxdn/SiteData.h index d48de9a4..d8749ea1 100644 --- a/nxdn/SiteData.h +++ b/nxdn/SiteData.h @@ -82,8 +82,8 @@ namespace nxdn if (m_channelNo == 0U) { // clamp to 1 m_channelNo = 1U; } - if (m_channelNo > 4095U) { // clamp to 4095 - m_channelNo = 4095U; + if (m_channelNo > 1023U) { // clamp to 1023 + m_channelNo = 1023U; } m_serviceClass = serviceClass; @@ -121,8 +121,8 @@ namespace nxdn if (channelNo == 0U) { // clamp to 1 channelNo = 1U; } - if (channelNo > 4095U) { // clamp to 4095 - channelNo = 4095U; + if (channelNo > 1023U) { // clamp to 1023 + channelNo = 1023U; } m_locId = locId; diff --git a/nxdn/channel/CAC.cpp b/nxdn/channel/CAC.cpp index 3b1e1e2b..f1f3f2be 100644 --- a/nxdn/channel/CAC.cpp +++ b/nxdn/channel/CAC.cpp @@ -128,8 +128,8 @@ CAC::CAC() : m_data(NULL), m_rxCRC(0U) { - m_data = new uint8_t[NXDN_CAC_FRAME_LENGTH_BYTES]; - ::memset(m_data, 0x00U, NXDN_CAC_FRAME_LENGTH_BYTES); + m_data = new uint8_t[NXDN_CAC_CRC_LENGTH_BYTES]; + ::memset(m_data, 0x00U, NXDN_CAC_CRC_LENGTH_BYTES); } /// @@ -165,7 +165,7 @@ CAC::~CAC() CAC& CAC::operator=(const CAC& data) { if (&data != this) { - ::memcpy(m_data, data.m_data, NXDN_CAC_FRAME_LENGTH_BYTES); + ::memcpy(m_data, data.m_data, NXDN_CAC_CRC_LENGTH_BYTES); m_verbose = data.m_verbose; @@ -317,7 +317,7 @@ void CAC::encode(uint8_t* data) const } #if DEBUG_NXDN_CAC - Utils::dump(2U, "CAC::encode(), CAC Puncture and Interleave", data, NXDN_CAC_FRAME_LENGTH_BYTES); + Utils::dump(2U, "CAC::encode(), CAC Puncture and Interleave", data, NXDN_FRAME_LENGTH_BYTES); #endif // apply control field @@ -374,7 +374,7 @@ void CAC::setData(const uint8_t* data) { assert(data != NULL); - ::memset(m_data, 0x00U, NXDN_CAC_FRAME_LENGTH_BYTES); + ::memset(m_data, 0x00U, NXDN_CAC_CRC_LENGTH_BYTES); uint32_t offset = 8U; for (uint32_t i = 0U; i < (NXDN_CAC_CRC_LENGTH_BITS - 31); i++, offset++) { @@ -393,8 +393,8 @@ void CAC::setData(const uint8_t* data) /// void CAC::copy(const CAC& data) { - m_data = new uint8_t[NXDN_CAC_FRAME_LENGTH_BYTES]; - ::memcpy(m_data, data.m_data, NXDN_CAC_FRAME_LENGTH_BYTES); + m_data = new uint8_t[NXDN_CAC_CRC_LENGTH_BYTES]; + ::memcpy(m_data, data.m_data, NXDN_CAC_CRC_LENGTH_BYTES); m_ran = m_data[0U] & 0x3FU; m_structure = (m_data[0U] >> 6) & 0x03U; diff --git a/nxdn/lc/RCCH.cpp b/nxdn/lc/RCCH.cpp index 5ffd2e6a..b622158d 100644 --- a/nxdn/lc/RCCH.cpp +++ b/nxdn/lc/RCCH.cpp @@ -115,8 +115,12 @@ void RCCH::decode(const uint8_t* data, uint32_t length, uint32_t offset) assert(data != NULL); for (uint32_t i = 0U; i < length; i++, offset++) { - bool b = READ_BIT(data, i); - WRITE_BIT(m_data, offset, b); + bool b = READ_BIT(data, offset); + WRITE_BIT(m_data, i, b); + } + + if (m_verbose) { + Utils::dump(2U, "Decoded RCCH Data", m_data, NXDN_RCCH_LC_LENGTH_BYTES); } decodeLC(m_data); @@ -135,8 +139,12 @@ void RCCH::encode(uint8_t* data, uint32_t length, uint32_t offset) encodeLC(m_data); for (uint32_t i = 0U; i < length; i++, offset++) { - bool b = READ_BIT(m_data, offset); - WRITE_BIT(data, i, b); + bool b = READ_BIT(m_data, i); + WRITE_BIT(data, offset, b); + } + + if (m_verbose) { + Utils::dump(2U, "Encoded RCCH Data", data, NXDN_RCCH_LC_LENGTH_BYTES); } } @@ -169,28 +177,6 @@ void RCCH::reset() m_transmissionMode = TRANSMISSION_MODE_4800; } -/// -/// Gets the raw layer 3 data. -/// -/// -void RCCH::getData(uint8_t* data) const -{ - ::memcpy(data, m_data, NXDN_RCCH_LC_LENGTH_BYTES); -} - -/// -/// Sets the raw layer 3 data. -/// -/// -/// -void RCCH::setData(const uint8_t* data, uint32_t length) -{ - ::memset(m_data, 0x00U, NXDN_RCCH_LC_LENGTH_BYTES); - ::memcpy(m_data, data, length); - - decodeLC(m_data); -} - /// /// Sets the callsign. /// @@ -260,10 +246,6 @@ RCCH::RCCH(SiteData siteData) : /// bool RCCH::decodeLC(const uint8_t* data) { - if (m_verbose) { - Utils::dump(2U, "Decoded RCCH", data, NXDN_RCCH_LC_LENGTH_BYTES); - } - m_messageType = data[0U] & 0x3FU; // Message Type // message type opcodes @@ -393,10 +375,10 @@ void RCCH::encodeLC(uint8_t* data) m_data[3U] = (m_siteData.locId() >> 0) & 0xFFU; // ... // bryanb: this is currently fixed -- maybe dynamic in the future - m_data[4U] = (1 << 6) + // Channel Structure - Number of BCCH (1) + m_data[4U] = (2 << 6) + // Channel Structure - Number of BCCH (2) (1 << 3) + // ... - Number of Grouping (1) - (1 << 0); // ... - Number of Paging Frames (1) - m_data[5U] = (1 << 0); // ... - Number of Iteration (1) + (2 << 0); // ... - Number of Paging Frames (2) + m_data[5U] = (3 << 0); // ... - Number of Iteration (3) m_data[6U] = m_siteData.serviceClass(); // Service Information m_data[7U] = (m_siteData.netActive() ? NXDN_SIF2_IP_NETWORK : 0x00U); // ... @@ -411,7 +393,7 @@ void RCCH::encodeLC(uint8_t* data) m_data[14U] = 1U; // Version - uint32_t channelNo = m_siteData.channelNo(); + uint16_t channelNo = m_siteData.channelNo() & 0x3FFU; m_data[15U] = (channelNo >> 6) & 0x0FU; // 1st Control Channel m_data[16U] = (channelNo & 0x3FU) << 2; // ... } @@ -463,10 +445,6 @@ void RCCH::encodeLC(uint8_t* data) LogError(LOG_NXDN, "RCCH::encodeRCCH(), unknown RCCH value, messageType = $%02X", m_messageType); return; } - - if (m_verbose) { - Utils::dump(2U, "Encoded RCCH", m_data, NXDN_RCCH_LC_LENGTH_BYTES); - } } // diff --git a/nxdn/lc/RCCH.h b/nxdn/lc/RCCH.h index 0a4b3bf0..238c0553 100644 --- a/nxdn/lc/RCCH.h +++ b/nxdn/lc/RCCH.h @@ -66,11 +66,6 @@ namespace nxdn /// void reset(); - /// Gets the raw layer 3 data. - void getData(uint8_t* data) const; - /// Sets the raw layer 3 data. - void setData(const uint8_t* data, uint32_t length); - /// Sets the callsign. void setCallsign(std::string callsign); diff --git a/nxdn/lc/RTCH.cpp b/nxdn/lc/RTCH.cpp index 065ed4fd..0a39db2d 100644 --- a/nxdn/lc/RTCH.cpp +++ b/nxdn/lc/RTCH.cpp @@ -145,8 +145,8 @@ void RTCH::decode(const uint8_t* data, uint32_t length, uint32_t offset) assert(data != NULL); for (uint32_t i = 0U; i < length; i++, offset++) { - bool b = READ_BIT(data, i); - WRITE_BIT(m_data, offset, b); + bool b = READ_BIT(data, offset); + WRITE_BIT(m_data, i, b); } if (m_verbose) { @@ -169,8 +169,8 @@ void RTCH::encode(uint8_t* data, uint32_t length, uint32_t offset) encodeLC(m_data); for (uint32_t i = 0U; i < length; i++, offset++) { - bool b = READ_BIT(m_data, offset); - WRITE_BIT(data, i, b); + bool b = READ_BIT(m_data, i); + WRITE_BIT(data, offset, b); } if (m_verbose) { @@ -211,33 +211,10 @@ void RTCH::reset() m_causeRsp = NXDN_CAUSE_VD_ACCEPTED; } -/// -/// Gets the raw layer 3 data. -/// -/// -void RTCH::getData(uint8_t* data) const -{ - ::memcpy(data, m_data, NXDN_RTCH_LC_LENGTH_BYTES); -} - -/// -/// Sets the raw layer 3 data. -/// -/// -/// -void RTCH::setData(const uint8_t* data, uint32_t length) -{ - ::memset(m_data, 0x00U, NXDN_RTCH_LC_LENGTH_BYTES); - ::memcpy(m_data, data, length); - - decodeLC(m_data); -} - /// --------------------------------------------------------------------------- // Private Class Members // --------------------------------------------------------------------------- - /// /// Decode link control. /// diff --git a/nxdn/lc/RTCH.h b/nxdn/lc/RTCH.h index 1448da82..95343f50 100644 --- a/nxdn/lc/RTCH.h +++ b/nxdn/lc/RTCH.h @@ -63,11 +63,6 @@ namespace nxdn /// void reset(); - /// Gets the raw layer 3 data. - void getData(uint8_t* data) const; - /// Sets the raw layer 3 data. - void setData(const uint8_t* data, uint32_t length); - public: /// Flag indicating verbose log output. __PROPERTY(bool, verbose, Verbose); diff --git a/nxdn/packet/Trunk.cpp b/nxdn/packet/Trunk.cpp index 948c12fa..877d944c 100644 --- a/nxdn/packet/Trunk.cpp +++ b/nxdn/packet/Trunk.cpp @@ -163,7 +163,7 @@ bool Trunk::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) m_nxdn->m_queue.clear(); // the layer3 data will only be correct if valid is true - uint8_t buffer[NXDN_CAC_FRAME_LENGTH_BYTES]; + uint8_t buffer[NXDN_FRAME_LENGTH_BYTES]; cac.getData(buffer); m_rfLC.decode(buffer, NXDN_RCCH_CAC_LC_SHORT_LENGTH_BITS); @@ -353,11 +353,11 @@ void Trunk::writeRF_ControlData(uint8_t frameCnt, uint8_t n, bool adjSS) } switch (n) - { - case 6: + { + case 1: + case 0: writeRF_CC_Message_Site_Info(); break; - case 0: default: writeRF_CC_Message_Service_Info(); break; @@ -692,7 +692,7 @@ void Trunk::writeRF_CC_Message_Site_Info() channel::LICH lich; lich.setRFCT(NXDN_LICH_RFCT_RCCH); lich.setFCT(NXDN_LICH_CAC_OUTBOUND); - lich.setOption(NXDN_LICH_DATA_COMMON); + lich.setOption(NXDN_LICH_DATA_NORMAL); lich.setOutbound(true); lich.encode(data + 2U); @@ -746,13 +746,14 @@ void Trunk::writeRF_CC_Message_Service_Info() ::memset(buffer, 0x00U, NXDN_RCCH_LC_LENGTH_BYTES); m_rfLC.setMessageType(MESSAGE_TYPE_SRV_INFO); - m_rfLC.encode(buffer, NXDN_RCCH_LC_LENGTH_BITS); + m_rfLC.encode(buffer, NXDN_RCCH_LC_LENGTH_BITS / 2U); + m_rfLC.encode(buffer, NXDN_RCCH_LC_LENGTH_BITS / 2U, NXDN_RCCH_LC_LENGTH_BITS / 2U); // generate the CAC channel::CAC cac; cac.setVerbose(m_dumpRCCH); cac.setRAN(m_nxdn->m_ran); - cac.setStructure(NXDN_SR_RCCH_SINGLE); + cac.setStructure(NXDN_SR_RCCH_DUAL); cac.setData(buffer); cac.encode(data + 2U); diff --git a/nxdn/packet/Voice.cpp b/nxdn/packet/Voice.cpp index 76e44a55..9881b62e 100644 --- a/nxdn/packet/Voice.cpp +++ b/nxdn/packet/Voice.cpp @@ -436,10 +436,10 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) sacch.setStructure(NXDN_SR_SINGLE); sacch.encode(start + 2U); - uint8_t message[NXDN_RTCH_LC_LENGTH_BYTES]; - m_nxdn->m_rfLC.getData(message); + uint8_t buffer[NXDN_RTCH_LC_LENGTH_BYTES]; + m_nxdn->m_rfLC.encode(buffer, NXDN_RTCH_LC_LENGTH_BITS); - facch.setData(message); + facch.setData(buffer); facch.encode(start + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS); facch.encode(start + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS); @@ -837,10 +837,10 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t sacch.setStructure(NXDN_SR_SINGLE); sacch.encode(start + 2U); - uint8_t message[NXDN_RTCH_LC_LENGTH_BYTES]; - m_nxdn->m_rfLC.getData(message); + uint8_t buffer[NXDN_RTCH_LC_LENGTH_BYTES]; + m_nxdn->m_rfLC.encode(buffer, NXDN_RTCH_LC_LENGTH_BITS); - facch.setData(message); + facch.setData(buffer); facch.encode(start + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS); facch.encode(start + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS);