0
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:
OneOfEleven 2023-11-19 10:45:46 +00:00
parent 3a181bed44
commit 7cc287dce0
7 changed files with 102 additions and 47 deletions

View File

@ -81,8 +81,9 @@ ENABLE_TX_AUDIO_BAR := 0
# Side Button Menu 300 B # Side Button Menu 300 B
ENABLE_SIDE_BUTT_MENU := 0 ENABLE_SIDE_BUTT_MENU := 0
# Key Lock 400 B # Key Lock 400 B
ENABLE_KEYLOCK := 1 ENABLE_KEYLOCK := 0
ENABLE_PANADAPTER := 1 ENABLE_PANADAPTER := 1
ENABLE_PANADAPTER_PEAK_FREQ := 0
#ENABLE_SINGLE_VFO_CHAN := 0 #ENABLE_SINGLE_VFO_CHAN := 0
############################################################# #############################################################
@ -179,9 +180,6 @@ OBJS += app/search.o
ifeq ($(ENABLE_SCAN_IGNORE_LIST),1) ifeq ($(ENABLE_SCAN_IGNORE_LIST),1)
OBJS += freq_ignore.o OBJS += freq_ignore.o
endif endif
ifeq ($(ENABLE_PANADAPTER),1)
// OBJS += app/spectrum.o
endif
ifeq ($(ENABLE_UART),1) ifeq ($(ENABLE_UART),1)
OBJS += app/uart.o OBJS += app/uart.o
endif endif
@ -473,6 +471,9 @@ endif
ifeq ($(ENABLE_PANADAPTER),1) ifeq ($(ENABLE_PANADAPTER),1)
CFLAGS += -DENABLE_PANADAPTER CFLAGS += -DENABLE_PANADAPTER
endif endif
ifeq ($(ENABLE_PANADAPTER_PEAK_FREQ),1)
CFLAGS += -DENABLE_PANADAPTER_PEAK_FREQ
endif
LDFLAGS = LDFLAGS =
ifeq ($(ENABLE_CLANG),0) ifeq ($(ENABLE_CLANG),0)

View File

@ -95,7 +95,8 @@ ENABLE_RX_SIGNAL_BAR := 1 enable a menu option for showing an
ENABLE_TX_AUDIO_BAR := 1 enable a menu option for showing a TX audio level bar ENABLE_TX_AUDIO_BAR := 1 enable a menu option for showing a TX audio level bar
ENABLE_SIDE_BUTT_MENU := 1 enable menu option for configuring the programmable side buttons ENABLE_SIDE_BUTT_MENU := 1 enable menu option for configuring the programmable side buttons
ENABLE_KEYLOCK := 1 enable keylock menu option + keylock code ENABLE_KEYLOCK := 1 enable keylock menu option + keylock code
ENABLE_PANADAPTER := 1 TEST ONLY centered on the selected VFO RX frequency, only shows if dual-watch is disabled ENABLE_PANADAPTER := 1 centered on the selected VFO RX frequency, only shows if dual-watch is disabled
ENABLE_PANADAPTER_PEAK_FREQ := 0 show the peak panadapter frequency
#ENABLE_SINGLE_VFO_CHAN := 0 not yet implemented - single VFO on display when possible #ENABLE_SINGLE_VFO_CHAN := 0 not yet implemented - single VFO on display when possible
``` ```

Binary file not shown.

Binary file not shown.

View File

