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;