diff --git a/ADF7021.cpp b/ADF7021.cpp index 5466da1..e09114b 100644 --- a/ADF7021.cpp +++ b/ADF7021.cpp @@ -187,9 +187,19 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) uint32_t ADF7021_REG13 = 0U; int32_t AFC_OFFSET = 0; - if(modemState != STATE_CWID && modemState != STATE_POCSAG) + uint32_t frequency_tx_tmp, frequency_rx_tmp; + + if (modemState != STATE_CWID && modemState != STATE_POCSAG) m_modemState_prev = modemState; + // Change frequency for POCSAG mode, store a backup of DV frequencies + if (modemState == STATE_POCSAG) { + frequency_tx_tmp = m_frequency_tx; + frequency_rx_tmp = m_frequency_rx; + m_frequency_tx = m_pocsag_freq_tx; + m_frequency_rx = m_pocsag_freq_tx; + } + // Toggle CE pin for ADF7021 reset if(reset) { CE_pin(LOW); @@ -545,7 +555,13 @@ void CIO::ifConf(MMDVM_STATE modemState, bool reset) AD7021_control_word = 0x000E000F; #endif Send_AD7021_control(); - + + // Restore normal DV frequencies + if (modemState == STATE_POCSAG) { + m_frequency_tx = frequency_tx_tmp; + m_frequency_rx = frequency_rx_tmp; + } + #if defined(DUPLEX) if(m_duplex && (modemState != STATE_CWID && modemState != STATE_POCSAG)) ifConf2(modemState); diff --git a/IO.cpp b/IO.cpp index 8c33119..d2d041f 100644 --- a/IO.cpp +++ b/IO.cpp @@ -24,6 +24,7 @@ uint32_t m_frequency_rx; uint32_t m_frequency_tx; +uint32_t m_pocsag_freq_tx; uint8_t m_power; CIO::CIO(): @@ -288,7 +289,7 @@ bool CIO::hasRXOverflow() return m_rxBuffer.hasOverflowed(); } -uint8_t CIO::setFreq(uint32_t frequency_rx, uint32_t frequency_tx, uint8_t rf_power) +uint8_t CIO::setFreq(uint32_t frequency_rx, uint32_t frequency_tx, uint8_t rf_power, uint32_t pocsag_freq_tx) { // Configure power level setPower(rf_power); @@ -300,9 +301,16 @@ uint8_t CIO::setFreq(uint32_t frequency_rx, uint32_t frequency_tx, uint8_t rf_po ((frequency_rx >= UHF2_MIN)&&(frequency_rx < UHF2_MAX)) || ((frequency_tx >= UHF2_MIN)&&(frequency_tx < UHF2_MAX)) ) ) return 4U; + if( !( ((pocsag_freq_tx >= VHF1_MIN)&&(pocsag_freq_tx < VHF1_MAX)) || \ + ((pocsag_freq_tx >= UHF1_MIN)&&(pocsag_freq_tx < UHF1_MAX)) || \ + ((pocsag_freq_tx >= VHF2_MIN)&&(pocsag_freq_tx < VHF2_MAX)) || \ + ((pocsag_freq_tx >= UHF2_MIN)&&(pocsag_freq_tx < UHF2_MAX)) ) ) + return 4U; + // Configure frequency m_frequency_rx = frequency_rx; m_frequency_tx = frequency_tx; + m_pocsag_freq_tx = pocsag_freq_tx; return 0U; } diff --git a/IO.h b/IO.h index 8e2c705..5fe4081 100644 --- a/IO.h +++ b/IO.h @@ -42,6 +42,7 @@ extern uint32_t m_frequency_rx; extern uint32_t m_frequency_tx; +extern uint32_t m_pocsag_freq_tx; extern uint8_t m_power; class CIO { @@ -93,7 +94,7 @@ class CIO { void process(void); bool hasTXOverflow(void); bool hasRXOverflow(void); - uint8_t setFreq(uint32_t frequency_rx, uint32_t frequency_tx, uint8_t rf_power); + uint8_t setFreq(uint32_t frequency_rx, uint32_t frequency_tx, uint8_t rf_power, uint32_t pocsag_freq_tx); void setPower(uint8_t power); void setMode(MMDVM_STATE modemState); void setDecode(bool dcd); diff --git a/SerialPort.cpp b/SerialPort.cpp index d6d2d37..8ee44b5 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -388,31 +388,41 @@ uint8_t CSerialPort::setMode(const uint8_t* data, uint8_t length) uint8_t CSerialPort::setFreq(const uint8_t* data, uint8_t length) { - uint32_t freq_rx, freq_tx; - uint8_t rf_power; + uint32_t freq_rx, freq_tx, pocsag_freq_tx; + uint8_t rf_power; - if (length < 9U) - return 4U; - - // Old MMDVMHost, set full power - if (length == 9U) - rf_power = 255U; + if (length < 9U) + return 4U; - // New MMDVMHost, set power from MMDVM.ini - if (length == 10U) - rf_power = data[9U]; + // Very old MMDVMHost, set full power + if (length == 9U) + rf_power = 255U; + + // Current MMDVMHost, set power from MMDVM.ini + if (length >= 10U) + rf_power = data[9U]; + + freq_rx = data[1U] << 0; + freq_rx |= data[2U] << 8; + freq_rx |= data[3U] << 16; + freq_rx |= data[4U] << 24; + + freq_tx = data[5U] << 0; + freq_tx |= data[6U] << 8; + freq_tx |= data[7U] << 16; + freq_tx |= data[8U] << 24; + + // New MMDVMHost, set POCSAG TX frequency + if (length >= 14U) { + pocsag_freq_tx = data[10U] << 0; + pocsag_freq_tx |= data[11U] << 8; + pocsag_freq_tx |= data[12U] << 16; + pocsag_freq_tx |= data[13U] << 24; + } + else + pocsag_freq_tx = freq_tx; - freq_rx = data[1U] * 1U; - freq_rx += data[2U] * 256U; - freq_rx += data[3U] * 65536U; - freq_rx += data[4U] * 16777216U; - - freq_tx = data[5U] * 1U; - freq_tx += data[6U] * 256U; - freq_tx += data[7U] * 65536U; - freq_tx += data[8U] * 16777216U; - - return io.setFreq(freq_rx, freq_tx, rf_power); + return io.setFreq(freq_rx, freq_tx, rf_power, pocsag_freq_tx); } void CSerialPort::setMode(MMDVM_STATE modemState)