diff --git a/SerialPort.cpp b/SerialPort.cpp
index bfbe557..0e7e39d 100644
--- a/SerialPort.cpp
+++ b/SerialPort.cpp
@@ -74,16 +74,16 @@
#endif
#if defined(ADF7021_14_7456)
-#define DESCR_OSC "TCXO 14.7456"
+#define DESCR_OSC "TCXO 14.7456, "
#endif
#if defined(ADF7021_12_2880)
-#define DESCR_OSC "TCXO 12.2880"
+#define DESCR_OSC "TCXO 12.2880, "
#endif
#if defined(ENABLE_ADF7021) && defined(ADF7021_N_VER)
-#define RF_CHIP "ADF7021N"
+#define RF_CHIP "ADF7021N, "
#elif defined(ENABLE_ADF7021)
-#define RF_CHIP "ADF7021"
+#define RF_CHIP "ADF7021, "
#endif
#define DESCRIPTION "Digital Voice Modem DSP Hotspot [" BOARD_INFO "] (" RF_CHIP DESCR_DMR DESCR_P25 DESCR_OSC DESCR_RSSI "CW Id)"
@@ -900,10 +900,6 @@ uint8_t SerialPort::setConfig(const uint8_t* data, uint8_t length)
io.setDeviations(dmrTXLevel, p25TXLevel);
- uint8_t p25CorrCount = data[11U];
- if (p25CorrCount > 255U)
- return RSN_INVALID_P25_CORR_COUNT;
-
if (modemState == STATE_DMR_CAL || modemState == STATE_DMR_DMO_CAL_1K || modemState == STATE_RSSI_CAL ||
modemState == STATE_INT_CAL) {
m_dmrEnable = true;
@@ -938,7 +934,6 @@ uint8_t SerialPort::setConfig(const uint8_t* data, uint8_t length)
dmrDMOTX.setPreambleCount(fdmaPreamble);
p25RX.setNAC(nac);
- p25RX.setCorrCount(p25CorrCount);
#if defined(DUPLEX)
dmrTX.setColorCode(colorCode);
diff --git a/dmr/DMRSlotRX.cpp b/dmr/DMRSlotRX.cpp
index 460481b..67d1d2a 100644
--- a/dmr/DMRSlotRX.cpp
+++ b/dmr/DMRSlotRX.cpp
@@ -42,9 +42,6 @@ using namespace dmr;
// Constants
// ---------------------------------------------------------------------------
-const uint16_t SCAN_START = 390U;
-const uint16_t SCAN_END = 500U;
-
const uint8_t MAX_SYNC_BYTES_ERRS = 3U;
const uint8_t MAX_SYNC_LOST_FRAMES = 13U;
@@ -132,15 +129,24 @@ bool DMRSlotRX::databit(bool bit)
return m_state != DMRRXS_NONE;
if (m_state == DMRRXS_NONE) {
- if (m_dataPtr >= SCAN_START && m_dataPtr <= SCAN_END)
- correlateSync();
+ correlateSync();
}
else {
-
- uint16_t min = m_syncPtr - 1U;
- uint16_t max = m_syncPtr + 1U;
- if (m_dataPtr >= min && m_dataPtr <= max)
- correlateSync();
+ uint16_t min = m_syncPtr + DMR_BUFFER_LENGTH_BITS - 2U;
+ uint16_t max = m_syncPtr + 2U;
+
+ if (min >= DMR_BUFFER_LENGTH_BITS)
+ min -= DMR_BUFFER_LENGTH_BITS;
+ if (max >= DMR_BUFFER_LENGTH_BITS)
+ max -= DMR_BUFFER_LENGTH_BITS;
+
+ if (min < max) {
+ if (m_dataPtr >= min && m_dataPtr <= max)
+ correlateSync();
+ } else {
+ if (m_dataPtr >= min || m_dataPtr <= max)
+ correlateSync();
+ }
}
if (m_dataPtr == m_endPtr) {
diff --git a/p25/P25RX.cpp b/p25/P25RX.cpp
index f2b54c1..b9e77b6 100644
--- a/p25/P25RX.cpp
+++ b/p25/P25RX.cpp
@@ -39,13 +39,11 @@ using namespace p25;
// Constants
// ---------------------------------------------------------------------------
-const uint8_t MAX_SYNC_BYTES_START_ERRS = 2U;
-const uint8_t MAX_SYNC_BYTES_ERRS = 4U;
+const uint8_t MAX_SYNC_BITS_START_ERRS = 2U;
+const uint8_t MAX_SYNC_BITS_ERRS = 4U;
const uint16_t MAX_SYNC_FRAMES = 7U;
-const uint8_t CORRELATION_COUNTDOWN = 6U;
-
const uint16_t NOENDPTR = 9999U;
// ---------------------------------------------------------------------------
@@ -58,15 +56,9 @@ P25RX::P25RX() :
m_bitBuffer(0x00U),
m_buffer(),
m_dataPtr(0U),
- m_minSyncPtr(0U),
- m_maxSyncPtr(NOENDPTR),
- m_startPtr(0U),
m_endPtr(NOENDPTR),
- m_syncPtr(0U),
m_lostCount(0U),
- m_countdown(0U),
m_nac(0xF7EU),
- m_corrCountdown(CORRELATION_COUNTDOWN),
m_state(P25RXS_NONE),
m_duid(0xFFU)
{
@@ -79,18 +71,11 @@ P25RX::P25RX() :
void P25RX::reset()
{
m_bitBuffer = 0x00U;
-
m_dataPtr = 0U;
- m_minSyncPtr = 0U;
- m_maxSyncPtr = NOENDPTR;
-
- m_startPtr = 0U;
m_endPtr = NOENDPTR;
- m_syncPtr = 0U;
m_lostCount = 0U;
- m_countdown = 0U;
m_state = P25RXS_NONE;
@@ -103,12 +88,20 @@ void P25RX::reset()
///
void P25RX::databit(bool bit)
{
- _WRITE_BIT(m_buffer, m_dataPtr, bit);
-
m_bitBuffer <<= 1;
if (bit)
m_bitBuffer |= 0x01U;
+ if (m_state != P25RXS_NONE) {
+ _WRITE_BIT(m_buffer, m_dataPtr, bit);
+
+ m_dataPtr++;
+ if (m_dataPtr > P25_LDU_FRAME_LENGTH_BITS) {
+ m_duid = 0xFFU;
+ m_dataPtr = 0U;
+ }
+ }
+
if (m_state == P25RXS_SYNC) {
processBit(bit);
}
@@ -121,36 +114,15 @@ void P25RX::databit(bool bit)
else {
bool ret = correlateSync();
if (ret) {
- // on the first sync, start the countdown to the state change
- if (m_countdown == 0U) {
- io.setDecode(true);
+ DEBUG3("P25RX: databit(): dataPtr/endPtr", m_dataPtr, m_endPtr);
- m_countdown = m_corrCountdown;
- DEBUG2("P25RX: databit(): correlation countdown", m_countdown);
- }
- }
-
- if (m_countdown > 0U)
- m_countdown--;
-
- if (m_countdown == 1U) {
- m_minSyncPtr = m_syncPtr + P25_HDU_FRAME_LENGTH_BITS - 1U;
- if (m_minSyncPtr >= P25_LDU_FRAME_LENGTH_BITS)
- m_minSyncPtr -= P25_LDU_FRAME_LENGTH_BITS;
-
- m_maxSyncPtr = m_syncPtr + P25_HDU_FRAME_LENGTH_BITS + 1U;
- if (m_maxSyncPtr >= P25_LDU_FRAME_LENGTH_BITS)
- m_maxSyncPtr -= P25_LDU_FRAME_LENGTH_BITS;
+ for (uint8_t i = 0U; i < P25_SYNC_LENGTH_BYTES; i++)
+ m_buffer[i] = P25_SYNC_BYTES[i];
m_state = P25RXS_SYNC;
- m_countdown = 0U;
- }
- }
- m_dataPtr++;
- if (m_dataPtr >= P25_LDU_FRAME_LENGTH_BITS) {
- m_duid = 0xFFU;
- m_dataPtr = 0U;
+ io.setDecode(true);
+ }
}
}
@@ -163,15 +135,6 @@ void P25RX::setNAC(uint16_t nac)
m_nac = nac;
}
-///
-/// Sets the P25 sync correlation countdown.
-///
-/// Correlation Countdown Count.
-void P25RX::setCorrCount(uint8_t count)
-{
- m_corrCountdown = count;
-}
-
// ---------------------------------------------------------------------------
// Private Class Members
// ---------------------------------------------------------------------------
@@ -181,22 +144,11 @@ void P25RX::setCorrCount(uint8_t count)
///
void P25RX::processBit(bool bit)
{
- if (m_minSyncPtr < m_maxSyncPtr) {
- if (m_dataPtr >= m_minSyncPtr && m_dataPtr <= m_maxSyncPtr)
- correlateSync();
- }
- else {
- if (m_dataPtr >= m_minSyncPtr || m_dataPtr <= m_maxSyncPtr)
- correlateSync();
- }
-
- // initial sample processing does not have an end pointer -- we simply wait till we've read
- // the bits up to the maximum sync pointer
- if (m_dataPtr == m_maxSyncPtr) {
- DEBUG4("P25RX: processBit(): dataPtr/startPtr/endPtr", m_dataPtr, m_startPtr, m_maxSyncPtr);
- DEBUG4("P25RX: processBit(): lostCount/maxSyncPtr/minSyncPtr", m_lostCount, m_maxSyncPtr, m_minSyncPtr);
+ // process NID
+ if (m_dataPtr == P25_SYNC_LENGTH_BITS + P25_NID_LENGTH_BITS + 1) {
+ DEBUG3("P25RX: processBit(): dataPtr/endPtr", m_dataPtr, m_endPtr);
- if (!decodeNid(m_startPtr)) {
+ if (!decodeNid()) {
io.setDecode(false);
serial.writeP25Lost();
@@ -206,60 +158,39 @@ void P25RX::processBit(bool bit)
switch (m_duid) {
case P25_DUID_HDU:
{
- DEBUG2("P25RX: processBit(): sync found in HDU pos", m_syncPtr);
-
- uint8_t frame[P25_HDU_FRAME_LENGTH_BYTES + 1U];
- bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_HDU_FRAME_LENGTH_BITS, frame);
-
- frame[0U] = 0x01U;
- serial.writeP25Data(frame, P25_HDU_FRAME_LENGTH_BYTES + 1U);
- reset();
+ DEBUG2("P25RX: processBit(): sync found in HDU pos", m_dataPtr);
+ m_endPtr = P25_HDU_FRAME_LENGTH_BITS;
}
break;
case P25_DUID_TDU:
{
- DEBUG2("P25RX: processBit(): sync found in TDU pos", m_syncPtr);
-
- uint8_t frame[P25_TDU_FRAME_LENGTH_BYTES + 1U];
- bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_TDU_FRAME_LENGTH_BITS, frame);
-
- frame[0U] = 0x01U;
- serial.writeP25Data(frame, P25_TDU_FRAME_LENGTH_BYTES + 1U);
- reset();
- }
+ DEBUG2("P25RX: processBit(): sync found in TDU pos", m_dataPtr);
+ m_endPtr = P25_TDU_FRAME_LENGTH_BITS;
+ }
break;
case P25_DUID_LDU1:
m_state = P25RXS_VOICE;
+ m_endPtr = P25_LDU_FRAME_LENGTH_BITS;
return;
case P25_DUID_TSDU:
{
- DEBUG2("P25RX: processBit(): sync found in TSDU pos", m_syncPtr);
-
- uint8_t frame[P25_TSDU_FRAME_LENGTH_BYTES + 1U];
- bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_TSDU_FRAME_LENGTH_BITS, frame);
-
- frame[0U] = 0x01U;
- serial.writeP25Data(frame, P25_TSDU_FRAME_LENGTH_BYTES + 1U);
- reset();
- }
+ DEBUG2("P25RX: processBit(): sync found in TSDU pos", m_dataPtr);
+ m_endPtr = P25_TSDU_FRAME_LENGTH_BITS;
+ }
break;
case P25_DUID_LDU2:
m_state = P25RXS_VOICE;
+ m_endPtr = P25_LDU_FRAME_LENGTH_BITS;
return;
case P25_DUID_PDU:
m_state = P25RXS_DATA;
+ m_endPtr = P25_LDU_FRAME_LENGTH_BITS;
return;
case P25_DUID_TDULC:
{
- DEBUG2("P25RX: processBit(): sync found in TDULC pos", m_syncPtr);
-
- uint8_t frame[P25_TDULC_FRAME_LENGTH_BYTES + 1U];
- bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_TDULC_FRAME_LENGTH_BITS, frame);
-
- frame[0U] = 0x01U;
- serial.writeP25Data(frame, P25_TDULC_FRAME_LENGTH_BYTES + 1U);
- reset();
- }
+ DEBUG2("P25RX: processBit(): sync found in TDULC pos", m_dataPtr);
+ m_endPtr = P25_TDULC_FRAME_LENGTH_BITS;
+ }
break;
default:
{
@@ -271,23 +202,25 @@ void P25RX::processBit(bool bit)
}
}
- m_minSyncPtr = m_syncPtr + P25_LDU_FRAME_LENGTH_BITS - 1U;
- if (m_minSyncPtr >= P25_LDU_FRAME_LENGTH_BITS)
- m_minSyncPtr -= P25_LDU_FRAME_LENGTH_BITS;
-
- m_maxSyncPtr = m_syncPtr + 1U;
- if (m_maxSyncPtr >= P25_LDU_FRAME_LENGTH_BITS)
- m_maxSyncPtr -= P25_LDU_FRAME_LENGTH_BITS;
-
- m_lostCount = MAX_SYNC_FRAMES;
-
if (m_state == P25RXS_VOICE) {
+ m_lostCount = MAX_SYNC_FRAMES;
processVoice(bit);
}
if (m_state == P25RXS_DATA) {
+ m_lostCount = MAX_SYNC_FRAMES;
processData(bit);
}
+
+ // since we aren't processing voice or data -- simply wait till we've reached the end pointer
+ if (m_dataPtr == m_endPtr) {
+ uint8_t frame[P25_HDU_FRAME_LENGTH_BYTES + 1U];
+ ::memcpy(frame + 1U, m_buffer, m_endPtr / 8U);
+
+ frame[0U] = 0x01U;
+ serial.writeP25Data(frame, (m_endPtr / 8U) + 1U);
+ reset();
+ }
}
///
@@ -296,31 +229,66 @@ void P25RX::processBit(bool bit)
///
void P25RX::processVoice(bool bit)
{
- if (m_minSyncPtr < m_maxSyncPtr) {
- if (m_dataPtr >= m_minSyncPtr && m_dataPtr <= m_maxSyncPtr)
- correlateSync();
- }
- else {
- if (m_dataPtr >= m_minSyncPtr || m_dataPtr <= m_maxSyncPtr)
- correlateSync();
+ // only search for a sync in the right place +-2 bits
+ if (m_dataPtr >= (P25_SYNC_LENGTH_BITS - 2U) && m_dataPtr <= (P25_SYNC_LENGTH_BITS + 2U)) {
+ correlateSync();
}
- if (m_dataPtr == m_endPtr) {
- if (m_lostCount == MAX_SYNC_FRAMES) {
- m_minSyncPtr = m_syncPtr + P25_LDU_FRAME_LENGTH_BITS - 1U;
- if (m_minSyncPtr >= P25_LDU_FRAME_LENGTH_BITS)
- m_minSyncPtr -= P25_LDU_FRAME_LENGTH_BITS;
-
- m_maxSyncPtr = m_syncPtr + 1U;
- if (m_maxSyncPtr >= P25_LDU_FRAME_LENGTH_BITS)
- m_maxSyncPtr -= P25_LDU_FRAME_LENGTH_BITS;
+ // process NID
+ if (m_dataPtr == P25_SYNC_LENGTH_BITS + P25_NID_LENGTH_BITS + 1) {
+ DEBUG3("P25RX: processVoice(): dataPtr/endPtr", m_dataPtr, m_endPtr);
+
+ if (!decodeNid()) {
+ io.setDecode(false);
+
+ serial.writeP25Lost();
+ reset();
+ }
+ else {
+ switch (m_duid) {
+ case P25_DUID_TDU:
+ {
+ DEBUG2("P25RX: processVoice(): sync found in TDU pos", m_dataPtr);
+ m_endPtr = P25_TDU_FRAME_LENGTH_BITS;
+ }
+ break;
+ case P25_DUID_LDU1:
+ m_endPtr = P25_LDU_FRAME_LENGTH_BITS;
+ return;
+ case P25_DUID_LDU2:
+ m_endPtr = P25_LDU_FRAME_LENGTH_BITS;
+ return;
+ default:
+ {
+ DEBUG3("P25RX: processVoice(): illegal DUID in NID", m_nac, m_duid);
+ reset();
+ }
+ return;
+ }
}
+ }
- m_lostCount--;
+ // if we've reached the end pointer and the DUID is a TDU; send it
+ if (m_dataPtr == m_endPtr && m_duid == P25_DUID_TDU)
+ {
+ DEBUG2("P25RX: processVoice(): sync found in TDU pos", m_dataPtr);
+
+ uint8_t frame[P25_TDU_FRAME_LENGTH_BYTES + 1U];
+ ::memcpy(frame + 1U, m_buffer, m_endPtr / 8U);
- DEBUG4("P25RX: processVoice(): dataPtr/startPtr/endPtr", m_dataPtr, m_startPtr, m_endPtr);
- DEBUG4("P25RX: processVoice(): lostCount/maxSyncPtr/minSyncPtr", m_lostCount, m_maxSyncPtr, m_minSyncPtr);
+ frame[0U] = 0x01U;
+ serial.writeP25Data(frame, P25_TDU_FRAME_LENGTH_BYTES + 1U);
+ io.setDecode(false);
+
+ reset();
+ return;
+ }
+
+ // process voice frame
+ if (m_dataPtr == m_endPtr) {
+ m_lostCount--;
+
// we've not seen a data sync for too long, signal sync lost and change to P25RXS_NONE
if (m_lostCount == 0U) {
DEBUG1("P25RX: processVoice(): sync timeout in LDU, lost lock");
@@ -331,49 +299,22 @@ void P25RX::processVoice(bool bit)
reset();
}
else {
- if (!decodeNid(m_startPtr)) {
- io.setDecode(false);
-
- serial.writeP25Lost();
- reset();
- }
- else {
- if (m_duid == P25_DUID_TDU) {
- DEBUG2("P25RX: processBit(): sync found in TDU pos", m_syncPtr);
-
- uint8_t frame[P25_TDU_FRAME_LENGTH_BYTES + 1U];
- bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_TDU_FRAME_LENGTH_BITS, frame);
+ DEBUG2("P25RX: processVoice(): sync found in LDU pos", m_dataPtr);
- frame[0U] = 0x01U;
- serial.writeP25Data(frame, P25_TDU_FRAME_LENGTH_BYTES + 1U);
+ uint8_t frame[P25_LDU_FRAME_LENGTH_BYTES + 3U];
+ ::memcpy(frame + 1U, m_buffer, m_endPtr / 8U);
- io.setDecode(false);
-
- reset();
- return;
- }
-
- DEBUG2("P25RX: processVoice(): sync found in LDU pos", m_syncPtr);
-
- uint8_t frame[P25_LDU_FRAME_LENGTH_BYTES + 3U];
- bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_LDU_FRAME_LENGTH_BITS, frame);
-
- frame[0U] = m_lostCount == (MAX_SYNC_FRAMES - 1U) ? 0x01U : 0x00U;
+ frame[0U] = m_lostCount == (MAX_SYNC_FRAMES - 1U) ? 0x01U : 0x00U;
#if defined(SEND_RSSI_DATA)
- if (m_rssiCount > 0U) {
- uint16_t rssi = m_rssiAccum / m_rssiCount;
- frame[217U] = (rssi >> 8) & 0xFFU;
- frame[218U] = (rssi >> 0) & 0xFFU;
+ uint16_t rssi = io.readRSSI();
+ frame[217U] = (rssi >> 8) & 0xFFU;
+ frame[218U] = (rssi >> 0) & 0xFFU;
- serial.writeP25Data(false, frame, P25_LDU_FRAME_LENGTH_BYTES + 3U);
- }
- else {
- serial.writeP25Data(false, frame, P25_LDU_FRAME_LENGTH_BYTES + 1U);
- }
+ serial.writeP25Data(false, frame, P25_LDU_FRAME_LENGTH_BYTES + 3U);
#else
- serial.writeP25Data(frame, P25_LDU_FRAME_LENGTH_BYTES + 1U);
+ serial.writeP25Data(frame, P25_LDU_FRAME_LENGTH_BYTES + 1U);
#endif
- }
+
}
}
}
@@ -384,31 +325,40 @@ void P25RX::processVoice(bool bit)
///
void P25RX::processData(bool bit)
{
- if (m_minSyncPtr < m_maxSyncPtr) {
- if (m_dataPtr >= m_minSyncPtr && m_dataPtr <= m_maxSyncPtr)
- correlateSync();
- }
- else {
- if (m_dataPtr >= m_minSyncPtr || m_dataPtr <= m_maxSyncPtr)
- correlateSync();
+ // only search for a sync in the right place +-2 bits
+ if (m_dataPtr >= (P25_SYNC_LENGTH_BITS - 2U) && m_dataPtr <= (P25_SYNC_LENGTH_BITS + 2U)) {
+ correlateSync();
}
- if (m_dataPtr == m_endPtr) {
- if (m_lostCount == MAX_SYNC_FRAMES) {
- m_minSyncPtr = m_syncPtr + P25_LDU_FRAME_LENGTH_BITS - 1U;
- if (m_minSyncPtr >= P25_LDU_FRAME_LENGTH_BITS)
- m_minSyncPtr -= P25_LDU_FRAME_LENGTH_BITS;
-
- m_maxSyncPtr = m_syncPtr + 1U;
- if (m_maxSyncPtr >= P25_LDU_FRAME_LENGTH_BITS)
- m_maxSyncPtr -= P25_LDU_FRAME_LENGTH_BITS;
- }
+ // process NID
+ if (m_dataPtr == P25_SYNC_LENGTH_BITS + P25_NID_LENGTH_BITS + 1) {
+ DEBUG3("P25RX: processVoice(): dataPtr/endPtr", m_dataPtr, m_endPtr);
- m_lostCount--;
+ if (!decodeNid()) {
+ io.setDecode(false);
- DEBUG4("P25RX: processData(): dataPtr/startPtr/endPtr", m_dataPtr, m_startPtr, m_endPtr);
- DEBUG4("P25RX: processData(): lostCount/maxSyncPtr/minSyncPtr", m_lostCount, m_maxSyncPtr, m_minSyncPtr);
+ serial.writeP25Lost();
+ reset();
+ }
+ else {
+ switch (m_duid) {
+ case P25_DUID_PDU:
+ m_endPtr = P25_LDU_FRAME_LENGTH_BITS;
+ return;
+ default:
+ {
+ DEBUG3("P25RX: processData(): illegal DUID in NID", m_nac, m_duid);
+ reset();
+ }
+ return;
+ }
+ }
+ }
+ // process voice frame
+ if (m_dataPtr == m_endPtr) {
+ m_lostCount--;
+
// we've not seen a data sync for too long, signal sync lost and change to P25RXS_NONE
if (m_lostCount == 0U) {
DEBUG1("P25RX: processData(): sync timeout in PDU, lost lock");
@@ -419,34 +369,13 @@ void P25RX::processData(bool bit)
reset();
}
else {
- if (!decodeNid(m_startPtr)) {
- io.setDecode(false);
-
- serial.writeP25Lost();
- reset();
- }
- else {
- DEBUG2("P25RX: processData(): sync found in PDU pos", m_syncPtr);
-
- uint8_t frame[P25_LDU_FRAME_LENGTH_BYTES + 3U];
- bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_LDU_FRAME_LENGTH_BITS, frame);
+ DEBUG2("P25RX: processData(): sync found in PDU pos", m_dataPtr);
- frame[0U] = m_lostCount == (MAX_SYNC_FRAMES - 1U) ? 0x01U : 0x00U;
-#if defined(SEND_RSSI_DATA)
- if (m_rssiCount > 0U) {
- uint16_t rssi = m_rssiAccum / m_rssiCount;
- frame[217U] = (rssi >> 8) & 0xFFU;
- frame[218U] = (rssi >> 0) & 0xFFU;
+ uint8_t frame[P25_LDU_FRAME_LENGTH_BYTES + 1U];
+ ::memcpy(frame + 1U, m_buffer, m_endPtr / 8U);
- serial.writeP25Data(false, frame, P25_LDU_FRAME_LENGTH_BYTES + 3U);
- }
- else {
- serial.writeP25Data(false, frame, P25_LDU_FRAME_LENGTH_BYTES + 1U);
- }
-#else
- serial.writeP25Data(frame, P25_LDU_FRAME_LENGTH_BYTES + 1U);
-#endif
- }
+ frame[0U] = m_lostCount == (MAX_SYNC_FRAMES - 1U) ? 0x01U : 0x00U;
+ serial.writeP25Data(frame, P25_LDU_FRAME_LENGTH_BYTES + 1U);
}
}
}
@@ -459,27 +388,22 @@ bool P25RX::correlateSync()
{
uint8_t maxErrs;
if (m_state == P25RXS_NONE)
- maxErrs = MAX_SYNC_BYTES_START_ERRS;
+ maxErrs = MAX_SYNC_BITS_START_ERRS;
else
- maxErrs = MAX_SYNC_BYTES_ERRS;
+ maxErrs = MAX_SYNC_BITS_ERRS;
uint8_t errs = countBits64((m_bitBuffer & P25_SYNC_BITS_MASK) ^ P25_SYNC_BITS);
if (errs <= maxErrs) {
DEBUG2("P25RX: correlateSync(): correlateSync errs", errs);
- m_syncPtr = m_dataPtr;
-
- m_startPtr = m_dataPtr + P25_LDU_FRAME_LENGTH_BITS - P25_SYNC_LENGTH_BITS + 1;
- if (m_startPtr >= P25_LDU_FRAME_LENGTH_BITS)
- m_startPtr -= P25_LDU_FRAME_LENGTH_BITS;
-
- m_endPtr = m_dataPtr + P25_LDU_FRAME_LENGTH_BITS - P25_SYNC_LENGTH_BITS - 1U;
+ m_endPtr = m_dataPtr + P25_LDU_FRAME_LENGTH_BITS - P25_SYNC_LENGTH_BITS;
if (m_endPtr >= P25_LDU_FRAME_LENGTH_BITS)
m_endPtr -= P25_LDU_FRAME_LENGTH_BITS;
m_lostCount = MAX_SYNC_FRAMES;
+ m_dataPtr = P25_SYNC_LENGTH_BITS;
- DEBUG4("P25RX: correlateSync(): dataPtr/startPtr/endPtr", m_dataPtr, m_startPtr, m_endPtr);
+ DEBUG3("P25RX: correlateSync(): dataPtr/endPtr", m_dataPtr, m_endPtr);
return true;
}
@@ -490,15 +414,11 @@ bool P25RX::correlateSync()
///
/// Helper to decode the P25 NID.
///
-///
-bool P25RX::decodeNid(uint16_t start)
+bool P25RX::decodeNid()
{
- uint16_t nidStartPtr = start + P25_SYNC_LENGTH_BITS;
- if (nidStartPtr >= P25_LDU_FRAME_LENGTH_BITS)
- nidStartPtr -= P25_LDU_FRAME_LENGTH_BITS;
-
uint8_t nid[P25_NID_LENGTH_BYTES];
- bitsToBytes(m_startPtr, P25_NID_LENGTH_BITS, nid);
+ for (int i = 6U; i < 8U; i++)
+ nid[i - 6U] = m_buffer[i];
if (m_nac == 0xF7EU) {
m_duid = nid[1U] & 0x0FU;
@@ -518,55 +438,3 @@ bool P25RX::decodeNid(uint16_t start)
return false;
}
-
-///
-///
-///
-///
-///
-///
-void P25RX::bitsToBytes(uint16_t start, uint8_t count, uint8_t* buffer)
-{
- for (uint8_t i = 0U; i < count; i++) {
- buffer[i] = 0U;
- buffer[i] |= _READ_BIT(m_buffer, start) << 7;
- start++;
- if (start >= P25_LDU_FRAME_LENGTH_BITS)
- start -= P25_LDU_FRAME_LENGTH_BITS;
-
- buffer[i] |= _READ_BIT(m_buffer, start) << 6;
- start++;
- if (start >= P25_LDU_FRAME_LENGTH_BITS)
- start -= P25_LDU_FRAME_LENGTH_BITS;
-
- buffer[i] |= _READ_BIT(m_buffer, start) << 5;
- start++;
- if (start >= P25_LDU_FRAME_LENGTH_BITS)
- start -= P25_LDU_FRAME_LENGTH_BITS;
-
- buffer[i] |= _READ_BIT(m_buffer, start) << 4;
- start++;
- if (start >= P25_LDU_FRAME_LENGTH_BITS)
- start -= P25_LDU_FRAME_LENGTH_BITS;
-
- buffer[i] |= _READ_BIT(m_buffer, start) << 3;
- start++;
- if (start >= P25_LDU_FRAME_LENGTH_BITS)
- start -= P25_LDU_FRAME_LENGTH_BITS;
-
- buffer[i] |= _READ_BIT(m_buffer, start) << 2;
- start++;
- if (start >= P25_LDU_FRAME_LENGTH_BITS)
- start -= P25_LDU_FRAME_LENGTH_BITS;
-
- buffer[i] |= _READ_BIT(m_buffer, start) << 1;
- start++;
- if (start >= P25_LDU_FRAME_LENGTH_BITS)
- start -= P25_LDU_FRAME_LENGTH_BITS;
-
- buffer[i] |= _READ_BIT(m_buffer, start) << 0;
- start++;
- if (start >= P25_LDU_FRAME_LENGTH_BITS)
- start -= P25_LDU_FRAME_LENGTH_BITS;
- }
-}
diff --git a/p25/P25RX.h b/p25/P25RX.h
index 3552d15..3029b89 100644
--- a/p25/P25RX.h
+++ b/p25/P25RX.h
@@ -66,29 +66,19 @@ namespace p25
/// Sets the P25 NAC.
void setNAC(uint16_t nac);
- /// Sets the P25 sync correlation countdown.
- void setCorrCount(uint8_t count);
private:
uint64_t m_bitBuffer;
- uint8_t m_buffer[P25_LDU_FRAME_LENGTH_BITS / 8U + 3U];
+ uint8_t m_buffer[P25_LDU_FRAME_LENGTH_BYTES + 3U];
uint16_t m_dataPtr;
- uint16_t m_minSyncPtr;
- uint16_t m_maxSyncPtr;
-
- uint16_t m_startPtr;
uint16_t m_endPtr;
- uint16_t m_syncPtr;
uint16_t m_lostCount;
- uint8_t m_countdown;
uint16_t m_nac;
- uint8_t m_corrCountdown;
-
P25RX_STATE m_state;
uint8_t m_duid;
@@ -104,10 +94,7 @@ namespace p25
bool correlateSync();
/// Helper to decode the P25 NID.
- bool decodeNid(uint16_t start);
-
- ///
- void bitsToBytes(uint16_t start, uint8_t count, uint8_t* buffer);
+ bool decodeNid();
};
} // namespace p25