From 0579b4387a7bf77d92db09c3e26158fe5ed53cf5 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 28 Jul 2020 14:22:26 +0100 Subject: [PATCH] Add the noise squelch configuration items. --- Conf.cpp | 26 ++++++++++++++++++ Conf.h | 6 +++++ MMDVM.ini | 4 +++ MMDVMHost.cpp | 70 ++++++++++++++++++++++++++++--------------------- Modem.h | 2 +- NullModem.h | 2 +- SerialModem.cpp | 24 ++++++++++++----- SerialModem.h | 5 +++- Version.h | 2 +- 9 files changed, 101 insertions(+), 40 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index 1ea5cc5..150b258 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -208,6 +208,9 @@ m_fmKerchunkTime(0U), m_fmHangTime(7U), m_fmAccessMode(1U), m_fmCOSInvert(false), +m_fmNoiseSquelch(false), +m_fmSquelchHighThreshold(30U), +m_fmSquelchLowThreshold(20U), m_fmRFAudioBoost(1U), m_fmMaxDevLevel(90.0F), m_fmExtAudioBoost(1U), @@ -808,6 +811,14 @@ bool CConf::read() m_fmAccessMode = ::atoi(value); else if (::strcmp(key, "COSInvert") == 0) m_fmCOSInvert = ::atoi(value) == 1; + else if (::strcmp(key, "NoiseSquelch") == 0) + m_fmNoiseSquelch = ::atoi(value) == 1; + else if (::strcmp(key, "SquelchThreshold") == 0) + m_fmSquelchHighThreshold = m_fmSquelchLowThreshold = (unsigned int)::atoi(value); + else if (::strcmp(key, "SquelchHighThreshold") == 0) + m_fmSquelchHighThreshold = (unsigned int)::atoi(value); + else if (::strcmp(key, "SquelchLowThreshold") == 0) + m_fmSquelchLowThreshold = (unsigned int)::atoi(value); else if (::strcmp(key, "RFAudioBoost") == 0) m_fmRFAudioBoost = (unsigned int)::atoi(value); else if (::strcmp(key, "MaxDevLevel") == 0) @@ -1757,6 +1768,21 @@ bool CConf::getFMCOSInvert() const return m_fmCOSInvert; } +bool CConf::getFMNoiseSquelch() const +{ + return m_fmNoiseSquelch; +} + +unsigned int CConf::getFMSquelchHighThreshold() const +{ + return m_fmSquelchHighThreshold; +} + +unsigned int CConf::getFMSquelchLowThreshold() const +{ + return m_fmSquelchLowThreshold; +} + unsigned int CConf::getFMRFAudioBoost() const { return m_fmRFAudioBoost; diff --git a/Conf.h b/Conf.h index 01ef9f5..f80ad87 100644 --- a/Conf.h +++ b/Conf.h @@ -211,6 +211,9 @@ public: unsigned int getFMHangTime() const; unsigned int getFMAccessMode() const; bool getFMCOSInvert() const; + bool getFMNoiseSquelch() const; + unsigned int getFMSquelchHighThreshold() const; + unsigned int getFMSquelchLowThreshold() const; unsigned int getFMRFAudioBoost() const; float getFMMaxDevLevel() const; unsigned int getFMExtAudioBoost() const; @@ -502,6 +505,9 @@ private: unsigned int m_fmHangTime; unsigned int m_fmAccessMode; bool m_fmCOSInvert; + bool m_fmNoiseSquelch; + unsigned int m_fmSquelchHighThreshold; + unsigned int m_fmSquelchLowThreshold; unsigned int m_fmRFAudioBoost; float m_fmMaxDevLevel; unsigned int m_fmExtAudioBoost; diff --git a/MMDVM.ini b/MMDVM.ini index 6c35909..2b5d8f1 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -174,6 +174,10 @@ KerchunkTime=0 HangTime=7 AccessMode=1 COSInvert=0 +NoiseSquelch=0 +SquelchThreshold=30 +# SquelchHighThreshold=30 +# SquelchLowThreshold=20 RFAudioBoost=1 MaxDevLevel=90 ExtAudioBoost=1 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 7066ad1..2c712a6 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -1356,35 +1356,38 @@ bool CMMDVMHost::createModem() m_modem->setAX25Params(rxTwist, ax25TXDelay, ax25SlotTime, ax25PPersist); if (m_fmEnabled) { - std::string callsign = m_conf.getFMCallsign(); - unsigned int callsignSpeed = m_conf.getFMCallsignSpeed(); - unsigned int callsignFrequency = m_conf.getFMCallsignFrequency(); - unsigned int callsignTime = m_conf.getFMCallsignTime(); - unsigned int callsignHoldoff = m_conf.getFMCallsignHoldoff(); - float callsignHighLevel = m_conf.getFMCallsignHighLevel(); - float callsignLowLevel = m_conf.getFMCallsignLowLevel(); - bool callsignAtStart = m_conf.getFMCallsignAtStart(); - bool callsignAtEnd = m_conf.getFMCallsignAtEnd(); - bool callsignAtLatch = m_conf.getFMCallsignAtLatch(); - std::string rfAck = m_conf.getFMRFAck(); - unsigned int ackSpeed = m_conf.getFMAckSpeed(); - unsigned int ackFrequency = m_conf.getFMAckFrequency(); - unsigned int ackMinTime = m_conf.getFMAckMinTime(); - unsigned int ackDelay = m_conf.getFMAckDelay(); - float ackLevel = m_conf.getFMAckLevel(); - unsigned int timeout = m_conf.getFMTimeout(); - float timeoutLevel = m_conf.getFMTimeoutLevel(); - float ctcssFrequency = m_conf.getFMCTCSSFrequency(); - unsigned int ctcssHighThreshold = m_conf.getFMCTCSSHighThreshold(); - unsigned int ctcssLowThreshold = m_conf.getFMCTCSSLowThreshold(); - float ctcssLevel = m_conf.getFMCTCSSLevel(); - unsigned int kerchunkTime = m_conf.getFMKerchunkTime(); - unsigned int hangTime = m_conf.getFMHangTime(); - unsigned int accessMode = m_conf.getFMAccessMode(); - bool cosInvert = m_conf.getFMCOSInvert(); - unsigned int rfAudioBoost = m_conf.getFMRFAudioBoost(); - float maxDevLevel = m_conf.getFMMaxDevLevel(); - unsigned int modeHangTime = m_conf.getFMModeHang(); + std::string callsign = m_conf.getFMCallsign(); + unsigned int callsignSpeed = m_conf.getFMCallsignSpeed(); + unsigned int callsignFrequency = m_conf.getFMCallsignFrequency(); + unsigned int callsignTime = m_conf.getFMCallsignTime(); + unsigned int callsignHoldoff = m_conf.getFMCallsignHoldoff(); + float callsignHighLevel = m_conf.getFMCallsignHighLevel(); + float callsignLowLevel = m_conf.getFMCallsignLowLevel(); + bool callsignAtStart = m_conf.getFMCallsignAtStart(); + bool callsignAtEnd = m_conf.getFMCallsignAtEnd(); + bool callsignAtLatch = m_conf.getFMCallsignAtLatch(); + std::string rfAck = m_conf.getFMRFAck(); + unsigned int ackSpeed = m_conf.getFMAckSpeed(); + unsigned int ackFrequency = m_conf.getFMAckFrequency(); + unsigned int ackMinTime = m_conf.getFMAckMinTime(); + unsigned int ackDelay = m_conf.getFMAckDelay(); + float ackLevel = m_conf.getFMAckLevel(); + unsigned int timeout = m_conf.getFMTimeout(); + float timeoutLevel = m_conf.getFMTimeoutLevel(); + float ctcssFrequency = m_conf.getFMCTCSSFrequency(); + unsigned int ctcssHighThreshold = m_conf.getFMCTCSSHighThreshold(); + unsigned int ctcssLowThreshold = m_conf.getFMCTCSSLowThreshold(); + float ctcssLevel = m_conf.getFMCTCSSLevel(); + unsigned int kerchunkTime = m_conf.getFMKerchunkTime(); + unsigned int hangTime = m_conf.getFMHangTime(); + unsigned int accessMode = m_conf.getFMAccessMode(); + bool cosInvert = m_conf.getFMCOSInvert(); + bool noiseSquelch = m_conf.getFMNoiseSquelch(); + unsigned int squelchHighThreshold = m_conf.getFMSquelchHighThreshold(); + unsigned int squelchLowThreshold = m_conf.getFMSquelchLowThreshold(); + unsigned int rfAudioBoost = m_conf.getFMRFAudioBoost(); + float maxDevLevel = m_conf.getFMMaxDevLevel(); + unsigned int modeHangTime = m_conf.getFMModeHang(); LogInfo("FM Parameters"); LogInfo(" Callsign: %s", callsign.c_str()); @@ -1413,13 +1416,20 @@ bool CMMDVMHost::createModem() LogInfo(" Hang Time: %us", hangTime); LogInfo(" Access Mode: %u", accessMode); LogInfo(" COS Invert: %s", cosInvert ? "yes" : "no"); + + LogInfo(" Noise Squelch: %s", noiseSquelch ? "yes" : "no"); + if (noiseSquelch) { + LogInfo(" Squelch High Threshold: %u", squelchHighThreshold); + LogInfo(" Squelch Low Threshold: %u", squelchLowThreshold); + } + LogInfo(" RF Audio Boost: x%u", rfAudioBoost); LogInfo(" Max. Deviation Level: %.1f%%", maxDevLevel); LogInfo(" Mode Hang: %us", modeHangTime); m_modem->setFMCallsignParams(callsign, callsignSpeed, callsignFrequency, callsignTime, callsignHoldoff, callsignHighLevel, callsignLowLevel, callsignAtStart, callsignAtEnd, callsignAtLatch); m_modem->setFMAckParams(rfAck, ackSpeed, ackFrequency, ackMinTime, ackDelay, ackLevel); - m_modem->setFMMiscParams(timeout, timeoutLevel, ctcssFrequency, ctcssHighThreshold, ctcssLowThreshold, ctcssLevel, kerchunkTime, hangTime, accessMode, cosInvert, rfAudioBoost, maxDevLevel); + m_modem->setFMMiscParams(timeout, timeoutLevel, ctcssFrequency, ctcssHighThreshold, ctcssLowThreshold, ctcssLevel, kerchunkTime, hangTime, accessMode, cosInvert, noiseSquelch, squelchHighThreshold, squelchLowThreshold, rfAudioBoost, maxDevLevel); if (m_conf.getFMNetworkEnabled()) { std::string extAck = m_conf.getFMExtAck(); diff --git a/Modem.h b/Modem.h index 45a5860..bbddc4d 100644 --- a/Modem.h +++ b/Modem.h @@ -40,7 +40,7 @@ public: virtual void setFMCallsignParams(const std::string& callsign, unsigned int callsignSpeed, unsigned int callsignFrequency, unsigned int callsignTime, unsigned int callsignHoldoff, float callsignHighLevel, float callsignLowLevel, bool callsignAtStart, bool callsignAtEnd, bool callsignAtLatch) = 0; virtual void setFMAckParams(const std::string& rfAck, unsigned int ackSpeed, unsigned int ackFrequency, unsigned int ackMinTime, unsigned int ackDelay, float ackLevel) = 0; - virtual void setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, unsigned int ctcssHighThreshold, unsigned int ctcssLowThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime, unsigned int accessMode, bool cosInvert, unsigned int rfAudioBoost, float maxDevLevel) = 0; + virtual void setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, unsigned int ctcssHighThreshold, unsigned int ctcssLowThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime, unsigned int accessMode, bool cosInvert, bool noiseSquelch, unsigned int squelchHighThreshold, unsigned int squelchLowThreshold, unsigned int rfAudioBoost, float maxDevLevel) = 0; virtual void setFMExtParams(const std::string& ack, unsigned int audioBoost) = 0; virtual bool open() = 0; diff --git a/NullModem.h b/NullModem.h index 41930c8..a99424a 100644 --- a/NullModem.h +++ b/NullModem.h @@ -42,7 +42,7 @@ public: virtual void setFMCallsignParams(const std::string& callsign, unsigned int callsignSpeed, unsigned int callsignFrequency, unsigned int callsignTime, unsigned int callsignHoldoff, float callsignHighLevel, float callsignLowLevel, bool callsignAtStart, bool callsignAtEnd, bool callsignAtLatch) {}; virtual void setFMAckParams(const std::string& rfAck, unsigned int ackSpeed, unsigned int ackFrequency, unsigned int ackMinTime, unsigned int ackDelay, float ackLevel) {}; - virtual void setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, unsigned int ctcssHighThreshold, unsigned int ctcssLowThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime, unsigned int accessMode, bool cosInvert, unsigned int rfAudioBoost, float maxDevLevel) {}; + virtual void setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, unsigned int ctcssHighThreshold, unsigned int ctcssLowThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime, unsigned int accessMode, bool cosInvert, bool noiseSquelch, unsigned int squelchHighThreshold, unsigned int squelchLowThreshold, unsigned int rfAudioBoost, float maxDevLevel) {}; virtual void setFMExtParams(const std::string& ack, unsigned int audioBoost) {}; virtual bool open(); diff --git a/SerialModem.cpp b/SerialModem.cpp index 0282850..cc0416d 100644 --- a/SerialModem.cpp +++ b/SerialModem.cpp @@ -224,6 +224,9 @@ m_fmKerchunkTime(0U), m_fmHangTime(5U), m_fmAccessMode(1U), m_fmCOSInvert(false), +m_fmNoiseSquelch(false), +m_fmSquelchHighThreshold(30U), +m_fmSquelchLowThreshold(20U), m_fmRFAudioBoost(1U), m_fmExtAudioBoost(1U), m_fmMaxDevLevel(90.0F), @@ -2186,7 +2189,7 @@ void CSerialModem::setFMAckParams(const std::string& rfAck, unsigned int ackSpee m_fmAckLevel = ackLevel; } -void CSerialModem::setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, unsigned int ctcssHighThreshold, unsigned int ctcssLowThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime, unsigned int accessMode, bool cosInvert, unsigned int rfAudioBoost, float maxDevLevel) +void CSerialModem::setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, unsigned int ctcssHighThreshold, unsigned int ctcssLowThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime, unsigned int accessMode, bool cosInvert, bool noiseSquelch, unsigned int squelchHighThreshold, unsigned int squelchLowThreshold, unsigned int rfAudioBoost, float maxDevLevel) { m_fmTimeout = timeout; m_fmTimeoutLevel = timeoutLevel; @@ -2203,6 +2206,10 @@ void CSerialModem::setFMMiscParams(unsigned int timeout, float timeoutLevel, flo m_fmAccessMode = accessMode; m_fmCOSInvert = cosInvert; + m_fmNoiseSquelch = noiseSquelch; + m_fmSquelchHighThreshold = squelchHighThreshold; + m_fmSquelchLowThreshold = squelchLowThreshold; + m_fmRFAudioBoost = rfAudioBoost; m_fmMaxDevLevel = maxDevLevel; } @@ -2334,7 +2341,7 @@ bool CSerialModem::setFMMiscParams() unsigned char buffer[20U]; buffer[0U] = MMDVM_FRAME_START; - buffer[1U] = 15U; + buffer[1U] = 17U; buffer[2U] = MMDVM_FM_PARAMS3; buffer[3U] = m_fmTimeout / 5U; @@ -2348,7 +2355,9 @@ bool CSerialModem::setFMMiscParams() buffer[9U] = m_fmKerchunkTime; buffer[10U] = m_fmHangTime; - buffer[11U] = m_fmAccessMode; + buffer[11U] = m_fmAccessMode & 0x0FU; + if (m_fmNoiseSquelch) + buffer[11U] |= 0x40U; if (m_fmCOSInvert) buffer[11U] |= 0x80U; @@ -2358,10 +2367,13 @@ bool CSerialModem::setFMMiscParams() buffer[14U] = (unsigned char)(m_rxLevel * 2.55F + 0.5F); - // CUtils::dump(1U, "Written", buffer, 15U); + buffer[15U] = m_fmSquelchHighThreshold; + buffer[16U] = m_fmSquelchLowThreshold; - int ret = m_serial->write(buffer, 15U); - if (ret != 15) + // 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/SerialModem.h b/SerialModem.h index 365e311..223774b 100644 --- a/SerialModem.h +++ b/SerialModem.h @@ -60,7 +60,7 @@ public: virtual void setFMCallsignParams(const std::string& callsign, unsigned int callsignSpeed, unsigned int callsignFrequency, unsigned int callsignTime, unsigned int callsignHoldoff, float callsignHighLevel, float callsignLowLevel, bool callsignAtStart, bool callsignAtEnd, bool callsignAtLatch); virtual void setFMAckParams(const std::string& rfAck, unsigned int ackSpeed, unsigned int ackFrequency, unsigned int ackMinTime, unsigned int ackDelay, float ackLevel); - virtual void setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, unsigned int ctcssHighThreshold, unsigned int ctcssLowThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime, unsigned int accessMode, bool cosInvert, unsigned int rfAudioBoost, float maxDevLevel); + virtual void setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, unsigned int ctcssHighThreshold, unsigned int ctcssLowThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime, unsigned int accessMode, bool cosInvert, bool noiseSquelch, unsigned int squelchHighThreshold, unsigned int squelchLowThreshold, unsigned int rfAudioBoost, float maxDevLevel); virtual void setFMExtParams(const std::string& ack, unsigned int audioBoost); virtual bool open(); @@ -247,6 +247,9 @@ private: unsigned int m_fmHangTime; unsigned int m_fmAccessMode; bool m_fmCOSInvert; + bool m_fmNoiseSquelch; + unsigned int m_fmSquelchHighThreshold; + unsigned int m_fmSquelchLowThreshold; unsigned int m_fmRFAudioBoost; unsigned int m_fmExtAudioBoost; float m_fmMaxDevLevel; diff --git a/Version.h b/Version.h index d5b3f85..342e069 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20200727"; +const char* VERSION = "20200728"; #endif