Implement RSSI based squelch control

replace/ebed05aa1fa9807d7d36f4e85f0d6d1f7fb4919e
Niccolò Izzo 2021-01-28 15:13:06 +01:00
rodzic 0b98f50a12
commit 226d2ccaf7
4 zmienionych plików z 23 dodań i 15 usunięć

Wyświetl plik

@ -21,6 +21,7 @@
#include <stdio.h>
#include <state.h>
#include <battery.h>
#include <hwconfig.h>
#include <interfaces/platform.h>
state_t state;
@ -52,7 +53,11 @@ void state_init()
state.channel.fm.txTone = 2; // 71.9Hz
state.rtxStatus = RTX_OFF;
#ifdef HAS_ABSOLUTE_KNOB // If the radio has an absolute position knob
state.sqlLevel = platform_getChSelector() - 1;
#else
state.sqlLevel = 3;
#endif
state.voxLevel = 0;
state.emergency = false;

Wyświetl plik

@ -118,7 +118,7 @@ static void ui_task(void *arg)
rtx_cfg.rxFrequency = state.channel.rx_frequency;
rtx_cfg.txFrequency = state.channel.tx_frequency;
rtx_cfg.txPower = state.channel.power;
rtx_cfg.sqlLevel = state.channel.squelch;
rtx_cfg.sqlLevel = state.sqlLevel;
rtx_cfg.rxToneEn = state.channel.fm.rxToneEn;
rtx_cfg.rxTone = ctcss_tone[state.channel.fm.rxTone];
rtx_cfg.txToneEn = state.channel.fm.txToneEn;

Wyświetl plik

@ -537,16 +537,18 @@ void _ui_fsm_menuMacro(kbd_msg_t msg, bool *sync_rtx) {
}
#ifdef HAS_ABSOLUTE_KNOB // If the radio has an absolute position knob
state.sqlLevel = platform_getChSelector();
printf("New squelch value: %d\n\r", state.sqlLevel);
#else // Use left and right buttons or relative position knob
if(msg.keys && KEY_LEFT) {
state.sqlLevel++;
state.sqlLevel = (state.sqlLevel > 15) 15 : state.sqlLevel;
if(msg.keys & KEY_LEFT || msg.keys & KEY_RIGHT) {
state.sqlLevel = platform_getChSelector() - 1;
*sync_rtx = true;
}
else if(msg.keys && KEY_RIGHT) {
state.sqlLevel--;
state.sqlLevel = (state.sqlLevel < 0) 0 : state.sqlLevel;
#else // Use left and right buttons or relative position knob
if(msg.keys & KEY_LEFT) {
state.sqlLevel = (state.sqlLevel == 15) 15 : state.sqlLevel++;
*sync_rtx = true;
}
else if(msg.keys & KEY_RIGHT) {
state.sqlLevel = (state.sqlLevel == 0) 0 : state.sqlLevel--;
*sync_rtx = true;
}
#endif
}

Wyświetl plik

@ -410,17 +410,18 @@ void rtx_taskFunc()
if(rtxStatus.opStatus == RX)
{
/* Convert back voltage to ADC counts */
float sqlValue = (adc1_getMeasurement(1) * 4096.0f)/3300.0f;
uint16_t sqlLevel = ((uint16_t) sqlValue) >> 6;
// Unmute speaker if rssi is greater than squelch value
float rssi = rtx_getRssi();
// sqlValue represents 15 steps from -140dBm to -70dBm
float rssi_squelch = -140.0f + rtxStatus.sqlLevel * 70.0f / 15.0f;
if((gpio_readPin(SPK_MUTE) == 1) && (sqlLevel > sqlOpenTsh))
if((gpio_readPin(SPK_MUTE) == 1) && (rssi > rssi_squelch))
{
gpio_clearPin(SPK_MUTE);
platform_ledOn(GREEN);
}
if((gpio_readPin(SPK_MUTE) == 0) && (sqlLevel < sqlCloseTsh))
if((gpio_readPin(SPK_MUTE) == 0) && (rssi < rssi_squelch))
{
gpio_setPin(SPK_MUTE);
platform_ledOff(GREEN);