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; }