From 06b4fba6031c3bc96826363665fac78938fbcfc4 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Thu, 9 Jan 2025 14:46:13 +0100 Subject: [PATCH] Added noise floor monitoring and reporting to host --- Config.h | 3 +++ RNode_Firmware.ino | 25 +++++++++++++++++++++++++ Utilities.h | 6 +++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Config.h b/Config.h index 903fff8..0a2cef2 100644 --- a/Config.h +++ b/Config.h @@ -95,6 +95,7 @@ #define CSMA_CW_PER_BAND_WINDOWS 15 #define CSMA_BAND_1_MAX_AIRTIME 7 #define CSMA_BAND_N_MIN_AIRTIME 85 + #define CSMA_INFR_THRESHOLD_DB 12 int csma_slot_ms = CSMA_SLOT_MIN_MS; unsigned long difs_ms = CSMA_SIFS_MS + 2*csma_slot_ms; unsigned long difs_wait_start = -1; @@ -131,6 +132,8 @@ uint8_t model = 0x00; uint8_t hwrev = 0x00; + #define NOISE_FLOOR_SAMPLES 16 + int noise_floor = -292; int current_rssi = -292; int last_rssi = -292; uint8_t last_rssi_raw = 0x00; diff --git a/RNode_Firmware.ino b/RNode_Firmware.ino index 0d0584b..12f6df0 100644 --- a/RNode_Firmware.ino +++ b/RNode_Firmware.ino @@ -1191,6 +1191,30 @@ void serial_callback(uint8_t sbyte) { bool medium_free() { update_modem_status(); return !dcd; } +bool noise_floor_sampled = false; +int noise_floor_sample = 0; +int noise_floor_buffer[NOISE_FLOOR_SAMPLES] = {0}; +void update_noise_floor() { + #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 + if (!dcd) { + if (!noise_floor_sampled || current_rssi < noise_floor + CSMA_INFR_THRESHOLD_DB) { + noise_floor_buffer[noise_floor_sample] = current_rssi; + noise_floor_sample = noise_floor_sample+1; + if (noise_floor_sample >= NOISE_FLOOR_SAMPLES) { + noise_floor_sample %= NOISE_FLOOR_SAMPLES; + noise_floor_sampled = true; + } + + if (noise_floor_sampled) { + noise_floor = 0; + for (int ni = 0; ni < NOISE_FLOOR_SAMPLES; ni++) { noise_floor += noise_floor_buffer[ni]; } + noise_floor /= NOISE_FLOOR_SAMPLES; + } + } + } + #endif +} + void update_modem_status() { #if MCU_VARIANT == MCU_ESP32 portENTER_CRITICAL(&update_lock); @@ -1220,6 +1244,7 @@ void update_modem_status() { void check_modem_status() { if (millis()-last_status_update >= status_interval_ms) { update_modem_status(); + update_noise_floor(); #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 util_samples[dcd_sample] = dcd; diff --git a/Utilities.h b/Utilities.h index 3b54629..03e4985 100644 --- a/Utilities.h +++ b/Utilities.h @@ -752,7 +752,7 @@ void kiss_indicate_stat_tx() { } void kiss_indicate_stat_rssi() { - uint8_t packet_rssi_val = (uint8_t)(last_rssi+rssi_offset); + uint8_t packet_rssi_val = (uint8_t)(last_rssi+rssi_offset); serial_write(FEND); serial_write(CMD_STAT_RSSI); escaped_serial_write(packet_rssi_val); @@ -845,6 +845,8 @@ void kiss_indicate_channel_stats() { uint16_t atl = (uint16_t)(longterm_airtime*100*100); uint16_t cls = (uint16_t)(total_channel_util*100*100); uint16_t cll = (uint16_t)(longterm_channel_util*100*100); + uint8_t crs = (uint8_t)(current_rssi+rssi_offset); + uint8_t nfl = (uint8_t)(noise_floor+rssi_offset); serial_write(FEND); serial_write(CMD_STAT_CHTM); escaped_serial_write(ats>>8); @@ -855,6 +857,8 @@ void kiss_indicate_channel_stats() { escaped_serial_write(cls); escaped_serial_write(cll>>8); escaped_serial_write(cll); + escaped_serial_write(crs); + escaped_serial_write(nfl); serial_write(FEND); #endif }