From 90445e29a787f9ba406b34fd0511a56d908fe8f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niccol=C3=B2=20Izzo?= Date: Thu, 28 Jan 2021 10:31:37 +0100 Subject: [PATCH] Implement voltage to dBm conversion in MDx MDx radios get an RSSI voltage in mV, to be converted into dBm, we used and empirically derived linear relation to compute the dBm value. --- openrtx/include/interfaces/rtx.h | 4 ++-- openrtx/include/state.h | 1 + openrtx/src/state.c | 1 + openrtx/src/threads.c | 1 + platform/drivers/baseband/rtx_MD3x0.c | 21 ++++++++++++++++++++- 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/openrtx/include/interfaces/rtx.h b/openrtx/include/interfaces/rtx.h index ccf03746..a89aa9df 100644 --- a/openrtx/include/interfaces/rtx.h +++ b/openrtx/include/interfaces/rtx.h @@ -110,8 +110,8 @@ rtxStatus_t rtx_getCurrentStatus(); void rtx_taskFunc(); /** - * Get current RSSI voltage. - * @return RSSI voltage. + * Get current RSSI in dBm. + * @return RSSI value in dBm. */ float rtx_getRssi(); diff --git a/openrtx/include/state.h b/openrtx/include/state.h index 8413a6b9..db679c93 100644 --- a/openrtx/include/state.h +++ b/openrtx/include/state.h @@ -37,6 +37,7 @@ typedef struct curTime_t time; float v_bat; float charge; + float rssi; uint8_t ui_screen; uint8_t backlight_level; diff --git a/openrtx/src/state.c b/openrtx/src/state.c index ee06a0bd..c323bad7 100644 --- a/openrtx/src/state.c +++ b/openrtx/src/state.c @@ -37,6 +37,7 @@ void state_init() #endif state.v_bat = platform_getVbat(); state.charge = battery_getCharge(state.v_bat); + state.rssi = rtx_getRssi(); state.backlight_level = 255; state.channelInfoUpdated = true; diff --git a/openrtx/src/threads.c b/openrtx/src/threads.c index cb3f5fa7..91f16e0d 100644 --- a/openrtx/src/threads.c +++ b/openrtx/src/threads.c @@ -251,6 +251,7 @@ static void dev_task(void *arg) #endif state.v_bat = platform_getVbat(); state.charge = battery_getCharge(state.v_bat); + state.rssi = rtx_getRssi(); OSMutexPost(&state_mutex, OS_OPT_POST_NONE, &os_err); diff --git a/platform/drivers/baseband/rtx_MD3x0.c b/platform/drivers/baseband/rtx_MD3x0.c index 9d168b01..78c999e3 100644 --- a/platform/drivers/baseband/rtx_MD3x0.c +++ b/platform/drivers/baseband/rtx_MD3x0.c @@ -44,6 +44,13 @@ rtxStatus_t rtxStatus; /* RTX driver status */ uint8_t sqlOpenTsh; /* Squelch opening threshold */ uint8_t sqlCloseTsh; /* Squelch closing threshold */ +// RSSI mV to dBm conversion function, gain is constant, while offset values +// are aligned to calibration frequency test points +float rssi_gain = 22.0f; +float rssi_offset[] = {3277.618f, 3654.755f, 3808.191f, + 3811.318f, 3804.936f, 3806.591f, + 3723.882f, 3621.373f, 3559.782f}; + /* * Helper functions to reduce code mess. They all access 'rtxStatus' * internally. @@ -443,5 +450,17 @@ void rtx_taskFunc() float rtx_getRssi() { - return adc1_getMeasurement(1); + // ADC1 returns the RSSI value in mV, we convert it to dBm trough + // their derived linear relation + float rssi_mv = adc1_getMeasurement(1); + float freq = rtxStatus.rxFrequency; + int index = 0; + if (freq < 401035000.0f) + index = 0; + else if (freq > 479995000.0f) + index = 8; + else + index = (int)(freq - 400035000.0f)/10000000; + float rssi_dbm = (rssi_mv - rssi_offset[index]) / rssi_gain; + return rssi_dbm; }