diff --git a/ADF7021.cpp b/ADF7021.cpp
index baccaad..7461cd2 100644
--- a/ADF7021.cpp
+++ b/ADF7021.cpp
@@ -257,14 +257,7 @@ void IO::interrupt1()
}
m_watchdog++;
- m_modeTimerCnt++;
m_int1Counter++;
-
- if (m_scanPauseCnt >= SCAN_PAUSE)
- m_scanPauseCnt = 0U;
-
- if (m_scanPauseCnt != 0U)
- m_scanPauseCnt++;
}
#if defined(DUPLEX)
@@ -299,8 +292,7 @@ void IO::rf1Conf(DVM_STATE modemState, bool reset)
uint32_t txFrequencyTmp, rxFrequencyTmp;
- if (modemState != STATE_CW)
- m_modemStatePrev = modemState;
+ DEBUG3("IO: rf1Conf(): configuring ADF for Tx/Rx; modemState/reset", modemState, reset);
#if defined (ZUMSPOT_ADF7021) || defined(SKYBRIDGE_HS)
io.checkBand(m_rxFrequency, m_txFrequency);
@@ -500,6 +492,8 @@ void IO::rf1Conf(DVM_STATE modemState, bool reset)
///
void IO::rf2Conf(DVM_STATE modemState)
{
+ DEBUG2("IO: rf2Conf(): configuring 2nd ADF for Rx; modemState", modemState);
+
// configure ADF Tx/RX
configureTxRx(modemState);
@@ -685,6 +679,8 @@ void IO::updateCal(DVM_STATE modemState)
AD7021_CONTROL = ADF7021_REG2;
AD7021_1_IOCTL();
+ DEBUG2("IO: updateCal(): updating ADF calibration; modemState", modemState);
+
if (m_tx)
setTX();
else
@@ -850,6 +846,8 @@ void IO::configureBand()
f_div = 2U;
else
f_div = 1U;
+
+ DEBUG3("IO: configureBand(): configuring ADF freq band; reg1/f_div", ADF7021_REG1, f_div);
}
///
@@ -1078,6 +1076,9 @@ void IO::configureTxRx(DVM_STATE modemState)
}
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);
}
///
@@ -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
diff --git a/FirmwareMain.cpp b/FirmwareMain.cpp
index bdeadb1..0e34f45 100644
--- a/FirmwareMain.cpp
+++ b/FirmwareMain.cpp
@@ -38,13 +38,10 @@
// ---------------------------------------------------------------------------
DVM_STATE m_modemState = STATE_IDLE;
-DVM_STATE m_modemStatePrev = STATE_IDLE;
bool m_cwIdState = false;
uint8_t m_cwIdTXLevel = 30;
-uint32_t m_modeTimerCnt;
-
#ifdef ENABLE_DMR
bool m_dmrEnable = true;
#else
@@ -101,9 +98,9 @@ void setup()
void loop()
{
- io.process();
-
serial.process();
+
+ io.process();
// The following is for transmitting
if (m_dmrEnable && m_modemState == STATE_DMR) {
diff --git a/Globals.h b/Globals.h
index 918f0da..c3ee4b8 100644
--- a/Globals.h
+++ b/Globals.h
@@ -85,13 +85,10 @@ const uint8_t MARK_NONE = 0x00U;
// ---------------------------------------------------------------------------
extern DVM_STATE m_modemState;
-extern DVM_STATE m_modemStatePrev;
extern bool m_cwIdState;
extern uint8_t m_cwIdTXLevel;
-extern uint32_t m_modeTimerCnt;
-
extern bool m_dmrEnable;
extern bool m_p25Enable;
diff --git a/IO.cpp b/IO.cpp
index 7a010e3..102457d 100644
--- a/IO.cpp
+++ b/IO.cpp
@@ -53,9 +53,6 @@ IO::IO():
m_rxBuffer(1024U),
m_txBuffer(1024U),
m_ledCount(0U),
- m_scanEnable(false),
- m_scanPauseCnt(0U),
- m_scanPos(0U),
m_ledValue(true),
m_watchdog(0U),
m_int1Counter(0U),
@@ -83,7 +80,6 @@ IO::IO():
#endif
selfTest();
- m_modeTimerCnt = 0U;
}
///
@@ -91,30 +87,6 @@ IO::IO():
///
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)
return;
@@ -129,18 +101,19 @@ void IO::start()
void IO::process()
{
uint8_t bit;
- uint32_t scantime;
+ uint32_t scanTime;
uint8_t control;
m_ledCount++;
if (m_started) {
// Two seconds timeout
if (m_watchdog >= 19200U) {
+/*
if (m_modemState == STATE_DMR || m_modemState == STATE_P25) {
m_modemState = STATE_IDLE;
setMode(m_modemState);
}
-
+*/
m_watchdog = 0U;
}
@@ -159,42 +132,22 @@ void IO::process()
return;
}
- // Switch off the transmitter if needed
+ // switch off the transmitter if needed
if (m_txBuffer.getData() == 0U && m_tx) {
if (m_cwIdState) {
// check for CW ID end of transmission
m_cwIdState = false;
-
- // restoring previous mode
- if (m_totalModes) {
- io.rf1Conf(m_modemStatePrev, true);
- }
+ io.rf1Conf(m_modemState, true);
}
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) {
m_rxBuffer.get(bit, control);
- if (m_modemStatePrev == STATE_DMR) {
+ if (m_modemState == STATE_DMR) {
+ /** Digital Mobile Radio */
#if defined(DUPLEX)
if (m_duplex) {
if (m_tx)
@@ -208,7 +161,8 @@ void IO::process()
dmrDMORX.databit(bit);
#endif
}
- else if (m_modemStatePrev == STATE_P25) {
+ else if (m_modemState == STATE_P25) {
+ /** Project 25 */
p25RX.databit(bit);
}
}
@@ -255,10 +209,8 @@ uint16_t IO::getSpace() const
///
void IO::setDecode(bool dcd)
{
- if (dcd != m_dcd) {
- m_scanPauseCnt = 1U;
+ if (dcd != m_dcd)
setCOSInt(dcd ? true : false);
- }
m_dcd = dcd;
}
@@ -270,16 +222,12 @@ void IO::setMode(DVM_STATE modemState)
{
DVM_STATE relativeState = modemState;
- if ((modemState != STATE_IDLE) && (m_modemStatePrev != modemState)) {
- DEBUG2("IO: setMode(): setting RF hardware", modemState);
- if (serial.isCalState(modemState)) {
- relativeState = serial.calRelativeState(modemState);
- }
- }
- else {
- return;
+ if (serial.isCalState(modemState)) {
+ relativeState = serial.calRelativeState(modemState);
}
+ DEBUG3("IO: setMode(): setting RF hardware", modemState, relativeState);
+
rf1Conf(relativeState, true);
setDMRInt(relativeState == STATE_DMR);
diff --git a/IO.h b/IO.h
index 4a03747..c1fd010 100644
--- a/IO.h
+++ b/IO.h
@@ -41,9 +41,6 @@
// Constants
// ---------------------------------------------------------------------------
-#define SCAN_TIME 1920
-#define SCAN_PAUSE 20000
-
#if defined(DUPLEX)
#if defined(STM32_USB_HOST)
#define CAL_DLY_LOOP 98950U
@@ -179,13 +176,6 @@ private:
BitBuffer m_txBuffer;
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;
volatile uint32_t m_watchdog;
diff --git a/SerialPort.cpp b/SerialPort.cpp
index 3cd38f4..6217a6a 100644
--- a/SerialPort.cpp
+++ b/SerialPort.cpp
@@ -370,13 +370,14 @@ void SerialPort::process()
bool SerialPort::isCalState(DVM_STATE state)
{
// calibration mode check
- if (state != STATE_P25_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_RSSI_CAL &&
- state != STATE_P25_CAL && state != STATE_DMR_CAL &&
- state != STATE_INT_CAL)
+ if (state == STATE_P25_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_RSSI_CAL ||
+ state == STATE_P25_CAL || state == STATE_DMR_CAL ||
+ state == STATE_INT_CAL) {
return true;
+ }
return false;
}
@@ -393,7 +394,7 @@ DVM_STATE SerialPort::calRelativeState(DVM_STATE state)
state == STATE_DMR_LF_CAL || state == STATE_DMR_CAL ||
state == STATE_RSSI_CAL || state == STATE_INT_CAL) {
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) {
return STATE_P25;
}
@@ -943,6 +944,10 @@ uint8_t SerialPort::setConfig(const uint8_t* data, uint8_t length)
m_dmrEnable = dmrEnable;
m_p25Enable = p25Enable;
+
+ if (m_dmrEnable && m_p25Enable)
+ return RSN_HS_NO_DUAL_MODE;
+
m_duplex = !simplex;
#if !defined(DUPLEX)
@@ -977,6 +982,8 @@ uint8_t SerialPort::setConfig(const uint8_t* data, uint8_t length)
io.updateCal(calRelativeState(m_modemState));
}
+ setMode(m_modemState);
+
io.start();
return RSN_OK;
diff --git a/SerialPort.h b/SerialPort.h
index 3054e3c..0ea5795 100644
--- a/SerialPort.h
+++ b/SerialPort.h
@@ -121,6 +121,8 @@ enum CMD_REASON_CODE {
RSN_INVALID_P25_CORR_COUNT = 16U,
+ RSN_HS_NO_DUAL_MODE = 32U,
+
RSN_DMR_DISABLED = 63U,
RSN_P25_DISABLED = 64U,
};
@@ -128,6 +130,7 @@ enum CMD_REASON_CODE {
const uint8_t DVM_FRAME_START = 0xFEU;
#define SERIAL_SPEED 115200
+#define STATE_SCAN_MAX 3
// ---------------------------------------------------------------------------
// Class Declaration
diff --git a/dmr/DMRDMORX.cpp b/dmr/DMRDMORX.cpp
index 5f80a04..a84011b 100644
--- a/dmr/DMRDMORX.cpp
+++ b/dmr/DMRDMORX.cpp
@@ -259,8 +259,6 @@ void DMRDMORX::correlateSync()
if (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);
}
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)
m_endPtr -= DMO_BUFFER_LENGTH_BITS;
- m_modeTimerCnt = 0;
-
DEBUG4("DMRDMORX: correlateSync(): dataPtr/startPtr/endPtr", m_dataPtr, m_startPtr, m_endPtr);
}
}