0
mirror of https://github.com/OneOfEleven/uv-k5-firmware-custom.git synced 2025-04-28 22:31:25 +03:00

panadapter update

This commit is contained in:
OneOfEleven 2023-11-20 11:11:58 +00:00
parent 9a5393cb34
commit bf816f2afc
4 changed files with 76 additions and 44 deletions

View File

@ -39,6 +39,9 @@
#include "freq_ignore.h" #include "freq_ignore.h"
#endif #endif
#include "misc.h" #include "misc.h"
#ifdef ENABLE_PANADAPTER
#include "panadapter.h"
#endif
#include "radio.h" #include "radio.h"
#include "settings.h" #include "settings.h"
#include "ui/inputbox.h" #include "ui/inputbox.h"
@ -1106,6 +1109,10 @@ void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t directio
} }
#endif #endif
#ifdef ENABLE_PANADAPTER
g_panadapter_vfo_mode = 20; // 200ms
#endif
BK4819_set_rf_frequency(freq, true); // set the VCO/PLL BK4819_set_rf_frequency(freq, true); // set the VCO/PLL
BK4819_set_rf_filter_path(freq); // set the proper LNA/PA filter path BK4819_set_rf_filter_path(freq); // set the proper LNA/PA filter path

Binary file not shown.

Binary file not shown.

View File