@ -17,14 +17,19 @@
#include "ui/main.h" #include "ui/main.h"
#include "ui/ui.h" #include "ui/ui.h"
bool g_pan_enabled; bool g_panadapter_enabled;
#ifdef ENABLE_PANADAPTER_PEAK_FREQ
uint32_t g_panadapter_peak_freq;
#endif
int g_panadapter_vfo_mode; // > 0 if we're currently sampling the VFO int g_panadapter_vfo_mode; // > 0 if we're currently sampling the VFO
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_min_rssi;
unsigned int panadapter_rssi_index; unsigned int panadapter_rssi_index;
bool PAN_scanning(void) bool PAN_scanning(void)
{ {
return (g_eeprom.config.setting.panadapter && g_pan_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_set_freq(void) void PAN_set_freq(void)
@ -33,7 +38,7 @@ void PAN_set_freq(void)
const uint32_t step_size = g_tx_vfo->step_freq; const uint32_t step_size = g_tx_vfo->step_freq;
uint32_t freq = g_tx_vfo->p_rx->frequency; uint32_t freq = g_tx_vfo->p_rx->frequency;
if (g_pan_enabled && g_panadapter_vfo_mode <= 0) if (g_panadapter_enabled && g_panadapter_vfo_mode <= 0)
{ // panadapter mode .. add the bin offset { // panadapter mode .. add the bin offset
if (panadapter_rssi_index < PANADAPTER_BINS) if (panadapter_rssi_index < PANADAPTER_BINS)
freq -= step_size * (PANADAPTER_BINS - panadapter_rssi_index); freq -= step_size * (PANADAPTER_BINS - panadapter_rssi_index);
@ -70,11 +75,14 @@ void PAN_process_10ms(void)
g_css_scan_mode != CSS_SCAN_MODE_OFF || g_css_scan_mode != CSS_SCAN_MODE_OFF ||
g_scan_state_dir != SCAN_STATE_DIR_OFF) g_scan_state_dir != SCAN_STATE_DIR_OFF)
{ {
if (g_pan_enabled) if (g_panadapter_enabled)
{ // disable the panadapter { // disable the panadapter
g_panadapter_vfo_mode = 1; #ifdef ENABLE_PANADAPTER_PEAK_FREQ
g_pan_enabled = false; g_panadapter_peak_freq = 0;
#endif
g_panadapter_vfo_mode = 1;
g_panadapter_enabled = false;
PAN_set_freq(); PAN_set_freq();
g_update_display = true; g_update_display = true;
@ -83,13 +91,18 @@ void PAN_process_10ms(void)
return; return;
} }
if (!g_pan_enabled) if (!g_panadapter_enabled)
{ // enable the panadapter { // enable the panadapter
g_panadapter_vfo_mode = 0; #ifdef ENABLE_PANADAPTER_PEAK_FREQ
panadapter_rssi_index = 0; g_panadapter_peak_freq = 0;
#endif
g_panadapter_vfo_mode = 0;
// g_panadapter_max_rssi = 0;
// g_panadapter_min_rssi = 0;
panadapter_rssi_index = 0;
// memset(g_panadapter_rssi, 0, sizeof(g_panadapter_rssi)); // memset(g_panadapter_rssi, 0, sizeof(g_panadapter_rssi));
g_pan_enabled = true; g_panadapter_enabled = true;
PAN_set_freq(); PAN_set_freq();
g_update_display = true; g_update_display = true;
@ -139,6 +152,44 @@ 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;
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
{ // find the peak freq
const int32_t step_size = g_tx_vfo->step_freq;
const int32_t center_freq = g_tx_vfo->p_rx->frequency;
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);
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)
{
peak_rssi = rssi;
g_panadapter_peak_freq = center_freq + (step_size * (i - PANADAPTER_BINS));
}
}
}
#endif
UI_DisplayMain_pan(true); UI_DisplayMain_pan(true);
//g_update_display = true; //g_update_display = true;
}
} }

View File

@ -25,9 +25,12 @@
// number of bins either side of the VFO RX frequency // number of bins either side of the VFO RX frequency
#define PANADAPTER_BINS ((LCD_WIDTH / 2) - 1) #define PANADAPTER_BINS ((LCD_WIDTH / 2) - 1)
extern bool g_pan_enabled; extern bool g_panadapter_enabled;
extern int g_panadapter_vfo_mode; extern uint32_t g_panadapter_peak_freq;
extern uint8_t g_panadapter_rssi[PANADAPTER_BINS + 1 + PANADAPTER_BINS]; extern int g_panadapter_vfo_mode;
extern uint8_t g_panadapter_rssi[PANADAPTER_BINS + 1 + PANADAPTER_BINS];
extern uint8_t g_panadapter_max_rssi;
extern uint8_t g_panadapter_min_rssi;
bool PAN_scanning(void); bool PAN_scanning(void);
void PAN_process_10ms(void); void PAN_process_10ms(void);

View File

