mirror of
https://github.com/OneOfEleven/uv-k5-firmware-custom.git
synced 2025-04-28 14:21:25 +03:00
panadapter update
This commit is contained in:
parent
9a5393cb34
commit
bf816f2afc
@ -39,6 +39,9 @@
|
||||
#include "freq_ignore.h"
|
||||
#endif
|
||||
#include "misc.h"
|
||||
#ifdef ENABLE_PANADAPTER
|
||||
#include "panadapter.h"
|
||||
#endif
|
||||
#include "radio.h"
|
||||
#include "settings.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
|
||||
|
||||
#ifdef ENABLE_PANADAPTER
|
||||
g_panadapter_vfo_mode = 20; // 200ms
|
||||
#endif
|
||||
|
||||
BK4819_set_rf_frequency(freq, true); // set the VCO/PLL
|
||||
BK4819_set_rf_filter_path(freq); // set the proper LNA/PA filter path
|
||||
|
||||
|
BIN
firmware.bin
BIN
firmware.bin
Binary file not shown.
Binary file not shown.
113
panadapter.c
113
panadapter.c
@ -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_max_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)
|
||||
|
||||
@ -36,6 +36,56 @@ bool PAN_scanning(void)
|
||||
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)
|
||||
{ // set the frequency
|
||||
|
||||
@ -44,9 +94,9 @@ void PAN_set_freq(void)
|
||||
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;
|
||||
|
||||
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
|
||||
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
|
||||
@ -95,7 +145,11 @@ void PAN_process_10ms(void)
|
||||
}
|
||||
|
||||
if (g_current_function == FUNCTION_TRANSMIT)
|
||||
{
|
||||
g_panadapter_vfo_mode = 100; // 1000ms
|
||||
panadapter_rssi_index = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!g_panadapter_enabled)
|
||||
{ // enable the panadapter
|
||||
@ -115,6 +169,13 @@ void PAN_process_10ms(void)
|
||||
return;
|
||||
}
|
||||
|
||||
if (panadapter_rssi_index < 0)
|
||||
{
|
||||
PAN_set_freq();
|
||||
panadapter_rssi_index++;
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_panadapter_vfo_mode > 0 && g_squelch_open)
|
||||
{ // 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];
|
||||
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
|
||||
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;
|
||||
|
||||
// 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;
|
||||
|
||||
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
|
||||
if (panadapter_rssi_index == 0)
|
||||
{
|
||||
int i;
|
||||
|
||||
// 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;
|
||||
}
|
||||
PAN_update_min_max();
|
||||
|
||||
#ifdef ENABLE_PANADAPTER_PEAK_FREQ
|
||||
{ // find the peak freq
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
PAN_find_peak();
|
||||
#endif
|
||||
|
||||
UI_DisplayMain_pan(true);
|
||||
|
Loading…
x
Reference in New Issue
Block a user