diff --git a/FM.cpp b/FM.cpp index f4174fc..a165fab 100644 --- a/FM.cpp +++ b/FM.cpp @@ -411,6 +411,8 @@ void CFM::kerchunkRFState(bool validSignal) m_ackMinTimer.stop(); m_callsignTimer.stop(); m_statusTimer.stop(); + + serial.writeFMEOT(); } } @@ -423,6 +425,8 @@ void CFM::relayingRFState(bool validSignal) m_ackMinTimer.stop(); m_timeoutTimer.stop(); m_timeoutTone.start(); + + serial.writeFMEOT(); } } else { DEBUG1("State to RELAYING_WAIT_RF"); @@ -574,10 +578,13 @@ void CFM::hangState(bool validRFSignal, bool validExtSignal) m_hangTimer.stop(); m_statusTimer.stop(); + serial.writeFMEOT(); + if (m_callsignAtEnd) sendCallsign(); m_callsignTimer.stop(); + } } diff --git a/SerialPort.cpp b/SerialPort.cpp index d0bf4fc..a320ed1 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -71,6 +71,7 @@ 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_FM_STATUS = 0x66U; +const uint8_t MMDVM_FM_EOT = 0x67U; const uint8_t MMDVM_ACK = 0x70U; const uint8_t MMDVM_NAK = 0x7FU; @@ -1286,7 +1287,24 @@ void CSerialPort::writeFMStatus(uint8_t status) reply[2U] = MMDVM_FM_STATUS; reply[3U] = status; - writeInt(1U, reply, 4); + writeInt(1U, reply, 4Us); +} + +void CSerialPort::writeFMEOT() +{ + if (m_modemState != STATE_FM && m_modemState != STATE_IDLE) + return; + + if (!m_fmEnable) + return; + + uint8_t reply[10U]; + + reply[0U] = MMDVM_FRAME_START; + reply[1U] = 4U; + reply[2U] = MMDVM_FM_EOT; + + writeInt(1U, reply, 3U); } void CSerialPort::writeCalData(const uint8_t* data, uint8_t length) diff --git a/SerialPort.h b/SerialPort.h index 2b5eb9a..a75731a 100644 --- a/SerialPort.h +++ b/SerialPort.h @@ -52,6 +52,7 @@ public: void writeFMData(const uint8_t* data, uint8_t length); void writeFMStatus(uint8_t status); + void writeFMEOT(); void writeCalData(const uint8_t* data, uint8_t length); void writeRSSIData(const uint8_t* data, uint8_t length);