From 992249dce4ca16657bfe01a187658520d4f875b8 Mon Sep 17 00:00:00 2001 From: Andy CA6JAU Date: Sat, 25 Mar 2017 12:52:37 -0300 Subject: [PATCH] Adding mode detection, using scanning mode --- ADF7021.cpp | 5 +-- Config.h | 3 ++ IO.cpp | 90 +++++++++++++++++++++++++++++++++++++++++++------- IO.h | 25 +++++++++----- SerialPort.cpp | 2 +- 5 files changed, 102 insertions(+), 23 deletions(-) diff --git a/ADF7021.cpp b/ADF7021.cpp index 4fb6348..444820e 100644 --- a/ADF7021.cpp +++ b/ADF7021.cpp @@ -144,6 +144,8 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) uint32_t ADF7021_REG13 = 0; uint32_t AFC_OFFSET = 0; + m_modemState_prev = modemState; + // Toggle CE pin for ADF7021 reset if(reset) { CE_pin(LOW); @@ -381,8 +383,7 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) // 3FSK/4FSK DEMOD (13) AD7021_control_word = ADF7021_REG13; Send_AD7021_control(); - - m_modemState_prev = modemState; + } //====================================================================================================================== diff --git a/Config.h b/Config.h index a24d2ce..7364f84 100644 --- a/Config.h +++ b/Config.h @@ -55,6 +55,9 @@ // #define STM32_USART1_HOST #define STM32_USB_HOST +// Enable mode detection +#define ENABLE_SCAN_MODE + // Send RSSI value: // #define SEND_RSSI_DATA diff --git a/IO.cpp b/IO.cpp index cf5c04e..7037241 100644 --- a/IO.cpp +++ b/IO.cpp @@ -33,13 +33,17 @@ CIO::CIO(): m_started(false), m_rxBuffer(RX_RINGBUFFER_SIZE), 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), -m_watchdog(0U), -m_LoDevYSF(false) +m_watchdog(0U) { Init(); - + CE_pin(HIGH); LED_pin(HIGH); PTT_pin(LOW); @@ -62,6 +66,7 @@ m_LoDevYSF(false) void CIO::process() { uint8_t bit; + uint32_t scantime; m_ledCount++; @@ -70,7 +75,7 @@ void CIO::process() if (m_watchdog >= 19200U) { if (m_modemState == STATE_DSTAR || m_modemState == STATE_DMR || m_modemState == STATE_YSF || m_modemState == STATE_P25) { m_modemState = STATE_IDLE; - setMode(); + setMode(m_modemState); } m_watchdog = 0U; @@ -95,6 +100,26 @@ void CIO::process() setRX(); m_tx = false; } + + if(m_modemState_prev == STATE_DSTAR) + scantime = SCAN_TIME; + else if(m_modemState_prev == STATE_DMR) + scantime = SCAN_TIME*2; + else if(m_modemState_prev == STATE_YSF) + scantime = SCAN_TIME; + else if(m_modemState_prev == STATE_P25) + scantime = SCAN_TIME; + else + scantime = SCAN_TIME; + + if(m_modeTimerCnt >= scantime) { + m_modeTimerCnt = 0; + if( (m_modemState == STATE_IDLE) && (m_scanPauseCnt == 0) && m_scanEnable) { + m_scanPos = (m_scanPos + 1) % m_TotalModes; + setMode(m_Modes[m_scanPos]); + io.ifConf(m_Modes[m_scanPos], true); + } + } if (m_rxBuffer.getData() >= 1U) { m_rxBuffer.get(bit); @@ -152,18 +177,56 @@ void CIO::interrupt() } m_watchdog++; + m_modeTimerCnt++; + + if(m_scanPauseCnt >= SCAN_PAUSE) + m_scanPauseCnt = 0; + + if(m_scanPauseCnt != 0) + m_scanPauseCnt++; + } void CIO::start() { + m_TotalModes = 0; + + if(m_dstarEnable) { + m_Modes[m_TotalModes] = STATE_DSTAR; + m_TotalModes++; + } + if(m_dmrEnable) { + m_Modes[m_TotalModes] = STATE_DMR; + m_TotalModes++; + } + if(m_ysfEnable) { + m_Modes[m_TotalModes] = STATE_YSF; + m_TotalModes++; + } + if(m_p25Enable) { + m_Modes[m_TotalModes] = STATE_P25; + m_TotalModes++; + } + +#if defined(ENABLE_SCAN_MODE) + if(m_TotalModes > 1) + m_scanEnable = true; + else { + m_scanEnable = false; + setMode(m_modemState); + } +#else + m_scanEnable = false; + setMode(m_modemState); +#endif + if (m_started) return; - + startInt(); m_started = true; - setMode(); } void CIO::write(uint8_t* data, uint16_t length) @@ -214,18 +277,20 @@ uint8_t CIO::setFreq(uint32_t frequency_rx, uint32_t frequency_tx) return 0U; } -void CIO::setMode() +void CIO::setMode(MMDVM_STATE modemState) { - DSTAR_pin(m_modemState == STATE_DSTAR); - DMR_pin(m_modemState == STATE_DMR); - YSF_pin(m_modemState == STATE_YSF); - P25_pin(m_modemState == STATE_P25); + DSTAR_pin(modemState == STATE_DSTAR); + DMR_pin(modemState == STATE_DMR); + YSF_pin(modemState == STATE_YSF); + P25_pin(modemState == STATE_P25); } void CIO::setDecode(bool dcd) { - if (dcd != m_dcd) + if (dcd != m_dcd) { + m_scanPauseCnt = 1; COS_pin(dcd ? true : false); + } m_dcd = dcd; } @@ -234,3 +299,4 @@ void CIO::resetWatchdog() { m_watchdog = 0U; } + diff --git a/IO.h b/IO.h index 8398e2d..1f5ceb5 100644 --- a/IO.h +++ b/IO.h @@ -35,6 +35,9 @@ #define UHF2_MIN 842000000 #define UHF2_MAX 950000000 +#define SCAN_TIME 960 +#define SCAN_PAUSE 10000 + extern uint32_t m_frequency_rx; extern uint32_t m_frequency_tx; extern uint8_t m_power; @@ -80,7 +83,7 @@ public: bool hasTXOverflow(void); bool hasRXOverflow(void); uint8_t setFreq(uint32_t frequency_rx, uint32_t frequency_tx); - void setMode(void); + void setMode(MMDVM_STATE modemState); void setDecode(bool dcd); void setLoDevYSF(bool ysfLoDev); @@ -100,14 +103,20 @@ public: void delay_rx(void); private: - bool m_started; - CBitRB m_rxBuffer; - CBitRB m_txBuffer; - bool m_LoDevYSF; - uint32_t m_ledCount; - bool m_ledValue; - volatile uint32_t m_watchdog; + bool m_started; + CBitRB m_rxBuffer; + CBitRB m_txBuffer; + 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; + MMDVM_STATE m_Modes[4]; + bool m_ledValue; + volatile uint32_t m_watchdog; }; diff --git a/SerialPort.cpp b/SerialPort.cpp index d8f876c..4c44482 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -339,7 +339,7 @@ void CSerialPort::setMode(MMDVM_STATE modemState) io.ifConf(modemState, true); } - io.setMode(); + io.setMode(m_modemState); } void CSerialPort::start()