From f1f69bb4ee32d1361b859d54f3db9d32e2252877 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 9 Aug 2016 07:08:37 +0100 Subject: [PATCH] Add independent mode output levels. --- Conf.cpp | 28 +++++++++++++++++++++++----- Conf.h | 8 ++++++-- MMDVM.ini | 3 +++ MMDVMHost.cpp | 35 ++++++++++++++++++++--------------- Modem.cpp | 30 ++++++++++++++++++++++-------- Modem.h | 7 +++++-- 6 files changed, 79 insertions(+), 32 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index ef5cd77..43f11e8 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -76,8 +76,10 @@ m_modemTXInvert(false), m_modemPTTInvert(false), m_modemTXDelay(100U), m_modemDMRDelay(0U), -m_modemRXLevel(100U), -m_modemTXLevel(100U), +m_modemRXLevel(50U), +m_modemDStarTXLevel(50U), +m_modemDMRTXLevel(50U), +m_modemYSFTXLevel(50U), m_modemOscOffset(0), m_modemRSSIMultiplier(0), m_modemRSSIOffset(0), @@ -278,7 +280,13 @@ bool CConf::read() else if (::strcmp(key, "RXLevel") == 0) m_modemRXLevel = (unsigned int)::atoi(value); else if (::strcmp(key, "TXLevel") == 0) - m_modemTXLevel = (unsigned int)::atoi(value); + m_modemDStarTXLevel = m_modemDMRTXLevel = m_modemYSFTXLevel = (unsigned int)::atoi(value); + else if (::strcmp(key, "D-StarTXLevel") == 0) + m_modemDStarTXLevel = (unsigned int)::atoi(value); + else if (::strcmp(key, "DMRTXLevel") == 0) + m_modemDMRTXLevel = (unsigned int)::atoi(value); + else if (::strcmp(key, "YSFTXLevel") == 0) + m_modemYSFTXLevel = (unsigned int)::atoi(value); else if (::strcmp(key, "OscOffset") == 0) m_modemOscOffset = ::atoi(value); else if (::strcmp(key, "RSSIMultiplier") == 0) @@ -657,9 +665,19 @@ unsigned int CConf::getModemRXLevel() const return m_modemRXLevel; } -unsigned int CConf::getModemTXLevel() const +unsigned int CConf::getModemDStarTXLevel() const { - return m_modemTXLevel; + return m_modemDStarTXLevel; +} + +unsigned int CConf::getModemDMRTXLevel() const +{ + return m_modemDMRTXLevel; +} + +unsigned int CConf::getModemYSFTXLevel() const +{ + return m_modemYSFTXLevel; } int CConf::getModemOscOffset() const diff --git a/Conf.h b/Conf.h index 5d1d209..14f411d 100644 --- a/Conf.h +++ b/Conf.h @@ -68,7 +68,9 @@ public: unsigned int getModemTXDelay() const; unsigned int getModemDMRDelay() const; unsigned int getModemRXLevel() const; - unsigned int getModemTXLevel() const; + unsigned int getModemDStarTXLevel() const; + unsigned int getModemDMRTXLevel() const; + unsigned int getModemYSFTXLevel() const; int getModemOscOffset() const; int getModemRSSIMultiplier() const; int getModemRSSIOffset() const; @@ -192,7 +194,9 @@ private: unsigned int m_modemTXDelay; unsigned int m_modemDMRDelay; unsigned int m_modemRXLevel; - unsigned int m_modemTXLevel; + unsigned int m_modemDStarTXLevel; + unsigned int m_modemDMRTXLevel; + unsigned int m_modemYSFTXLevel; int m_modemOscOffset; int m_modemRSSIMultiplier; int m_modemRSSIOffset; diff --git a/MMDVM.ini b/MMDVM.ini index 59c7c55..d4b937f 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -40,6 +40,9 @@ TXDelay=100 DMRDelay=0 RXLevel=50 TXLevel=50 +# D-StarTXLevel=50 +# DMRTXLevel=50 +# YSFTXLevel=50 OscOffset=0 RSSIMultiplier=1 RSSIOffset=10 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 13c91d8..5aa3b4d 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -655,19 +655,21 @@ int CMMDVMHost::run() bool CMMDVMHost::createModem() { - std::string port = m_conf.getModemPort(); - bool rxInvert = m_conf.getModemRXInvert(); - bool txInvert = m_conf.getModemTXInvert(); - bool pttInvert = m_conf.getModemPTTInvert(); - unsigned int txDelay = m_conf.getModemTXDelay(); - unsigned int dmrDelay = m_conf.getModemDMRDelay(); - unsigned int rxLevel = m_conf.getModemRXLevel(); - unsigned int txLevel = m_conf.getModemTXLevel(); - bool debug = m_conf.getModemDebug(); - unsigned int colorCode = m_conf.getDMRColorCode(); - unsigned int rxFrequency = m_conf.getRxFrequency(); - unsigned int txFrequency = m_conf.getTxFrequency(); - int oscOffset = m_conf.getModemOscOffset(); + std::string port = m_conf.getModemPort(); + bool rxInvert = m_conf.getModemRXInvert(); + bool txInvert = m_conf.getModemTXInvert(); + bool pttInvert = m_conf.getModemPTTInvert(); + unsigned int txDelay = m_conf.getModemTXDelay(); + unsigned int dmrDelay = m_conf.getModemDMRDelay(); + unsigned int rxLevel = m_conf.getModemRXLevel(); + unsigned int dstarTXLevel = m_conf.getModemDStarTXLevel(); + unsigned int dmrTXLevel = m_conf.getModemDMRTXLevel(); + unsigned int ysfTXLevel = m_conf.getModemYSFTXLevel(); + bool debug = m_conf.getModemDebug(); + unsigned int colorCode = m_conf.getDMRColorCode(); + unsigned int rxFrequency = m_conf.getRxFrequency(); + unsigned int txFrequency = m_conf.getTxFrequency(); + int oscOffset = m_conf.getModemOscOffset(); LogInfo("Modem Parameters"); LogInfo(" Port: %s", port.c_str()); @@ -677,14 +679,17 @@ bool CMMDVMHost::createModem() LogInfo(" TX Delay: %ums", txDelay); LogInfo(" DMR Delay: %u (%.1fms)", dmrDelay, float(dmrDelay) * 0.0416666F); LogInfo(" RX Level: %u%%", rxLevel); - LogInfo(" TX Level: %u%%", txLevel); + LogInfo(" D-Star TX Level: %u%%", dstarTXLevel); + LogInfo(" DMR TX Level: %u%%", dmrTXLevel); + LogInfo(" YSF TX Level: %u%%", ysfTXLevel); LogInfo(" RX Frequency: %uHz", rxFrequency); LogInfo(" TX Frequency: %uHz", txFrequency); LogInfo(" Osc. Offset: %dppm", oscOffset); - m_modem = new CModem(port, m_duplex, rxInvert, txInvert, pttInvert, txDelay, rxLevel, txLevel, dmrDelay, oscOffset, debug); + m_modem = new CModem(port, m_duplex, rxInvert, txInvert, pttInvert, txDelay, dmrDelay, oscOffset, debug); m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled); + m_modem->setLevels(rxLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel); m_modem->setRFParams(rxFrequency, txFrequency); m_modem->setDMRParams(colorCode); diff --git a/Modem.cpp b/Modem.cpp index e3bda87..cff03e4 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -76,7 +76,7 @@ const unsigned int MAX_RESPONSES = 30U; const unsigned int BUFFER_LENGTH = 500U; -CModem::CModem(const std::string& port, bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int rxLevel, unsigned int txLevel, unsigned int dmrDelay, int oscOffset, bool debug) : +CModem::CModem(const std::string& port, bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int dmrDelay, int oscOffset, bool debug) : m_port(port), m_colorCode(0U), m_duplex(duplex), @@ -85,8 +85,10 @@ m_txInvert(txInvert), m_pttInvert(pttInvert), m_txDelay(txDelay), m_dmrDelay(dmrDelay), -m_rxLevel(rxLevel), -m_txLevel(txLevel), +m_rxLevel(0U), +m_dstarTXLevel(0U), +m_dmrTXLevel(0U), +m_ysfTXLevel(0U), m_oscOffset(oscOffset), m_debug(debug), m_rxFrequency(0U), @@ -140,6 +142,14 @@ void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled) m_ysfEnabled = ysfEnabled; } +void CModem::setLevels(unsigned int rxLevel, unsigned int dstarTXLevel, unsigned int dmrTXLevel, unsigned int ysfTXLevel) +{ + m_rxLevel = rxLevel; + m_dstarTXLevel = dstarTXLevel; + m_dmrTXLevel = dmrTXLevel; + m_ysfTXLevel = ysfTXLevel; +} + void CModem::setDMRParams(unsigned int colorCode) { assert(colorCode < 16U); @@ -763,7 +773,7 @@ bool CModem::setConfig() buffer[0U] = MMDVM_FRAME_START; - buffer[1U] = 12U; + buffer[1U] = 15U; buffer[2U] = MMDVM_SET_CONFIG; @@ -788,7 +798,7 @@ bool CModem::setConfig() buffer[6U] = MODE_IDLE; buffer[7U] = (m_rxLevel * 255U) / 100U; - buffer[8U] = (m_txLevel * 255U) / 100U; + buffer[8U] = (m_dstarTXLevel * 255U) / 100U; // For backwards compatibility buffer[9U] = m_colorCode; @@ -796,10 +806,14 @@ bool CModem::setConfig() buffer[11U] = (unsigned char)(m_oscOffset + 128); - // CUtils::dump(1U, "Written", buffer, 12U); + buffer[12U] = (m_dstarTXLevel * 255U) / 100U; + buffer[13U] = (m_dmrTXLevel * 255U) / 100U; + buffer[14U] = (m_ysfTXLevel * 255U) / 100U; - int ret = m_serial.write(buffer, 12U); - if (ret != 12) + // CUtils::dump(1U, "Written", buffer, 15U); + + int ret = m_serial.write(buffer, 15U); + if (ret != 15) return false; unsigned int count = 0U; diff --git a/Modem.h b/Modem.h index df34620..1438b01 100644 --- a/Modem.h +++ b/Modem.h @@ -33,11 +33,12 @@ enum RESP_TYPE_MMDVM { class CModem { public: - CModem(const std::string& port, bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int rxLevel, unsigned int txLevel, unsigned int dmrDelay, int oscOffset, bool debug = false); + CModem(const std::string& port, bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int dmrDelay, int oscOffset, bool debug = false); ~CModem(); void setRFParams(unsigned int rxFrequency, unsigned int txFrequency); void setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled); + void setLevels(unsigned int rxLevel, unsigned int dstarTXLevel, unsigned int dmrTXLevel, unsigned int ysfTXLevel); void setDMRParams(unsigned int colorCode); bool open(); @@ -84,7 +85,9 @@ private: unsigned int m_txDelay; unsigned int m_dmrDelay; unsigned int m_rxLevel; - unsigned int m_txLevel; + unsigned int m_dstarTXLevel; + unsigned int m_dmrTXLevel; + unsigned int m_ysfTXLevel; int m_oscOffset; bool m_debug; unsigned int m_rxFrequency;