remove mode scanning entirely (this sucks);

pull/2/head
Bryan Biedenkapp 4 years ago
parent 3cef7709a9
commit 67b2ad5697

@ -257,14 +257,7 @@ void IO::interrupt1()
} }
m_watchdog++; m_watchdog++;
m_modeTimerCnt++;
m_int1Counter++; m_int1Counter++;
if (m_scanPauseCnt >= SCAN_PAUSE)
m_scanPauseCnt = 0U;
if (m_scanPauseCnt != 0U)
m_scanPauseCnt++;
} }
#if defined(DUPLEX) #if defined(DUPLEX)
@ -299,8 +292,7 @@ void IO::rf1Conf(DVM_STATE modemState, bool reset)
uint32_t txFrequencyTmp, rxFrequencyTmp; uint32_t txFrequencyTmp, rxFrequencyTmp;
if (modemState != STATE_CW) DEBUG3("IO: rf1Conf(): configuring ADF for Tx/Rx; modemState/reset", modemState, reset);
m_modemStatePrev = modemState;
#if defined (ZUMSPOT_ADF7021) || defined(SKYBRIDGE_HS) #if defined (ZUMSPOT_ADF7021) || defined(SKYBRIDGE_HS)
io.checkBand(m_rxFrequency, m_txFrequency); io.checkBand(m_rxFrequency, m_txFrequency);
@ -500,6 +492,8 @@ void IO::rf1Conf(DVM_STATE modemState, bool reset)
/// <param name="reset"></param> /// <param name="reset"></param>
void IO::rf2Conf(DVM_STATE modemState) void IO::rf2Conf(DVM_STATE modemState)
{ {
DEBUG2("IO: rf2Conf(): configuring 2nd ADF for Rx; modemState", modemState);
// configure ADF Tx/RX // configure ADF Tx/RX
configureTxRx(modemState); configureTxRx(modemState);
@ -685,6 +679,8 @@ void IO::updateCal(DVM_STATE modemState)
AD7021_CONTROL = ADF7021_REG2; AD7021_CONTROL = ADF7021_REG2;
AD7021_1_IOCTL(); AD7021_1_IOCTL();
DEBUG2("IO: updateCal(): updating ADF calibration; modemState", modemState);
if (m_tx) if (m_tx)
setTX(); setTX();
else else
@ -850,6 +846,8 @@ void IO::configureBand()
f_div = 2U; f_div = 2U;
else else
f_div = 1U; f_div = 1U;
DEBUG3("IO: configureBand(): configuring ADF freq band; reg1/f_div", ADF7021_REG1, f_div);
} }
/// <summary> /// <summary>
@ -1078,6 +1076,9 @@ void IO::configureTxRx(DVM_STATE modemState)
} }
break; break;
} }
DEBUG4("IO: configureTxRx(): configuring ADF Tx/Rx states; dmrSymDev/p25SymDev/rfPower", (uint16_t)((ADF7021_PFD * dmrDev) / (f_div * 65536)),
(uint16_t)((ADF7021_PFD * p25Dev) / (f_div * 65536)), m_rfPower);
} }
/// <summary> /// <summary>
@ -1127,39 +1128,4 @@ void IO::setRX(bool doSle)
} }
} }
#if defined(ENABLE_DEBUG)
uint32_t CIO::RXfreq()
{
return (uint32_t)((float)(ADF7021_PFD / f_div) * ((float)((32768 * m_RX_N_divider) + m_RX_F_divider) / 32768.0)) + 100000;
}
uint32_t CIO::TXfreq()
{
return (uint32_t)((float)(ADF7021_PFD / f_div) * ((float)((32768 * m_TX_N_divider) + m_TX_F_divider) / 32768.0));
}
uint16_t CIO::devDMR()
{
return (uint16_t)((ADF7021_PFD * dmrDev) / (f_div * 65536));
}
uint16_t CIO::devP25()
{
return (uint16_t)((ADF7021_PFD * p25Dev) / (f_div * 65536));
}
void CIO::printConf()
{
DEBUG1("MMDVM_HS FW configuration:");
DEBUG2I("TX freq (Hz):", TXfreq());
DEBUG2I("RX freq (Hz):", RXfreq());
DEBUG2("Power set:", m_power);
DEBUG2("DMR +1 sym dev (Hz):", devDMR());
DEBUG2("P25 +1 sym dev (Hz):", devP25());
}
#endif
#endif // ENABLE_ADF7021 #endif // ENABLE_ADF7021