@ -418,7 +418,7 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int
unsigned int i; unsigned int i;
if (!g_eeprom.config.setting.panadapter || if (!g_eeprom.config.setting.panadapter ||
!g_pan_enabled || !g_panadapter_enabled ||
single_vfo < 0 || single_vfo < 0 ||
g_current_display_screen != DISPLAY_MAIN || g_current_display_screen != DISPLAY_MAIN ||
g_current_function == FUNCTION_TRANSMIT || g_current_function == FUNCTION_TRANSMIT ||
@ -432,16 +432,8 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int
// return; // return;
// auto scale // auto scale
max_rssi = g_panadapter_rssi[0]; max_rssi = g_panadapter_max_rssi;
min_rssi = g_panadapter_rssi[0]; min_rssi = g_panadapter_min_rssi;
for (i = 1; i < ARRAY_SIZE(g_panadapter_rssi); i++)
{
const uint8_t rssi = g_panadapter_rssi[i];
if (max_rssi < rssi)
max_rssi = rssi;
if (min_rssi > rssi)
min_rssi = rssi;
}
span_rssi = max_rssi - min_rssi; span_rssi = max_rssi - min_rssi;
if (span_rssi < 40) // minimum vertical range (20dB) if (span_rssi < 40) // minimum vertical range (20dB)
{ {
@ -456,6 +448,27 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int
memset(g_frame_buffer[line], 0, LCD_WIDTH * 3); memset(g_frame_buffer[line], 0, LCD_WIDTH * 3);
} }
#ifdef ENABLE_PANADAPTER_PEAK_FREQ
if (g_panadapter_peak_freq > 0)
{
char str[16];
sprintf(str, "%u.%05u", g_panadapter_peak_freq / 100000, g_panadapter_peak_freq % 100000);
NUMBER_trim_trailing_zeros(str);
UI_PrintStringSmall(str, 8, 0, line + 0);
}
#endif
// center marker (the VFO frequency)
base_line[PANADAPTER_BINS - (LCD_WIDTH * 2)] = 0x07;
// top horizontal line
for (i = 0; i < PANADAPTER_BINS; i += 4)
{
const unsigned int k = PANADAPTER_BINS - (LCD_WIDTH * 2);
base_line[k - i] |= 1u;
base_line[k + i] |= 1u;
}
// draw the vertical bins // draw the vertical bins
for (i = 0; i < ARRAY_SIZE(g_panadapter_rssi); i++) for (i = 0; i < ARRAY_SIZE(g_panadapter_rssi); i++)
{ {
@ -476,25 +489,11 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int
pixels = (1u << rssi) - 1; pixels = (1u << rssi) - 1;
pixels &= 0xfffffffe; pixels &= 0xfffffffe;
base_line[i - (LCD_WIDTH * 2)] = bit_reverse_8(pixels >> 16); base_line[i - (LCD_WIDTH * 2)] |= bit_reverse_8(pixels >> 16);
base_line[i - (LCD_WIDTH * 1)] = bit_reverse_8(pixels >> 8); base_line[i - (LCD_WIDTH * 1)] |= bit_reverse_8(pixels >> 8);
base_line[i - (LCD_WIDTH * 0)] = bit_reverse_8(pixels >> 0); base_line[i - (LCD_WIDTH * 0)] |= bit_reverse_8(pixels >> 0);
} }
// center marker (the VFO frequency)
base_line[PANADAPTER_BINS - (LCD_WIDTH * 2)] = 0x07;
// top horizontal line
for (i = 0; i < PANADAPTER_BINS; i += 4)
{
const unsigned int k = PANADAPTER_BINS - (LCD_WIDTH * 2);
base_line[k - i] |= 1u;
base_line[k + i] |= 1u;
}
// sprintf(str, "r %3d g %3u n %3u", rssi, glitch, noise);
// UI_PrintStringSmall(str, 2, 0, line);
if (now) if (now)
ST7565_BlitFullScreen(); ST7565_BlitFullScreen();
} }
@ -546,7 +545,7 @@ void UI_DisplayMain(void)
#ifdef ENABLE_PANADAPTER #ifdef ENABLE_PANADAPTER
if (g_eeprom.config.setting.dual_watch == DUAL_WATCH_OFF && g_eeprom.config.setting.cross_vfo == CROSS_BAND_OFF) if (g_eeprom.config.setting.dual_watch == DUAL_WATCH_OFF && g_eeprom.config.setting.cross_vfo == CROSS_BAND_OFF)
if (g_eeprom.config.setting.panadapter && g_pan_enabled) if (g_eeprom.config.setting.panadapter && g_panadapter_enabled)
//if (!g_squelch_open && !g_monitor_enabled) //if (!g_squelch_open && !g_monitor_enabled)
if (!g_monitor_enabled) if (!g_monitor_enabled)
single_vfo = g_eeprom.config.setting.tx_vfo_num; single_vfo = g_eeprom.config.setting.tx_vfo_num;