diff --git a/Makefile b/Makefile index 02b87c7..7fb3ad3 100644 --- a/Makefile +++ b/Makefile @@ -81,8 +81,9 @@ ENABLE_TX_AUDIO_BAR := 0 # Side Button Menu 300 B ENABLE_SIDE_BUTT_MENU := 0 # Key Lock 400 B -ENABLE_KEYLOCK := 1 +ENABLE_KEYLOCK := 0 ENABLE_PANADAPTER := 1 +ENABLE_PANADAPTER_PEAK_FREQ := 0 #ENABLE_SINGLE_VFO_CHAN := 0 ############################################################# @@ -179,9 +180,6 @@ OBJS += app/search.o ifeq ($(ENABLE_SCAN_IGNORE_LIST),1) OBJS += freq_ignore.o endif -ifeq ($(ENABLE_PANADAPTER),1) -// OBJS += app/spectrum.o -endif ifeq ($(ENABLE_UART),1) OBJS += app/uart.o endif @@ -473,6 +471,9 @@ endif ifeq ($(ENABLE_PANADAPTER),1) CFLAGS += -DENABLE_PANADAPTER endif +ifeq ($(ENABLE_PANADAPTER_PEAK_FREQ),1) + CFLAGS += -DENABLE_PANADAPTER_PEAK_FREQ +endif LDFLAGS = ifeq ($(ENABLE_CLANG),0) diff --git a/README.md b/README.md index 73ff118..7ee935d 100644 --- a/README.md +++ b/README.md @@ -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_SIDE_BUTT_MENU := 1 enable menu option for configuring the programmable side buttons 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 ``` diff --git a/firmware.bin b/firmware.bin index 2e68088..508712f 100644 Binary files a/firmware.bin and b/firmware.bin differ diff --git a/firmware.packed.bin b/firmware.packed.bin index 7cccc69..56ffc61 100644 Binary files a/firmware.packed.bin and b/firmware.packed.bin differ diff --git a/panadapter.c b/panadapter.c index 71cad56..cc2a9d2 100644 --- a/panadapter.c +++ b/panadapter.c @@ -17,14 +17,19 @@ #include "ui/main.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 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; 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) @@ -33,7 +38,7 @@ void PAN_set_freq(void) const uint32_t step_size = g_tx_vfo->step_freq; 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 if (panadapter_rssi_index < PANADAPTER_BINS) 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_scan_state_dir != SCAN_STATE_DIR_OFF) { - if (g_pan_enabled) + if (g_panadapter_enabled) { // disable the panadapter - g_panadapter_vfo_mode = 1; - g_pan_enabled = false; + #ifdef ENABLE_PANADAPTER_PEAK_FREQ + g_panadapter_peak_freq = 0; + #endif + g_panadapter_vfo_mode = 1; + g_panadapter_enabled = false; PAN_set_freq(); g_update_display = true; @@ -83,13 +91,18 @@ void PAN_process_10ms(void) return; } - if (!g_pan_enabled) + if (!g_panadapter_enabled) { // enable the panadapter - g_panadapter_vfo_mode = 0; - panadapter_rssi_index = 0; + #ifdef ENABLE_PANADAPTER_PEAK_FREQ + 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)); - g_pan_enabled = true; + g_panadapter_enabled = true; PAN_set_freq(); g_update_display = true; @@ -139,6 +152,44 @@ void PAN_process_10ms(void) // the last bin value .. draw the panadapter once each scan cycle 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); //g_update_display = true; + } } diff --git a/panadapter.h b/panadapter.h index 80b7530..2f263dc 100644 --- a/panadapter.h +++ b/panadapter.h @@ -25,9 +25,12 @@ // number of bins either side of the VFO RX frequency #define PANADAPTER_BINS ((LCD_WIDTH / 2) - 1) -extern bool g_pan_enabled; -extern int g_panadapter_vfo_mode; -extern uint8_t g_panadapter_rssi[PANADAPTER_BINS + 1 + PANADAPTER_BINS]; +extern bool g_panadapter_enabled; +extern uint32_t g_panadapter_peak_freq; +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); void PAN_process_10ms(void); diff --git a/ui/main.c b/ui/main.c index 7b18dfd..f37993b 100644 --- a/ui/main.c +++ b/ui/main.c @@ -418,7 +418,7 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int unsigned int i; if (!g_eeprom.config.setting.panadapter || - !g_pan_enabled || + !g_panadapter_enabled || single_vfo < 0 || g_current_display_screen != DISPLAY_MAIN || g_current_function == FUNCTION_TRANSMIT || @@ -432,16 +432,8 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int // return; // auto scale - max_rssi = g_panadapter_rssi[0]; - min_rssi = g_panadapter_rssi[0]; - 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; - } + max_rssi = g_panadapter_max_rssi; + min_rssi = g_panadapter_min_rssi; span_rssi = max_rssi - min_rssi; 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); } + #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 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 &= 0xfffffffe; - 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 * 0)] = bit_reverse_8(pixels >> 0); + 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 * 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) ST7565_BlitFullScreen(); } @@ -546,7 +545,7 @@ void UI_DisplayMain(void) #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.panadapter && g_pan_enabled) + if (g_eeprom.config.setting.panadapter && g_panadapter_enabled) //if (!g_squelch_open && !g_monitor_enabled) if (!g_monitor_enabled) single_vfo = g_eeprom.config.setting.tx_vfo_num;