From c359d874b5b79f52818cadedb4d3af0b98db255a Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Sat, 18 Apr 2020 14:59:19 +0100 Subject: [PATCH] Regularise the FM configuration. --- MMDVMHost.cpp | 106 +++++++++++++++++++------------------- Modem.cpp | 140 +++++++++++++++++++++++++++++++++++++++----------- Modem.h | 31 +++++++++-- 3 files changed, 192 insertions(+), 85 deletions(-) diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 708fa97..751d25f 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -606,59 +606,6 @@ int CMMDVMHost::run() pocsagTimer.start(); } - 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 callsignLevel = m_conf.getFMCallsignLevel(); - bool callsignAtStart = m_conf.getFMCallsignAtStart(); - bool callsignAtEnd = m_conf.getFMCallsignAtEnd(); - std::string rfAck = m_conf.getFMRFAck(); - std::string netAck = m_conf.getFMNetAck(); - 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(); - float ctcssThreshold = m_conf.getFMCTCSSThreshold(); - float ctcssLevel = m_conf.getFMCTCSSLevel(); - unsigned int kerchunkTime = m_conf.getFMKerchunkTime(); - unsigned int hangTime = m_conf.getFMHangTime(); - - LogInfo("FM RF Parameters"); - LogInfo(" Callsign: %s", callsign.c_str()); - LogInfo(" Callsign Speed: %uWPM", callsignSpeed); - LogInfo(" Callsign Frequency: %uHz", callsignFrequency); - LogInfo(" Callsign Time: %umins", callsignTime); - LogInfo(" Callsign Holdoff: 1/%u", callsignHoldoff); - LogInfo(" Callsign Level: %.1f%%", callsignLevel); - LogInfo(" Callsign At Start: %s", callsignAtStart ? "yes" : "no"); - LogInfo(" Callsign At End: %s", callsignAtEnd ? "yes" : "no"); - LogInfo(" RF Ack: %s", rfAck.c_str()); - // LogInfo(" Net Ack: %s", netAck.c_str()); - LogInfo(" Ack Speed: %uWPM", ackSpeed); - LogInfo(" Ack Frequency: %uHz", ackFrequency); - LogInfo(" Ack Min Time: %us", ackMinTime); - LogInfo(" Ack Delay: %ums", ackDelay); - LogInfo(" Ack Level: %.1f%%", ackLevel); - LogInfo(" Timeout: %us", timeout); - LogInfo(" Timeout Level: %.1f%%", timeoutLevel); - LogInfo(" CTCSS Frequency: %.1fHz", ctcssFrequency); - LogInfo(" CTCSS Threshold: %.1f%%", ctcssThreshold); - LogInfo(" CTCSS Level: %.1f%%", ctcssLevel); - LogInfo(" Kerchunk Time: %us", kerchunkTime); - LogInfo(" Hang Time: %us", hangTime); - - m_modem->setFMCallsignParams(callsign, callsignSpeed, callsignFrequency, callsignTime, callsignHoldoff, callsignLevel, callsignAtStart, callsignAtEnd); - m_modem->setFMAckParams(rfAck, ackSpeed, ackFrequency, ackMinTime, ackDelay, ackLevel); - m_modem->setFMMiscParams(timeout, timeoutLevel, ctcssFrequency, ctcssThreshold, ctcssLevel, kerchunkTime, hangTime); - } - bool remoteControlEnabled = m_conf.getRemoteControlEnabled(); if (remoteControlEnabled) { unsigned int port = m_conf.getRemoteControlPort(); @@ -1252,6 +1199,59 @@ bool CMMDVMHost::createModem() LogInfo(" FM RX Level: %.1f%%", fmRXLevel); LogInfo(" TX Frequency: %uHz (%uHz)", txFrequency, txFrequency + txOffset); + 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 callsignLevel = m_conf.getFMCallsignLevel(); + bool callsignAtStart = m_conf.getFMCallsignAtStart(); + bool callsignAtEnd = m_conf.getFMCallsignAtEnd(); + std::string rfAck = m_conf.getFMRFAck(); + std::string netAck = m_conf.getFMNetAck(); + 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(); + float ctcssThreshold = m_conf.getFMCTCSSThreshold(); + float ctcssLevel = m_conf.getFMCTCSSLevel(); + unsigned int kerchunkTime = m_conf.getFMKerchunkTime(); + unsigned int hangTime = m_conf.getFMHangTime(); + + LogInfo("FM Parameters"); + LogInfo(" Callsign: %s", callsign.c_str()); + LogInfo(" Callsign Speed: %uWPM", callsignSpeed); + LogInfo(" Callsign Frequency: %uHz", callsignFrequency); + LogInfo(" Callsign Time: %umins", callsignTime); + LogInfo(" Callsign Holdoff: 1/%u", callsignHoldoff); + LogInfo(" Callsign Level: %.1f%%", callsignLevel); + LogInfo(" Callsign At Start: %s", callsignAtStart ? "yes" : "no"); + LogInfo(" Callsign At End: %s", callsignAtEnd ? "yes" : "no"); + LogInfo(" RF Ack: %s", rfAck.c_str()); + // LogInfo(" Net Ack: %s", netAck.c_str()); + LogInfo(" Ack Speed: %uWPM", ackSpeed); + LogInfo(" Ack Frequency: %uHz", ackFrequency); + LogInfo(" Ack Min Time: %us", ackMinTime); + LogInfo(" Ack Delay: %ums", ackDelay); + LogInfo(" Ack Level: %.1f%%", ackLevel); + LogInfo(" Timeout: %us", timeout); + LogInfo(" Timeout Level: %.1f%%", timeoutLevel); + LogInfo(" CTCSS Frequency: %.1fHz", ctcssFrequency); + LogInfo(" CTCSS Threshold: %.1f%%", ctcssThreshold); + LogInfo(" CTCSS Level: %.1f%%", ctcssLevel); + LogInfo(" Kerchunk Time: %us", kerchunkTime); + LogInfo(" Hang Time: %us", hangTime); + + m_modem->setFMCallsignParams(callsign, callsignSpeed, callsignFrequency, callsignTime, callsignHoldoff, callsignLevel, callsignAtStart, callsignAtEnd); + m_modem->setFMAckParams(rfAck, ackSpeed, ackFrequency, ackMinTime, ackDelay, ackLevel); + m_modem->setFMMiscParams(timeout, timeoutLevel, ctcssFrequency, ctcssThreshold, ctcssLevel, kerchunkTime, hangTime); + } + m_modem = CModem::createModem(port, m_duplex, rxInvert, txInvert, pttInvert, txDelay, dmrDelay, trace, debug); m_modem->setSerialParams(protocol,address); m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_pocsagEnabled, m_fmEnabled); diff --git a/Modem.cpp b/Modem.cpp index db47265..850b2e6 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -169,7 +169,28 @@ m_cd(false), m_lockout(false), m_error(false), m_mode(MODE_IDLE), -m_hwType(HWT_UNKNOWN) +m_hwType(HWT_UNKNOWN), +m_fmCallsign(), +m_fmCallsignSpeed(20U), +m_fmCallsignFrequency(1000U), +m_fmCallsignTime(600U), +m_fmCallsignHoldoff(0U), +m_fmCallsignLevel(40.0F), +m_fmCallsignAtStart(true), +m_fmCallsignAtEnd(true), +m_fmRfAck("K"), +m_fmAckSpeed(20U), +m_fmAckFrequency(1750U), +m_fmAckMinTime(4U), +m_fmAckDelay(1000U), +m_fmAckLevel(80.0F), +m_fmTimeout(120U), +m_fmTimeoutLevel(80.0F), +m_fmCtcssFrequency(88.4F), +m_fmCtcssThreshold(10.0F), +m_fmCtcssLevel(10.0F), +m_fmKerchunkTime(0U), +m_fmHangTime(5U) { m_buffer = new unsigned char[BUFFER_LENGTH]; @@ -280,6 +301,32 @@ bool CModem::open() return false; } + if (m_fmEnabled) { + ret = setFMCallsignParams(); + if (!ret) { + m_serial->close(); + delete m_serial; + m_serial = NULL; + return false; + } + + ret = setFMAckParams(); + if (!ret) { + m_serial->close(); + delete m_serial; + m_serial = NULL; + return false; + } + + ret = setFMMiscParams(); + if (!ret) { + m_serial->close(); + delete m_serial; + m_serial = NULL; + return false; + } + } + m_statusTimer.start(); m_error = false; @@ -1834,32 +1881,67 @@ bool CModem::writeDMRShortLC(const unsigned char* lc) return m_serial->write(buffer, 12U) == 12; } -bool CModem::setFMCallsignParams(const std::string& callsign, unsigned int callsignSpeed, unsigned int callsignFrequency, unsigned int callsignTime, unsigned int callsignHoldoff, float callsignLevel, bool callsignAtStart, bool callsignAtEnd) +void CModem::setFMCallsignParams(const std::string& callsign, unsigned int callsignSpeed, unsigned int callsignFrequency, unsigned int callsignTime, unsigned int callsignHoldoff, float callsignLevel, bool callsignAtStart, bool callsignAtEnd) +{ + m_fmCallsign = callsign; + m_fmCallsignSpeed = callsignSpeed; + m_fmCallsignFrequency = callsignFrequency; + m_fmCallsignTime = callsignTime; + m_fmCallsignHoldoff = callsignHoldoff; + m_fmCallsignLevel = callsignLevel; + m_fmCallsignAtStart = callsignAtStart; + m_fmCallsignAtEnd = callsignAtEnd; +} + +void CModem::setFMAckParams(const std::string& rfAck, unsigned int ackSpeed, unsigned int ackFrequency, unsigned int ackMinTime, unsigned int ackDelay, float ackLevel) +{ + m_fmRfAck = rfAck; + m_fmAckSpeed = ackSpeed; + m_fmAckFrequency = ackFrequency; + m_fmAckMinTime = ackMinTime; + m_fmAckDelay = ackDelay; + m_fmAckLevel = ackLevel; +} + +void CModem::setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, float ctcssThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime) +{ + m_fmTimeout = timeout; + m_fmTimeoutLevel = timeoutLevel; + + m_fmCtcssFrequency = ctcssFrequency; + m_fmCtcssThreshold = ctcssThreshold; + m_fmCtcssLevel = ctcssLevel; + + m_fmKerchunkTime = kerchunkTime; + m_fmHangTime = hangTime; +} + +bool CModem::setFMCallsignParams() { assert(m_serial != NULL); unsigned char buffer[80U]; - unsigned char len = 9U + callsign.size(); + unsigned char len = 9U + m_fmCallsign.size(); buffer[0U] = MMDVM_FRAME_START; buffer[1U] = len; buffer[2U] = MMDVM_FM_PARAMS1; - buffer[3U] = callsignSpeed; - buffer[4U] = callsignFrequency / 10U; - buffer[5U] = callsignTime; - buffer[6U] = callsignHoldoff; + buffer[3U] = m_fmCallsignSpeed; + buffer[4U] = m_fmCallsignFrequency / 10U; + buffer[5U] = m_fmCallsignTime; + buffer[6U] = m_fmCallsignHoldoff; - buffer[7U] = (unsigned char)(callsignLevel * 2.55F + 0.5F); + buffer[7U] = (unsigned char)(m_fmCallsignLevel * 2.55F + 0.5F); buffer[8U] = 0x00U; - if (callsignAtStart) + if (m_fmCallsignAtStart) buffer[8U] |= 0x01U; - if (callsignAtEnd) + if (m_fmCallsignAtEnd) buffer[8U] |= 0x02U; - for (unsigned int i = 0U; i < callsign.size(); i++) - buffer[9U + i] = callsign.at(i); + for (unsigned int i = 0U; i < m_fmCallsign.size(); i++) + buffer[9U + i] = m_fmCallsign.at(i); // CUtils::dump(1U, "Written", buffer, len); @@ -1892,26 +1974,26 @@ bool CModem::setFMCallsignParams(const std::string& callsign, unsigned int calls return true; } -bool CModem::setFMAckParams(const std::string& rfAck, unsigned int ackSpeed, unsigned int ackFrequency, unsigned int ackMinTime, unsigned int ackDelay, float ackLevel) +bool CModem::setFMAckParams() { assert(m_serial != NULL); unsigned char buffer[80U]; - unsigned char len = 8U + rfAck.size(); + unsigned char len = 8U + m_fmRfAck.size(); buffer[0U] = MMDVM_FRAME_START; buffer[1U] = len; buffer[2U] = MMDVM_FM_PARAMS2; - buffer[3U] = ackSpeed; - buffer[4U] = ackFrequency / 10U; - buffer[5U] = ackMinTime; - buffer[6U] = ackDelay / 10U; + buffer[3U] = m_fmAckSpeed; + buffer[4U] = m_fmAckFrequency / 10U; + buffer[5U] = m_fmAckMinTime; + buffer[6U] = m_fmAckDelay / 10U; - buffer[7U] = (unsigned char)(ackLevel * 2.55F + 0.5F); + buffer[7U] = (unsigned char)(m_fmAckLevel * 2.55F + 0.5F); - for (unsigned int i = 0U; i < rfAck.size(); i++) - buffer[8U + i] = rfAck.at(i); + for (unsigned int i = 0U; i < m_fmRfAck.size(); i++) + buffer[8U + i] = m_fmRfAck.at(i); // CUtils::dump(1U, "Written", buffer, len); @@ -1944,7 +2026,7 @@ bool CModem::setFMAckParams(const std::string& rfAck, unsigned int ackSpeed, uns return true; } -bool CModem::setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, float ctcssThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime) +bool CModem::setFMMiscParams() { assert(m_serial != NULL); @@ -1954,15 +2036,15 @@ bool CModem::setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctc buffer[1U] = 10U; buffer[2U] = MMDVM_FM_PARAMS3; - buffer[3U] = timeout / 5U; - buffer[4U] = (unsigned char)(timeoutLevel * 2.55F + 0.5F); + buffer[3U] = m_fmTimeout / 5U; + buffer[4U] = (unsigned char)(m_fmTimeoutLevel * 2.55F + 0.5F); - buffer[5U] = (unsigned char)ctcssFrequency; - buffer[6U] = (unsigned char)(ctcssThreshold * 2.55F + 0.5F); - buffer[7U] = (unsigned char)(ctcssLevel * 2.55F + 0.5F); + buffer[5U] = (unsigned char)m_fmCtcssFrequency; + buffer[6U] = (unsigned char)(m_fmCtcssThreshold * 2.55F + 0.5F); + buffer[7U] = (unsigned char)(m_fmCtcssLevel * 2.55F + 0.5F); - buffer[8U] = kerchunkTime; - buffer[9U] = hangTime; + buffer[8U] = m_fmKerchunkTime; + buffer[9U] = m_fmHangTime; // CUtils::dump(1U, "Written", buffer, 10U); diff --git a/Modem.h b/Modem.h index 4a33116..fdca2e3 100644 --- a/Modem.h +++ b/Modem.h @@ -45,9 +45,9 @@ public: virtual void setYSFParams(bool loDev, unsigned int txHang); virtual void setTransparentDataParams(unsigned int sendFrameType); - virtual bool setFMCallsignParams(const std::string& callsign, unsigned int callsignSpeed, unsigned int callsignFrequency, unsigned int callsignTime, unsigned int callsignHoldoff, float callsignLevel, bool callsignAtStart, bool callsignAtEnd); - virtual bool setFMAckParams(const std::string& rfAck, unsigned int ackSpeed, unsigned int ackFrequency, unsigned int minTime, unsigned int ackDelay, float ackLevel); - virtual bool setFMMiscParams(unsigned int timeout, float timeoutLevel, float ctcssFrequency, float ctcssThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime); + virtual void setFMCallsignParams(const std::string& callsign, unsigned int callsignSpeed, unsigned int callsignFrequency, unsigned int callsignTime, unsigned int callsignHoldoff, float callsignLevel, bool callsignAtStart, bool callsignAtEnd); + 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, float ctcssThreshold, float ctcssLevel, unsigned int kerchunkTime, unsigned int hangTime); virtual bool open(); @@ -185,10 +185,35 @@ private: unsigned char m_mode; HW_TYPE m_hwType; + std::string m_fmCallsign; + unsigned int m_fmCallsignSpeed; + unsigned int m_fmCallsignFrequency; + unsigned int m_fmCallsignTime; + unsigned int m_fmCallsignHoldoff; + float m_fmCallsignLevel; + bool m_fmCallsignAtStart; + bool m_fmCallsignAtEnd; + std::string m_fmRfAck; + unsigned int m_fmAckSpeed; + unsigned int m_fmAckFrequency; + unsigned int m_fmAckMinTime; + unsigned int m_fmAckDelay; + float m_fmAckLevel; + unsigned int m_fmTimeout; + float m_fmTimeoutLevel; + float m_fmCtcssFrequency; + float m_fmCtcssThreshold; + float m_fmCtcssLevel; + unsigned int m_fmKerchunkTime; + unsigned int m_fmHangTime; + bool readVersion(); bool readStatus(); bool setConfig(); bool setFrequency(); + bool setFMCallsignParams(); + bool setFMAckParams(); + bool setFMMiscParams(); void printDebug();