From 96364dc18936ab3b597fddbc5a527159604cc10d Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Thu, 7 May 2020 22:01:48 +0100 Subject: [PATCH] Add the external audio parameters. --- FM.cpp | 14 +++++++++++++- FM.h | 6 ++++-- SerialPort.cpp | 30 ++++++++++++++++++++++++++++++ SerialPort.h | 1 + 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/FM.cpp b/FM.cpp index 70b6b6a..ba952b7 100644 --- a/FM.cpp +++ b/FM.cpp @@ -23,6 +23,7 @@ CFM::CFM() : m_callsign(), m_rfAck(), +m_extAck(), m_ctcssRX(), m_ctcssTX(), m_timeoutTone(), @@ -46,7 +47,9 @@ m_blanking(), m_useCOS(true), m_cosInvert(false), m_rfAudioBoost(1U), -m_downsampler(128)//Size might need adjustement +m_extAudioBoost(1U), +m_downsampler(128U), //Size might need adjustement +m_extEnabled(false) { } @@ -195,6 +198,15 @@ uint8_t CFM::setMisc(uint16_t timeout, uint8_t timeoutLevel, uint8_t ctcssFreque return m_ctcssTX.setParams(ctcssFrequency, ctcssLevel); } +uint8_t CFM::setExt(const char* ack, uint8_t audioBoost, uint8_t speed, uint16_t frequency, uint8_t level) +{ + m_extEnabled = true; + + m_extAudioBoost = q15_t(audioBoost); + + return m_extAck.setParams(ack, speed, frequency, level, level); +} + void CFM::stateMachine(bool validSignal) { switch (m_state) { diff --git a/FM.h b/FM.h index e559293..cac2231 100644 --- a/FM.h +++ b/FM.h @@ -41,8 +41,6 @@ enum FM_STATE { }; - - class CFM { public: CFM(); @@ -56,6 +54,7 @@ public: uint8_t setCallsign(const char* callsign, uint8_t speed, uint16_t frequency, uint8_t time, uint8_t holdoff, uint8_t highLevel, uint8_t lowLevel, bool callsignAtStart, bool callsignAtEnd, bool callsignAtLatch); uint8_t setAck(const char* rfAck, uint8_t speed, uint16_t frequency, uint8_t minTime, uint16_t delay, uint8_t level); uint8_t setMisc(uint16_t timeout, uint8_t timeoutLevel, uint8_t ctcssFrequency, uint8_t ctcssThreshold, uint8_t ctcssLevel, uint8_t kerchunkTime, uint8_t hangTime, bool useCOS, bool cosInvert, uint8_t rfAudioBoost, uint8_t maxDev, uint8_t rxLevel); + uint8_t setExt(const char* ack, uint8_t audioBoost, uint8_t speed, uint16_t frequency, uint8_t level); uint8_t getSpace() const; @@ -64,6 +63,7 @@ public: private: CFMKeyer m_callsign; CFMKeyer m_rfAck; + CFMKeyer m_extAck; CFMCTCSSRX m_ctcssRX; CFMCTCSSTX m_ctcssTX; CFMTimeout m_timeoutTone; @@ -87,7 +87,9 @@ private: bool m_useCOS; bool m_cosInvert; q15_t m_rfAudioBoost; + q15_t m_extAudioBoost; CFMDownsampler m_downsampler; + bool m_extEnabled; void stateMachine(bool validSignal); void listeningState(bool validSignal); diff --git a/SerialPort.cpp b/SerialPort.cpp index f7bde93..6cb8b37 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -68,6 +68,7 @@ const uint8_t MMDVM_POCSAG_DATA = 0x50U; const uint8_t MMDVM_FM_PARAMS1 = 0x60U; const uint8_t MMDVM_FM_PARAMS2 = 0x61U; const uint8_t MMDVM_FM_PARAMS3 = 0x62U; +const uint8_t MMDVM_FM_PARAMS4 = 0x63U; const uint8_t MMDVM_FM_DATA = 0x65U; const uint8_t MMDVM_ACK = 0x70U; @@ -438,6 +439,25 @@ uint8_t CSerialPort::setFMParams3(const uint8_t* data, uint8_t length) return fm.setMisc(timeout, timeoutLevel, ctcssFrequency, ctcssThreshold, ctcssLevel, kerchunkTime, hangTime, useCOS, cosInvert, rfAudioBoost, maxDev, rxLevel); } +uint8_t CSerialPort::setFMParams4(const uint8_t* data, uint8_t length) +{ + if (length < 4U) + return 4U; + + uint8_t audioBoost = data[0U]; + uint8_t speed = data[1U]; + uint16_t frequency = data[2U] * 10U; + uint8_t level = data[3U]; + + char ack[50U]; + uint8_t n = 0U; + for (uint8_t i = 4U; i < length; i++, n++) + ack[n] = data[i]; + ack[n] = '\0'; + + return fm.setExt(ack, audioBoost, speed, frequency, level); +} + uint8_t CSerialPort::setMode(const uint8_t* data, uint8_t length) { if (length < 1U) @@ -666,6 +686,16 @@ void CSerialPort::process() } break; + case MMDVM_FM_PARAMS4: + err = setFMParams4(m_buffer + 3U, m_len - 3U); + if (err == 0U) { + sendACK(); + } else { + DEBUG2("Received invalid FM params 4", err); + sendNAK(err); + } + break; + case MMDVM_CAL_DATA: if (m_modemState == STATE_DSTARCAL) err = calDStarTX.write(m_buffer + 3U, m_len - 3U); diff --git a/SerialPort.h b/SerialPort.h index 0e69752..004c626 100644 --- a/SerialPort.h +++ b/SerialPort.h @@ -78,6 +78,7 @@ private: uint8_t setFMParams1(const uint8_t* data, uint8_t length); uint8_t setFMParams2(const uint8_t* data, uint8_t length); uint8_t setFMParams3(const uint8_t* data, uint8_t length); + uint8_t setFMParams4(const uint8_t* data, uint8_t length); // Hardware versions void beginInt(uint8_t n, int speed);