diff --git a/DMRDMORX.cpp b/DMRDMORX.cpp index c44293c..ff099d2 100644 --- a/DMRDMORX.cpp +++ b/DMRDMORX.cpp @@ -209,6 +209,8 @@ void CDMRDMORX::correlateSync() m_endPtr = m_dataPtr + DMR_SLOT_TYPE_LENGTH_BITS / 2U + DMR_INFO_LENGTH_BITS / 2U; if (m_endPtr >= DMO_BUFFER_LENGTH_BITS) m_endPtr -= DMO_BUFFER_LENGTH_BITS; + + m_modeTimerCnt = 0; //DEBUG4("SYNC MS Data found pos/start/end:", m_dataPtr, m_startPtr, m_endPtr); } else if ( (countBits64((m_patternBuffer & DMR_SYNC_BITS_MASK) ^ DMR_MS_VOICE_SYNC_BITS) <= MAX_SYNC_BYTES_ERRS) || \ @@ -225,6 +227,8 @@ void CDMRDMORX::correlateSync() if (m_endPtr >= DMO_BUFFER_LENGTH_BITS) m_endPtr -= DMO_BUFFER_LENGTH_BITS; + m_modeTimerCnt = 0; + //DEBUG4("SYNC MS Voice found pos/start/end: ", m_dataPtr, m_startPtr, m_endPtr); } } diff --git a/DStarRX.cpp b/DStarRX.cpp index 9b3a2ff..12bb276 100644 --- a/DStarRX.cpp +++ b/DStarRX.cpp @@ -30,6 +30,11 @@ const unsigned int SYNC_POS = 21U * DSTAR_DATA_LENGTH_BITS; const unsigned int SYNC_SCAN_START = SYNC_POS - 3U; const unsigned int SYNC_SCAN_END = SYNC_POS + 3U; +// D-Star preamble sequence (only 32 bits of 101010...) +const uint32_t PREAMBLE_MASK = 0xFFFFFFFFU; +const uint32_t PREAMBLE_DATA = 0xAAAAAAAAU; +const uint8_t PREAMBLE_ERRS = 2U; + // D-Star bit order version of 0x55 0x55 0x6E 0x0A const uint32_t FRAME_SYNC_DATA = 0x00557650U; const uint32_t FRAME_SYNC_MASK = 0x00FFFFFFU; @@ -284,9 +289,21 @@ void CDStarRX::processNone(bool bit) if (bit) m_patternBuffer |= 0x01U; + // Fuzzy matching of the preamble sync sequence + if (countBits32((m_patternBuffer & PREAMBLE_MASK) ^ PREAMBLE_DATA) <= PREAMBLE_ERRS) { + DEBUG1("DStarRX: preamble detected, fuzzy"); + + // Extend scan period in D-Star, once preamble is detected + m_modeTimerCnt = 0; + + m_rxState = DSRXS_NONE; + + return; + } + // Fuzzy matching of the frame sync sequence if (countBits32((m_patternBuffer & FRAME_SYNC_MASK) ^ FRAME_SYNC_DATA) <= FRAME_SYNC_ERRS) { - DEBUG1("DStarRX: found frame sync in None"); + DEBUG1("DStarRX: found frame sync in None, fuzzy"); ::memset(m_rxBuffer, 0x00U, DSTAR_FEC_SECTION_LENGTH_BYTES); m_rxBufferBits = 0U; @@ -297,7 +314,7 @@ void CDStarRX::processNone(bool bit) // Exact matching of the data sync bit sequence if (countBits32((m_patternBuffer & DATA_SYNC_MASK) ^ DATA_SYNC_DATA) == 0U) { - DEBUG1("DStarRX: found data sync in None"); + DEBUG1("DStarRX: found data sync in None, exact"); io.setDecode(true); diff --git a/Globals.h b/Globals.h index 5b4fcc6..2bd31ee 100644 --- a/Globals.h +++ b/Globals.h @@ -53,6 +53,8 @@ const uint16_t RX_RINGBUFFER_SIZE = 120U; extern MMDVM_STATE m_modemState; extern MMDVM_STATE m_modemState_prev; +extern uint32_t m_modeTimerCnt; + extern bool m_dstarEnable; extern bool m_dmrEnable; extern bool m_ysfEnable; diff --git a/IO.cpp b/IO.cpp index bf9ca06..d95f955 100644 --- a/IO.cpp +++ b/IO.cpp @@ -32,7 +32,6 @@ m_txBuffer(TX_RINGBUFFER_SIZE), m_LoDevYSF(false), m_ledCount(0U), m_scanEnable(false), -m_modeTimerCnt(0U), m_scanPauseCnt(0U), m_scanPos(0U), m_ledValue(true), @@ -57,6 +56,8 @@ m_watchdog(0U) SCLK_pin(LOW); SDATA_pin(LOW); SLE_pin(LOW); + + m_modeTimerCnt = 0; } void CIO::process() diff --git a/IO.h b/IO.h index dae9e47..31ddfc8 100644 --- a/IO.h +++ b/IO.h @@ -113,7 +113,6 @@ private: bool m_LoDevYSF; uint32_t m_ledCount; bool m_scanEnable; - uint32_t m_modeTimerCnt; uint32_t m_scanPauseCnt; uint8_t m_scanPos; uint8_t m_TotalModes; diff --git a/MMDVM_HS.cpp b/MMDVM_HS.cpp index ab3f8a5..20444e4 100644 --- a/MMDVM_HS.cpp +++ b/MMDVM_HS.cpp @@ -29,6 +29,8 @@ MMDVM_STATE m_modemState = STATE_IDLE; MMDVM_STATE m_modemState_prev = STATE_IDLE; +uint32_t m_modeTimerCnt; + bool m_dstarEnable = true; bool m_dmrEnable = true; bool m_ysfEnable = true; diff --git a/MMDVM_HS.ino b/MMDVM_HS.ino index 17e957f..592bc37 100644 --- a/MMDVM_HS.ino +++ b/MMDVM_HS.ino @@ -25,6 +25,8 @@ MMDVM_STATE m_modemState = STATE_IDLE; MMDVM_STATE m_modemState_prev = STATE_IDLE; +uint32_t m_modeTimerCnt; + bool m_dstarEnable = true; bool m_dmrEnable = true; bool m_ysfEnable = true;