From 34f6dfc5bbf8aa57fa6c932697f445d5ab2936ae Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Sun, 14 Mar 2021 18:24:30 +0000 Subject: [PATCH] Simplification of the M17 receiver. --- M17RX.cpp | 73 +++++++++++++++++++++++++++++++++----------------- M17RX.h | 5 ++-- SerialPort.cpp | 62 +++++++++++++++++++++++++++++++++--------- SerialPort.h | 7 ++--- 4 files changed, 105 insertions(+), 42 deletions(-) diff --git a/M17RX.cpp b/M17RX.cpp index bf4f56b..fa09084 100644 --- a/M17RX.cpp +++ b/M17RX.cpp @@ -174,9 +174,9 @@ void CM17RX::processData(q15_t sample) bool ret2 = correlateSync(M17_STREAM_SYNC_SYMBOLS, M17_STREAM_SYNC_SYMBOLS_VALUES, M17_STREAM_SYNC_BYTES, MAX_SYNC_SYMBOL_RUN_ERRS, MAX_SYNC_BIT_RUN_ERRS); bool ret3 = correlateSync(M17_PACKET_SYNC_SYMBOLS, M17_PACKET_SYNC_SYMBOLS_VALUES, M17_PACKET_SYNC_BYTES, MAX_SYNC_SYMBOL_RUN_ERRS, MAX_SYNC_BIT_RUN_ERRS); - if (ret1) m_nextState = M17RXS_LINK_SETUP; - if (ret2) m_nextState = M17RXS_STREAM; - if (ret3) m_nextState = M17RXS_PACKET; + if (ret1) m_state = M17RXS_LINK_SETUP; + if (ret2) m_state = M17RXS_STREAM; + if (ret3) m_state = M17RXS_PACKET; } } else { if (m_dataPtr >= m_minSyncPtr || m_dataPtr <= m_maxSyncPtr) { @@ -184,9 +184,9 @@ void CM17RX::processData(q15_t sample) bool ret2 = correlateSync(M17_STREAM_SYNC_SYMBOLS, M17_STREAM_SYNC_SYMBOLS_VALUES, M17_STREAM_SYNC_BYTES, MAX_SYNC_SYMBOL_RUN_ERRS, MAX_SYNC_BIT_RUN_ERRS); bool ret3 = correlateSync(M17_PACKET_SYNC_SYMBOLS, M17_PACKET_SYNC_SYMBOLS_VALUES, M17_PACKET_SYNC_BYTES, MAX_SYNC_SYMBOL_RUN_ERRS, MAX_SYNC_BIT_RUN_ERRS); - if (ret1) m_nextState = M17RXS_LINK_SETUP; - if (ret2) m_nextState = M17RXS_STREAM; - if (ret3) m_nextState = M17RXS_PACKET; + if (ret1) m_state = M17RXS_LINK_SETUP; + if (ret2) m_state = M17RXS_STREAM; + if (ret3) m_state = M17RXS_PACKET; } } @@ -204,11 +204,7 @@ void CM17RX::processData(q15_t sample) calculateLevels(m_startPtr, M17_FRAME_LENGTH_SYMBOLS); - M17RX_STATE state = m_nextState; - if (state == M17RXS_NONE) - state = m_state; - - switch (state) { + switch (m_state) { case M17RXS_LINK_SETUP: DEBUG4("M17RX: link setup sync found pos/centre/threshold", m_syncPtr, m_centreVal, m_thresholdVal); break; @@ -243,13 +239,19 @@ void CM17RX::processData(q15_t sample) frame[0U] = 0x00U; frame[0U] |= m_lostCount == (MAX_SYNC_FRAMES - 1U) ? 0x01U : 0x00U; - writeRSSIData(frame); - - m_maxCorr = 0; - - if (m_nextState != M17RXS_NONE) - m_state = m_nextState; + switch (m_state) { + case M17RXS_LINK_SETUP: + writeRSSILinkSetup(frame); + break; + case M17RXS_STREAM: + writeRSSIStream(frame); + break; + case M17RXS_PACKET: + writeRSSIPacket(frame); + break; + } + m_maxCorr = 0; m_nextState = M17RXS_NONE; } } @@ -429,7 +431,7 @@ void CM17RX::samplesToBits(uint16_t start, uint16_t count, uint8_t* buffer, uint } } -void CM17RX::writeRSSIHeader(uint8_t* data) +void CM17RX::writeRSSILinkSetup(uint8_t* data) { #if defined(SEND_RSSI_DATA) if (m_rssiCount > 0U) { @@ -438,19 +440,19 @@ void CM17RX::writeRSSIHeader(uint8_t* data) data[121U] = (rssi >> 8) & 0xFFU; data[122U] = (rssi >> 0) & 0xFFU; - serial.writeM17Header(data, M17_FRAME_LENGTH_BYTES + 3U); + serial.writeM17LinkSetup(data, M17_FRAME_LENGTH_BYTES + 3U); } else { - serial.writeM17Header(data, M17_FRAME_LENGTH_BYTES + 1U); + serial.writeM17LinkSetup(data, M17_FRAME_LENGTH_BYTES + 1U); } #else - serial.writeM17Header(data, M17_FRAME_LENGTH_BYTES + 1U); + serial.writeM17LinkSetup(data, M17_FRAME_LENGTH_BYTES + 1U); #endif m_rssiAccum = 0U; m_rssiCount = 0U; } -void CM17RX::writeRSSIData(uint8_t* data) +void CM17RX::writeRSSIStream(uint8_t* data) { #if defined(SEND_RSSI_DATA) if (m_rssiCount > 0U) { @@ -459,12 +461,33 @@ void CM17RX::writeRSSIData(uint8_t* data) data[121U] = (rssi >> 8) & 0xFFU; data[122U] = (rssi >> 0) & 0xFFU; - serial.writeM17Data(data, M17_FRAME_LENGTH_BYTES + 3U); + serial.writeM17Stream(data, M17_FRAME_LENGTH_BYTES + 3U); } else { - serial.writeM17Data(data, M17_FRAME_LENGTH_BYTES + 1U); + serial.writeM17Stream(data, M17_FRAME_LENGTH_BYTES + 1U); } #else - serial.writeM17Data(data, M17_FRAME_LENGTH_BYTES + 1U); + serial.writeM17Stream(data, M17_FRAME_LENGTH_BYTES + 1U); +#endif + + m_rssiAccum = 0U; + m_rssiCount = 0U; +} + +void CM17RX::writeRSSIPacket(uint8_t* data) +{ +#if defined(SEND_RSSI_DATA) + if (m_rssiCount > 0U) { + uint16_t rssi = m_rssiAccum / m_rssiCount; + + data[121U] = (rssi >> 8) & 0xFFU; + data[122U] = (rssi >> 0) & 0xFFU; + + serial.writeM17Packet(data, M17_FRAME_LENGTH_BYTES + 3U); + } else { + serial.writeM17Packet(data, M17_FRAME_LENGTH_BYTES + 1U); + } +#else + serial.writeM17Packet(data, M17_FRAME_LENGTH_BYTES + 1U); #endif m_rssiAccum = 0U; diff --git a/M17RX.h b/M17RX.h index c7637ea..7506551 100644 --- a/M17RX.h +++ b/M17RX.h @@ -68,8 +68,9 @@ private: bool correlateSync(uint8_t syncSymbols, const int8_t* syncSymbolValues, const uint8_t* syncBytes, uint8_t maxSymbolErrs, uint8_t maxBitErrs); void calculateLevels(uint16_t start, uint16_t count); void samplesToBits(uint16_t start, uint16_t count, uint8_t* buffer, uint16_t offset, q15_t centre, q15_t threshold); - void writeRSSIHeader(uint8_t* data); - void writeRSSIData(uint8_t* data); + void writeRSSILinkSetup(uint8_t* data); + void writeRSSIStream(uint8_t* data); + void writeRSSIPacket(uint8_t* data); }; #endif diff --git a/SerialPort.cpp b/SerialPort.cpp index 3d3586f..1a47d8e 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013,2015-2020 by Jonathan Naylor G4KLX + * Copyright (C) 2013,2015-2021 by Jonathan Naylor G4KLX * Copyright (C) 2016 by Colin Durbridge G4EML * * This program is free software; you can redistribute it and/or modify @@ -63,9 +63,10 @@ const uint8_t MMDVM_P25_LOST = 0x32U; const uint8_t MMDVM_NXDN_DATA = 0x40U; const uint8_t MMDVM_NXDN_LOST = 0x41U; -const uint8_t MMDVM_M17_HEADER = 0x45U; -const uint8_t MMDVM_M17_DATA = 0x46U; -const uint8_t MMDVM_M17_LOST = 0x47U; +const uint8_t MMDVM_M17_LINK_SETUP = 0x45U; +const uint8_t MMDVM_M17_STREAM = 0x46U; +const uint8_t MMDVM_M17_PACKET = 0x47U; +const uint8_t MMDVM_M17_LOST = 0x48U; const uint8_t MMDVM_POCSAG_DATA = 0x50U; @@ -1258,7 +1259,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l #endif #if defined(MODE_M17) - case MMDVM_M17_HEADER: + case MMDVM_M17_LINK_SETUP: if (m_m17Enable) { if (m_modemState == STATE_IDLE || m_modemState == STATE_M17) err = m17TX.writeData(buffer, length); @@ -1267,12 +1268,12 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l if (m_modemState == STATE_IDLE) setMode(STATE_M17); } else { - DEBUG2("Received invalid M17 header", err); + DEBUG2("Received invalid M17 link setup data", err); sendNAK(err); } break; - case MMDVM_M17_DATA: + case MMDVM_M17_STREAM: if (m_m17Enable) { if (m_modemState == STATE_IDLE || m_modemState == STATE_M17) err = m17TX.writeData(buffer, length); @@ -1281,7 +1282,21 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l if (m_modemState == STATE_IDLE) setMode(STATE_M17); } else { - DEBUG2("Received invalid M17 data", err); + DEBUG2("Received invalid M17 stream data", err); + sendNAK(err); + } + break; + + case MMDVM_M17_PACKET: + if (m_m17Enable) { + if (m_modemState == STATE_IDLE || m_modemState == STATE_M17) + err = m17TX.writeData(buffer, length); + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_M17); + } else { + DEBUG2("Received invalid M17 packet data", err); sendNAK(err); } break; @@ -1636,7 +1651,7 @@ void CSerialPort::writeNXDNLost() #endif #if defined(MODE_M17) -void CSerialPort::writeM17Header(const uint8_t* data, uint8_t length) +void CSerialPort::writeM17LinkSetup(const uint8_t* data, uint8_t length) { if (m_modemState != STATE_M17 && m_modemState != STATE_IDLE) return; @@ -1648,7 +1663,7 @@ void CSerialPort::writeM17Header(const uint8_t* data, uint8_t length) reply[0U] = MMDVM_FRAME_START; reply[1U] = 0U; - reply[2U] = MMDVM_M17_HEADER; + reply[2U] = MMDVM_M17_LINK_SETUP; uint8_t count = 3U; for (uint8_t i = 0U; i < length; i++, count++) @@ -1659,7 +1674,7 @@ void CSerialPort::writeM17Header(const uint8_t* data, uint8_t length) writeInt(1U, reply, count); } -void CSerialPort::writeM17Data(const uint8_t* data, uint8_t length) +void CSerialPort::writeM17Stream(const uint8_t* data, uint8_t length) { if (m_modemState != STATE_M17 && m_modemState != STATE_IDLE) return; @@ -1671,7 +1686,30 @@ void CSerialPort::writeM17Data(const uint8_t* data, uint8_t length) reply[0U] = MMDVM_FRAME_START; reply[1U] = 0U; - reply[2U] = MMDVM_M17_DATA; + reply[2U] = MMDVM_M17_STREAM; + + uint8_t count = 3U; + for (uint8_t i = 0U; i < length; i++, count++) + reply[count] = data[i]; + + reply[1U] = count; + + writeInt(1U, reply, count); +} + +void CSerialPort::writeM17Packet(const uint8_t* data, uint8_t length) +{ + if (m_modemState != STATE_M17 && m_modemState != STATE_IDLE) + return; + + if (!m_m17Enable) + return; + + uint8_t reply[130U]; + + reply[0U] = MMDVM_FRAME_START; + reply[1U] = 0U; + reply[2U] = MMDVM_M17_PACKET; uint8_t count = 3U; for (uint8_t i = 0U; i < length; i++, count++) diff --git a/SerialPort.h b/SerialPort.h index 3302a8d..c8f1733 100644 --- a/SerialPort.h +++ b/SerialPort.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017,2018,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,2018,2020,2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -65,8 +65,9 @@ public: #endif #if defined(MODE_M17) - void writeM17Header(const uint8_t* data, uint8_t length); - void writeM17Data(const uint8_t* data, uint8_t length); + void writeM17LinkSetup(const uint8_t* data, uint8_t length); + void writeM17Stream(const uint8_t* data, uint8_t length); + void writeM17Packet(const uint8_t* data, uint8_t length); void writeM17Lost(); #endif