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-19 07:52:46 +00:00
parent 4ff7f54c81
commit 99c590d922
5 changed files with 57 additions and 50 deletions

View File

@ -27,7 +27,7 @@ ENABLE_NOAA := 0
ENABLE_VOICE := 0 ENABLE_VOICE := 0
ENABLE_MUTE_RADIO_FOR_VOICE := 0 ENABLE_MUTE_RADIO_FOR_VOICE := 0
# Tx on Voice 1.0 kB # Tx on Voice 1.0 kB
ENABLE_VOX := 1 ENABLE_VOX := 0
ENABLE_VOX_MORE_SENSITIVE := 1 ENABLE_VOX_MORE_SENSITIVE := 1
ENABLE_REDUCE_LOW_MID_TX_POWER := 1 ENABLE_REDUCE_LOW_MID_TX_POWER := 1
# Tx Alarm 600 B # Tx Alarm 600 B
@ -82,7 +82,7 @@ ENABLE_TX_AUDIO_BAR := 0
ENABLE_SIDE_BUTT_MENU := 0 ENABLE_SIDE_BUTT_MENU := 0
# Key Lock 400 B # Key Lock 400 B
ENABLE_KEYLOCK := 1 ENABLE_KEYLOCK := 1
ENABLE_PANADAPTER := 0 ENABLE_PANADAPTER := 1
#ENABLE_SINGLE_VFO_CHAN := 0 #ENABLE_SINGLE_VFO_CHAN := 0
############################################################# #############################################################

Binary file not shown.

Binary file not shown.

View File

@ -17,10 +17,10 @@
#include "ui/main.h" #include "ui/main.h"
#include "ui/ui.h" #include "ui/ui.h"
bool g_pan_enabled; bool g_pan_enabled;
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];
int g_panadapter_rssi_index; unsigned int panadapter_rssi_index;
bool PAN_scanning(void) bool PAN_scanning(void)
{ {
@ -35,11 +35,11 @@ void PAN_set_freq(void)
if (g_pan_enabled && g_panadapter_vfo_mode <= 0) if (g_pan_enabled && g_panadapter_vfo_mode <= 0)
{ // panadapter mode .. add the bin offset { // panadapter mode .. add the bin offset
if (g_panadapter_rssi_index < PANADAPTER_BINS) if (panadapter_rssi_index < PANADAPTER_BINS)
freq -= step_size * (PANADAPTER_BINS - g_panadapter_rssi_index); freq -= step_size * (PANADAPTER_BINS - panadapter_rssi_index);
else else
if (g_panadapter_rssi_index > PANADAPTER_BINS) if (panadapter_rssi_index > PANADAPTER_BINS)
freq += step_size * (g_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
@ -78,7 +78,6 @@ void PAN_process_10ms(void)
PAN_set_freq(); PAN_set_freq();
g_update_display = true; g_update_display = true;
//UI_DisplayMain_pan(true);
} }
return; return;
@ -88,45 +87,50 @@ void PAN_process_10ms(void)
{ // enable the panadapter { // enable the panadapter
g_panadapter_vfo_mode = 0; g_panadapter_vfo_mode = 0;
g_panadapter_rssi_index = 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_pan_enabled = true;
PAN_set_freq(); PAN_set_freq();
g_update_display = true; g_update_display = true;
//UI_DisplayMain_pan(true); return;
}
if (g_panadapter_vfo_mode > 0 && g_squelch_open)
{ // we have a signal on the VFO frequency
g_panadapter_vfo_mode = 50; // pause scanning for at least another 500ms
return; return;
} }
if (g_panadapter_vfo_mode <= 0)
{ // save the current RSSI value
const uint16_t rssi = BK4819_GetRSSI();
g_panadapter_rssi[g_panadapter_rssi_index] = (rssi <= 255) ? rssi : 255;
}
if (g_panadapter_vfo_mode <= 0) if (g_panadapter_vfo_mode <= 0)
{ // scanning { // scanning
if (++g_panadapter_rssi_index >= (int)ARRAY_SIZE(g_panadapter_rssi))
g_panadapter_rssi_index = 0; // save the current RSSI value
const uint16_t rssi = BK4819_GetRSSI();
g_panadapter_rssi[panadapter_rssi_index] = (rssi <= 255) ? rssi : 255;
// next frequency
if (++panadapter_rssi_index >= ARRAY_SIZE(g_panadapter_rssi))
panadapter_rssi_index = 0;
if (g_tx_vfo->channel.mod_mode == MOD_MODE_FM) if (g_tx_vfo->channel.mod_mode == MOD_MODE_FM)
// switch back to the VFO frequency once every 16 frequency steps .. if in FM mode { // switch back to the VFO frequency for 90ms once every 250ms
g_panadapter_vfo_mode = ((g_panadapter_rssi_index & 15u) == 0) ? 1 : 0; g_panadapter_vfo_mode = ((panadapter_rssi_index % 25) == 0) ? 9 : 0;
}
else else
// switch back to the VFO frequency once each scan cycle if not in FM mode { // switch back to the VFO frequency for 90ms once each scan cycle
g_panadapter_vfo_mode = (g_panadapter_rssi_index == 0) ? 1 : 0; g_panadapter_vfo_mode = (panadapter_rssi_index == 0) ? 9 : 0;
}
} }
else else
{ // checking the VFO frequency for a signal .. we do this this periodically { // checking the VFO frequency for a signal .. we periodically do this
if (++g_panadapter_vfo_mode >= 9) // monitor the VFO frequency for 90ms before continuing our scan g_panadapter_vfo_mode--;
g_panadapter_vfo_mode = 0;
} }
PAN_set_freq(); PAN_set_freq();
// the last bin value .. draw the panadapter once each scan cycle // the last bin value .. draw the panadapter once each scan cycle
if (g_panadapter_rssi_index == 0 && g_panadapter_vfo_mode <= 1) if (panadapter_rssi_index == 0)
UI_DisplayMain_pan(true); UI_DisplayMain_pan(true);
//g_update_display = true; //g_update_display = true;
} }

