Added noise floor monitoring and reporting to host

This commit is contained in:
Mark Qvist 2025-01-09 14:46:13 +01:00
parent c5ed792280
commit 06b4fba603
3 changed files with 33 additions and 1 deletions

View File

@ -95,6 +95,7 @@
#define CSMA_CW_PER_BAND_WINDOWS 15 #define CSMA_CW_PER_BAND_WINDOWS 15
#define CSMA_BAND_1_MAX_AIRTIME 7 #define CSMA_BAND_1_MAX_AIRTIME 7
#define CSMA_BAND_N_MIN_AIRTIME 85 #define CSMA_BAND_N_MIN_AIRTIME 85
#define CSMA_INFR_THRESHOLD_DB 12
int csma_slot_ms = CSMA_SLOT_MIN_MS; int csma_slot_ms = CSMA_SLOT_MIN_MS;
unsigned long difs_ms = CSMA_SIFS_MS + 2*csma_slot_ms; unsigned long difs_ms = CSMA_SIFS_MS + 2*csma_slot_ms;
unsigned long difs_wait_start = -1; unsigned long difs_wait_start = -1;
@ -131,6 +132,8 @@
uint8_t model = 0x00; uint8_t model = 0x00;
uint8_t hwrev = 0x00; uint8_t hwrev = 0x00;
#define NOISE_FLOOR_SAMPLES 16
int noise_floor = -292;
int current_rssi = -292; int current_rssi = -292;
int last_rssi = -292; int last_rssi = -292;
uint8_t last_rssi_raw = 0x00; uint8_t last_rssi_raw = 0x00;

View File

@ -1191,6 +1191,30 @@ void serial_callback(uint8_t sbyte) {
bool medium_free() { update_modem_status(); return !dcd; } 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() { void update_modem_status() {
#if MCU_VARIANT == MCU_ESP32 #if MCU_VARIANT == MCU_ESP32
portENTER_CRITICAL(&update_lock); portENTER_CRITICAL(&update_lock);
@ -1220,6 +1244,7 @@ void update_modem_status() {
void check_modem_status() { void check_modem_status() {
if (millis()-last_status_update >= status_interval_ms) { if (millis()-last_status_update >= status_interval_ms) {
update_modem_status(); update_modem_status();
update_noise_floor();
#if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52 #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
util_samples[dcd_sample] = dcd; util_samples[dcd_sample] = dcd;

View File

@ -752,7 +752,7 @@ void kiss_indicate_stat_tx() {
} }
void kiss_indicate_stat_rssi() { 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(FEND);
serial_write(CMD_STAT_RSSI); serial_write(CMD_STAT_RSSI);
escaped_serial_write(packet_rssi_val); 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 atl = (uint16_t)(longterm_airtime*100*100);
uint16_t cls = (uint16_t)(total_channel_util*100*100); uint16_t cls = (uint16_t)(total_channel_util*100*100);
uint16_t cll = (uint16_t)(longterm_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(FEND);
serial_write(CMD_STAT_CHTM); serial_write(CMD_STAT_CHTM);
escaped_serial_write(ats>>8); escaped_serial_write(ats>>8);
@ -855,6 +857,8 @@ void kiss_indicate_channel_stats() {
escaped_serial_write(cls); escaped_serial_write(cls);
escaped_serial_write(cll>>8); escaped_serial_write(cll>>8);
escaped_serial_write(cll); escaped_serial_write(cll);
escaped_serial_write(crs);
escaped_serial_write(nfl);
serial_write(FEND); serial_write(FEND);
#endif #endif
} }