diff --git a/M17RX.cpp b/M17RX.cpp index e3a6696..3954eb9 100644 --- a/M17RX.cpp +++ b/M17RX.cpp @@ -54,13 +54,9 @@ void CM17RX::databit(bool bit) { switch (m_state) { case M17RXS_LINK_SETUP: - processLinkSetup(bit); - break; case M17RXS_STREAM: - processStream(bit); - break; case M17RXS_PACKET: - processPacket(bit); + processData(bit); break; default: processNone(bit); @@ -114,7 +110,7 @@ void CM17RX::processNone(bool bit) } } -void CM17RX::processLinkSetup(bool bit) +void CM17RX::processData(bool bit) { m_bitBuffer <<= 1; if (bit) @@ -126,30 +122,16 @@ void CM17RX::processLinkSetup(bool bit) if (m_bufferPtr > M17_FRAME_LENGTH_BITS) reset(); - // Send a data frame to the host if the required number of bits have been received - if (m_bufferPtr == M17_FRAME_LENGTH_BITS) { - m_lostCount--; - - // Write data to host - m_outBuffer[0U] = 0x01U; - writeRSSIHeader(m_outBuffer); - - // Start the next frame, but we don't know the type - reset(); + // Only search for a link setup sync in the right place +-2 symbols + if (m_bufferPtr >= (M17_SYNC_LENGTH_BITS - 2U) && m_bufferPtr <= (M17_SYNC_LENGTH_BITS + 2U)) { + // Fuzzy matching of the stream sync bit sequence + if (countBits16(m_bitBuffer ^ M17_LINK_SETUP_SYNC_BITS) <= MAX_SYNC_BIT_RUN_ERRS) { + DEBUG2("M17RX: found link setup sync, pos", m_bufferPtr - M17_SYNC_LENGTH_BITS); + m_lostCount = MAX_SYNC_FRAMES; + m_bufferPtr = M17_SYNC_LENGTH_BITS; + m_state = M17RXS_LINK_SETUP; + } } -} - -void CM17RX::processStream(bool bit) -{ - m_bitBuffer <<= 1; - if (bit) - m_bitBuffer |= 0x01U; - - WRITE_BIT1(m_buffer, m_bufferPtr, bit); - - m_bufferPtr++; - if (m_bufferPtr > M17_FRAME_LENGTH_BITS) - reset(); // Only search for a stream sync in the right place +-2 symbols if (m_bufferPtr >= (M17_SYNC_LENGTH_BITS - 2U) && m_bufferPtr <= (M17_SYNC_LENGTH_BITS + 2U)) { @@ -158,15 +140,27 @@ void CM17RX::processStream(bool bit) DEBUG2("M17RX: found stream sync, pos", m_bufferPtr - M17_SYNC_LENGTH_BITS); m_lostCount = MAX_SYNC_FRAMES; m_bufferPtr = M17_SYNC_LENGTH_BITS; + m_state = M17RXS_STREAM; } } - // Send a stream frame to the host if the required number of bits have been received + // Only search for a packet sync in the right place +-2 symbols + if (m_bufferPtr >= (M17_SYNC_LENGTH_BITS - 2U) && m_bufferPtr <= (M17_SYNC_LENGTH_BITS + 2U)) { + // Fuzzy matching of the stream sync bit sequence + if (countBits16(m_bitBuffer ^ M17_STREAM_SYNC_BITS) <= MAX_SYNC_BIT_RUN_ERRS) { + DEBUG2("M17RX: found packet sync, pos", m_bufferPtr - M17_SYNC_LENGTH_BITS); + m_lostCount = MAX_SYNC_FRAMES; + m_bufferPtr = M17_SYNC_LENGTH_BITS; + m_state = M17RXS_PACKET; + } + } + + // Send a frame to the host if the required number of bits have been received if (m_bufferPtr == M17_FRAME_LENGTH_BITS) { - // We've not seen a stream sync for too long, signal RXLOST and change to RX_NONE + // We've not seen a sync for too long, signal RXLOST and change to RX_NONE m_lostCount--; if (m_lostCount == 0U) { - DEBUG1("M17RX: stream sync timed out, lost lock"); + DEBUG1("M17RX: sync timed out, lost lock"); io.setDecode(false); serial.writeM17Lost(); reset(); @@ -174,7 +168,18 @@ void CM17RX::processStream(bool bit) // Write data to host m_outBuffer[0U] = 0x00U; // Stream data m_outBuffer[0U] |= m_lostCount == (MAX_SYNC_FRAMES - 1U) ? 0x01U : 0x00U; - writeRSSIData(m_outBuffer); + + switch (m_state) { + case M17RXS_LINK_SETUP: + writeRSSILinkSetup(m_outBuffer); + break; + case M17RXS_STREAM: + writeRSSIStream(m_outBuffer); + break; + default: + writeRSSIPacket(m_outBuffer); + break; + } // Start the next frame ::memset(m_outBuffer, 0x00U, M17_FRAME_LENGTH_BYTES + 3U); @@ -183,51 +188,7 @@ void CM17RX::processStream(bool bit) } } -void CM17RX::processPacket(bool bit) -{ - m_bitBuffer <<= 1; - if (bit) - m_bitBuffer |= 0x01U; - - WRITE_BIT1(m_buffer, m_bufferPtr, bit); - - m_bufferPtr++; - if (m_bufferPtr > M17_FRAME_LENGTH_BITS) - reset(); - - // Only search for a packet sync in the right place +-2 symbols - if (m_bufferPtr >= (M17_SYNC_LENGTH_BITS - 2U) && m_bufferPtr <= (M17_SYNC_LENGTH_BITS + 2U)) { - // Fuzzy matching of the packet sync bit sequence - if (countBits16(m_bitBuffer ^ M17_PACKET_SYNC_BITS) <= MAX_SYNC_BIT_RUN_ERRS) { - DEBUG2("M17RX: found packet sync, pos", m_bufferPtr - M17_SYNC_LENGTH_BITS); - m_lostCount = MAX_SYNC_FRAMES; - m_bufferPtr = M17_SYNC_LENGTH_BITS; - } - } - - // Send a packet frame to the host if the required number of bits have been received - if (m_bufferPtr == M17_FRAME_LENGTH_BITS) { - // We've not seen a packet sync for too long, signal RXLOST and change to RX_NONE - m_lostCount--; - if (m_lostCount == 0U) { - DEBUG1("M17RX: packet sync timed out, lost lock"); - io.setDecode(false); - serial.writeM17Lost(); - reset(); - } else { - // Write data to host - m_outBuffer[0U] = 0x02U; // Packet data - m_outBuffer[0U] |= m_lostCount == (MAX_SYNC_FRAMES - 1U) ? 0x01U : 0x00U; - writeRSSIData(m_outBuffer); - - // Start the next frame - ::memset(m_outBuffer, 0x00U, M17_FRAME_LENGTH_BYTES + 3U); - m_bufferPtr = 0U; - } - } -} - -void CM17RX::writeRSSIHeader(uint8_t* data) +void CM17RX::writeRSSILinkSetup(uint8_t* data) { #if defined(SEND_RSSI_DATA) uint16_t rssi = io.readRSSI(); @@ -235,13 +196,13 @@ void CM17RX::writeRSSIHeader(uint8_t* data) data[49U] = (rssi >> 8) & 0xFFU; data[50U] = (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); #endif } -void CM17RX::writeRSSIData(uint8_t* data) +void CM17RX::writeRSSIStream(uint8_t* data) { #if defined(SEND_RSSI_DATA) uint16_t rssi = io.readRSSI(); @@ -249,8 +210,23 @@ void CM17RX::writeRSSIData(uint8_t* data) data[49U] = (rssi >> 8) & 0xFFU; data[50U] = (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); #endif } + +void CM17RX::writeRSSIPacket(uint8_t* data) +{ +#if defined(SEND_RSSI_DATA) + uint16_t rssi = io.readRSSI(); + + data[49U] = (rssi >> 8) & 0xFFU; + data[50U] = (rssi >> 0) & 0xFFU; + + serial.writeM17Packet(data, M17_FRAME_LENGTH_BYTES + 3U); +#else + serial.writeM17Packet(data, M17_FRAME_LENGTH_BYTES + 1U); +#endif +} + diff --git a/M17RX.h b/M17RX.h index 0cf3626..3329b81 100644 --- a/M17RX.h +++ b/M17RX.h @@ -46,11 +46,11 @@ private: uint16_t m_lostCount; void processNone(bool bit); - void processLinkSetup(bool bit); - void processStream(bool bit); - void processPacket(bool bit); - void writeRSSIHeader(uint8_t* data); - void writeRSSIData(uint8_t* data); + void processData(bool bit); + 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 edc3287..d230247 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013,2015,2016,2018,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2013,2015,2016,2018,2020,2021 by Jonathan Naylor G4KLX * Copyright (C) 2016 by Colin Durbridge G4EML * Copyright (C) 2016,2017,2018,2019 by Andy Uribe CA6JAU * Copyright (C) 2019 by Florian Wolters DF2ET @@ -60,9 +60,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; @@ -865,7 +866,7 @@ void CSerialPort::process() } break; - case MMDVM_M17_HEADER: + case MMDVM_M17_LINK_SETUP: if (m_m17Enable) { if (m_modemState == STATE_IDLE || m_modemState == STATE_M17) err = m17TX.writeData(m_buffer + 3U, m_len - 3U); @@ -874,12 +875,12 @@ void CSerialPort::process() 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(m_buffer + 3U, m_len - 3U); @@ -888,7 +889,21 @@ void CSerialPort::process() 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(m_buffer + 3U, m_len - 3U); + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_M17); + } else { + DEBUG2("Received invalid M17 packet data", err); sendNAK(err); } break; @@ -1248,7 +1263,7 @@ void CSerialPort::writeNXDNLost() writeInt(1U, reply, 3); } -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; @@ -1260,7 +1275,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++) @@ -1271,7 +1286,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; @@ -1283,7 +1298,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 38d2139..f397c52 100644 --- a/SerialPort.h +++ b/SerialPort.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2018,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2018,2020,2021 by Jonathan Naylor G4KLX * Copyright (C) 2018 by Andy Uribe CA6JAU * * This program is free software; you can redistribute it and/or modify @@ -52,8 +52,9 @@ public: void writeNXDNData(const uint8_t* data, uint8_t length); void writeNXDNLost(); - 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(); #if defined(SEND_RSSI_DATA) diff --git a/version.h b/version.h index d48ac89..3d379e6 100644 --- a/version.h +++ b/version.h @@ -25,7 +25,7 @@ #define VER_MAJOR "1" #define VER_MINOR "5" #define VER_REV "2" -#define VERSION_DATE "20210102" +#define VERSION_DATE "20210314" #if defined(ZUMSPOT_ADF7021) #define BOARD_INFO "ZUMspot"