@ -27,7 +27,7 @@ int g_panadapter_vfo_mode; // > 0 if we're currently sampling the
uint8_t g_panadapter_rssi[PANADAPTER_BINS + 1 + PANADAPTER_BINS]; uint8_t g_panadapter_rssi[PANADAPTER_BINS + 1 + PANADAPTER_BINS];
uint8_t g_panadapter_max_rssi; uint8_t g_panadapter_max_rssi;
uint8_t g_panadapter_min_rssi; uint8_t g_panadapter_min_rssi;
unsigned int panadapter_rssi_index; int panadapter_rssi_index;
const uint8_t panadapter_min_rssi = (-147 + 160) * 2; // min of -147dBm (S0) const uint8_t panadapter_min_rssi = (-147 + 160) * 2; // min of -147dBm (S0)
@ -36,6 +36,56 @@ bool PAN_scanning(void)
return (g_eeprom.config.setting.panadapter && g_panadapter_enabled && g_panadapter_vfo_mode <= 0) ? true : false; return (g_eeprom.config.setting.panadapter && g_panadapter_enabled && g_panadapter_vfo_mode <= 0) ? true : false;
} }
void PAN_update_min_max(void)
{ // compute the min/max RSSI values
int i;
g_panadapter_max_rssi = g_panadapter_rssi[0];
g_panadapter_min_rssi = g_panadapter_rssi[0];
for (i = 1; i < (int)ARRAY_SIZE(g_panadapter_rssi); i++)
{
const uint8_t rssi = g_panadapter_rssi[i];
if (g_panadapter_max_rssi < rssi)
g_panadapter_max_rssi = rssi;
if (g_panadapter_min_rssi > rssi)
g_panadapter_min_rssi = rssi;
}
}
#ifdef ENABLE_PANADAPTER_PEAK_FREQ
void PAN_find_peak(void)
{ // find the peak freq
const int32_t center_freq = g_tx_vfo->p_rx->frequency;
int32_t step_size = g_tx_vfo->step_freq;
int i;
uint8_t peak_rssi = 0;
uint8_t threshold_rssi;
uint8_t span_rssi = g_panadapter_max_rssi - g_panadapter_min_rssi;
if (span_rssi < 80)
span_rssi = 80;
threshold_rssi = g_panadapter_min_rssi + (span_rssi / 4);
// limit the step size
step_size = (step_size < PANADAPTER_MIN_STEP) ? PANADAPTER_MIN_STEP : (step_size > PANADAPTER_MAX_STEP) ? PANADAPTER_MAX_STEP : step_size;
g_panadapter_peak_freq = 0;
for (i = 0; i < (int)ARRAY_SIZE(g_panadapter_rssi); i++)
{
const uint8_t rssi = g_panadapter_rssi[i];
if (peak_rssi < rssi && rssi >= threshold_rssi && (i < (PANADAPTER_BINS - 1) || i > (PANADAPTER_BINS + 1)))
{
peak_rssi = rssi;
g_panadapter_peak_freq = center_freq + (step_size * (i - PANADAPTER_BINS));
}
}
}
#endif
void PAN_set_freq(void) void PAN_set_freq(void)
{ // set the frequency { // set the frequency
@ -44,9 +94,9 @@ void PAN_set_freq(void)
int32_t step_size = g_tx_vfo->step_freq; int32_t step_size = g_tx_vfo->step_freq;
step_size = (step_size < PANADAPTER_MIN_STEP) ? PANADAPTER_MIN_STEP : (step_size > PANADAPTER_MAX_STEP) ? PANADAPTER_MAX_STEP : step_size; step_size = (step_size < PANADAPTER_MIN_STEP) ? PANADAPTER_MIN_STEP : (step_size > PANADAPTER_MAX_STEP) ? PANADAPTER_MAX_STEP : step_size;
if (g_panadapter_enabled && g_panadapter_vfo_mode <= 0) if (g_panadapter_enabled && g_panadapter_vfo_mode <= 0 && panadapter_rssi_index >= 0)
{ // panadapter mode .. add the bin offset { // panadapter mode .. add the bin offset
freq += step_size * ((int)panadapter_rssi_index - PANADAPTER_BINS); freq += step_size * (panadapter_rssi_index - PANADAPTER_BINS);
} }
BK4819_set_rf_frequency(freq, true); // set the VCO/PLL BK4819_set_rf_frequency(freq, true); // set the VCO/PLL
@ -95,7 +145,11 @@ void PAN_process_10ms(void)
} }
if (g_current_function == FUNCTION_TRANSMIT) if (g_current_function == FUNCTION_TRANSMIT)
{
g_panadapter_vfo_mode = 100; // 1000ms
panadapter_rssi_index = -1;
return; return;
}
if (!g_panadapter_enabled) if (!g_panadapter_enabled)
{ // enable the panadapter { // enable the panadapter
@ -115,6 +169,13 @@ void PAN_process_10ms(void)
return; return;
} }
if (panadapter_rssi_index < 0)
{
PAN_set_freq();
panadapter_rssi_index++;
return;
}
if (g_panadapter_vfo_mode > 0 && g_squelch_open) if (g_panadapter_vfo_mode > 0 && g_squelch_open)
{ // we have a signal on the VFO frequency { // we have a signal on the VFO frequency
@ -122,6 +183,8 @@ void PAN_process_10ms(void)
const int16_t rssi = g_current_rssi[g_eeprom.config.setting.tx_vfo_num]; const int16_t rssi = g_current_rssi[g_eeprom.config.setting.tx_vfo_num];
g_panadapter_rssi[PANADAPTER_BINS] = (rssi > 255) ? 255 : (rssi < panadapter_min_rssi) ? panadapter_min_rssi : rssi; g_panadapter_rssi[PANADAPTER_BINS] = (rssi > 255) ? 255 : (rssi < panadapter_min_rssi) ? panadapter_min_rssi : rssi;
PAN_update_min_max();
g_panadapter_vfo_mode = 40; // pause scanning for at least another 400ms g_panadapter_vfo_mode = 40; // pause scanning for at least another 400ms
return; return;
} }
@ -134,7 +197,7 @@ void PAN_process_10ms(void)
g_panadapter_rssi[panadapter_rssi_index] = (rssi > 255) ? 255 : (rssi < panadapter_min_rssi) ? panadapter_min_rssi : rssi; g_panadapter_rssi[panadapter_rssi_index] = (rssi > 255) ? 255 : (rssi < panadapter_min_rssi) ? panadapter_min_rssi : rssi;
// next frequency // next frequency
if (++panadapter_rssi_index >= ARRAY_SIZE(g_panadapter_rssi)) if (++panadapter_rssi_index >= (int)ARRAY_SIZE(g_panadapter_rssi))
panadapter_rssi_index = 0; panadapter_rssi_index = 0;
if (g_tx_vfo->channel.mod_mode == MOD_MODE_FM) if (g_tx_vfo->channel.mod_mode == MOD_MODE_FM)
@ -156,48 +219,10 @@ void PAN_process_10ms(void)
// the last bin value .. draw the panadapter once each scan cycle // the last bin value .. draw the panadapter once each scan cycle
if (panadapter_rssi_index == 0) if (panadapter_rssi_index == 0)
{ {
int i; PAN_update_min_max();
// compute the min/max RSSI values
g_panadapter_max_rssi = g_panadapter_rssi[0];
g_panadapter_min_rssi = g_panadapter_rssi[0];
for (i = 1; i < (int)ARRAY_SIZE(g_panadapter_rssi); i++)
{
const uint8_t rssi = g_panadapter_rssi[i];
if (g_panadapter_max_rssi < rssi)
g_panadapter_max_rssi = rssi;
if (g_panadapter_min_rssi > rssi)
g_panadapter_min_rssi = rssi;
}
#ifdef ENABLE_PANADAPTER_PEAK_FREQ #ifdef ENABLE_PANADAPTER_PEAK_FREQ
{ // find the peak freq PAN_find_peak();
const int32_t center_freq = g_tx_vfo->p_rx->frequency;
int32_t step_size = g_tx_vfo->step_freq;
uint8_t peak_rssi = 0;
uint8_t threshold_rssi;
uint8_t span_rssi = g_panadapter_max_rssi - g_panadapter_min_rssi;
if (span_rssi < 80)
span_rssi = 80;
threshold_rssi = g_panadapter_min_rssi + (span_rssi / 4);
// limit the step size
step_size = (step_size < PANADAPTER_MIN_STEP) ? PANADAPTER_MIN_STEP : (step_size > PANADAPTER_MAX_STEP) ? PANADAPTER_MAX_STEP : step_size;
g_panadapter_peak_freq = 0;
for (i = 0; i < (int)ARRAY_SIZE(g_panadapter_rssi); i++)
{
const uint8_t rssi = g_panadapter_rssi[i];
if (peak_rssi < rssi && rssi >= threshold_rssi && (i < (PANADAPTER_BINS - 1) || i > (PANADAPTER_BINS + 1)))
{
peak_rssi = rssi;
g_panadapter_peak_freq = center_freq + (step_size * (i - PANADAPTER_BINS));
}
}
}
#endif #endif
UI_DisplayMain_pan(true); UI_DisplayMain_pan(true);