]> git.tnoah.ca Git - lora-radio.git/commitdiff
Added noise floor monitoring and reporting to host
authorMark Qvist <mark@unsigned.io>
Thu, 9 Jan 2025 13:46:13 +0000 (14:46 +0100)
committerMark Qvist <mark@unsigned.io>
Thu, 9 Jan 2025 13:46:13 +0000 (14:46 +0100)
Config.h
RNode_Firmware.ino
Utilities.h

index 903fff89585161961c1bb79cd3d348a7a188fd99..0a2cef203766cf915df51ae59c3d6f3cef5e1385 100644 (file)
--- 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;
        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;
index 0d0584bf7ebb13d22ed1400b09d2e6fd9d19f4cc..12f6df0b6c68e7d376b75a4fdee56fd948aa27ee 100644 (file)
@@ -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;
index 3b54629635acf9143631d725dc8c110022098c9a..03e49854153f631e85a5c279b8094a8737aabc4a 100644 (file)
@@ -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
 }