View File

@ -412,18 +412,20 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int
{ {
const unsigned int line = (g_eeprom.config.setting.tx_vfo_num == 0) ? 4 : 0; const unsigned int line = (g_eeprom.config.setting.tx_vfo_num == 0) ? 4 : 0;
uint8_t *base_line = g_frame_buffer[line + 2]; uint8_t *base_line = g_frame_buffer[line + 2];
uint8_t max_rssi = g_panadapter_rssi[0]; uint8_t max_rssi;
uint8_t min_rssi = g_panadapter_rssi[0]; uint8_t min_rssi;
uint8_t span_rssi; uint8_t span_rssi;
unsigned int i; unsigned int i;
if (!g_eeprom.config.setting.panadapter || !g_pan_enabled || g_panadapter_vfo_mode > 0) if (!g_eeprom.config.setting.panadapter || !g_pan_enabled)
return; return;
if (single_vfo < 0 || g_current_display_screen != DISPLAY_MAIN) if (single_vfo < 0 || g_current_display_screen != DISPLAY_MAIN || g_monitor_enabled)
return;
if (g_squelch_open || g_monitor_enabled)
return; return;
// if (g_squelch_open)
// return;
max_rssi = g_panadapter_rssi[0];
min_rssi = g_panadapter_rssi[0];
for (i = 1; i < ARRAY_SIZE(g_panadapter_rssi); i++) for (i = 1; i < ARRAY_SIZE(g_panadapter_rssi); i++)
{ {
const uint8_t rssi = g_panadapter_rssi[i]; const uint8_t rssi = g_panadapter_rssi[i];
@ -434,21 +436,20 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int
} }
span_rssi = max_rssi - min_rssi; span_rssi = max_rssi - min_rssi;
if (span_rssi < 20) // minimum vertical range if (span_rssi < 40) // minimum vertical range
{ {
span_rssi = 20; span_rssi = 40;
if (min_rssi > (255 - span_rssi)) if (min_rssi > (255 - span_rssi))
min_rssi = 255 - span_rssi; min_rssi = 255 - span_rssi;
max_rssi = min_rssi + span_rssi; max_rssi = min_rssi + span_rssi;
} }
if (now) if (now)
{ { // clear our assigned screen area
memset(g_frame_buffer[line + 0], 0, LCD_WIDTH); memset(g_frame_buffer[line], 0, LCD_WIDTH * 3);
memset(g_frame_buffer[line + 1], 0, LCD_WIDTH);
memset(g_frame_buffer[line + 2], 0, LCD_WIDTH);
} }
// draw the bins
for (i = 0; i < ARRAY_SIZE(g_panadapter_rssi); i++) for (i = 0; i < ARRAY_SIZE(g_panadapter_rssi); i++)
{ {
uint8_t rssi = g_panadapter_rssi[i]; uint8_t rssi = g_panadapter_rssi[i];
@ -477,7 +478,7 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int
base_line[(ARRAY_SIZE(g_panadapter_rssi) / 2) - (LCD_WIDTH * 2)] = 0xAA; base_line[(ARRAY_SIZE(g_panadapter_rssi) / 2) - (LCD_WIDTH * 2)] = 0xAA;
// top horizontal line // top horizontal line
for (i = 0; i < ARRAY_SIZE(g_panadapter_rssi); i += 2) for (i = 0; i < ARRAY_SIZE(g_panadapter_rssi); i += 4)
base_line[i - (LCD_WIDTH * 2)] |= 1u; base_line[i - (LCD_WIDTH * 2)] |= 1u;
// sprintf(str, "r %3d g %3u n %3u", rssi, glitch, noise); // sprintf(str, "r %3d g %3u n %3u", rssi, glitch, noise);
@ -507,13 +508,6 @@ void UI_DisplayMain(void)
if (g_eeprom.config.setting.dual_watch != DUAL_WATCH_OFF && g_rx_vfo_is_active) if (g_eeprom.config.setting.dual_watch != DUAL_WATCH_OFF && g_rx_vfo_is_active)
current_vfo_num = g_rx_vfo_num; // we're currently monitoring the other VFO current_vfo_num = g_rx_vfo_num; // we're currently monitoring the other VFO
#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_squelch_open && !g_monitor_enabled)
single_vfo = g_eeprom.config.setting.tx_vfo_num;
#endif
// clear the screen // clear the screen
memset(g_frame_buffer, 0, sizeof(g_frame_buffer)); memset(g_frame_buffer, 0, sizeof(g_frame_buffer));
@ -539,6 +533,14 @@ void UI_DisplayMain(void)
} }
#endif #endif
#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_squelch_open && !g_monitor_enabled)
if (!g_monitor_enabled)
single_vfo = g_eeprom.config.setting.tx_vfo_num;
#endif
for (vfo_num = 0; vfo_num < 2; vfo_num++) for (vfo_num = 0; vfo_num < 2; vfo_num++)
{ {
const unsigned int scrn_chan = g_eeprom.config.setting.indices.vfo[vfo_num].screen; const unsigned int scrn_chan = g_eeprom.config.setting.indices.vfo[vfo_num].screen;
@ -1140,7 +1142,8 @@ void UI_DisplayMain(void)
} }
#ifdef ENABLE_PANADAPTER #ifdef ENABLE_PANADAPTER
UI_DisplayMain_pan(false); //if (single_vfo >= 0)
UI_DisplayMain_pan(false);
#endif #endif
ST7565_BlitFullScreen(); ST7565_BlitFullScreen();