diff --git a/edac/CRC.cpp b/edac/CRC.cpp
index e0acf7ff..6883052d 100644
--- a/edac/CRC.cpp
+++ b/edac/CRC.cpp
@@ -690,8 +690,9 @@ bool CRC::checkCRC16(const uint8_t* in, uint32_t bitLength)
///
/// Input byte array.
/// Length of byte array in bits.
+/// Offset in bits to write CRC.
/// 16-bit CRC.
-uint16_t CRC::addCRC16(uint8_t* in, uint32_t bitLength)
+uint16_t CRC::addCRC16(uint8_t* in, uint32_t bitLength, uint32_t offset)
{
assert(in != nullptr);
@@ -704,7 +705,7 @@ uint16_t CRC::addCRC16(uint8_t* in, uint32_t bitLength)
uint32_t n = bitLength;
for (uint32_t i = 0U; i < 16U; i++, n++) {
bool b = READ_BIT(temp, i);
- WRITE_BIT(in, n, b);
+ WRITE_BIT(in, n + offset, b);
}
#if DEBUG_CRC
diff --git a/edac/CRC.h b/edac/CRC.h
index a15a0d75..2c598f24 100644
--- a/edac/CRC.h
+++ b/edac/CRC.h
@@ -85,8 +85,8 @@ namespace edac
/// Check 16-bit CRC-CCITT.
static bool checkCRC16(const uint8_t* in, uint32_t bitLength);
- /// Encode 15-bit CRC.
- static uint16_t addCRC16(uint8_t* in, uint32_t bitLength);
+ /// Encode 16-bit CRC.
+ static uint16_t addCRC16(uint8_t* in, uint32_t bitLength, uint32_t offset = 0);
private:
///
diff --git a/nxdn/channel/CAC.cpp b/nxdn/channel/CAC.cpp
index 807d27eb..ea8fd348 100644
--- a/nxdn/channel/CAC.cpp
+++ b/nxdn/channel/CAC.cpp
@@ -261,11 +261,8 @@ void CAC::encode(uint8_t* data) const
{
assert(data != nullptr);
- m_data[0U] &= 0xC0U;
- m_data[0U] |= m_ran;
-
- m_data[0U] &= 0x3FU;
- m_data[0U] |= (m_structure << 6) & 0xC0U;
+ m_data[0U] = m_ran;
+ m_data[0U] |= ((m_structure << 6) & 0xC0U);
uint8_t buffer[NXDN_CAC_FEC_LENGTH_BYTES];
::memset(buffer, 0x00U, NXDN_CAC_FEC_LENGTH_BYTES);
@@ -275,7 +272,7 @@ void CAC::encode(uint8_t* data) const
WRITE_BIT(buffer, i, b);
}
- uint16_t crc = CRC::addCRC16(buffer, NXDN_CAC_LENGTH_BITS);
+ uint16_t crc = CRC::addCRC16(buffer, NXDN_CAC_LENGTH_BITS, 5U);
#if DEBUG_NXDN_CAC
Utils::dump(2U, "Encoded CAC", buffer, NXDN_CAC_FEC_LENGTH_BYTES);
diff --git a/nxdn/packet/Trunk.cpp b/nxdn/packet/Trunk.cpp
index dc12b020..e89f2e8e 100644
--- a/nxdn/packet/Trunk.cpp
+++ b/nxdn/packet/Trunk.cpp
@@ -758,12 +758,12 @@ void Trunk::writeRF_CC_Message_Service_Info()
std::unique_ptr rcch = new_unique(rcch::MESSAGE_TYPE_SRV_INFO);
rcch->encode(buffer, NXDN_RCCH_LC_LENGTH_BITS / 2U);
- rcch->encode(buffer, NXDN_RCCH_LC_LENGTH_BITS / 2U, NXDN_RCCH_LC_LENGTH_BITS / 2U);
+ //rcch->encode(buffer, NXDN_RCCH_LC_LENGTH_BITS / 2U, NXDN_RCCH_LC_LENGTH_BITS / 2U);
// generate the CAC
channel::CAC cac;
cac.setRAN(m_nxdn->m_ran);
- cac.setStructure(NXDN_SR_RCCH_DUAL);
+ cac.setStructure(NXDN_SR_RCCH_SINGLE);
cac.setData(buffer);
cac.encode(data + 2U);