From 5e91c1159f5badda3df35d1fb1d73666550f0605 Mon Sep 17 00:00:00 2001 From: g0wfv Date: Wed, 14 Jun 2017 16:44:23 +0100 Subject: [PATCH] Add Tx and Rx frequency offsets Enables specification of independant Tx and Rx offsets in Hz for Tx and Rx frequencies on DVMega and MMDVM_HS hardware. Tx and Rx frequencies no longer have to be offset for frequency errors in ADF7021 devices and dashboards (BM/DMR+) will now display intended frequencies. --- Conf.cpp | 16 ++++++++++++++++ Conf.h | 4 ++++ MMDVM.ini | 2 ++ MMDVMHost.cpp | 10 +++++++--- Modem.cpp | 6 +++--- Modem.h | 2 +- 6 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index 2e0b5c0..42e02f4 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -85,6 +85,8 @@ m_modemTXInvert(false), m_modemPTTInvert(false), m_modemTXDelay(100U), m_modemDMRDelay(0U), +m_modemTxOffset(0), +m_modemRxOffset(0), m_modemRXLevel(50.0F), m_modemCWIdTXLevel(50.0F), m_modemDStarTXLevel(50.0F), @@ -327,6 +329,10 @@ bool CConf::read() m_modemTXDelay = (unsigned int)::atoi(value); else if (::strcmp(key, "DMRDelay") == 0) m_modemDMRDelay = (unsigned int)::atoi(value); + else if (::strcmp(key, "RXOffset") == 0) + m_modemRxOffset = ::atoi(value); + else if (::strcmp(key, "TXOffset") == 0) + m_modemTxOffset = ::atoi(value); else if (::strcmp(key, "RXLevel") == 0) m_modemRXLevel = float(::atof(value)); else if (::strcmp(key, "TXLevel") == 0) @@ -733,6 +739,16 @@ unsigned int CConf::getModemDMRDelay() const return m_modemDMRDelay; } +int CConf::getModemRxOffset() const +{ + return m_modemRxOffset; +} + +int CConf::getModemTxOffset() const +{ + return m_modemTxOffset; +} + float CConf::getModemRXLevel() const { return m_modemRXLevel; diff --git a/Conf.h b/Conf.h index 53baaf5..f46bd3f 100644 --- a/Conf.h +++ b/Conf.h @@ -72,6 +72,8 @@ public: bool getModemPTTInvert() const; unsigned int getModemTXDelay() const; unsigned int getModemDMRDelay() const; + int getModemTxOffset() const; + int getModemRxOffset() const; float getModemRXLevel() const; float getModemCWIdTXLevel() const; float getModemDStarTXLevel() const; @@ -228,6 +230,8 @@ private: bool m_modemPTTInvert; unsigned int m_modemTXDelay; unsigned int m_modemDMRDelay; + int m_modemTxOffset; + int m_modemRxOffset; float m_modemRXLevel; float m_modemCWIdTXLevel; float m_modemDStarTXLevel; diff --git a/MMDVM.ini b/MMDVM.ini index eefe240..968864a 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -42,6 +42,8 @@ TXInvert=1 RXInvert=0 PTTInvert=0 TXDelay=100 +RXOffset=0 +TXOffset=0 DMRDelay=0 RXLevel=50 TXLevel=50 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 1046ffc..c3dd6f5 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -815,6 +815,8 @@ bool CMMDVMHost::createModem() bool lowDeviation = m_conf.getFusionLowDeviation(); unsigned int rxFrequency = m_conf.getRxFrequency(); unsigned int txFrequency = m_conf.getTxFrequency(); + int rxOffset = m_conf.getModemRxOffset(); + int txOffset = m_conf.getModemTxOffset(); LogInfo("Modem Parameters"); LogInfo(" Port: %s", port.c_str()); @@ -822,6 +824,8 @@ bool CMMDVMHost::createModem() LogInfo(" TX Invert: %s", txInvert ? "yes" : "no"); LogInfo(" PTT Invert: %s", pttInvert ? "yes" : "no"); LogInfo(" TX Delay: %ums", txDelay); + LogInfo(" RX Offset: %dHz", rxOffset); + LogInfo(" TX Offset: %dHz", txOffset); LogInfo(" DMR Delay: %u (%.1fms)", dmrDelay, float(dmrDelay) * 0.0416666F); LogInfo(" RX Level: %.1f%%", rxLevel); LogInfo(" CW Id TX Level: %.1f%%", cwIdTXLevel); @@ -829,13 +833,13 @@ bool CMMDVMHost::createModem() LogInfo(" DMR TX Level: %.1f%%", dmrTXLevel); LogInfo(" YSF TX Level: %.1f%%", ysfTXLevel); LogInfo(" P25 TX Level: %.1f%%", p25TXLevel); - LogInfo(" RX Frequency: %uHz", rxFrequency); - LogInfo(" TX Frequency: %uHz", txFrequency); + LogInfo(" RX Frequency: %uHz (%uHz)", rxFrequency, rxFrequency + rxOffset); + LogInfo(" TX Frequency: %uHz (%uHz)", txFrequency, txFrequency + txOffset); m_modem = new CModem(port, m_duplex, rxInvert, txInvert, pttInvert, txDelay, dmrDelay, trace, debug); m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled); m_modem->setLevels(rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel); - m_modem->setRFParams(rxFrequency, txFrequency); + m_modem->setRFParams(rxFrequency, rxOffset, txFrequency, txOffset); m_modem->setDMRParams(colorCode); m_modem->setYSFParams(lowDeviation); diff --git a/Modem.cpp b/Modem.cpp index 13d6f2c..6881a2a 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -145,10 +145,10 @@ CModem::~CModem() delete[] m_buffer; } -void CModem::setRFParams(unsigned int rxFrequency, unsigned int txFrequency) +void CModem::setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int txFrequency, int txOffset) { - m_rxFrequency = rxFrequency; - m_txFrequency = txFrequency; + m_rxFrequency = rxFrequency + rxOffset; + m_txFrequency = txFrequency + txOffset; } void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled) diff --git a/Modem.h b/Modem.h index f67104e..bcebcff 100644 --- a/Modem.h +++ b/Modem.h @@ -37,7 +37,7 @@ public: CModem(const std::string& port, bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int dmrDelay, bool trace, bool debug); ~CModem(); - void setRFParams(unsigned int rxFrequency, unsigned int txFrequency); + void setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int txFrequency, int txOffset); void setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled); void setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25Enabled); void setDMRParams(unsigned int colorCode);