Adding original MMDVM duplex support in SerialPort.cpp

pull/14/head
Andy CA6JAU 9 years ago
parent 6ff367081a
commit 92108f664b

@ -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

@ -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:

Loading…
Cancel
Save

Powered by TurnKey Linux.