diff --git a/SerialPort.cpp b/SerialPort.cpp index 37d19ed..fd2678f 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -218,6 +218,7 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) bool rxInvert = (data[0U] & 0x01U) == 0x01U; bool txInvert = (data[0U] & 0x02U) == 0x02U; bool pttInvert = (data[0U] & 0x04U) == 0x04U; + bool ysfLoDev = (data[0U] & 0x08U) == 0x08U; bool simplex = (data[0U] & 0x80U) == 0x80U; bool dstarEnable = (data[1U] & 0x01U) == 0x01U; @@ -275,6 +276,8 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) dmrDMORX.setColorCode(colorCode); dmrIdleRX.setColorCode(colorCode); + ysfTX.setLoDev(ysfLoDev); + io.setParameters(rxInvert, txInvert, pttInvert, rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel); io.start(); diff --git a/YSFTX.cpp b/YSFTX.cpp index fcdcb87..5ed0a0b 100644 --- a/YSFTX.cpp +++ b/YSFTX.cpp @@ -37,10 +37,15 @@ static q15_t YSF_C4FSK_FILTER[] = {401, 104, -340, -731, -847, -553, 112, 909, 1 const uint16_t YSF_C4FSK_FILTER_LEN = 42U; #endif -const q15_t YSF_LEVELA[] = { 809, 809, 809, 809, 809}; -const q15_t YSF_LEVELB[] = { 269, 269, 269, 269, 269}; -const q15_t YSF_LEVELC[] = {-269, -269, -269, -269, -269}; -const q15_t YSF_LEVELD[] = {-809, -809, -809, -809, -809}; +const q15_t YSF_LEVELA_HI[] = { 809, 809, 809, 809, 809}; +const q15_t YSF_LEVELB_HI[] = { 269, 269, 269, 269, 269}; +const q15_t YSF_LEVELC_HI[] = {-269, -269, -269, -269, -269}; +const q15_t YSF_LEVELD_HI[] = {-809, -809, -809, -809, -809}; + +const q15_t YSF_LEVELA_LO[] = { 405, 405, 405, 405, 405}; +const q15_t YSF_LEVELB_LO[] = { 135, 135, 135, 135, 135}; +const q15_t YSF_LEVELC_LO[] = {-135, -135, -135, -135, -135}; +const q15_t YSF_LEVELD_LO[] = {-405, -405, -405, -405, -405}; const uint8_t YSF_START_SYNC = 0x77U; const uint8_t YSF_END_SYNC = 0xFFU; @@ -52,7 +57,8 @@ m_modState(), m_poBuffer(), m_poLen(0U), m_poPtr(0U), -m_txDelay(240U) // 200ms +m_txDelay(240U), // 200ms +m_loDev(false) { ::memset(m_modState, 0x00U, 70U * sizeof(q15_t)); @@ -124,16 +130,16 @@ void CYSFTX::writeByte(uint8_t c) for (uint8_t i = 0U; i < 4U; i++, c <<= 2, p += YSF_RADIO_SYMBOL_LENGTH) { switch (c & MASK) { case 0xC0U: - ::memcpy(p, YSF_LEVELA, YSF_RADIO_SYMBOL_LENGTH * sizeof(q15_t)); + ::memcpy(p, m_loDev ? YSF_LEVELA_LO : YSF_LEVELA_HI, YSF_RADIO_SYMBOL_LENGTH * sizeof(q15_t)); break; case 0x80U: - ::memcpy(p, YSF_LEVELB, YSF_RADIO_SYMBOL_LENGTH * sizeof(q15_t)); + ::memcpy(p, m_loDev ? YSF_LEVELB_LO : YSF_LEVELB_HI, YSF_RADIO_SYMBOL_LENGTH * sizeof(q15_t)); break; case 0x00U: - ::memcpy(p, YSF_LEVELC, YSF_RADIO_SYMBOL_LENGTH * sizeof(q15_t)); + ::memcpy(p, m_loDev ? YSF_LEVELC_LO : YSF_LEVELC_HI, YSF_RADIO_SYMBOL_LENGTH * sizeof(q15_t)); break; default: - ::memcpy(p, YSF_LEVELD, YSF_RADIO_SYMBOL_LENGTH * sizeof(q15_t)); + ::memcpy(p, m_loDev ? YSF_LEVELD_LO : YSF_LEVELD_HI, YSF_RADIO_SYMBOL_LENGTH * sizeof(q15_t)); break; } } @@ -153,3 +159,8 @@ uint8_t CYSFTX::getSpace() const return m_buffer.getSpace() / YSF_FRAME_LENGTH_BYTES; } +void CYSFTX::setLoDev(bool on) +{ + m_loDev = on; +} + diff --git a/YSFTX.h b/YSFTX.h index b51d5b7..c38cf96 100644 --- a/YSFTX.h +++ b/YSFTX.h @@ -35,6 +35,8 @@ public: uint8_t getSpace() const; + void setLoDev(bool on); + private: CSerialRB m_buffer; arm_fir_instance_q15 m_modFilter; @@ -43,6 +45,7 @@ private: uint16_t m_poLen; uint16_t m_poPtr; uint16_t m_txDelay; + bool m_loDev; void writeByte(uint8_t c); };