diff --git a/SerialPort.cpp b/SerialPort.cpp index e4ca8ac..7fbd004 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -175,6 +175,17 @@ void SerialPort::process() } break; + case CMD_SET_BUFFERS: + err = setBuffers(m_buffer + 3U, m_len - 3U); + if (err == RSN_OK) { + sendACK(); + } + else { + DEBUG2("SerialPort: process(): received invalid data to set buffers", err); + sendNAK(err); + } + break; + /** CW */ case CMD_SEND_CWID: err = RSN_RINGBUFF_FULL; @@ -1301,3 +1312,33 @@ uint8_t SerialPort::setRFParams(const uint8_t* data, uint8_t length) return io.setRFParams(rxFreq, txFreq, rfPower, gainMode); } + +/// +/// Sets the protocol ring buffer sizes. +/// +/// +/// +/// +uint8_t SerialPort::setBuffers(const uint8_t* data, uint8_t length) +{ + if (length < 1U) + return RSN_ILLEGAL_LENGTH; + if (m_modemState != STATE_IDLE) + return RSN_INVALID_MODE; + + uint16_t dmrBufSize = dmr::DMR_TX_BUFFER_LEN; + uint16_t p25BufSize = p25::P25_TX_BUFFER_LEN; + uint16_t nxdnBufSize = nxdn::NXDN_TX_BUFFER_LEN; + + dmrBufSize = (data[0U] << 8) + (data[1U]); + p25BufSize = (data[2U] << 8) + (data[3U]); + nxdnBufSize = (data[4U] << 8) + (data[5U]); + + p25TX.resizeBuffer(p25BufSize); + nxdnTX.resizeBuffer(nxdnBufSize); + + dmrTX.resizeBuffer(dmrBufSize); + dmrDMOTX.resizeBuffer(dmrBufSize); + + return RSN_OK; +} diff --git a/SerialPort.h b/SerialPort.h index 001fa16..f70e54f 100644 --- a/SerialPort.h +++ b/SerialPort.h @@ -82,6 +82,8 @@ enum DVM_COMMANDS { CMD_RSSI_DATA = 0x09U, CMD_SEND_CWID = 0x0AU, + + CMD_SET_BUFFERS = 0x0FU, CMD_DMR_DATA1 = 0x18U, CMD_DMR_LOST1 = 0x19U, @@ -227,6 +229,8 @@ private: void setMode(DVM_STATE modemState); /// Sets the RF parameters. uint8_t setRFParams(const uint8_t* data, uint8_t length); + /// Sets the protocol ring buffer sizes. + uint8_t setBuffers(const uint8_t* data, uint8_t length); /// void flashRead(); diff --git a/dmr/DMRDMOTX.cpp b/dmr/DMRDMOTX.cpp index ffd42e7..353a5e5 100644 --- a/dmr/DMRDMOTX.cpp +++ b/dmr/DMRDMOTX.cpp @@ -144,6 +144,16 @@ void DMRDMOTX::setPreambleCount(uint8_t preambleCnt) m_preambleCnt = 1200U; } +/// +/// Helper to resize the FIFO buffer. +/// +/// +void DMRDMOTX::resizeBuffer(uint16_t size) +{ + m_fifo.reset(); + m_fifo.reinitialize(size); +} + /// /// Helper to get how much space the ring buffer has for samples. /// diff --git a/dmr/DMRDMOTX.h b/dmr/DMRDMOTX.h index cedeb2a..4b756b3 100644 --- a/dmr/DMRDMOTX.h +++ b/dmr/DMRDMOTX.h @@ -65,6 +65,9 @@ namespace dmr /// Sets the FDMA preamble count. void setPreambleCount(uint8_t preambleCnt); + /// Helper to resize the FIFO buffer. + void resizeBuffer(uint16_t size); + /// Helper to get how much space the ring buffer has for samples. uint16_t getSpace() const; diff --git a/dmr/DMRDefines.h b/dmr/DMRDefines.h index 8da1010..ce980fe 100644 --- a/dmr/DMRDefines.h +++ b/dmr/DMRDefines.h @@ -126,7 +126,8 @@ namespace dmr const int8_t DMR_MS_VOICE_SYNC_SYMBOLS_VALUES[] = { +3, -3, -3, -3, +3, -3, -3, +3, +3, +3, -3, +3, -3, +3, +3, +3, +3, -3, -3, +3, -3, -3, -3, +3 }; - const uint32_t DMR_TX_BUFFER_LEN = 538U; // 538 = DMR_FRAME_LENGTH_BYTES * 16 + 10 (BUFFER_LEN = DMR_FRAME_LENGTH_BYTES * NO_OF_FRAMES + 10) + // 505 = DMR_FRAME_LENGTH_BYTES * 15 + 10 (BUFFER_LEN = DMR_FRAME_LENGTH_BYTES * NO_OF_FRAMES + 10) + const uint32_t DMR_TX_BUFFER_LEN = 505U; // 15 frames + pad // Data Type(s) const uint8_t DT_VOICE_PI_HEADER = 0U; diff --git a/dmr/DMRTX.cpp b/dmr/DMRTX.cpp index 81c4d57..2ca0ccf 100644 --- a/dmr/DMRTX.cpp +++ b/dmr/DMRTX.cpp @@ -350,6 +350,18 @@ void DMRTX::resetFifo2() m_fifo[1U].reset(); } +/// +/// Helper to resize the FIFO buffer. +/// +/// +void DMRTX::resizeBuffer(uint16_t size) +{ + m_fifo[0U].reset(); + m_fifo[1U].reset(); + m_fifo[0U].reinitialize(size); + m_fifo[1U].reinitialize(size); +} + /// /// /// diff --git a/dmr/DMRTX.h b/dmr/DMRTX.h index baf6d71..bd1644e 100644 --- a/dmr/DMRTX.h +++ b/dmr/DMRTX.h @@ -94,6 +94,10 @@ namespace dmr void resetFifo1(); /// Helper to reset data values to defaults for slot 2 FIFO. void resetFifo2(); + + /// Helper to resize the FIFO buffer. + void resizeBuffer(uint16_t size); + /// uint32_t getFrameCount(); diff --git a/nxdn/NXDNDefines.h b/nxdn/NXDNDefines.h index 8005db9..e40d147 100644 --- a/nxdn/NXDNDefines.h +++ b/nxdn/NXDNDefines.h @@ -68,7 +68,8 @@ namespace nxdn const uint16_t NXDN_FSW_SYMBOLS = 0x014DU; const uint16_t NXDN_FSW_SYMBOLS_MASK = 0x03FFU; - const uint32_t NXDN_TX_BUFFER_LEN = 1018U; // 2026 = NXDN_FRAME_LENGTH_BYTES * 21 + 10 (BUFFER_LEN = NXDN_FRAME_LENGTH_BYTES * NO_OF_FRAMES) + // 538 = NXDN_FRAME_LENGTH_BYTES * 11 + 10 (BUFFER_LEN = NXDN_FRAME_LENGTH_BYTES * NO_OF_FRAMES) + const uint32_t NXDN_TX_BUFFER_LEN = 538U; // 11 frames + pad } // namespace nxdn #endif // __NXDN_DEFINES_H__ diff --git a/nxdn/NXDNTX.cpp b/nxdn/NXDNTX.cpp index 5aad090..17415fb 100644 --- a/nxdn/NXDNTX.cpp +++ b/nxdn/NXDNTX.cpp @@ -175,6 +175,16 @@ void NXDNTX::setCal(bool start) m_state = start ? NXDNTXSTATE_CAL : NXDNTXSTATE_NORMAL; } +/// +/// Helper to resize the FIFO buffer. +/// +/// +void NXDNTX::resizeBuffer(uint16_t size) +{ + m_fifo.reset(); + m_fifo.reinitialize(size); +} + /// /// Helper to get how much space the ring buffer has for samples. /// diff --git a/nxdn/NXDNTX.h b/nxdn/NXDNTX.h index f869afe..d99fc0f 100644 --- a/nxdn/NXDNTX.h +++ b/nxdn/NXDNTX.h @@ -74,6 +74,9 @@ namespace nxdn /// Helper to set the calibration state for Tx. void setCal(bool start); + /// Helper to resize the FIFO buffer. + void resizeBuffer(uint16_t size); + /// Helper to get how much space the ring buffer has for samples. uint8_t getSpace() const; diff --git a/p25/P25Defines.h b/p25/P25Defines.h index dfa3841..3886484 100644 --- a/p25/P25Defines.h +++ b/p25/P25Defines.h @@ -120,7 +120,8 @@ namespace p25 const uint32_t P25_SYNC_SYMBOLS = 0x00FB30A0U; const uint32_t P25_SYNC_SYMBOLS_MASK = 0x00FFFFFFU; - const uint32_t P25_TX_BUFFER_LEN = 1738U; // 2592 = P25_LDU_FRAME_LENGTH_BYTES * 8 + 10 (BUFFER_LEN = P25_LDU_FRAME_LENGTH_BYTES * NO_OF_FRAMES + 10) + // 442 = P25_LDU_FRAME_LENGTH_BYTES * 2 + 10 (BUFFER_LEN = P25_LDU_FRAME_LENGTH_BYTES * NO_OF_FRAMES + 10) + const uint32_t P25_TX_BUFFER_LEN = 442U; // 2 frames + pad // Data Unit ID(s) const uint8_t P25_DUID_HDU = 0x00U; // Header Data Unit diff --git a/p25/P25TX.cpp b/p25/P25TX.cpp index 29eeec4..0cd35d7 100644 --- a/p25/P25TX.cpp +++ b/p25/P25TX.cpp @@ -189,6 +189,16 @@ void P25TX::setCal(bool start) m_state = start ? P25TXSTATE_CAL : P25TXSTATE_NORMAL; } +/// +/// Helper to resize the FIFO buffer. +/// +/// +void P25TX::resizeBuffer(uint16_t size) +{ + m_fifo.reset(); + m_fifo.reinitialize(size); +} + /// /// Helper to get how much space the ring buffer has for samples. /// diff --git a/p25/P25TX.h b/p25/P25TX.h index 667e184..ea54ca7 100644 --- a/p25/P25TX.h +++ b/p25/P25TX.h @@ -75,6 +75,9 @@ namespace p25 /// Helper to set the calibration state for Tx. void setCal(bool start); + /// Helper to resize the FIFO buffer. + void resizeBuffer(uint16_t size); + /// Helper to get how much space the ring buffer has for samples. uint8_t getSpace() const;