Adding mode detection, using scanning mode

pull/2/head
Andy CA6JAU 9 years ago
parent 7908b0f958
commit 992249dce4

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

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

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

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

@ -339,7 +339,7 @@ void CSerialPort::setMode(MMDVM_STATE modemState)
io.ifConf(modemState, true);
}
io.setMode();
io.setMode(m_modemState);
}
void CSerialPort::start()

Loading…
Cancel
Save

Powered by TurnKey Linux.