diff --git a/IO.cpp b/IO.cpp index fb9a325..d7a6ec9 100644 --- a/IO.cpp +++ b/IO.cpp @@ -62,6 +62,7 @@ m_dstarTXLevel(128 * 128), m_dmrTXLevel(128 * 128), m_ysfTXLevel(128 * 128), m_p25TXLevel(128 * 128), +m_txDCOffset(DC_OFFSET), m_ledCount(0U), m_ledValue(true), m_detect(false), @@ -299,7 +300,7 @@ void CIO::write(MMDVM_STATE mode, q15_t* samples, uint16_t length, const uint8_t for (uint16_t i = 0U; i < length; i++) { q31_t res1 = samples[i] * txLevel; q15_t res2 = q15_t(__SSAT((res1 >> 15), 16)); - uint16_t res3 = uint16_t(res2 + DC_OFFSET); + uint16_t res3 = uint16_t(res2 + m_txDCOffset); // Detect DAC overflow if (res3 > 4095U) @@ -340,7 +341,7 @@ void CIO::setMode() #endif } -void CIO::setParameters(bool rxInvert, bool txInvert, bool pttInvert, uint8_t rxLevel, uint8_t cwIdTXLevel, uint8_t dstarTXLevel, uint8_t dmrTXLevel, uint8_t ysfTXLevel, uint8_t p25TXLevel) +void CIO::setParameters(bool rxInvert, bool txInvert, bool pttInvert, uint8_t rxLevel, uint8_t cwIdTXLevel, uint8_t dstarTXLevel, uint8_t dmrTXLevel, uint8_t ysfTXLevel, uint8_t p25TXLevel, int16_t txDCOffset) { m_pttInvert = pttInvert; @@ -350,6 +351,8 @@ void CIO::setParameters(bool rxInvert, bool txInvert, bool pttInvert, uint8_t rx m_dmrTXLevel = q15_t(dmrTXLevel * 128); m_ysfTXLevel = q15_t(ysfTXLevel * 128); m_p25TXLevel = q15_t(p25TXLevel * 128); + + m_txDCOffset = DC_OFFSET + txDCOffset; if (rxInvert) m_rxLevel = -m_rxLevel; diff --git a/IO.h b/IO.h index 6e243c8..6c2fe7d 100644 --- a/IO.h +++ b/IO.h @@ -42,7 +42,7 @@ public: void interrupt(); - void setParameters(bool rxInvert, bool txInvert, bool pttInvert, uint8_t rxLevel, uint8_t cwIdTXLevel, uint8_t dstarTXLevel, uint8_t dmrTXLevel, uint8_t ysfTXLevel, uint8_t p25TXLevel); + void setParameters(bool rxInvert, bool txInvert, bool pttInvert, uint8_t rxLevel, uint8_t cwIdTXLevel, uint8_t dstarTXLevel, uint8_t dmrTXLevel, uint8_t ysfTXLevel, uint8_t p25TXLevel, int16_t txDCOffset); void getOverflow(bool& adcOverflow, bool& dacOverflow); @@ -79,6 +79,8 @@ private: q15_t m_ysfTXLevel; q15_t m_p25TXLevel; + uint16_t m_txDCOffset; + uint32_t m_ledCount; bool m_ledValue; diff --git a/SerialPort.cpp b/SerialPort.cpp index daf0ee9..44a8f17 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -221,7 +221,7 @@ void CSerialPort::getVersion() uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) { - if (length < 13U) + if (length < 14U) return 4U; bool rxInvert = (data[0U] & 0x01U) == 0x01U; @@ -268,6 +268,8 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) uint8_t ysfTXLevel = data[11U]; uint8_t p25TXLevel = data[12U]; + int16_t txDCOffset = int16_t(data[13U]) - 128; + m_modemState = modemState; m_dstarEnable = dstarEnable; @@ -289,7 +291,7 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) ysfTX.setLoDev(ysfLoDev); - io.setParameters(rxInvert, txInvert, pttInvert, rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel); + io.setParameters(rxInvert, txInvert, pttInvert, rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, txDCOffset); io.start();