Small changes to the serial protocol.

This commit is contained in:
Jonathan Naylor 2020-11-09 14:23:43 +00:00
parent 31744a237a
commit d144ce6f1c
1 changed files with 173 additions and 80 deletions

View File

@ -163,11 +163,11 @@ void CSerialPort::getStatus()
{ {
io.resetWatchdog(); io.resetWatchdog();
uint8_t reply[20U]; uint8_t reply[30U];
// Send all sorts of interesting internal values // Send all sorts of interesting internal values
reply[0U] = MMDVM_FRAME_START; reply[0U] = MMDVM_FRAME_START;
reply[1U] = 15U; reply[1U] = 20U;
reply[2U] = MMDVM_GET_STATUS; reply[2U] = MMDVM_GET_STATUS;
reply[3U] = uint8_t(m_modemState); reply[3U] = uint8_t(m_modemState);
@ -195,72 +195,65 @@ void CSerialPort::getStatus()
reply[4U] |= m_dcd ? 0x40U : 0x00U; reply[4U] |= m_dcd ? 0x40U : 0x00U;
reply[5U] = 0x00U;
#if defined(MODE_DSTAR) #if defined(MODE_DSTAR)
if (m_dstarEnable) if (m_dstarEnable)
reply[5U] = dstarTX.getSpace(); reply[6U] = dstarTX.getSpace();
else else
reply[5U] = 0U; reply[6U] = 0U;
#else #else
reply[5U] = 0U; reply[6U] = 0U;
#endif #endif
#if defined(MODE_DMR) #if defined(MODE_DMR)
if (m_dmrEnable) { if (m_dmrEnable) {
if (m_duplex) { if (m_duplex) {
reply[6U] = dmrTX.getSpace1(); reply[7U] = dmrTX.getSpace1();
reply[7U] = dmrTX.getSpace2(); reply[8U] = dmrTX.getSpace2();
} else { } else {
reply[6U] = 10U; reply[7U] = 10U;
reply[7U] = dmrDMOTX.getSpace(); reply[8U] = dmrDMOTX.getSpace();
} }
} else { } else {
reply[6U] = 0U;
reply[7U] = 0U; reply[7U] = 0U;
reply[8U] = 0U;
} }
#else #else
reply[6U] = 0U;
reply[7U] = 0U; reply[7U] = 0U;
reply[8U] = 0U;
#endif #endif
#if defined(MODE_YSF) #if defined(MODE_YSF)
if (m_ysfEnable) if (m_ysfEnable)
reply[8U] = ysfTX.getSpace(); reply[9U] = ysfTX.getSpace();
else
reply[8U] = 0U;
#else
reply[8U] = 0U;
#endif
#if defined(MODE_P25)
if (m_p25Enable)
reply[9U] = p25TX.getSpace();
else else
reply[9U] = 0U; reply[9U] = 0U;
#else #else
reply[9U] = 0U; reply[9U] = 0U;
#endif #endif
#if defined(MODE_NXDN) #if defined(MODE_P25)
if (m_nxdnEnable) if (m_p25Enable)
reply[10U] = nxdnTX.getSpace(); reply[10U] = p25TX.getSpace();
else else
reply[10U] = 0U; reply[10U] = 0U;
#else #else
reply[10U] = 0U; reply[10U] = 0U;
#endif #endif
#if defined(MODE_M17) #if defined(MODE_NXDN)
if (m_m17Enable) if (m_nxdnEnable)
reply[11U] = m17TX.getSpace(); reply[11U] = nxdnTX.getSpace();
else else
reply[11U] = 0U; reply[11U] = 0U;
#else #else
reply[11U] = 0U; reply[11U] = 0U;
#endif #endif
#if defined(MODE_POCSAG) #if defined(MODE_M17)
if (m_pocsagEnable) if (m_m17Enable)
reply[12U] = pocsagTX.getSpace(); reply[12U] = m17TX.getSpace();
else else
reply[12U] = 0U; reply[12U] = 0U;
#else #else
@ -276,16 +269,31 @@ void CSerialPort::getStatus()
reply[13U] = 0U; reply[13U] = 0U;
#endif #endif
#if defined(MODE_AX25) reply[14U] = 0x00U;
if (m_ax25Enable) reply[15U] = 0x00U;
reply[14U] = ax25TX.getSpace();
#if defined(MODE_POCSAG)
if (m_pocsagEnable)
reply[16U] = pocsagTX.getSpace();
else else
reply[14U] = 0U; reply[16U] = 0U;
#else #else
reply[14U] = 0U; reply[16U] = 0U;
#endif #endif
writeInt(1U, reply, 15); #if defined(MODE_AX25)
if (m_ax25Enable)
reply[17U] = ax25TX.getSpace();
else
reply[17U] = 0U;
#else
reply[17U] = 0U;
#endif
reply[18U] = 0x00U;
reply[19U] = 0x00U;
writeInt(1U, reply, 20);
} }
void CSerialPort::getVersion() void CSerialPort::getVersion()
@ -315,7 +323,7 @@ void CSerialPort::getVersion()
uint8_t CSerialPort::setConfig(const uint8_t* data, uint16_t length) uint8_t CSerialPort::setConfig(const uint8_t* data, uint16_t length)
{ {
if (length < 28U) if (length < 37U)
return 4U; return 4U;
bool rxInvert = (data[0U] & 0x01U) == 0x01U; bool rxInvert = (data[0U] & 0x01U) == 0x01U;
@ -346,22 +354,70 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint16_t length)
if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_P25 && modemState != STATE_NXDN && modemState != STATE_M17 && modemState != STATE_POCSAG && modemState != STATE_FM && modemState != STATE_DSTARCAL && modemState != STATE_DMRCAL && modemState != STATE_RSSICAL && modemState != STATE_LFCAL && modemState != STATE_DMRCAL1K && modemState != STATE_P25CAL1K && modemState != STATE_DMRDMO1K && modemState != STATE_NXDNCAL1K && modemState != STATE_POCSAGCAL && modemState != STATE_FMCAL10K && modemState != STATE_FMCAL12K && modemState != STATE_FMCAL15K && modemState != STATE_FMCAL20K && modemState != STATE_FMCAL25K && modemState != STATE_FMCAL30K) if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_P25 && modemState != STATE_NXDN && modemState != STATE_M17 && modemState != STATE_POCSAG && modemState != STATE_FM && modemState != STATE_DSTARCAL && modemState != STATE_DMRCAL && modemState != STATE_RSSICAL && modemState != STATE_LFCAL && modemState != STATE_DMRCAL1K && modemState != STATE_P25CAL1K && modemState != STATE_DMRDMO1K && modemState != STATE_NXDNCAL1K && modemState != STATE_POCSAGCAL && modemState != STATE_FMCAL10K && modemState != STATE_FMCAL12K && modemState != STATE_FMCAL15K && modemState != STATE_FMCAL20K && modemState != STATE_FMCAL25K && modemState != STATE_FMCAL30K)
return 4U; return 4U;
#if defined(MODE_DSTAR)
if (modemState == STATE_DSTAR && !dstarEnable) if (modemState == STATE_DSTAR && !dstarEnable)
return 4U; return 4U;
#else
if (modemState == STATE_DSTAR)
return 4U;
#endif
#if defined(MODE_DMR)
if (modemState == STATE_DMR && !dmrEnable) if (modemState == STATE_DMR && !dmrEnable)
return 4U; return 4U;
#else
if (modemState == STATE_DMR)
return 4U;
#endif
#if defined(MODE_YSF)
if (modemState == STATE_YSF && !ysfEnable) if (modemState == STATE_YSF && !ysfEnable)
return 4U; return 4U;
#else
if (modemState == STATE_YSF)
return 4U;
#endif
#if defined(MODE_P25)
if (modemState == STATE_P25 && !p25Enable) if (modemState == STATE_P25 && !p25Enable)
return 4U; return 4U;
#else
if (modemState == STATE_P25)
return 4U;
#endif
#if defined(MODE_NXDN)
if (modemState == STATE_NXDN && !nxdnEnable) if (modemState == STATE_NXDN && !nxdnEnable)
return 4U; return 4U;
#else
if (modemState == STATE_NXDN)
return 4U;
#endif
#if defined(MODE_M17)
if (modemState == STATE_M17 && !m17Enable) if (modemState == STATE_M17 && !m17Enable)
return 4U; return 4U;
#else
if (modemState == STATE_M17)
return 4U;
#endif
#if defined(MODE_POCSAG)
if (modemState == STATE_POCSAG && !pocsagEnable) if (modemState == STATE_POCSAG && !pocsagEnable)
return 4U; return 4U;
#else
if (modemState == STATE_POCSAG)
return 4U;
#endif
#if defined(MODE_FM)
if (modemState == STATE_FM && !fmEnable) if (modemState == STATE_FM && !fmEnable)
return 4U; return 4U;
#else
if (modemState == STATE_FM)
return 4U;
#endif
int16_t txDCOffset = int16_t(data[5U]) - 128; int16_t txDCOffset = int16_t(data[5U]) - 128;
int16_t rxDCOffset = int16_t(data[6U]) - 128; int16_t rxDCOffset = int16_t(data[6U]) - 128;
@ -379,86 +435,75 @@ uint8_t CSerialPort::setConfig(const uint8_t* data, uint16_t length)
uint8_t fmTXLevel = data[16U]; uint8_t fmTXLevel = data[16U];
uint8_t ax25TXLevel = data[17U]; uint8_t ax25TXLevel = data[17U];
uint8_t ysfTXHang = data[18U]; uint8_t ysfTXHang = data[20U];
uint8_t p25TXHang = data[19U]; uint8_t p25TXHang = data[21U];
uint8_t nxdnTXHang = data[20U]; uint8_t nxdnTXHang = data[22U];
uint8_t m17TXHang = data[21U]; uint8_t m17TXHang = data[23U];
uint8_t colorCode = data[22U]; uint8_t colorCode = data[26U];
if (colorCode > 15U) if (colorCode > 15U)
return 4U; return 4U;
uint8_t dmrDelay = data[23U]; uint8_t dmrDelay = data[27U];
int8_t ax25RXTwist = int8_t(data[24U]) - 128; int8_t ax25RXTwist = int8_t(data[28U]) - 128;
if (ax25RXTwist < -4 || ax25RXTwist > 10) if (ax25RXTwist < -4 || ax25RXTwist > 10)
return 4U; return 4U;
uint8_t ax25TXDelay = data[25U]; uint8_t ax25TXDelay = data[29U];
uint8_t ax25SlotTime = data[26U]; uint8_t ax25SlotTime = data[30U];
uint8_t ax25PPersist = data[27U]; uint8_t ax25PPersist = data[31U];
setMode(modemState); setMode(modemState);
m_dstarEnable = dstarEnable;
m_dmrEnable = dmrEnable;
m_ysfEnable = ysfEnable;
m_p25Enable = p25Enable;
m_nxdnEnable = nxdnEnable;
m_m17Enable = m17Enable;
m_pocsagEnable = pocsagEnable;
m_fmEnable = fmEnable;
m_ax25Enable = ax25Enable;
m_duplex = !simplex; m_duplex = !simplex;
#if defined(MODE_DSTAR) #if defined(MODE_DSTAR)
m_dstarEnable = dstarEnable;
dstarTX.setTXDelay(txDelay); dstarTX.setTXDelay(txDelay);
#endif #endif
#if defined(MODE_YSF)
ysfTX.setTXDelay(txDelay);
#endif
#if defined(MODE_P25)
p25TX.setTXDelay(txDelay);
#endif
#if defined(MODE_DMR) #if defined(MODE_DMR)
m_dmrEnable = dmrEnable;
dmrDMOTX.setTXDelay(txDelay); dmrDMOTX.setTXDelay(txDelay);
#endif
#if defined(MODE_NXDN)
nxdnTX.setTXDelay(txDelay);
#endif
#if defined(MODE_M17)
m17TX.setTXDelay(txDelay);
#endif
#if defined(MODE_POCSAG)
pocsagTX.setTXDelay(txDelay);
#endif
#if defined(MODE_AX25)
ax25TX.setTXDelay(ax25TXDelay);
#endif
#if defined(MODE_DMR)
dmrTX.setColorCode(colorCode); dmrTX.setColorCode(colorCode);
dmrRX.setColorCode(colorCode); dmrRX.setColorCode(colorCode);
dmrRX.setDelay(dmrDelay); dmrRX.setDelay(dmrDelay);
dmrDMORX.setColorCode(colorCode); dmrDMORX.setColorCode(colorCode);
dmrIdleRX.setColorCode(colorCode); dmrIdleRX.setColorCode(colorCode);
#endif #endif
#if defined(MODE_YSF) #if defined(MODE_YSF)
m_ysfEnable = ysfEnable;
ysfTX.setTXDelay(txDelay);
ysfTX.setParams(ysfLoDev, ysfTXHang); ysfTX.setParams(ysfLoDev, ysfTXHang);
#endif #endif
#if defined(MODE_P25) #if defined(MODE_P25)
m_p25Enable = p25Enable;
p25TX.setTXDelay(txDelay);
p25TX.setParams(p25TXHang); p25TX.setParams(p25TXHang);
#endif #endif
#if defined(MODE_NXDN) #if defined(MODE_NXDN)
m_nxdnEnable = nxdnEnable;
nxdnTX.setTXDelay(txDelay);
nxdnTX.setParams(nxdnTXHang); nxdnTX.setParams(nxdnTXHang);
#endif #endif
#if defined(MODE_M17) #if defined(MODE_M17)
m_m17Enable = m17Enable;
m17TX.setTXDelay(txDelay);
m17TX.setParams(m17TXHang); m17TX.setParams(m17TXHang);
#endif #endif
#if defined(MODE_POCSAG)
m_pocsagEnable = pocsagEnable;
pocsagTX.setTXDelay(txDelay);
#endif
#if defined(MODE_AX25) #if defined(MODE_AX25)
m_ax25Enable = ax25Enable;
ax25TX.setTXDelay(ax25TXDelay);
ax25RX.setParams(ax25RXTwist, ax25SlotTime, ax25PPersist); ax25RX.setParams(ax25RXTwist, ax25SlotTime, ax25PPersist);
#endif #endif
#if defined(MODE_FM)
m_fmEnable = fmEnable;
#endif
io.setParameters(rxInvert, txInvert, pttInvert, rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, m17TXLevel, pocsagTXLevel, fmTXLevel, ax25TXLevel, txDCOffset, rxDCOffset, useCOSAsLockout); io.setParameters(rxInvert, txInvert, pttInvert, rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, m17TXLevel, pocsagTXLevel, fmTXLevel, ax25TXLevel, txDCOffset, rxDCOffset, useCOSAsLockout);
@ -575,22 +620,70 @@ uint8_t CSerialPort::setMode(const uint8_t* data, uint16_t length)
if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_P25 && modemState != STATE_NXDN && modemState != STATE_M17 && modemState != STATE_POCSAG && modemState != STATE_FM && modemState != STATE_DSTARCAL && modemState != STATE_DMRCAL && modemState != STATE_RSSICAL && modemState != STATE_LFCAL && modemState != STATE_DMRCAL1K && modemState != STATE_P25CAL1K && modemState != STATE_DMRDMO1K && modemState != STATE_NXDNCAL1K && modemState != STATE_POCSAGCAL && modemState != STATE_FMCAL10K && modemState != STATE_FMCAL12K && modemState != STATE_FMCAL15K && modemState != STATE_FMCAL20K && modemState != STATE_FMCAL25K && modemState != STATE_FMCAL30K) if (modemState != STATE_IDLE && modemState != STATE_DSTAR && modemState != STATE_DMR && modemState != STATE_YSF && modemState != STATE_P25 && modemState != STATE_NXDN && modemState != STATE_M17 && modemState != STATE_POCSAG && modemState != STATE_FM && modemState != STATE_DSTARCAL && modemState != STATE_DMRCAL && modemState != STATE_RSSICAL && modemState != STATE_LFCAL && modemState != STATE_DMRCAL1K && modemState != STATE_P25CAL1K && modemState != STATE_DMRDMO1K && modemState != STATE_NXDNCAL1K && modemState != STATE_POCSAGCAL && modemState != STATE_FMCAL10K && modemState != STATE_FMCAL12K && modemState != STATE_FMCAL15K && modemState != STATE_FMCAL20K && modemState != STATE_FMCAL25K && modemState != STATE_FMCAL30K)
return 4U; return 4U;
#if defined(MODE_DSTAR)
if (modemState == STATE_DSTAR && !m_dstarEnable) if (modemState == STATE_DSTAR && !m_dstarEnable)
return 4U; return 4U;
#else
if (modemState == STATE_DSTAR)
return 4U;
#endif
#if defined(MODE_DMR)
if (modemState == STATE_DMR && !m_dmrEnable) if (modemState == STATE_DMR && !m_dmrEnable)
return 4U; return 4U;
#else
if (modemState == STATE_DMR)
return 4U;
#endif
#if defined(MODE_YSF)
if (modemState == STATE_YSF && !m_ysfEnable) if (modemState == STATE_YSF && !m_ysfEnable)
return 4U; return 4U;
#else
if (modemState == STATE_YSF)
return 4U;
#endif
#if defined(MODE_P25)
if (modemState == STATE_P25 && !m_p25Enable) if (modemState == STATE_P25 && !m_p25Enable)
return 4U; return 4U;
#else
if (modemState == STATE_P25)
return 4U;
#endif
#if defined(MODE_NXDN)
if (modemState == STATE_NXDN && !m_nxdnEnable) if (modemState == STATE_NXDN && !m_nxdnEnable)
return 4U; return 4U;
#else
if (modemState == STATE_NXDN)
return 4U;
#endif
#if defined(MODE_M17)
if (modemState == STATE_M17 && !m_m17Enable) if (modemState == STATE_M17 && !m_m17Enable)
return 4U; return 4U;
#else
if (modemState == STATE_M17)
return 4U;
#endif
#if defined(MODE_POCSAG)
if (modemState == STATE_POCSAG && !m_pocsagEnable) if (modemState == STATE_POCSAG && !m_pocsagEnable)
return 4U; return 4U;
#else
if (modemState == STATE_POCSAG)
return 4U;
#endif
#if defined(MODE_FM)
if (modemState == STATE_FM && !m_fmEnable) if (modemState == STATE_FM && !m_fmEnable)
return 4U; return 4U;
#else
if (modemState == STATE_FM)
return 4U;
#endif
setMode(modemState); setMode(modemState);
@ -600,12 +693,12 @@ uint8_t CSerialPort::setMode(const uint8_t* data, uint16_t length)
void CSerialPort::setMode(MMDVM_STATE modemState) void CSerialPort::setMode(MMDVM_STATE modemState)
{ {
switch (modemState) { switch (modemState) {
case STATE_DMR:
DEBUG1("Mode set to DMR");
break;
case STATE_DSTAR: case STATE_DSTAR:
DEBUG1("Mode set to D-Star"); DEBUG1("Mode set to D-Star");
break; break;
case STATE_DMR:
DEBUG1("Mode set to DMR");
break;
case STATE_YSF: case STATE_YSF:
DEBUG1("Mode set to System Fusion"); DEBUG1("Mode set to System Fusion");
break; break;