diff --git a/examples/kiss_modem/KissModem.cpp b/examples/kiss_modem/KissModem.cpp index 94e4fe83..ebe2e98f 100644 --- a/examples/kiss_modem/KissModem.cpp +++ b/examples/kiss_modem/KissModem.cpp @@ -24,6 +24,7 @@ KissModem::KissModem(Stream& serial, mesh::LocalIdentity& identity, mesh::RNG& r _isSendCompleteCallback = nullptr; _onSendFinishedCallback = nullptr; _config = {0, 0, 0, 0, 0}; + _signal_report_enabled = true; } void KissModem::begin() { @@ -239,6 +240,12 @@ void KissModem::handleHardwareCommand(uint8_t sub_cmd, const uint8_t* data, uint case HW_CMD_GET_DEVICE_NAME: handleGetDeviceName(); break; + case HW_CMD_SET_SIGNAL_REPORT: + handleSetSignalReport(data, len); + break; + case HW_CMD_GET_SIGNAL_REPORT: + handleGetSignalReport(); + break; default: writeHardwareError(HW_ERR_UNKNOWN_CMD); break; @@ -304,8 +311,10 @@ void KissModem::processTx() { void KissModem::onPacketReceived(int8_t snr, int8_t rssi, const uint8_t* packet, uint16_t len) { writeFrame(KISS_CMD_DATA, packet, len); - uint8_t meta[2] = { (uint8_t)snr, (uint8_t)rssi }; - writeHardwareFrame(HW_RESP_RX_META, meta, 2); + if (_signal_report_enabled) { + uint8_t meta[2] = { (uint8_t)snr, (uint8_t)rssi }; + writeHardwareFrame(HW_RESP_RX_META, meta, 2); + } } void KissModem::handleGetIdentity() { @@ -572,3 +581,18 @@ void KissModem::handleGetDeviceName() { const char* name = _board.getManufacturerName(); writeHardwareFrame(HW_RESP_DEVICE_NAME, (const uint8_t*)name, strlen(name)); } + +void KissModem::handleSetSignalReport(const uint8_t* data, uint16_t len) { + if (len < 1) { + writeHardwareError(HW_ERR_INVALID_LENGTH); + return; + } + _signal_report_enabled = (data[0] != 0x00); + uint8_t val = _signal_report_enabled ? 0x01 : 0x00; + writeHardwareFrame(HW_RESP_SIGNAL_REPORT, &val, 1); +} + +void KissModem::handleGetSignalReport() { + uint8_t val = _signal_report_enabled ? 0x01 : 0x00; + writeHardwareFrame(HW_RESP_SIGNAL_REPORT, &val, 1); +} diff --git a/examples/kiss_modem/KissModem.h b/examples/kiss_modem/KissModem.h index f364f3ce..6a5e25dd 100644 --- a/examples/kiss_modem/KissModem.h +++ b/examples/kiss_modem/KissModem.h @@ -51,6 +51,8 @@ #define HW_CMD_GET_DEVICE_NAME 0x16 #define HW_CMD_PING 0x17 #define HW_CMD_REBOOT 0x18 +#define HW_CMD_SET_SIGNAL_REPORT 0x19 +#define HW_CMD_GET_SIGNAL_REPORT 0x1A /* Response code = command code | 0x80. Generic / unsolicited use 0xF0+. */ #define HW_RESP(cmd) ((cmd) | 0x80) @@ -76,6 +78,7 @@ #define HW_RESP_SENSORS HW_RESP(HW_CMD_GET_SENSORS) /* 0x95 */ #define HW_RESP_DEVICE_NAME HW_RESP(HW_CMD_GET_DEVICE_NAME) /* 0x96 */ #define HW_RESP_PONG HW_RESP(HW_CMD_PING) /* 0x97 */ +#define HW_RESP_SIGNAL_REPORT HW_RESP(HW_CMD_GET_SIGNAL_REPORT) /* 0x9A */ /* Generic responses (shared by multiple commands) */ #define HW_RESP_OK 0xF0 @@ -153,6 +156,7 @@ class KissModem { OnSendFinishedCallback _onSendFinishedCallback; RadioConfig _config; + bool _signal_report_enabled; void writeByte(uint8_t b); void writeFrame(uint8_t type, const uint8_t* data, uint16_t len); @@ -186,6 +190,8 @@ class KissModem { void handleGetMCUTemp(); void handleReboot(); void handleGetDeviceName(); + void handleSetSignalReport(const uint8_t* data, uint16_t len); + void handleGetSignalReport(); public: KissModem(Stream& serial, mesh::LocalIdentity& identity, mesh::RNG& rng,