diff --git a/modem/Modem.cpp b/modem/Modem.cpp index c93b6753..90bdb619 100644 --- a/modem/Modem.cpp +++ b/modem/Modem.cpp @@ -158,12 +158,12 @@ Modem::Modem(port::IModemPort* port, bool duplex, bool rxInvert, bool txInvert, m_openPortHandler(NULL), m_closePortHandler(NULL), m_rspHandler(NULL), - m_rxDMRData1(1000U, "Modem RX DMR1"), - m_rxDMRData2(1000U, "Modem RX DMR2"), - m_txDMRData1(1000U, "Modem TX DMR1"), - m_txDMRData2(1000U, "Modem TX DMR2"), - m_rxP25Data(1000U, "Modem RX P25"), - m_txP25Data(1000U, "Modem TX P25"), + m_rxDMRData1(1110U, "Modem RX DMR1"), + m_rxDMRData2(1110U, "Modem RX DMR2"), + m_txDMRData1(740U, "Modem TX DMR1"), + m_txDMRData2(740U, "Modem TX DMR2"), + m_rxP25Data(6000U, "Modem RX P25"), + m_txP25Data(864U, "Modem TX P25"), m_useDFSI(false), m_statusTimer(1000U, 0U, 250U), m_inactivityTimer(1000U, 4U), @@ -786,7 +786,7 @@ void Modem::clock(uint32_t ms) m_txDMRData1.getData(m_buffer, len); //if (m_trace) - // Utils::dump(1U, "TX DMR Data 1", m_buffer, len); + // Utils::dump(1U, "Buffered TX DMR Data 1", m_buffer, len); int ret = write(m_buffer, len); if (ret != int(len)) @@ -804,7 +804,7 @@ void Modem::clock(uint32_t ms) m_txDMRData2.getData(m_buffer, len); //if (m_trace) - // Utils::dump(1U, "TX DMR Data 2", m_buffer, len); + // Utils::dump(1U, "Buffered TX DMR Data 2", m_buffer, len); int ret = write(m_buffer, len); if (ret != int(len)) @@ -822,7 +822,7 @@ void Modem::clock(uint32_t ms) m_txP25Data.getData(m_buffer, len); //if (m_trace) - // Utils::dump(1U, "TX P25 Data", m_buffer, len); + // Utils::dump(1U, "Buffered TX P25 Data", m_buffer, len); int ret = write(m_buffer, len); if (ret != int(len)) @@ -1117,7 +1117,7 @@ void Modem::injectP25Data(const uint8_t* data, uint32_t length) /// Data to write to ring buffer. /// Length of data to write. /// True, if data is written, otherwise false. -bool Modem::writeDMRData1(const uint8_t* data, uint32_t length) +bool Modem::writeDMRData1(const uint8_t* data, uint32_t length, bool immediate) { assert(data != NULL); assert(length > 0U); @@ -1134,8 +1134,26 @@ bool Modem::writeDMRData1(const uint8_t* data, uint32_t length) ::memcpy(buffer + 3U, data + 1U, length - 1U); uint8_t len = length + 2U; - m_txDMRData1.addData(&len, 1U); - m_txDMRData1.addData(buffer, len); + + // write or buffer DMR slot 1 data to air interface + if (immediate && m_dmrSpace1 > 1U) { + if (m_debug) + LogDebug(LOG_MODEM, "Modem::writeDMRData1(); immediate write (len %u)", length); + //if (m_trace) + // Utils::dump(1U, "Immediate TX DMR Data 1", m_buffer, len); + + int ret = write(m_buffer, len); + if (ret != int(len)) + LogError(LOG_MODEM, "Error writing DMR slot 1 data"); + + m_playoutTimer.start(); + + m_dmrSpace1--; + } + else { + m_txDMRData1.addData(&len, 1U); + m_txDMRData1.addData(buffer, len); + } return true; } @@ -1145,8 +1163,9 @@ bool Modem::writeDMRData1(const uint8_t* data, uint32_t length) /// /// Data to write to ring buffer. /// Length of data to write. +/// Flag indicating data should be immediately written. /// True, if data is written, otherwise false. -bool Modem::writeDMRData2(const uint8_t* data, uint32_t length) +bool Modem::writeDMRData2(const uint8_t* data, uint32_t length, bool immediate) { assert(data != NULL); assert(length > 0U); @@ -1163,8 +1182,26 @@ bool Modem::writeDMRData2(const uint8_t* data, uint32_t length) ::memcpy(buffer + 3U, data + 1U, length - 1U); uint8_t len = length + 2U; - m_txDMRData2.addData(&len, 1U); - m_txDMRData2.addData(buffer, len); + + // write or buffer DMR slot 2 data to air interface + if (immediate && m_dmrSpace2 > 1U) { + if (m_debug) + LogDebug(LOG_MODEM, "Modem::writeDMRData2(); immediate write (len %u)", length); + //if (m_trace) + // Utils::dump(1U, "Immediate TX DMR Data 2", m_buffer, len); + + int ret = write(m_buffer, len); + if (ret != int(len)) + LogError(LOG_MODEM, "Error writing DMR slot 2 data"); + + m_playoutTimer.start(); + + m_dmrSpace2--; + } + else { + m_txDMRData2.addData(&len, 1U); + m_txDMRData2.addData(buffer, len); + } return true; } @@ -1174,8 +1211,9 @@ bool Modem::writeDMRData2(const uint8_t* data, uint32_t length) /// /// Data to write to ring buffer. /// Length of data to write. +/// Flag indicating data should be immediately written. /// True, if data is written, otherwise false. -bool Modem::writeP25Data(const uint8_t* data, uint32_t length) +bool Modem::writeP25Data(const uint8_t* data, uint32_t length, bool immediate) { assert(data != NULL); assert(length > 0U); @@ -1192,8 +1230,26 @@ bool Modem::writeP25Data(const uint8_t* data, uint32_t length) ::memcpy(buffer + 3U, data + 1U, length - 1U); uint8_t len = length + 2U; - m_txP25Data.addData(&len, 1U); - m_txP25Data.addData(buffer, len); + + // write or buffer P25 data to air interface + if (immediate && m_p25Space > 1U) { + if (m_debug) + LogDebug(LOG_MODEM, "Modem::writeP25Data(); immediate write (len %u)", length); + //if (m_trace) + // Utils::dump(1U, "Immediate TX P25 Data", m_buffer, len); + + int ret = write(m_buffer, len); + if (ret != int(len)) + LogError(LOG_MODEM, "Error writing P25 data"); + + m_playoutTimer.start(); + + m_p25Space--; + } + else { + m_txP25Data.addData(&len, 1U); + m_txP25Data.addData(buffer, len); + } return true; } @@ -1669,7 +1725,7 @@ bool Modem::readFlash() if (len == 249U) { bool ret = edac::CRC::checkCCITT162(m_buffer + 3U, DVM_CONF_AREA_LEN); if (!ret) { - LogError(LOG_MODEM, "Modem::readFlash(), failed CRC CCITT-162 check"); + LogWarning(LOG_MODEM, "Modem configuration area does not contain a valid configuration!"); } else { bool isErased = (m_buffer[DVM_CONF_AREA_LEN] & 0x80U) == 0x80U; @@ -1677,14 +1733,14 @@ bool Modem::readFlash() if (!isErased) { if (confAreaVersion != DVM_CONF_AREA_VER) { - LogError(LOG_MODEM, "Modem::readFlash(), invalid version for configuration area, %02X != %02X", DVM_CONF_AREA_VER, confAreaVersion); + LogError(LOG_MODEM, "Invalid version for configuration area, %02X != %02X", DVM_CONF_AREA_VER, confAreaVersion); } else { processFlashConfig(m_buffer); } } else { - LogWarning(LOG_MODEM, "Modem::readFlash(), modem configuration area was erased and does not contain active configuration!"); + LogWarning(LOG_MODEM, "Modem configuration area was erased and does not contain active configuration!"); } } } diff --git a/modem/Modem.h b/modem/Modem.h index c087aa59..4f75fbe2 100644 --- a/modem/Modem.h +++ b/modem/Modem.h @@ -298,11 +298,11 @@ namespace modem void injectP25Data(const uint8_t* data, uint32_t length); /// Writes DMR Slot 1 frame data to the DMR Slot 1 ring buffer. - bool writeDMRData1(const uint8_t* data, uint32_t length); + bool writeDMRData1(const uint8_t* data, uint32_t length, bool immediate = false); /// Writes DMR Slot 2 frame data to the DMR Slot 2 ring buffer. - bool writeDMRData2(const uint8_t* data, uint32_t length); + bool writeDMRData2(const uint8_t* data, uint32_t length, bool immediate = false); /// Writes P25 frame data to the P25 ring buffer. - bool writeP25Data(const uint8_t* data, uint32_t length); + bool writeP25Data(const uint8_t* data, uint32_t length, bool immediate = false); /// Triggers the start of DMR transmit. bool writeDMRStart(bool tx);