From 9a7828566d20460d5016c2beb5272fbae0561ede Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Sun, 20 Aug 2017 12:07:57 +0100 Subject: [PATCH] Add an optional transmi DC offset value. --- Conf.cpp | 28 ++++++++++++++++++---------- Conf.h | 14 ++++++++------ MMDVM.ini | 1 + MMDVMHost.cpp | 16 +++++++++------- Modem.cpp | 12 ++++++++---- Modem.h | 3 ++- 6 files changed, 46 insertions(+), 28 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index 1889347..42a5258 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -86,8 +86,9 @@ m_modemTXInvert(false), m_modemPTTInvert(false), m_modemTXDelay(100U), m_modemDMRDelay(0U), -m_modemTxOffset(0), -m_modemRxOffset(0), +m_modemTXOffset(0), +m_modemRXOffset(0), +m_modemTXDCOffset(0), m_modemRXLevel(50.0F), m_modemCWIdTXLevel(50.0F), m_modemDStarTXLevel(50.0F), @@ -340,9 +341,11 @@ bool CConf::read() else if (::strcmp(key, "DMRDelay") == 0) m_modemDMRDelay = (unsigned int)::atoi(value); else if (::strcmp(key, "RXOffset") == 0) - m_modemRxOffset = ::atoi(value); + m_modemRXOffset = ::atoi(value); else if (::strcmp(key, "TXOffset") == 0) - m_modemTxOffset = ::atoi(value); + m_modemTXOffset = ::atoi(value); + else if (::strcmp(key, "TXDCOffset") == 0) + m_modemTXDCOffset = ::atoi(value); else if (::strcmp(key, "RXLevel") == 0) m_modemRXLevel = float(::atof(value)); else if (::strcmp(key, "TXLevel") == 0) @@ -647,12 +650,12 @@ bool CConf::getDaemon() const return m_daemon; } -unsigned int CConf::getRxFrequency() const +unsigned int CConf::getRXFrequency() const { return m_rxFrequency; } -unsigned int CConf::getTxFrequency() const +unsigned int CConf::getTXFrequency() const { return m_txFrequency; } @@ -767,14 +770,19 @@ unsigned int CConf::getModemDMRDelay() const return m_modemDMRDelay; } -int CConf::getModemRxOffset() const +int CConf::getModemRXOffset() const { - return m_modemRxOffset; + return m_modemRXOffset; } -int CConf::getModemTxOffset() const +int CConf::getModemTXOffset() const { - return m_modemTxOffset; + return m_modemTXOffset; +} + +int CConf::getModemTXDCOffset() const +{ + return m_modemTXDCOffset; } float CConf::getModemRXLevel() const diff --git a/Conf.h b/Conf.h index d266369..fce1750 100644 --- a/Conf.h +++ b/Conf.h @@ -41,8 +41,8 @@ public: bool getDaemon() const; // The Info section - unsigned int getRxFrequency() const; - unsigned int getTxFrequency() const; + unsigned int getRXFrequency() const; + unsigned int getTXFrequency() const; unsigned int getPower() const; float getLatitude() const; float getLongitude() const; @@ -73,8 +73,9 @@ public: bool getModemPTTInvert() const; unsigned int getModemTXDelay() const; unsigned int getModemDMRDelay() const; - int getModemTxOffset() const; - int getModemRxOffset() const; + int getModemTXOffset() const; + int getModemRXOffset() const; + int getModemTXDCOffset() const; float getModemRXLevel() const; float getModemCWIdTXLevel() const; float getModemDStarTXLevel() const; @@ -239,8 +240,9 @@ private: bool m_modemPTTInvert; unsigned int m_modemTXDelay; unsigned int m_modemDMRDelay; - int m_modemTxOffset; - int m_modemRxOffset; + int m_modemTXOffset; + int m_modemRXOffset; + int m_modemTXDCOffset; float m_modemRXLevel; float m_modemCWIdTXLevel; float m_modemDStarTXLevel; diff --git a/MMDVM.ini b/MMDVM.ini index fb50f95..9180aeb 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -48,6 +48,7 @@ TXOffset=0 DMRDelay=0 RXLevel=50 TXLevel=50 +TXDCOffset=0 # CWIdTXLevel=50 # D-StarTXLevel=50 # DMRTXLevel=50 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 475d062..b388579 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -828,10 +828,11 @@ bool CMMDVMHost::createModem() bool debug = m_conf.getModemDebug(); unsigned int colorCode = m_conf.getDMRColorCode(); 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(); + unsigned int rxFrequency = m_conf.getRXFrequency(); + unsigned int txFrequency = m_conf.getTXFrequency(); + int rxOffset = m_conf.getModemRXOffset(); + int txOffset = m_conf.getModemTXOffset(); + int txDCOffset = m_conf.getModemTXDCOffset(); LogInfo("Modem Parameters"); LogInfo(" Port: %s", port.c_str()); @@ -841,6 +842,7 @@ bool CMMDVMHost::createModem() LogInfo(" TX Delay: %ums", txDelay); LogInfo(" RX Offset: %dHz", rxOffset); LogInfo(" TX Offset: %dHz", txOffset); + LogInfo(" TX DC Offset: %d", txDCOffset); LogInfo(" DMR Delay: %u (%.1fms)", dmrDelay, float(dmrDelay) * 0.0416666F); LogInfo(" RX Level: %.1f%%", rxLevel); LogInfo(" CW Id TX Level: %.1f%%", cwIdTXLevel); @@ -854,7 +856,7 @@ bool CMMDVMHost::createModem() 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, rxOffset, txFrequency, txOffset); + m_modem->setRFParams(rxFrequency, rxOffset, txFrequency, txOffset, txDCOffset); m_modem->setDMRParams(colorCode); m_modem->setYSFParams(lowDeviation); @@ -926,8 +928,8 @@ bool CMMDVMHost::createDMRNetwork() m_dmrNetwork->setOptions(options); } - unsigned int rxFrequency = m_conf.getRxFrequency(); - unsigned int txFrequency = m_conf.getTxFrequency(); + unsigned int rxFrequency = m_conf.getRXFrequency(); + unsigned int txFrequency = m_conf.getTXFrequency(); unsigned int power = m_conf.getPower(); unsigned int colorCode = m_conf.getDMRColorCode(); float latitude = m_conf.getLatitude(); diff --git a/Modem.cpp b/Modem.cpp index 6881a2a..1797071 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -107,6 +107,7 @@ m_dstarEnabled(false), m_dmrEnabled(false), m_ysfEnabled(false), m_p25Enabled(false), +m_txDCOffset(0), m_serial(port, SERIAL_115200, true), m_buffer(NULL), m_length(0U), @@ -145,10 +146,11 @@ CModem::~CModem() delete[] m_buffer; } -void CModem::setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int txFrequency, int txOffset) +void CModem::setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int txFrequency, int txOffset, int txDCOffset) { m_rxFrequency = rxFrequency + rxOffset; m_txFrequency = txFrequency + txOffset; + m_txDCOffset = txDCOffset; } void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled) @@ -990,10 +992,12 @@ bool CModem::setConfig() buffer[14U] = (unsigned char)(m_ysfTXLevel * 2.55F + 0.5F); buffer[15U] = (unsigned char)(m_p25TXLevel * 2.55F + 0.5F); - // CUtils::dump(1U, "Written", buffer, 16U); + buffer[16U] = (unsigned char)(m_txDCOffset + 128); - int ret = m_serial.write(buffer, 16U); - if (ret != 16) + // CUtils::dump(1U, "Written", buffer, 17U); + + int ret = m_serial.write(buffer, 17U); + if (ret != 17) return false; unsigned int count = 0U; diff --git a/Modem.h b/Modem.h index bcebcff..cb271f2 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, int rxOffset, unsigned int txFrequency, int txOffset); + void setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int txFrequency, int txOffset, int txDCOffset); 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); @@ -111,6 +111,7 @@ private: bool m_dmrEnabled; bool m_ysfEnabled; bool m_p25Enabled; + int m_txDCOffset; CSerialController m_serial; unsigned char* m_buffer; unsigned int m_length;