continued NXDN CAC work; minor refactor to remove get/set data functions;

pull/12/head
Bryan Biedenkapp 4 years ago
parent e79663687c
commit 0d331ecb78

@ -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;
}

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

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

@ -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);
}
/// <summary>
@ -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)
/// <param name="data"></param>
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;

@ -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;
}
/// <summary>
/// Gets the raw layer 3 data.
/// </summary>
/// <param name="data"></param>
void RCCH::getData(uint8_t* data) const
{
::memcpy(data, m_data, NXDN_RCCH_LC_LENGTH_BYTES);
}
/// <summary>
/// Sets the raw layer 3 data.
/// </summary>
/// <param name="data"></param>
/// <param name="length"></param>
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);
}
/// <summary>
/// Sets the callsign.
/// </summary>
@ -260,10 +246,6 @@ RCCH::RCCH(SiteData siteData) :
/// <returns></returns>
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);
}
}
// <summary>

@ -66,11 +66,6 @@ namespace nxdn
/// <summary></summary>
void reset();
/// <summary>Gets the raw layer 3 data.</summary>
void getData(uint8_t* data) const;
/// <summary>Sets the raw layer 3 data.</summary>
void setData(const uint8_t* data, uint32_t length);
/// <summary>Sets the callsign.</summary>
void setCallsign(std::string callsign);

@ -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;
}
/// <summary>
/// Gets the raw layer 3 data.
/// </summary>
/// <param name="data"></param>
void RTCH::getData(uint8_t* data) const
{
::memcpy(data, m_data, NXDN_RTCH_LC_LENGTH_BYTES);
}
/// <summary>
/// Sets the raw layer 3 data.
/// </summary>
/// <param name="data"></param>
/// <param name="length"></param>
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
// ---------------------------------------------------------------------------
/// <summary>
/// Decode link control.
/// </summary>

@ -63,11 +63,6 @@ namespace nxdn
/// <summary></summary>
void reset();
/// <summary>Gets the raw layer 3 data.</summary>
void getData(uint8_t* data) const;
/// <summary>Sets the raw layer 3 data.</summary>
void setData(const uint8_t* data, uint32_t length);
public:
/// <summary>Flag indicating verbose log output.</summary>
__PROPERTY(bool, verbose, Verbose);

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

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

Loading…
Cancel
Save

Powered by TurnKey Linux.