diff --git a/CWIdTX.cpp b/CWIdTX.cpp index 641b374..aef04b0 100644 --- a/CWIdTX.cpp +++ b/CWIdTX.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2017 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2017,2020 by Jonathan Naylor G4KLX * Copyright (C) 2016 by Colin Durbridge G4EML * * This program is free software; you can redistribute it and/or modify @@ -125,7 +125,7 @@ void CCWIdTX::process() } } -uint8_t CCWIdTX::write(const uint8_t* data, uint8_t length) +uint8_t CCWIdTX::write(const uint8_t* data, uint16_t length) { ::memset(m_poBuffer, 0x00U, 1000U * sizeof(uint8_t)); diff --git a/CWIdTX.h b/CWIdTX.h index 70f67ea..a0480e0 100644 --- a/CWIdTX.h +++ b/CWIdTX.h @@ -1,6 +1,6 @@ /* * Copyright (C) 2009-2015 by Jonathan Naylor G4KLX - * Copyright (C) 2016 by Colin Durbridge G4EML + * Copyright (C) 2016,2020 by Colin Durbridge G4EML * * 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 @@ -28,7 +28,7 @@ public: void process(); - uint8_t write(const uint8_t* data, uint8_t length); + uint8_t write(const uint8_t* data, uint16_t length); void reset(); diff --git a/CalDMR.cpp b/CalDMR.cpp index 5a92fb0..949a8e9 100644 --- a/CalDMR.cpp +++ b/CalDMR.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2015 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2015,2020 by Jonathan Naylor G4KLX * Copyright (C) 2016 by Colin Durbridge G4EML * * This program is free software; you can redistribute it and/or modify @@ -208,7 +208,7 @@ void CCalDMR::dmrdmo1k() } } -uint8_t CCalDMR::write(const uint8_t* data, uint8_t length) +uint8_t CCalDMR::write(const uint8_t* data, uint16_t length) { if (length != 1U) return 4U; diff --git a/CalDMR.h b/CalDMR.h index 06ff6e6..9ba5f2c 100644 --- a/CalDMR.h +++ b/CalDMR.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2015 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2015,2020 by Jonathan Naylor G4KLX * Copyright (C) 2016 by Colin Durbridge G4EML * * This program is free software; you can redistribute it and/or modify @@ -41,7 +41,7 @@ public: void createData1k(uint8_t n); void createDataDMO1k(uint8_t n); - uint8_t write(const uint8_t* data, uint8_t length); + uint8_t write(const uint8_t* data, uint16_t length); private: bool m_transmit; diff --git a/CalDStarTX.cpp b/CalDStarTX.cpp index 1c1a3a4..9680cdc 100644 --- a/CalDStarTX.cpp +++ b/CalDStarTX.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2016 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2016,2020 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 @@ -162,7 +162,7 @@ void CCalDStarTX::process() m_count = (m_count + 1U) % (30U * 21U); } -uint8_t CCalDStarTX::write(const uint8_t* data, uint8_t length) +uint8_t CCalDStarTX::write(const uint8_t* data, uint16_t length) { if (length != 1U) return 4U; diff --git a/CalDStarTX.h b/CalDStarTX.h index c411317..86f6625 100644 --- a/CalDStarTX.h +++ b/CalDStarTX.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2020 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 @@ -26,7 +26,7 @@ class CCalDStarTX { public: CCalDStarTX(); - uint8_t write(const uint8_t* data, uint8_t length); + uint8_t write(const uint8_t* data, uint16_t length); void process(); diff --git a/CalFM.cpp b/CalFM.cpp index e89f0be..9841725 100644 --- a/CalFM.cpp +++ b/CalFM.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2015 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2015,2020 by Jonathan Naylor G4KLX * Copyright (C) 2016 by Colin Durbridge G4EML * Copyright (C) 2020 by Phil Taylor M0VSE * @@ -116,7 +116,7 @@ void CCalFM::process() } -uint8_t CCalFM::write(const uint8_t* data, uint8_t length) +uint8_t CCalFM::write(const uint8_t* data, uint16_t length) { if (length != 1U) return 4U; diff --git a/CalFM.h b/CalFM.h index 0dd8887..9665bcc 100644 --- a/CalFM.h +++ b/CalFM.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2015 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2015,2020 by Jonathan Naylor G4KLX * Copyright (C) 2016 by Colin Durbridge G4EML * Copyright (C) 2020 by Phil Taylor M0VSE * @@ -35,7 +35,7 @@ public: void fm25kcal(); void fm30kcal(); - uint8_t write(const uint8_t* data, uint8_t length); + uint8_t write(const uint8_t* data, uint16_t length); private: uint16_t m_frequency; diff --git a/CalNXDN.cpp b/CalNXDN.cpp index c223f59..3e46f3e 100644 --- a/CalNXDN.cpp +++ b/CalNXDN.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2018 by Andy Uribe CA6JAU + * Copyright (C) 2020 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 @@ -79,7 +80,7 @@ void CCalNXDN::process() } } -uint8_t CCalNXDN::write(const uint8_t* data, uint8_t length) +uint8_t CCalNXDN::write(const uint8_t* data, uint16_t length) { if (length != 1U) return 4U; diff --git a/CalNXDN.h b/CalNXDN.h index f0051ef..cad88a4 100644 --- a/CalNXDN.h +++ b/CalNXDN.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2018 by Andy Uribe CA6JAU + * Copyright (C) 2020 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 @@ -32,7 +33,7 @@ public: void process(); - uint8_t write(const uint8_t* data, uint8_t length); + uint8_t write(const uint8_t* data, uint16_t length); private: bool m_transmit; diff --git a/CalP25.cpp b/CalP25.cpp index b1b9b6d..6f3d4c0 100644 --- a/CalP25.cpp +++ b/CalP25.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2018 by Andy Uribe CA6JAU + * Copyright (C) 2020 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 @@ -82,7 +83,7 @@ void CCalP25::process() } } -uint8_t CCalP25::write(const uint8_t* data, uint8_t length) +uint8_t CCalP25::write(const uint8_t* data, uint16_t length) { if (length != 1U) return 4U; diff --git a/CalP25.h b/CalP25.h index 6374ed2..75bfe0d 100644 --- a/CalP25.h +++ b/CalP25.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2018 by Andy Uribe CA6JAU + * Copyright (C) 2020 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 @@ -34,7 +35,7 @@ public: void process(); - uint8_t write(const uint8_t* data, uint8_t length); + uint8_t write(const uint8_t* data, uint16_t length); private: bool m_transmit; diff --git a/CalPOCSAG.cpp b/CalPOCSAG.cpp index bf88a51..b66eb69 100644 --- a/CalPOCSAG.cpp +++ b/CalPOCSAG.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2019 by Florian Wolters DF2ET + * Copyright (C) 2020 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 @@ -38,7 +39,7 @@ void CCalPOCSAG::process() pocsagTX.writeByte(0xAAU); } -uint8_t CCalPOCSAG::write(const uint8_t* data, uint8_t length) +uint8_t CCalPOCSAG::write(const uint8_t* data, uint16_t length) { if (length != 1U) return 4U; diff --git a/CalPOCSAG.h b/CalPOCSAG.h index 291e360..d49eb81 100644 --- a/CalPOCSAG.h +++ b/CalPOCSAG.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2019 by Florian Wolters DF2ET + * Copyright (C) 2020 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 @@ -32,7 +33,7 @@ public: void process(); - uint8_t write(const uint8_t* data, uint8_t length); + uint8_t write(const uint8_t* data, uint16_t length); private: POCSAGCAL m_state; diff --git a/DMRDMOTX.cpp b/DMRDMOTX.cpp index 141ed38..ca3159c 100644 --- a/DMRDMOTX.cpp +++ b/DMRDMOTX.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2017 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2017,2020 by Jonathan Naylor G4KLX * Copyright (C) 2016 by Colin Durbridge G4EML * Copyright (C) 2017 by Andy Uribe CA6JAU * @@ -104,7 +104,7 @@ void CDMRDMOTX::process() } } -uint8_t CDMRDMOTX::writeData(const uint8_t* data, uint8_t length) +uint8_t CDMRDMOTX::writeData(const uint8_t* data, uint16_t length) { if (length != (DMR_FRAME_LENGTH_BYTES + 1U)) return 4U; diff --git a/DMRDMOTX.h b/DMRDMOTX.h index 62ef2c1..076212d 100644 --- a/DMRDMOTX.h +++ b/DMRDMOTX.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,2020 by Jonathan Naylor G4KLX * Copyright (C) 2016 by Colin Durbridge G4EML * * This program is free software; you can redistribute it and/or modify @@ -29,7 +29,7 @@ class CDMRDMOTX { public: CDMRDMOTX(); - uint8_t writeData(const uint8_t* data, uint8_t length); + uint8_t writeData(const uint8_t* data, uint16_t length); void process(); diff --git a/DMRTX.cpp b/DMRTX.cpp index 81437ec..21bfb44 100644 --- a/DMRTX.cpp +++ b/DMRTX.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2017 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2017,2020 by Jonathan Naylor G4KLX * Copyright (C) 2016 by Colin Durbridge G4EML * Copyright (C) 2017 by Andy Uribe CA6JAU * @@ -144,7 +144,7 @@ void CDMRTX::process() } } -uint8_t CDMRTX::writeData1(const uint8_t* data, uint8_t length) +uint8_t CDMRTX::writeData1(const uint8_t* data, uint16_t length) { if (length != (DMR_FRAME_LENGTH_BYTES + 1U)) return 4U; @@ -168,7 +168,7 @@ uint8_t CDMRTX::writeData1(const uint8_t* data, uint8_t length) return 0U; } -uint8_t CDMRTX::writeData2(const uint8_t* data, uint8_t length) +uint8_t CDMRTX::writeData2(const uint8_t* data, uint16_t length) { if (length != (DMR_FRAME_LENGTH_BYTES + 1U)) return 4U; @@ -192,7 +192,7 @@ uint8_t CDMRTX::writeData2(const uint8_t* data, uint8_t length) return 0U; } -uint8_t CDMRTX::writeShortLC(const uint8_t* data, uint8_t length) +uint8_t CDMRTX::writeShortLC(const uint8_t* data, uint16_t length) { if (length != 9U) return 4U; @@ -208,7 +208,7 @@ uint8_t CDMRTX::writeShortLC(const uint8_t* data, uint8_t length) return 0U; } -uint8_t CDMRTX::writeAbort(const uint8_t* data, uint8_t length) +uint8_t CDMRTX::writeAbort(const uint8_t* data, uint16_t length) { if (length != 1U) return 4U; diff --git a/DMRTX.h b/DMRTX.h index 1e2f617..ef7fdcb 100644 --- a/DMRTX.h +++ b/DMRTX.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,2020 by Jonathan Naylor G4KLX * Copyright (C) 2016 by Colin Durbridge G4EML * * This program is free software; you can redistribute it and/or modify @@ -38,11 +38,11 @@ class CDMRTX { public: CDMRTX(); - uint8_t writeData1(const uint8_t* data, uint8_t length); - uint8_t writeData2(const uint8_t* data, uint8_t length); + uint8_t writeData1(const uint8_t* data, uint16_t length); + uint8_t writeData2(const uint8_t* data, uint16_t length); - uint8_t writeShortLC(const uint8_t* data, uint8_t length); - uint8_t writeAbort(const uint8_t* data, uint8_t length); + uint8_t writeShortLC(const uint8_t* data, uint16_t length); + uint8_t writeAbort(const uint8_t* data, uint16_t length); void setStart(bool start); void setCal(bool start); diff --git a/DStarTX.cpp b/DStarTX.cpp index 63eb910..e1dc81c 100644 --- a/DStarTX.cpp +++ b/DStarTX.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2017 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2017,2020 by Jonathan Naylor G4KLX * Copyright (C) 2017 by Andy Uribe CA6JAU * * This program is free software; you can redistribute it and/or modify @@ -277,7 +277,7 @@ void CDStarTX::process() } } -uint8_t CDStarTX::writeHeader(const uint8_t* header, uint8_t length) +uint8_t CDStarTX::writeHeader(const uint8_t* header, uint16_t length) { if (length != DSTAR_HEADER_LENGTH_BYTES) return 4U; @@ -296,7 +296,7 @@ uint8_t CDStarTX::writeHeader(const uint8_t* header, uint8_t length) return 0U; } -uint8_t CDStarTX::writeData(const uint8_t* data, uint8_t length) +uint8_t CDStarTX::writeData(const uint8_t* data, uint16_t length) { if (length != DSTAR_DATA_LENGTH_BYTES) return 4U; diff --git a/DStarTX.h b/DStarTX.h index 24876d7..8470746 100644 --- a/DStarTX.h +++ b/DStarTX.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,2020 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 @@ -27,8 +27,8 @@ class CDStarTX { public: CDStarTX(); - uint8_t writeHeader(const uint8_t* header, uint8_t length); - uint8_t writeData(const uint8_t* data, uint8_t length); + uint8_t writeHeader(const uint8_t* header, uint16_t length); + uint8_t writeData(const uint8_t* data, uint16_t length); uint8_t writeEOT(); void process(); diff --git a/NXDNTX.cpp b/NXDNTX.cpp index b6ef616..9aba8ef 100644 --- a/NXDNTX.cpp +++ b/NXDNTX.cpp @@ -122,7 +122,7 @@ void CNXDNTX::process() } } -uint8_t CNXDNTX::writeData(const uint8_t* data, uint8_t length) +uint8_t CNXDNTX::writeData(const uint8_t* data, uint16_t length) { if (length != (NXDN_FRAME_LENGTH_BYTES + 1U)) return 4U; diff --git a/NXDNTX.h b/NXDNTX.h index bd65818..7c4f937 100644 --- a/NXDNTX.h +++ b/NXDNTX.h @@ -27,7 +27,7 @@ class CNXDNTX { public: CNXDNTX(); - uint8_t writeData(const uint8_t* data, uint8_t length); + uint8_t writeData(const uint8_t* data, uint16_t length); void process(); diff --git a/P25TX.cpp b/P25TX.cpp index 009a0f2..76dfe3c 100644 --- a/P25TX.cpp +++ b/P25TX.cpp @@ -118,7 +118,7 @@ void CP25TX::process() } } -uint8_t CP25TX::writeData(const uint8_t* data, uint8_t length) +uint8_t CP25TX::writeData(const uint8_t* data, uint16_t length) { if (length < (P25_TERM_FRAME_LENGTH_BYTES + 1U)) return 4U; diff --git a/P25TX.h b/P25TX.h index a7cd27d..45bd05a 100644 --- a/P25TX.h +++ b/P25TX.h @@ -27,7 +27,7 @@ class CP25TX { public: CP25TX(); - uint8_t writeData(const uint8_t* data, uint8_t length); + uint8_t writeData(const uint8_t* data, uint16_t length); void process(); diff --git a/POCSAGTX.cpp b/POCSAGTX.cpp index d53f9b7..e673e01 100644 --- a/POCSAGTX.cpp +++ b/POCSAGTX.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2018 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2018,2020 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 @@ -95,7 +95,7 @@ bool CPOCSAGTX::busy() return false; } -uint8_t CPOCSAGTX::writeData(const uint8_t* data, uint8_t length) +uint8_t CPOCSAGTX::writeData(const uint8_t* data, uint16_t length) { if (length != POCSAG_FRAME_LENGTH_BYTES) return 4U; diff --git a/POCSAGTX.h b/POCSAGTX.h index d640862..1fe9bbb 100644 --- a/POCSAGTX.h +++ b/POCSAGTX.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2019 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2020 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 @@ -27,7 +27,7 @@ class CPOCSAGTX { public: CPOCSAGTX(); - uint8_t writeData(const uint8_t* data, uint8_t length); + uint8_t writeData(const uint8_t* data, uint16_t length); void writeByte(uint8_t c); diff --git a/SerialPort.cpp b/SerialPort.cpp index 65ad4c2..b1775b8 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -266,7 +266,7 @@ void CSerialPort::getVersion() writeInt(1U, reply, count); } -uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) +uint8_t CSerialPort::setConfig(const uint8_t* data, uint16_t length) { if (length < 21U) return 4U; @@ -376,7 +376,7 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) return 0U; } -uint8_t CSerialPort::setFMParams1(const uint8_t* data, uint8_t length) +uint8_t CSerialPort::setFMParams1(const uint8_t* data, uint16_t length) { if (length < 8U) return 4U; @@ -401,7 +401,7 @@ uint8_t CSerialPort::setFMParams1(const uint8_t* data, uint8_t length) return fm.setCallsign(callsign, speed, frequency, time, holdoff, highLevel, lowLevel, callAtStart, callAtEnd, callAtLatch); } -uint8_t CSerialPort::setFMParams2(const uint8_t* data, uint8_t length) +uint8_t CSerialPort::setFMParams2(const uint8_t* data, uint16_t length) { if (length < 6U) return 4U; @@ -421,7 +421,7 @@ uint8_t CSerialPort::setFMParams2(const uint8_t* data, uint8_t length) return fm.setAck(ack, speed, frequency, minTime, delay, level); } -uint8_t CSerialPort::setFMParams3(const uint8_t* data, uint8_t length) +uint8_t CSerialPort::setFMParams3(const uint8_t* data, uint16_t length) { if (length < 12U) return 4U; @@ -447,7 +447,7 @@ uint8_t CSerialPort::setFMParams3(const uint8_t* data, uint8_t length) return fm.setMisc(timeout, timeoutLevel, ctcssFrequency, ctcssHighThreshold, ctcssLowThreshold, ctcssLevel, kerchunkTime, hangTime, useCOS, cosInvert, rfAudioBoost, maxDev, rxLevel); } -uint8_t CSerialPort::setMode(const uint8_t* data, uint8_t length) +uint8_t CSerialPort::setMode(const uint8_t* data, uint16_t length) { if (length < 1U) return 4U; @@ -598,321 +598,33 @@ void CSerialPort::process() m_buffer[0U] = c; m_ptr = 1U; m_len = 0U; - } - else { + } else { m_ptr = 0U; m_len = 0U; } } else if (m_ptr == 1U) { - // Handle the frame length + // Handle the frame length, 1/2 m_len = m_buffer[m_ptr] = c; m_ptr = 2U; + } else if (m_ptr == 2U) { + // Handle the frame length, 2/2 + m_buffer[m_ptr] = c; + m_ptr = 3U; + + if (m_len == 0U) + m_len = c + 255U; + + // The full packet has been received, process it + if (m_ptr == m_len) + processMessage(); } else { // Any other bytes are added to the buffer m_buffer[m_ptr] = c; m_ptr++; // The full packet has been received, process it - if (m_ptr == m_len) { - uint8_t err = 2U; - - switch (m_buffer[2U]) { - case MMDVM_GET_STATUS: - getStatus(); - break; - - case MMDVM_GET_VERSION: - getVersion(); - break; - - case MMDVM_SET_CONFIG: - err = setConfig(m_buffer + 3U, m_len - 3U); - if (err == 0U) - sendACK(); - else - sendNAK(err); - break; - - case MMDVM_SET_MODE: - err = setMode(m_buffer + 3U, m_len - 3U); - if (err == 0U) - sendACK(); - else - sendNAK(err); - break; - - case MMDVM_SET_FREQ: - sendACK(); - break; - - case MMDVM_FM_PARAMS1: - err = setFMParams1(m_buffer + 3U, m_len - 3U); - if (err == 0U) { - sendACK(); - } else { - DEBUG2("Received invalid FM params 1", err); - sendNAK(err); - } - break; - - case MMDVM_FM_PARAMS2: - err = setFMParams2(m_buffer + 3U, m_len - 3U); - if (err == 0U) { - sendACK(); - } else { - DEBUG2("Received invalid FM params 2", err); - sendNAK(err); - } - break; - - case MMDVM_FM_PARAMS3: - err = setFMParams3(m_buffer + 3U, m_len - 3U); - if (err == 0U) { - sendACK(); - } else { - DEBUG2("Received invalid FM params 3", err); - sendNAK(err); - } - break; - - case MMDVM_CAL_DATA: - if (m_modemState == STATE_DSTARCAL) - err = calDStarTX.write(m_buffer + 3U, m_len - 3U); - if (m_modemState == STATE_DMRCAL || m_modemState == STATE_LFCAL || m_modemState == STATE_DMRCAL1K || m_modemState == STATE_DMRDMO1K) - err = calDMR.write(m_buffer + 3U, m_len - 3U); - if (m_modemState == STATE_FMCAL10K || m_modemState == STATE_FMCAL12K || m_modemState == STATE_FMCAL15K || m_modemState == STATE_FMCAL20K || m_modemState == STATE_FMCAL25K || m_modemState == STATE_FMCAL30K) - err = calFM.write(m_buffer + 3U, m_len - 3U); - if (m_modemState == STATE_P25CAL1K) - err = calP25.write(m_buffer + 3U, m_len - 3U); - if (m_modemState == STATE_NXDNCAL1K) - err = calNXDN.write(m_buffer + 3U, m_len - 3U); - if (m_modemState == STATE_POCSAGCAL) - err = calPOCSAG.write(m_buffer + 3U, m_len - 3U); - if (err == 0U) { - sendACK(); - } else { - DEBUG2("Received invalid calibration data", err); - sendNAK(err); - } - break; - - case MMDVM_SEND_CWID: - err = 5U; - if (m_modemState == STATE_IDLE) - err = cwIdTX.write(m_buffer + 3U, m_len - 3U); - if (err != 0U) { - DEBUG2("Invalid CW Id data", err); - sendNAK(err); - } - break; - - case MMDVM_DSTAR_HEADER: - if (m_dstarEnable) { - if (m_modemState == STATE_IDLE || m_modemState == STATE_DSTAR) - err = dstarTX.writeHeader(m_buffer + 3U, m_len - 3U); - } - if (err == 0U) { - if (m_modemState == STATE_IDLE) - setMode(STATE_DSTAR); - } else { - DEBUG2("Received invalid D-Star header", err); - sendNAK(err); - } - break; - - case MMDVM_DSTAR_DATA: - if (m_dstarEnable) { - if (m_modemState == STATE_IDLE || m_modemState == STATE_DSTAR) - err = dstarTX.writeData(m_buffer + 3U, m_len - 3U); - } - if (err == 0U) { - if (m_modemState == STATE_IDLE) - setMode(STATE_DSTAR); - } else { - DEBUG2("Received invalid D-Star data", err); - sendNAK(err); - } - break; - - case MMDVM_DSTAR_EOT: - if (m_dstarEnable) { - if (m_modemState == STATE_IDLE || m_modemState == STATE_DSTAR) - err = dstarTX.writeEOT(); - } - if (err == 0U) { - if (m_modemState == STATE_IDLE) - setMode(STATE_DSTAR); - } else { - DEBUG2("Received invalid D-Star EOT", err); - sendNAK(err); - } - break; - - case MMDVM_DMR_DATA1: - if (m_dmrEnable) { - if (m_modemState == STATE_IDLE || m_modemState == STATE_DMR) { - if (m_duplex) - err = dmrTX.writeData1(m_buffer + 3U, m_len - 3U); - } - } - if (err == 0U) { - if (m_modemState == STATE_IDLE) - setMode(STATE_DMR); - } else { - DEBUG2("Received invalid DMR data", err); - sendNAK(err); - } - break; - - case MMDVM_DMR_DATA2: - if (m_dmrEnable) { - if (m_modemState == STATE_IDLE || m_modemState == STATE_DMR) { - if (m_duplex) - err = dmrTX.writeData2(m_buffer + 3U, m_len - 3U); - else - err = dmrDMOTX.writeData(m_buffer + 3U, m_len - 3U); - } - } - if (err == 0U) { - if (m_modemState == STATE_IDLE) - setMode(STATE_DMR); - } else { - DEBUG2("Received invalid DMR data", err); - sendNAK(err); - } - break; - - case MMDVM_DMR_START: - if (m_dmrEnable) { - err = 4U; - if (m_len == 4U) { - if (m_buffer[3U] == 0x01U && m_modemState == STATE_DMR) { - if (!m_tx) - dmrTX.setStart(true); - err = 0U; - } else if (m_buffer[3U] == 0x00U && m_modemState == STATE_DMR) { - if (m_tx) - dmrTX.setStart(false); - err = 0U; - } - } - } - if (err != 0U) { - DEBUG2("Received invalid DMR start", err); - sendNAK(err); - } - break; - - case MMDVM_DMR_SHORTLC: - if (m_dmrEnable) - err = dmrTX.writeShortLC(m_buffer + 3U, m_len - 3U); - if (err != 0U) { - DEBUG2("Received invalid DMR Short LC", err); - sendNAK(err); - } - break; - - case MMDVM_DMR_ABORT: - if (m_dmrEnable) - err = dmrTX.writeAbort(m_buffer + 3U, m_len - 3U); - if (err != 0U) { - DEBUG2("Received invalid DMR Abort", err); - sendNAK(err); - } - break; - - case MMDVM_YSF_DATA: - if (m_ysfEnable) { - if (m_modemState == STATE_IDLE || m_modemState == STATE_YSF) - err = ysfTX.writeData(m_buffer + 3U, m_len - 3U); - } - if (err == 0U) { - if (m_modemState == STATE_IDLE) - setMode(STATE_YSF); - } else { - DEBUG2("Received invalid System Fusion data", err); - sendNAK(err); - } - break; - - case MMDVM_P25_HDR: - if (m_p25Enable) { - if (m_modemState == STATE_IDLE || m_modemState == STATE_P25) - err = p25TX.writeData(m_buffer + 3U, m_len - 3U); - } - if (err == 0U) { - if (m_modemState == STATE_IDLE) - setMode(STATE_P25); - } else { - DEBUG2("Received invalid P25 header", err); - sendNAK(err); - } - break; - - case MMDVM_P25_LDU: - if (m_p25Enable) { - if (m_modemState == STATE_IDLE || m_modemState == STATE_P25) - err = p25TX.writeData(m_buffer + 3U, m_len - 3U); - } - if (err == 0U) { - if (m_modemState == STATE_IDLE) - setMode(STATE_P25); - } else { - DEBUG2("Received invalid P25 LDU", err); - sendNAK(err); - } - break; - - case MMDVM_NXDN_DATA: - if (m_nxdnEnable) { - if (m_modemState == STATE_IDLE || m_modemState == STATE_NXDN) - err = nxdnTX.writeData(m_buffer + 3U, m_len - 3U); - } - if (err == 0U) { - if (m_modemState == STATE_IDLE) - setMode(STATE_NXDN); - } else { - DEBUG2("Received invalid NXDN data", err); - sendNAK(err); - } - break; - - case MMDVM_POCSAG_DATA: - if (m_pocsagEnable) { - if (m_modemState == STATE_IDLE || m_modemState == STATE_POCSAG) - err = pocsagTX.writeData(m_buffer + 3U, m_len - 3U); - } - if (err == 0U) { - if (m_modemState == STATE_IDLE) - setMode(STATE_POCSAG); - } else { - DEBUG2("Received invalid POCSAG data", err); - sendNAK(err); - } - break; - - case MMDVM_TRANSPARENT: - case MMDVM_QSO_INFO: - // Do nothing on the MMDVM. - break; - -#if defined(SERIAL_REPEATER) - case MMDVM_SERIAL: { - for (uint8_t i = 3U; i < m_len; i++) - m_repeat.put(m_buffer[i]); - } - break; -#endif - - default: - // Handle this, send a NAK back - sendNAK(1U); - break; - } - - m_ptr = 0U; - m_len = 0U; - } + if (m_ptr == m_len) + processMessage(); } } @@ -941,6 +653,308 @@ void CSerialPort::process() #endif } +void CSerialPort::processMessage() +{ + uint8_t err = 2U; + + switch (m_buffer[2U]) { + case MMDVM_GET_STATUS: + getStatus(); + break; + + case MMDVM_GET_VERSION: + getVersion(); + break; + + case MMDVM_SET_CONFIG: + err = setConfig(m_buffer + 3U, m_len - 3U); + if (err == 0U) + sendACK(); + else + sendNAK(err); + break; + + case MMDVM_SET_MODE: + err = setMode(m_buffer + 3U, m_len - 3U); + if (err == 0U) + sendACK(); + else + sendNAK(err); + break; + + case MMDVM_SET_FREQ: + sendACK(); + break; + + case MMDVM_FM_PARAMS1: + err = setFMParams1(m_buffer + 3U, m_len - 3U); + if (err == 0U) { + sendACK(); + } else { + DEBUG2("Received invalid FM params 1", err); + sendNAK(err); + } + break; + + case MMDVM_FM_PARAMS2: + err = setFMParams2(m_buffer + 3U, m_len - 3U); + if (err == 0U) { + sendACK(); + } else { + DEBUG2("Received invalid FM params 2", err); + sendNAK(err); + } + break; + + case MMDVM_FM_PARAMS3: + err = setFMParams3(m_buffer + 3U, m_len - 3U); + if (err == 0U) { + sendACK(); + } else { + DEBUG2("Received invalid FM params 3", err); + sendNAK(err); + } + break; + + case MMDVM_CAL_DATA: + if (m_modemState == STATE_DSTARCAL) + err = calDStarTX.write(m_buffer + 3U, m_len - 3U); + if (m_modemState == STATE_DMRCAL || m_modemState == STATE_LFCAL || m_modemState == STATE_DMRCAL1K || m_modemState == STATE_DMRDMO1K) + err = calDMR.write(m_buffer + 3U, m_len - 3U); + if (m_modemState == STATE_FMCAL10K || m_modemState == STATE_FMCAL12K || m_modemState == STATE_FMCAL15K || m_modemState == STATE_FMCAL20K || m_modemState == STATE_FMCAL25K || m_modemState == STATE_FMCAL30K) + err = calFM.write(m_buffer + 3U, m_len - 3U); + if (m_modemState == STATE_P25CAL1K) + err = calP25.write(m_buffer + 3U, m_len - 3U); + if (m_modemState == STATE_NXDNCAL1K) + err = calNXDN.write(m_buffer + 3U, m_len - 3U); + if (m_modemState == STATE_POCSAGCAL) + err = calPOCSAG.write(m_buffer + 3U, m_len - 3U); + if (err == 0U) { + sendACK(); + } else { + DEBUG2("Received invalid calibration data", err); + sendNAK(err); + } + break; + + case MMDVM_SEND_CWID: + err = 5U; + if (m_modemState == STATE_IDLE) + err = cwIdTX.write(m_buffer + 3U, m_len - 3U); + if (err != 0U) { + DEBUG2("Invalid CW Id data", err); + sendNAK(err); + } + break; + + case MMDVM_DSTAR_HEADER: + if (m_dstarEnable) { + if (m_modemState == STATE_IDLE || m_modemState == STATE_DSTAR) + err = dstarTX.writeHeader(m_buffer + 3U, m_len - 3U); + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_DSTAR); + } else { + DEBUG2("Received invalid D-Star header", err); + sendNAK(err); + } + break; + + case MMDVM_DSTAR_DATA: + if (m_dstarEnable) { + if (m_modemState == STATE_IDLE || m_modemState == STATE_DSTAR) + err = dstarTX.writeData(m_buffer + 3U, m_len - 3U); + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_DSTAR); + } else { + DEBUG2("Received invalid D-Star data", err); + sendNAK(err); + } + break; + + case MMDVM_DSTAR_EOT: + if (m_dstarEnable) { + if (m_modemState == STATE_IDLE || m_modemState == STATE_DSTAR) + err = dstarTX.writeEOT(); + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_DSTAR); + } else { + DEBUG2("Received invalid D-Star EOT", err); + sendNAK(err); + } + break; + + case MMDVM_DMR_DATA1: + if (m_dmrEnable) { + if (m_modemState == STATE_IDLE || m_modemState == STATE_DMR) { + if (m_duplex) + err = dmrTX.writeData1(m_buffer + 3U, m_len - 3U); + } + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_DMR); + } else { + DEBUG2("Received invalid DMR data", err); + sendNAK(err); + } + break; + + case MMDVM_DMR_DATA2: + if (m_dmrEnable) { + if (m_modemState == STATE_IDLE || m_modemState == STATE_DMR) { + if (m_duplex) + err = dmrTX.writeData2(m_buffer + 3U, m_len - 3U); + else + err = dmrDMOTX.writeData(m_buffer + 3U, m_len - 3U); + } + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_DMR); + } else { + DEBUG2("Received invalid DMR data", err); + sendNAK(err); + } + break; + + case MMDVM_DMR_START: + if (m_dmrEnable) { + err = 4U; + if (m_len == 4U) { + if (m_buffer[3U] == 0x01U && m_modemState == STATE_DMR) { + if (!m_tx) + dmrTX.setStart(true); + err = 0U; + } else if (m_buffer[3U] == 0x00U && m_modemState == STATE_DMR) { + if (m_tx) + dmrTX.setStart(false); + err = 0U; + } + } + } + if (err != 0U) { + DEBUG2("Received invalid DMR start", err); + sendNAK(err); + } + break; + + case MMDVM_DMR_SHORTLC: + if (m_dmrEnable) + err = dmrTX.writeShortLC(m_buffer + 3U, m_len - 3U); + if (err != 0U) { + DEBUG2("Received invalid DMR Short LC", err); + sendNAK(err); + } + break; + + case MMDVM_DMR_ABORT: + if (m_dmrEnable) + err = dmrTX.writeAbort(m_buffer + 3U, m_len - 3U); + if (err != 0U) { + DEBUG2("Received invalid DMR Abort", err); + sendNAK(err); + } + break; + + case MMDVM_YSF_DATA: + if (m_ysfEnable) { + if (m_modemState == STATE_IDLE || m_modemState == STATE_YSF) + err = ysfTX.writeData(m_buffer + 3U, m_len - 3U); + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_YSF); + } else { + DEBUG2("Received invalid System Fusion data", err); + sendNAK(err); + } + break; + + case MMDVM_P25_HDR: + if (m_p25Enable) { + if (m_modemState == STATE_IDLE || m_modemState == STATE_P25) + err = p25TX.writeData(m_buffer + 3U, m_len - 3U); + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_P25); + } else { + DEBUG2("Received invalid P25 header", err); + sendNAK(err); + } + break; + + case MMDVM_P25_LDU: + if (m_p25Enable) { + if (m_modemState == STATE_IDLE || m_modemState == STATE_P25) + err = p25TX.writeData(m_buffer + 3U, m_len - 3U); + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_P25); + } else { + DEBUG2("Received invalid P25 LDU", err); + sendNAK(err); + } + break; + + case MMDVM_NXDN_DATA: + if (m_nxdnEnable) { + if (m_modemState == STATE_IDLE || m_modemState == STATE_NXDN) + err = nxdnTX.writeData(m_buffer + 3U, m_len - 3U); + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_NXDN); + } else { + DEBUG2("Received invalid NXDN data", err); + sendNAK(err); + } + break; + + case MMDVM_POCSAG_DATA: + if (m_pocsagEnable) { + if (m_modemState == STATE_IDLE || m_modemState == STATE_POCSAG) + err = pocsagTX.writeData(m_buffer + 3U, m_len - 3U); + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_POCSAG); + } else { + DEBUG2("Received invalid POCSAG data", err); + sendNAK(err); + } + break; + + case MMDVM_TRANSPARENT: + case MMDVM_QSO_INFO: + // Do nothing on the MMDVM. + break; + +#if defined(SERIAL_REPEATER) + case MMDVM_SERIAL: { + for (uint8_t i = 3U; i < m_len; i++) + m_repeat.put(m_buffer[i]); + } + break; +#endif + + default: + // Handle this, send a NAK back + sendNAK(1U); + break; + } + + m_ptr = 0U; + m_len = 0U; +} + void CSerialPort::writeDStarHeader(const uint8_t* header, uint8_t length) { if (m_modemState != STATE_DSTAR && m_modemState != STATE_IDLE) @@ -1203,7 +1217,7 @@ void CSerialPort::writeNXDNLost() writeInt(1U, reply, 3); } -void CSerialPort::writeAX25Data(const uint8_t* data, uint8_t length) +void CSerialPort::writeAX25Data(const uint8_t* data, uint16_t length) { if (m_modemState != STATE_FM && m_modemState != STATE_IDLE) return; @@ -1211,19 +1225,28 @@ void CSerialPort::writeAX25Data(const uint8_t* data, uint8_t length) if (!m_ax25Enable) return; - uint8_t reply[300U]; + uint8_t reply[512U]; reply[0U] = MMDVM_FRAME_START; - reply[1U] = 0U; - reply[2U] = MMDVM_AX25_DATA; - uint8_t count = 3U; - for (uint8_t i = 0U; i < length; i++, count++) - reply[count] = data[i]; + if (length > 252U) { + reply[1U] = 0U; + reply[2U] = (length + 4U) - 255U; + reply[3U] = MMDVM_AX25_DATA; - reply[1U] = count; + for (uint8_t i = 0U; i < length; i++) + reply[i + 4U] = data[i]; - writeInt(1U, reply, count); + writeInt(1U, reply, length + 4U); + } else { + reply[1U] = length + 3U; + reply[2U] = MMDVM_AX25_DATA; + + for (uint8_t i = 0U; i < length; i++) + reply[i + 3U] = data[i]; + + writeInt(1U, reply, length + 3U); + } } void CSerialPort::writeCalData(const uint8_t* data, uint8_t length) diff --git a/SerialPort.h b/SerialPort.h index e8b9d58..57b8f00 100644 --- a/SerialPort.h +++ b/SerialPort.h @@ -50,7 +50,7 @@ public: void writeNXDNData(const uint8_t* data, uint8_t length); void writeNXDNLost(); - void writeAX25Data(const uint8_t* data, uint8_t length); + void writeAX25Data(const uint8_t* data, uint16_t length); void writeCalData(const uint8_t* data, uint8_t length); void writeRSSIData(const uint8_t* data, uint8_t length); @@ -62,9 +62,9 @@ public: void writeDebug(const char* text, int16_t n1, int16_t n2, int16_t n3, int16_t n4); private: - uint8_t m_buffer[256U]; - uint8_t m_ptr; - uint8_t m_len; + uint8_t m_buffer[512U]; + uint16_t m_ptr; + uint16_t m_len; bool m_debug; CSerialRB m_repeat; @@ -72,12 +72,13 @@ private: void sendNAK(uint8_t err); void getStatus(); void getVersion(); - uint8_t setConfig(const uint8_t* data, uint8_t length); - uint8_t setMode(const uint8_t* data, uint8_t length); + uint8_t setConfig(const uint8_t* data, uint16_t length); + uint8_t setMode(const uint8_t* data, uint16_t length); void setMode(MMDVM_STATE modemState); - 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 setFMParams1(const uint8_t* data, uint16_t length); + uint8_t setFMParams2(const uint8_t* data, uint16_t length); + uint8_t setFMParams3(const uint8_t* data, uint16_t length); + void processMessage(); // Hardware versions void beginInt(uint8_t n, int speed); diff --git a/YSFTX.cpp b/YSFTX.cpp index 090445a..9ac0607 100644 --- a/YSFTX.cpp +++ b/YSFTX.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2018 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2018,2020 by Jonathan Naylor G4KLX * Copyright (C) 2017 by Andy Uribe CA6JAU * * This program is free software; you can redistribute it and/or modify @@ -116,7 +116,7 @@ void CYSFTX::process() } } -uint8_t CYSFTX::writeData(const uint8_t* data, uint8_t length) +uint8_t CYSFTX::writeData(const uint8_t* data, uint16_t length) { if (length != (YSF_FRAME_LENGTH_BYTES + 1U)) return 4U; diff --git a/YSFTX.h b/YSFTX.h index 647767c..4793221 100644 --- a/YSFTX.h +++ b/YSFTX.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,2020 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 @@ -27,7 +27,7 @@ class CYSFTX { public: CYSFTX(); - uint8_t writeData(const uint8_t* data, uint8_t length); + uint8_t writeData(const uint8_t* data, uint16_t length); void process();