From 92108f664b114fbbf642c64d967aa2532850ce00 Mon Sep 17 00:00:00 2001 From: Andy CA6JAU Date: Sat, 29 Apr 2017 11:51:59 -0300 Subject: [PATCH] Adding original MMDVM duplex support in SerialPort.cpp --- Config.h | 3 ++ SerialPort.cpp | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/Config.h b/Config.h index 11b9714..b409bf4 100644 --- a/Config.h +++ b/Config.h @@ -33,6 +33,9 @@ // Support for ADF7021-N version // #define ADF7021_N_VER +// Enable duplex mode with dual ADF7021 +// #define DUPLEX + // Bidirectional Data pin (Enable Standard TX/RX Data Interface of ADF7021): #define BIDIR_DATA_PIN diff --git a/SerialPort.cpp b/SerialPort.cpp index 8a33f19..6bd8b31 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -148,8 +148,18 @@ void CSerialPort::getStatus() reply[6U] = 0U; if (m_dmrEnable) { +#if defined(DUPLEX) + if (m_duplex) { + reply[7U] = dmrTX.getSpace1(); + reply[8U] = dmrTX.getSpace2(); + } else { reply[7U] = 10U; reply[8U] = dmrDMOTX.getSpace(); + } +#else + reply[7U] = 10U; + reply[8U] = dmrDMOTX.getSpace(); +#endif } else { reply[7U] = 0U; reply[8U] = 0U; @@ -235,6 +245,13 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint8_t length) p25TX.setTXDelay(txDelay); dmrDMOTX.setTXDelay(txDelay); +#if defined(DUPLEX) + dmrTX.setColorCode(colorCode); + dmrRX.setColorCode(colorCode); + dmrRX.setDelay(dmrDelay); + dmrIdleRX.setColorCode(colorCode); +#endif + dmrDMORX.setColorCode(colorCode); io.setLoDevYSF(ysfLoDev); @@ -310,18 +327,30 @@ void CSerialPort::setMode(MMDVM_STATE modemState) break; case STATE_DSTAR: DEBUG1("Mode set to D-Star"); +#if defined(DUPLEX) + dmrIdleRX.reset(); + dmrRX.reset(); +#endif dmrDMORX.reset(); ysfRX.reset(); p25RX.reset(); break; case STATE_YSF: DEBUG1("Mode set to System Fusion"); +#if defined(DUPLEX) + dmrIdleRX.reset(); + dmrRX.reset(); +#endif dmrDMORX.reset(); dstarRX.reset(); p25RX.reset(); break; case STATE_P25: DEBUG1("Mode set to P25"); +#if defined(DUPLEX) + dmrIdleRX.reset(); + dmrRX.reset(); +#endif dmrDMORX.reset(); dstarRX.reset(); ysfRX.reset(); @@ -458,12 +487,34 @@ void CSerialPort::process() break; case MMDVM_DMR_DATA1: + #if defined(DUPLEX) + if (m_dmrEnable) { + if (m_modemState == STATE_IDLE || m_modemState == STATE_DMR) { + if (m_duplex) + err = dmrTX.writeData1(m_buffer + 3U, m_len - 3U); + } + } + if (err == 0U) { + if (m_modemState == STATE_IDLE) + setMode(STATE_DMR); + } else { + DEBUG2("Received invalid DMR data", err); + sendNAK(err); + } + #endif break; case MMDVM_DMR_DATA2: if (m_dmrEnable) { if (m_modemState == STATE_IDLE || m_modemState == STATE_DMR) { + #if defined(DUPLEX) + if (m_duplex) + err = dmrTX.writeData2(m_buffer + 3U, m_len - 3U); + else + err = dmrDMOTX.writeData(m_buffer + 3U, m_len - 3U); + #else err = dmrDMOTX.writeData(m_buffer + 3U, m_len - 3U); + #endif } } if (err == 0U) { @@ -476,12 +527,48 @@ void CSerialPort::process() break; case MMDVM_DMR_START: + #if defined(DUPLEX) + if (m_dmrEnable) { + err = 4U; + if (m_len == 4U) { + if (m_buffer[3U] == 0x01U && m_modemState == STATE_DMR) { + if (!m_tx) + dmrTX.setStart(true); + err = 0U; + } else if (m_buffer[3U] == 0x00U && m_modemState == STATE_DMR) { + if (m_tx) + dmrTX.setStart(false); + err = 0U; + } + } + } + if (err != 0U) { + DEBUG2("Received invalid DMR start", err); + sendNAK(err); + } + #endif break; case MMDVM_DMR_SHORTLC: + #if defined(DUPLEX) + if (m_dmrEnable) + err = dmrTX.writeShortLC(m_buffer + 3U, m_len - 3U); + if (err != 0U) { + DEBUG2("Received invalid DMR Short LC", err); + sendNAK(err); + } + #endif break; case MMDVM_DMR_ABORT: + #if defined(DUPLEX) + if (m_dmrEnable) + err = dmrTX.writeAbort(m_buffer + 3U, m_len - 3U); + if (err != 0U) { + DEBUG2("Received invalid DMR Abort", err); + sendNAK(err); + } + #endif break; case MMDVM_YSF_DATA: