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

139 lines
3.4 KiB
C
Raw Normal View History

2023-11-18 18:44:10 +00:00
#if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG)
#include "driver/uart.h"
#endif
#include "panadapter.h"
#ifdef ENABLE_FMRADIO
#include "app/fm.h"
#endif
#include "driver/bk4819.h"
#include "functions.h"
#include "misc.h"
#include "radio.h"
#include "settings.h"
#include "ui/main.h"
#include "ui/ui.h"
bool g_pan_enabled = false;
// a list of frequencies to ignore/skip when scanning
uint8_t g_panadapter_rssi[PANADAPTER_BINS + 1 + PANADAPTER_BINS];
int g_panadapter_rssi_index;
int g_panadapter_vfo_mode; // > 0 if we're currently sampling the VFO
void PAN_set_freq(void)
{ // set the frequency
const uint32_t step_size = g_tx_vfo->step_freq;
uint32_t freq = g_tx_vfo->p_rx->frequency;
if (g_panadapter_vfo_mode <= 0)
{ // panadapter mode .. add the bin offset
if (g_panadapter_rssi_index < PANADAPTER_BINS)
freq -= step_size * (PANADAPTER_BINS - g_panadapter_rssi_index);
else
if (g_panadapter_rssi_index > PANADAPTER_BINS)
freq += step_size * (g_panadapter_rssi_index - PANADAPTER_BINS);
}
BK4819_set_rf_frequency(freq, true); // set the VCO/PLL
//BK4819_set_rf_filter_path(freq); // set the proper LNA/PA filter path
// default front end gains
if (g_panadapter_vfo_mode <= 0)
BK4819_write_reg(0x13, (g_orig_lnas << 8) | (g_orig_lna << 5) | (g_orig_mixer << 3) | (g_orig_pga << 0));
}
void PAN_clear(void)
{
g_panadapter_rssi_index = 0;
memset(g_panadapter_rssi, 0, sizeof(g_panadapter_rssi));
g_panadapter_vfo_mode = 1;
#if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG)
// UART_printf("%u\r\n", g_panadapter_rssi_index);
#endif
}
void PAN_enable(const bool enable)
{
if (enable && g_eeprom.config.setting.panadapter)
{
if (!g_pan_enabled)
{
PAN_clear();
g_panadapter_vfo_mode = 0;
PAN_set_freq();
g_pan_enabled = true;
//g_update_display = true;
UI_DisplayMain_pan(true);
}
}
else
{
if (g_pan_enabled)
{
PAN_clear();
g_panadapter_vfo_mode = 1;
PAN_set_freq();
g_pan_enabled = false;
g_update_display = true;
}
}
}
bool PAN_process_10ms(void)
{
if (!g_pan_enabled)
return false;
if (g_current_function == FUNCTION_TRANSMIT ||
g_current_function == FUNCTION_POWER_SAVE ||
g_current_function == FUNCTION_NEW_RECEIVE ||
g_current_function == FUNCTION_RECEIVE)
return false;
if (g_current_display_screen == DISPLAY_SEARCH ||
g_css_scan_mode != CSS_SCAN_MODE_OFF ||
g_scan_state_dir != SCAN_STATE_DIR_OFF)
return false;
#ifdef ENABLE_FMRADIO
if (g_fm_radio_mode)
return false;
#endif
if (g_squelch_open || g_monitor_enabled)
return false;
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_rssi_index >= (int)ARRAY_SIZE(g_panadapter_rssi))
g_panadapter_rssi_index = 0;
// switch back to the VFO frequency once every 16 frequency steps
g_panadapter_vfo_mode = ((g_panadapter_rssi_index & 15u) == 0) ? 1 : 0;
}
else
if (++g_panadapter_vfo_mode >= 8)
{
g_panadapter_vfo_mode = 0;
}
PAN_set_freq();
if (g_panadapter_rssi_index == 0 && g_panadapter_vfo_mode <= 1)
UI_DisplayMain_pan(true); // the last bin value - show the panadapter
// g_update_display = true;
return (g_panadapter_vfo_mode <= 0) ? true : false;
}