@ -38,13 +38,10 @@
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
DVM_STATE m_modemState = STATE_IDLE; DVM_STATE m_modemState = STATE_IDLE;
DVM_STATE m_modemStatePrev = STATE_IDLE;
bool m_cwIdState = false; bool m_cwIdState = false;
uint8_t m_cwIdTXLevel = 30; uint8_t m_cwIdTXLevel = 30;
uint32_t m_modeTimerCnt;
#ifdef ENABLE_DMR #ifdef ENABLE_DMR
bool m_dmrEnable = true; bool m_dmrEnable = true;
#else #else
@ -101,10 +98,10 @@ void setup()
void loop() void loop()
{ {
io.process();
serial.process(); serial.process();
io.process();
// The following is for transmitting // The following is for transmitting
if (m_dmrEnable && m_modemState == STATE_DMR) { if (m_dmrEnable && m_modemState == STATE_DMR) {
#if defined(DUPLEX) #if defined(DUPLEX)

@ -85,13 +85,10 @@ const uint8_t MARK_NONE = 0x00U;
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
extern DVM_STATE m_modemState; extern DVM_STATE m_modemState;
extern DVM_STATE m_modemStatePrev;
extern bool m_cwIdState; extern bool m_cwIdState;
extern uint8_t m_cwIdTXLevel; extern uint8_t m_cwIdTXLevel;
extern uint32_t m_modeTimerCnt;
extern bool m_dmrEnable; extern bool m_dmrEnable;
extern bool m_p25Enable; extern bool m_p25Enable;

@ -53,9 +53,6 @@ IO::IO():
m_rxBuffer(1024U), m_rxBuffer(1024U),
m_txBuffer(1024U), m_txBuffer(1024U),
m_ledCount(0U), m_ledCount(0U),
m_scanEnable(false),
m_scanPauseCnt(0U),
m_scanPos(0U),
m_ledValue(true), m_ledValue(true),
m_watchdog(0U), m_watchdog(0U),
m_int1Counter(0U), m_int1Counter(0U),
@ -83,7 +80,6 @@ IO::IO():
#endif #endif
selfTest(); selfTest();
m_modeTimerCnt = 0U;
} }
/// <summary> /// <summary>
@ -91,30 +87,6 @@ IO::IO():
/// </summary> /// </summary>
void IO::start() void IO::start()
{ {
m_totalModes = 0U;
if (m_dmrEnable) {
m_modes[m_totalModes] = STATE_DMR;
m_totalModes++;
}
if (m_p25Enable) {
m_modes[m_totalModes] = STATE_P25;
m_totalModes++;
}
#if defined(ENABLE_SCAN_MODE)
if (m_totalModes > 1U) {
m_scanEnable = true;
}
else {
m_scanEnable = false;
setMode(m_modemState);
}
#else
m_scanEnable = false;
setMode(m_modemState);
#endif
if (m_started) if (m_started)
return; return;
@ -129,18 +101,19 @@ void IO::start()
void IO::process() void IO::process()
{ {
uint8_t bit; uint8_t bit;
uint32_t scantime; uint32_t scanTime;
uint8_t control; uint8_t control;
m_ledCount++; m_ledCount++;
if (m_started) { if (m_started) {
// Two seconds timeout // Two seconds timeout
if (m_watchdog >= 19200U) { if (m_watchdog >= 19200U) {
/*
if (m_modemState == STATE_DMR || m_modemState == STATE_P25) { if (m_modemState == STATE_DMR || m_modemState == STATE_P25) {
m_modemState = STATE_IDLE; m_modemState = STATE_IDLE;
setMode(m_modemState); setMode(m_modemState);
} }
*/
m_watchdog = 0U; m_watchdog = 0U;
} }
@ -159,42 +132,22 @@ void IO::process()
return; return;
} }
// Switch off the transmitter if needed // switch off the transmitter if needed
if (m_txBuffer.getData() == 0U && m_tx) { if (m_txBuffer.getData() == 0U && m_tx) {
if (m_cwIdState) { if (m_cwIdState) {
// check for CW ID end of transmission // check for CW ID end of transmission
m_cwIdState = false; m_cwIdState = false;
io.rf1Conf(m_modemState, true);
// restoring previous mode
if (m_totalModes) {
io.rf1Conf(m_modemStatePrev, true);
}
} }
setRX(false); setRX(false);
} }
if (m_modemStatePrev == STATE_DMR)
scantime = SCAN_TIME * 2U;
else if (m_modemStatePrev == STATE_P25)
scantime = SCAN_TIME;
else
scantime = SCAN_TIME;
if (m_modeTimerCnt >= scantime) {
m_modeTimerCnt = 0U;
if ((m_modemState == STATE_IDLE) && (m_scanPauseCnt == 0U) && m_scanEnable && !m_cwIdState) {
m_scanPos = (m_scanPos + 1U) % m_totalModes;
setMode(m_modes[m_scanPos]);
io.rf1Conf(m_modes[m_scanPos], true);
}
}
if (m_rxBuffer.getData() >= 1U) { if (m_rxBuffer.getData() >= 1U) {
m_rxBuffer.get(bit, control); m_rxBuffer.get(bit, control);
if (m_modemStatePrev == STATE_DMR) { if (m_modemState == STATE_DMR) {
/** Digital Mobile Radio */
#if defined(DUPLEX) #if defined(DUPLEX)
if (m_duplex) { if (m_duplex) {
if (m_tx) if (m_tx)
@ -208,7 +161,8 @@ void IO::process()
dmrDMORX.databit(bit); dmrDMORX.databit(bit);
#endif #endif
} }
else if (m_modemStatePrev == STATE_P25) { else if (m_modemState == STATE_P25) {
/** Project 25 */
p25RX.databit(bit); p25RX.databit(bit);
} }
} }
@ -255,10 +209,8 @@ uint16_t IO::getSpace() const
/// <param name="dcd"></param> /// <param name="dcd"></param>
void IO::setDecode(bool dcd) void IO::setDecode(bool dcd)
{ {
if (dcd != m_dcd) { if (dcd != m_dcd)
m_scanPauseCnt = 1U;
setCOSInt(dcd ? true : false); setCOSInt(dcd ? true : false);
}
m_dcd = dcd; m_dcd = dcd;
} }
@ -270,16 +222,12 @@ void IO::setMode(DVM_STATE modemState)
{ {
DVM_STATE relativeState = modemState; DVM_STATE relativeState = modemState;
if ((modemState != STATE_IDLE) && (m_modemStatePrev != modemState)) { if (serial.isCalState(modemState)) {
DEBUG2("IO: setMode(): setting RF hardware", modemState); relativeState = serial.calRelativeState(modemState);
if (serial.isCalState(modemState)) {
relativeState = serial.calRelativeState(modemState);
}
}
else {
return;
} }
DEBUG3("IO: setMode(): setting RF hardware", modemState, relativeState);
rf1Conf(relativeState, true); rf1Conf(relativeState, true);
setDMRInt(relativeState == STATE_DMR); setDMRInt(relativeState == STATE_DMR);

10
IO.h

@ -41,9 +41,6 @@
// Constants // Constants
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
#define SCAN_TIME 1920
#define SCAN_PAUSE 20000
#if defined(DUPLEX) #if defined(DUPLEX)
#if defined(STM32_USB_HOST) #if defined(STM32_USB_HOST)
#define CAL_DLY_LOOP 98950U #define CAL_DLY_LOOP 98950U
@ -179,13 +176,6 @@ private:
BitBuffer m_txBuffer; BitBuffer m_txBuffer;
uint32_t m_ledCount; uint32_t m_ledCount;
bool m_scanEnable;
uint32_t m_scanPauseCnt;
uint8_t m_scanPos;
uint8_t m_totalModes;
DVM_STATE m_modes[6];
bool m_ledValue; bool m_ledValue;
volatile uint32_t m_watchdog; volatile uint32_t m_watchdog;

@ -370,13 +370,14 @@ void SerialPort::process()
bool SerialPort::isCalState(DVM_STATE state) bool SerialPort::isCalState(DVM_STATE state)
{ {
// calibration mode check // calibration mode check
if (state != STATE_P25_CAL_1K && if (state == STATE_P25_CAL_1K ||
state != STATE_DMR_DMO_CAL_1K && state != STATE_DMR_CAL_1K && state == STATE_DMR_DMO_CAL_1K || state == STATE_DMR_CAL_1K ||
state != STATE_DMR_LF_CAL && state != STATE_P25_LF_CAL && state == STATE_DMR_LF_CAL || state == STATE_P25_LF_CAL ||
state != STATE_RSSI_CAL && state == STATE_RSSI_CAL ||
state != STATE_P25_CAL && state != STATE_DMR_CAL && state == STATE_P25_CAL || state == STATE_DMR_CAL ||
state != STATE_INT_CAL) state == STATE_INT_CAL) {
return true; return true;
}
return false; return false;
} }
@ -393,7 +394,7 @@ DVM_STATE SerialPort::calRelativeState(DVM_STATE state)
state == STATE_DMR_LF_CAL || state == STATE_DMR_CAL || state == STATE_DMR_LF_CAL || state == STATE_DMR_CAL ||
state == STATE_RSSI_CAL || state == STATE_INT_CAL) { state == STATE_RSSI_CAL || state == STATE_INT_CAL) {
return STATE_DMR; return STATE_DMR;
} else if(state != STATE_P25_CAL_1K && state != STATE_P25_LF_CAL && } else if(state == STATE_P25_CAL_1K || state == STATE_P25_LF_CAL ||
state == STATE_P25_CAL) { state == STATE_P25_CAL) {
return STATE_P25; return STATE_P25;
} }
@ -943,6 +944,10 @@ uint8_t SerialPort::setConfig(const uint8_t* data, uint8_t length)
m_dmrEnable = dmrEnable; m_dmrEnable = dmrEnable;
m_p25Enable = p25Enable; m_p25Enable = p25Enable;
if (m_dmrEnable && m_p25Enable)
return RSN_HS_NO_DUAL_MODE;
m_duplex = !simplex; m_duplex = !simplex;
#if !defined(DUPLEX) #if !defined(DUPLEX)
@ -977,6 +982,8 @@ uint8_t SerialPort::setConfig(const uint8_t* data, uint8_t length)
io.updateCal(calRelativeState(m_modemState)); io.updateCal(calRelativeState(m_modemState));
} }
setMode(m_modemState);
io.start(); io.start();
return RSN_OK; return RSN_OK;

@ -121,6 +121,8 @@ enum CMD_REASON_CODE {
RSN_INVALID_P25_CORR_COUNT = 16U, RSN_INVALID_P25_CORR_COUNT = 16U,
RSN_HS_NO_DUAL_MODE = 32U,
RSN_DMR_DISABLED = 63U, RSN_DMR_DISABLED = 63U,
RSN_P25_DISABLED = 64U, RSN_P25_DISABLED = 64U,
}; };
@ -128,6 +130,7 @@ enum CMD_REASON_CODE {
const uint8_t DVM_FRAME_START = 0xFEU; const uint8_t DVM_FRAME_START = 0xFEU;
#define SERIAL_SPEED 115200 #define SERIAL_SPEED 115200
#define STATE_SCAN_MAX 3
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Class Declaration // Class Declaration

@ -259,8 +259,6 @@ void DMRDMORX::correlateSync()
if (m_endPtr >= DMO_BUFFER_LENGTH_BITS) if (m_endPtr >= DMO_BUFFER_LENGTH_BITS)
m_endPtr -= DMO_BUFFER_LENGTH_BITS; m_endPtr -= DMO_BUFFER_LENGTH_BITS;
m_modeTimerCnt = 0;
DEBUG4("DMRDMORX: correlateSync(): dataPtr/startPtr/endPtr", m_dataPtr, m_startPtr, m_endPtr); DEBUG4("DMRDMORX: correlateSync(): dataPtr/startPtr/endPtr", m_dataPtr, m_startPtr, m_endPtr);
} }
else if ((countBits64((m_bitBuffer & DMR_SYNC_BITS_MASK) ^ DMR_MS_VOICE_SYNC_BITS) <= MAX_SYNC_BYTES_ERRS) || \ else if ((countBits64((m_bitBuffer & DMR_SYNC_BITS_MASK) ^ DMR_MS_VOICE_SYNC_BITS) <= MAX_SYNC_BYTES_ERRS) || \
@ -276,8 +274,6 @@ void DMRDMORX::correlateSync()
if (m_endPtr >= DMO_BUFFER_LENGTH_BITS) if (m_endPtr >= DMO_BUFFER_LENGTH_BITS)
m_endPtr -= DMO_BUFFER_LENGTH_BITS; m_endPtr -= DMO_BUFFER_LENGTH_BITS;
m_modeTimerCnt = 0;
DEBUG4("DMRDMORX: correlateSync(): dataPtr/startPtr/endPtr", m_dataPtr, m_startPtr, m_endPtr); DEBUG4("DMRDMORX: correlateSync(): dataPtr/startPtr/endPtr", m_dataPtr, m_startPtr, m_endPtr);
} }
} }

Loading…
Cancel
Save

Powered by TurnKey Linux.