Fix a potential issue with reporting the wrong command type in ACK and NAK messages.

This commit is contained in:
Jonathan Naylor 2021-06-17 16:55:59 +01:00
parent 43b53fe2fc
commit f4e1c0b401
3 changed files with 43 additions and 43 deletions

View File

@ -146,26 +146,26 @@ m_i2CData()
{ {
} }
void CSerialPort::sendACK() void CSerialPort::sendACK(uint8_t type)
{ {
uint8_t reply[4U]; uint8_t reply[4U];
reply[0U] = MMDVM_FRAME_START; reply[0U] = MMDVM_FRAME_START;
reply[1U] = 4U; reply[1U] = 4U;
reply[2U] = MMDVM_ACK; reply[2U] = MMDVM_ACK;
reply[3U] = m_buffer[2U]; reply[3U] = type;
writeInt(1U, reply, 4); writeInt(1U, reply, 4);
} }
void CSerialPort::sendNAK(uint8_t err) void CSerialPort::sendNAK(uint8_t type, uint8_t err)
{ {
uint8_t reply[5U]; uint8_t reply[5U];
reply[0U] = MMDVM_FRAME_START; reply[0U] = MMDVM_FRAME_START;
reply[1U] = 5U; reply[1U] = 5U;
reply[2U] = MMDVM_NAK; reply[2U] = MMDVM_NAK;
reply[3U] = m_buffer[2U]; reply[3U] = type;
reply[4U] = err; reply[4U] = err;
writeInt(1U, reply, 5); writeInt(1U, reply, 5);
@ -980,61 +980,61 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
case MMDVM_SET_CONFIG: case MMDVM_SET_CONFIG:
err = setConfig(buffer, length); err = setConfig(buffer, length);
if (err == 0U) if (err == 0U)
sendACK(); sendACK(type);
else else
sendNAK(err); sendNAK(type, err);
break; break;
case MMDVM_SET_MODE: case MMDVM_SET_MODE:
err = setMode(buffer, length); err = setMode(buffer, length);
if (err == 0U) if (err == 0U)
sendACK(); sendACK(type);
else else
sendNAK(err); sendNAK(type, err);
break; break;
case MMDVM_SET_FREQ: case MMDVM_SET_FREQ:
sendACK(); sendACK(type);
break; break;
#if defined(MODE_FM) #if defined(MODE_FM)
case MMDVM_FM_PARAMS1: case MMDVM_FM_PARAMS1:
err = setFMParams1(buffer, length); err = setFMParams1(buffer, length);
if (err == 0U) { if (err == 0U) {
sendACK(); sendACK(type);
} else { } else {
DEBUG2("Received invalid FM params 1", err); DEBUG2("Received invalid FM params 1", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
case MMDVM_FM_PARAMS2: case MMDVM_FM_PARAMS2:
err = setFMParams2(buffer, length); err = setFMParams2(buffer, length);
if (err == 0U) { if (err == 0U) {
sendACK(); sendACK(type);
} else { } else {
DEBUG2("Received invalid FM params 2", err); DEBUG2("Received invalid FM params 2", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
case MMDVM_FM_PARAMS3: case MMDVM_FM_PARAMS3:
err = setFMParams3(buffer, length); err = setFMParams3(buffer, length);
if (err == 0U) { if (err == 0U) {
sendACK(); sendACK(type);
} else { } else {
DEBUG2("Received invalid FM params 3", err); DEBUG2("Received invalid FM params 3", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
case MMDVM_FM_PARAMS4: case MMDVM_FM_PARAMS4:
err = setFMParams4(buffer, length); err = setFMParams4(buffer, length);
if (err == 0U) { if (err == 0U) {
sendACK(); sendACK(type);
} else { } else {
DEBUG2("Received invalid FM params 4", err); DEBUG2("Received invalid FM params 4", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
#else #else
@ -1042,7 +1042,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
case MMDVM_FM_PARAMS2: case MMDVM_FM_PARAMS2:
case MMDVM_FM_PARAMS3: case MMDVM_FM_PARAMS3:
case MMDVM_FM_PARAMS4: case MMDVM_FM_PARAMS4:
sendACK(); sendACK(type);
break; break;
#endif #endif
@ -1072,10 +1072,10 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
err = calPOCSAG.write(buffer, length); err = calPOCSAG.write(buffer, length);
#endif #endif
if (err == 0U) { if (err == 0U) {
sendACK(); sendACK(type);
} else { } else {
DEBUG2("Received invalid calibration data", err); DEBUG2("Received invalid calibration data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
@ -1085,7 +1085,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
err = cwIdTX.write(buffer, length); err = cwIdTX.write(buffer, length);
if (err != 0U) { if (err != 0U) {
DEBUG2("Invalid CW Id data", err); DEBUG2("Invalid CW Id data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
@ -1100,7 +1100,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_DSTAR); setMode(STATE_DSTAR);
} else { } else {
DEBUG2("Received invalid D-Star header", err); DEBUG2("Received invalid D-Star header", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
@ -1114,7 +1114,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_DSTAR); setMode(STATE_DSTAR);
} else { } else {
DEBUG2("Received invalid D-Star data", err); DEBUG2("Received invalid D-Star data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
@ -1128,7 +1128,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_DSTAR); setMode(STATE_DSTAR);
} else { } else {
DEBUG2("Received invalid D-Star EOT", err); DEBUG2("Received invalid D-Star EOT", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
#endif #endif
@ -1146,7 +1146,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_DMR); setMode(STATE_DMR);
} else { } else {
DEBUG2("Received invalid DMR data", err); DEBUG2("Received invalid DMR data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
@ -1164,7 +1164,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_DMR); setMode(STATE_DMR);
} else { } else {
DEBUG2("Received invalid DMR data", err); DEBUG2("Received invalid DMR data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
@ -1185,7 +1185,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
} }
if (err != 0U) { if (err != 0U) {
DEBUG2("Received invalid DMR start", err); DEBUG2("Received invalid DMR start", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
@ -1194,7 +1194,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
err = dmrTX.writeShortLC(buffer, length); err = dmrTX.writeShortLC(buffer, length);
if (err != 0U) { if (err != 0U) {
DEBUG2("Received invalid DMR Short LC", err); DEBUG2("Received invalid DMR Short LC", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
@ -1203,7 +1203,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
err = dmrTX.writeAbort(buffer, length); err = dmrTX.writeAbort(buffer, length);
if (err != 0U) { if (err != 0U) {
DEBUG2("Received invalid DMR Abort", err); DEBUG2("Received invalid DMR Abort", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
#endif #endif
@ -1219,7 +1219,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_YSF); setMode(STATE_YSF);
} else { } else {
DEBUG2("Received invalid System Fusion data", err); DEBUG2("Received invalid System Fusion data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
#endif #endif
@ -1235,7 +1235,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_P25); setMode(STATE_P25);
} else { } else {
DEBUG2("Received invalid P25 header", err); DEBUG2("Received invalid P25 header", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
@ -1249,7 +1249,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_P25); setMode(STATE_P25);
} else { } else {
DEBUG2("Received invalid P25 LDU", err); DEBUG2("Received invalid P25 LDU", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
#endif #endif
@ -1265,7 +1265,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_NXDN); setMode(STATE_NXDN);
} else { } else {
DEBUG2("Received invalid NXDN data", err); DEBUG2("Received invalid NXDN data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
#endif #endif
@ -1281,7 +1281,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_M17); setMode(STATE_M17);
} else { } else {
DEBUG2("Received invalid M17 link setup data", err); DEBUG2("Received invalid M17 link setup data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
@ -1295,7 +1295,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_M17); setMode(STATE_M17);
} else { } else {
DEBUG2("Received invalid M17 stream data", err); DEBUG2("Received invalid M17 stream data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
@ -1309,7 +1309,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_M17); setMode(STATE_M17);
} else { } else {
DEBUG2("Received invalid M17 packet data", err); DEBUG2("Received invalid M17 packet data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
#endif #endif
@ -1325,7 +1325,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_POCSAG); setMode(STATE_POCSAG);
} else { } else {
DEBUG2("Received invalid POCSAG data", err); DEBUG2("Received invalid POCSAG data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
#endif #endif
@ -1341,7 +1341,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
setMode(STATE_FM); setMode(STATE_FM);
} else { } else {
DEBUG2("Received invalid FM data", err); DEBUG2("Received invalid FM data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
#endif #endif
@ -1354,7 +1354,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
} }
if (err != 0U) { if (err != 0U) {
DEBUG2("Received invalid AX.25 data", err); DEBUG2("Received invalid AX.25 data", err);
sendNAK(err); sendNAK(type, err);
} }
break; break;
#endif #endif
@ -1382,7 +1382,7 @@ void CSerialPort::processMessage(uint8_t type, const uint8_t* buffer, uint16_t l
default: default:
// Handle this, send a NAK back // Handle this, send a NAK back
sendNAK(1U); sendNAK(type, 1U);
break; break;
} }

View File

@ -109,8 +109,8 @@ private:
uint16_t m_lastSerialAvailCount; uint16_t m_lastSerialAvailCount;
CRingBuffer<uint8_t> m_i2CData; CRingBuffer<uint8_t> m_i2CData;
void sendACK(); void sendACK(uint8_t type);
void sendNAK(uint8_t err); void sendNAK(uint8_t type, uint8_t err);
void getStatus(); void getStatus();
void getVersion(); void getVersion();
uint8_t setConfig(const uint8_t* data, uint16_t length); uint8_t setConfig(const uint8_t* data, uint16_t length);

View File

@ -19,7 +19,7 @@
#if !defined(VERSION_H) #if !defined(VERSION_H)
#define VERSION_H #define VERSION_H
#define VERSION "20210508" #define VERSION "20210617"
#endif #endif