Wolf-LITE/STM32/Core/Src/front_unit.c

1489 wiersze
57 KiB
C

#include "stm32f4xx_hal.h"
#include "main.h"
#include "front_unit.h"
#include "lcd.h"
#include "trx_manager.h"
#include "settings.h"
#include "system_menu.h"
#include "functions.h"
#include "audio_filters.h"
#include "auto_notch.h"
#include "agc.h"
static void FRONTPANEL_ENCODER_Rotated(float32_t direction);
static void FRONTPANEL_ENCODER2_Rotated(int8_t direction);
static uint16_t FRONTPANEL_ReadMCP3008_Value(uint8_t channel, GPIO_TypeDef *CS_PORT, uint16_t CS_PIN);
static void FRONTPANEL_ENCODER2_Rotated(int8_t direction);
void FRONTPANEL_BUTTONHANDLER_BAND_P(void);
void FRONTPANEL_BUTTONHANDLER_BAND_N(void);
static void FRONTPANEL_BUTTONHANDLER_SQUELCH(void);
static void FRONTPANEL_BUTTONHANDLER_WPM(void);
static void FRONTPANEL_BUTTONHANDLER_KEYER(void);
static void FRONTPANEL_BUTTONHANDLER_SHIFT(void);
static void FRONTPANEL_BUTTONHANDLER_CLAR(void);
static void FRONTPANEL_BUTTONHANDLER_STEP(void);
static void FRONTPANEL_BUTTONHANDLER_BANDMAP(void);
static void FRONTPANEL_BUTTONHANDLER_HIDDEN_ENABLE(void);
static void FRONTPANEL_BUTTONHANDLER_ATTHOLD(void);
static void SYSMENU_HANDL_TRX_AutoGain(int8_t direction);
void FRONTPANEL_BUTTONHANDLER_AGC(void);
static void FRONTPANEL_BUTTONHANDLER_AGC_SPEED(void);
void FRONTPANEL_BUTTONHANDLER_AUTGain(void);
void FRONTPANEL_BUTTONHANDLER_NOTCH(void);
void FRONTPANEL_BUTTONHANDLER_FAST(void);
void FRONTPANEL_BUTTONHANDLER_MUTE(void);
static void FRONTPANEL_BUTTONHANDLER_AsB(void);
static void FRONTPANEL_BUTTONHANDLER_ArB(void);
void FRONTPANEL_BUTTONHANDLER_TUNE(void);
static void FRONTPANEL_BUTTONHANDLER_BW(void);
static void FRONTPANEL_BUTTONHANDLER_HPF(void);
static void FRONTPANEL_BUTTONHANDLER_MENU(void);
void FRONTPANEL_BUTTONHANDLER_LOCK(void);
static void FRONTPANEL_BUTTONHANDLER_PWR_P(void);
static void FRONTPANEL_BUTTONHANDLER_PWR_N(void);
void FRONTPANEL_BUTTONHANDLER_ZOOM_P(void);
static void FRONTPANEL_ENC2SW_click_handler(uint32_t parameter);
static void FRONTPANEL_ENC2SW_hold_handler(uint32_t parameter);
static bool FRONTPanel_MCP3008_1_Enabled = true;
static int32_t ENCODER_slowler = 0;
static int32_t ENCODER2_slowler = 0;
static uint32_t ENCODER_AValDeb = 0;
static uint32_t ENCODER2_AValDeb = 0;
//static uint8_t enc2_func_mode = 0;
//static bool enc2_func_mode = false; //false - fast-step, true - func mode (WPM, etc...)
#if (defined(BUTTONS_R7KBI)) //
static PERIPH_FrontPanel_Button PERIPH_FrontPanel_Static_Buttons[] = {
{.port = 1, .channel = 0, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
{.port = 1, .channel = 1, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
{.port = 1, .channel = 2, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
{.port = 1, .channel = 3, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
{.port = 1, .channel = 4, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
{.port = 1, .channel = 5, .name = "MODE", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_P}, //SB6
{.port = 1, .channel = 5, .name = "BAND", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BAND_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BAND_N}, //SB1
{.port = 1, .channel = 7, .name = "MENU", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_MENU, .holdHandler = FRONTPANEL_BUTTONHANDLER_MENU}, //SB1
};
static PERIPH_FrontPanel_Button PERIPH_FrontPanel_BottomScroll_Buttons[BOTTOM_SCROLLBUTTONS_GROUPS_COUNT][5] = {
{
{.port = 1, .channel = 5, .name = "PRE", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PRE, .holdHandler = FRONTPANEL_BUTTONHANDLER_PRE}, //SB2
{.port = 1, .channel = 6, .name = "ATT", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_ATT, .holdHandler = FRONTPANEL_BUTTONHANDLER_ATTHOLD}, //SB3
{.port = 1, .channel = 6, .name = "BW", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_BW, .holdHandler = FRONTPANEL_BUTTONHANDLER_HPF}, //SB4
{.port = 1, .channel = 6, .name = "A/B", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_AsB, .holdHandler = FRONTPANEL_BUTTONHANDLER_ArB}, //SB5
{.port = 1, .channel = 7, .name = "POWER", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER, .holdHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER}, //SB2
},
{
{.port = 1, .channel = 5, .name = "AGC", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_AGC, .holdHandler = FRONTPANEL_BUTTONHANDLER_AGC_SPEED}, //SB2
{.port = 1, .channel = 6, .name = "ZOOM", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P}, //SB3
{.port = 1, .channel = 6, .name = "NOTCH", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_NOTCH, .holdHandler = FRONTPANEL_BUTTONHANDLER_NOTCH}, //SB4
{.port = 1, .channel = 6, .name = "FAST", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_FAST, .holdHandler = FRONTPANEL_BUTTONHANDLER_FAST}, //SB5
{.port = 1, .channel = 7, .name = "CLAR", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_CLAR, .holdHandler = FRONTPANEL_BUTTONHANDLER_CLAR}, //SB3
},
{
{.port = 1, .channel = 5, .name = "GAIN", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_GAIN, .holdHandler = FRONTPANEL_BUTTONHANDLER_GAIN}, //SB2
{.port = 1, .channel = 6, .name = "BANDMAP", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BANDMAP, .holdHandler = FRONTPANEL_BUTTONHANDLER_BANDMAP}, //SB3
{.port = 1, .channel = 6, .name = "MUTE", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_MUTE, .holdHandler = FRONTPANEL_BUTTONHANDLER_MUTE}, //SB4
{.port = 1, .channel = 6, .name = "LOCK", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_LOCK, .holdHandler = FRONTPANEL_BUTTONHANDLER_LOCK}, //SB5
{.port = 1, .channel = 7, .name = "WPM", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_WPM, .holdHandler = FRONTPANEL_BUTTONHANDLER_WPM}, //SB4
},
{
{.port = 1, .channel = 5, .name = "BAND-", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BAND_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_BAND_N}, //SB2
{.port = 1, .channel = 6, .name = "BAND+", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BAND_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BAND_P}, //SB3
{.port = 1, .channel = 6, .name = "MODE-", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_N}, //SB4
{.port = 1, .channel = 6, .name = "MODE+", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_P}, //SB5
{.port = 1, .channel = 7, .name = "KEYER", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_KEYER, .holdHandler = FRONTPANEL_BUTTONHANDLER_KEYER}, //SB5
},
{
{.port = 1, .channel = 5, .name = "BW-", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BW_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_BW_N}, //SB2
{.port = 1, .channel = 6, .name = "BW+", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BW_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BW_P}, //SB3
{.port = 1, .channel = 6, .name = "PWR-", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PWR_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_PWR_N}, //SB4
{.port = 1, .channel = 6, .name = "PWR+", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PWR_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_PWR_P}, //SB5
{.port = 1, .channel = 7, .name = "TUNE", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_TUNE, .holdHandler = FRONTPANEL_BUTTONHANDLER_TUNE}, //SB2
//{.port = 1, .channel = 7, .name = "ZOOM", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P}, //SB2
},
{
// {.port = 1, .channel = 5, .name = "MODE", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_P}, //SB6
// {.port = 1, .channel = 6, .name = "BAND", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BAND_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BAND_N}, //SB1
{.port = 1, .channel = 5, .name = "AUTGN", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_AUTGain, .holdHandler = FRONTPANEL_BUTTONHANDLER_AUTGain}, //SB6
{.port = 1, .channel = 6, .name = "AGC", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_AGC, .holdHandler = FRONTPANEL_BUTTONHANDLER_AGC_SPEED}, //SB1
{.port = 1, .channel = 6, .name = "GAIN", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_GAIN, .holdHandler = FRONTPANEL_BUTTONHANDLER_GAIN}, //SB2
{.port = 1, .channel = 6, .name = "ATT", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_ATT, .holdHandler = FRONTPANEL_BUTTONHANDLER_ATTHOLD}, //SB5
{.port = 1, .channel = 7, .name = "POWER", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER, .holdHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER}, //SB2
},
};
#else
static PERIPH_FrontPanel_Button PERIPH_FrontPanel_Static_Buttons[] = {
{.port = 1, .channel = 0, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
{.port = 1, .channel = 1, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
{.port = 1, .channel = 2, .name = "", .tres_min = 0, .tres_max = 1023, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = NULL, .holdHandler = NULL}, //not used
{.port = 1, .channel = 7, .name = "PRE", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PRE, .holdHandler = FRONTPANEL_BUTTONHANDLER_PRE}, //SB13
{.port = 1, .channel = 7, .name = "ATT", .tres_min = 700, .tres_max = 950, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_ATT, .holdHandler = FRONTPANEL_BUTTONHANDLER_ATTHOLD}, //SB14
{.port = 1, .channel = 7, .name = "MODE", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_P}, //SB6
{.port = 1, .channel = 7, .name = "BAND", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BAND_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BAND_N}, //SB1
{.port = 1, .channel = 6, .name = "MENU", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_MENU, .holdHandler = FRONTPANEL_BUTTONHANDLER_MENU}, //SB1
};
static PERIPH_FrontPanel_Button PERIPH_FrontPanel_BottomScroll_Buttons[BOTTOM_SCROLLBUTTONS_GROUPS_COUNT][5] = {
{
{.port = 1, .channel = 5, .name = "PRE", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PRE, .holdHandler = FRONTPANEL_BUTTONHANDLER_PRE}, //SB2
{.port = 1, .channel = 5, .name = "ATT", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_ATT, .holdHandler = FRONTPANEL_BUTTONHANDLER_ATTHOLD}, //SB3
{.port = 1, .channel = 5, .name = "BW", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_BW, .holdHandler = FRONTPANEL_BUTTONHANDLER_HPF}, //SB4
{.port = 1, .channel = 6, .name = "A/B", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_AsB, .holdHandler = FRONTPANEL_BUTTONHANDLER_ArB}, //SB5
{.port = 1, .channel = 6, .name = "POWER", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER,.holdHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER}, //SB2
},
{
{.port = 1, .channel = 5, .name = "AGC", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_AGC, .holdHandler = FRONTPANEL_BUTTONHANDLER_AGC_SPEED}, //SB2
{.port = 1, .channel = 5, .name = "ZOOM", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_ZOOM_P}, //SB3
{.port = 1, .channel = 5, .name = "NOTCH", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_NOTCH, .holdHandler = FRONTPANEL_BUTTONHANDLER_NOTCH}, //SB4
{.port = 1, .channel = 6, .name = "FAST", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_FAST, .holdHandler = FRONTPANEL_BUTTONHANDLER_FAST}, //SB5
{.port = 1, .channel = 6, .name = "CLAR", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_CLAR, .holdHandler = FRONTPANEL_BUTTONHANDLER_CLAR}, //SB3
},
{
{.port = 1, .channel = 5, .name = "GAIN", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_GAIN, .holdHandler = FRONTPANEL_BUTTONHANDLER_GAIN}, //SB2
{.port = 1, .channel = 5, .name = "BANDMAP", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BANDMAP, .holdHandler = FRONTPANEL_BUTTONHANDLER_BANDMAP}, //SB3
{.port = 1, .channel = 5, .name = "MUTE", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_MUTE, .holdHandler = FRONTPANEL_BUTTONHANDLER_MUTE}, //SB4
{.port = 1, .channel = 6, .name = "LOCK", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_LOCK, .holdHandler = FRONTPANEL_BUTTONHANDLER_LOCK}, //SB5
{.port = 1, .channel = 6, .name = "WPM", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_WPM, .holdHandler = FRONTPANEL_BUTTONHANDLER_WPM}, //SB4
},
{
{.port = 1, .channel = 5, .name = "BAND-", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BAND_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_BAND_N}, //SB2
{.port = 1, .channel = 5, .name = "BAND+", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BAND_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BAND_P}, //SB3
{.port = 1, .channel = 5, .name = "MODE-", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_N}, //SB4
{.port = 1, .channel = 6, .name = "MODE+", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_P}, //SB5
{.port = 1, .channel = 6, .name = "KEYER", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_KEYER, .holdHandler = FRONTPANEL_BUTTONHANDLER_KEYER}, //SB5
},
{
{.port = 1, .channel = 5, .name = "BW-", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BW_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_BW_N}, //SB2
{.port = 1, .channel = 5, .name = "BW+", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BW_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BW_P}, //SB3
{.port = 1, .channel = 5, .name = "PWR-", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PWR_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_PWR_N}, //SB4
{.port = 1, .channel = 6, .name = "PWR+", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PWR_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_PWR_P}, //SB5
{.port = 1, .channel = 6, .name = "TUNE", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_TUNE, .holdHandler = FRONTPANEL_BUTTONHANDLER_TUNE}, //SB2
},
{
{.port = 1, .channel = 5, .name = "MODE", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_MODE_N, .holdHandler = FRONTPANEL_BUTTONHANDLER_MODE_P}, //SB6
{.port = 1, .channel = 5, .name = "BAND", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_BAND_P, .holdHandler = FRONTPANEL_BUTTONHANDLER_BAND_N}, //SB1
{.port = 1, .channel = 5, .name = "PRE", .tres_min = 10, .tres_max = 300, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_PRE, .holdHandler = FRONTPANEL_BUTTONHANDLER_PRE}, //SB2
{.port = 1, .channel = 6, .name = "A/B", .tres_min = 500, .tres_max = 700, .state = false, .prev_state = false, .work_in_menu = false, .clickHandler = FRONTPANEL_BUTTONHANDLER_AsB, .holdHandler = FRONTPANEL_BUTTONHANDLER_ArB}, //SB5
{.port = 1, .channel = 6, .name = "POWER", .tres_min = 300, .tres_max = 500, .state = false, .prev_state = false, .work_in_menu = true, .clickHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER,.holdHandler = FRONTPANEL_BUTTONHANDLER_RF_POWER}, //SB2
},
};
#endif
PERIPH_FrontPanel_Button* PERIPH_FrontPanel_BottomScroll_Buttons_Active = PERIPH_FrontPanel_BottomScroll_Buttons[0];
int8_t PERIPH_FrontPanel_BottomScroll_index = 0;
void FRONTPANEL_ENCODER_checkRotate(void)
{
static uint32_t ENCstartMeasureTime = 0;
static int16_t ENCticksInInterval = 0;
static float32_t ENCAcceleration = 0;
static uint8_t ENClastClkVal = 0;
static bool ENCfirst = true;
uint8_t ENCODER_DTVal = HAL_GPIO_ReadPin(ENC_DT_GPIO_Port, ENC_DT_Pin);
uint8_t ENCODER_CLKVal = HAL_GPIO_ReadPin(ENC_CLK_GPIO_Port, ENC_CLK_Pin);
if (ENCfirst)
{
ENClastClkVal = ENCODER_CLKVal;
ENCfirst = false;
}
if ((HAL_GetTick() - ENCODER_AValDeb) < CALIBRATE.ENCODER_DEBOUNCE)
return;
if (ENClastClkVal != ENCODER_CLKVal)
{
if (!CALIBRATE.ENCODER_ON_FALLING || ENCODER_CLKVal == 0)
{
if (ENCODER_DTVal != ENCODER_CLKVal)
{ // If pin A changed first - clockwise rotation
ENCODER_slowler--;
if (ENCODER_slowler <= -CALIBRATE.ENCODER_SLOW_RATE)
{
//acceleration
ENCticksInInterval++;
if((HAL_GetTick() - ENCstartMeasureTime) > ENCODER_ACCELERATION)
{
ENCstartMeasureTime = HAL_GetTick();
ENCAcceleration = (10.0f + ENCticksInInterval - 1.0f) / 10.0f;
ENCticksInInterval = 0;
}
//do rotate
FRONTPANEL_ENCODER_Rotated(CALIBRATE.ENCODER_INVERT ? ENCAcceleration : -ENCAcceleration);
ENCODER_slowler = 0;
}
}
else
{ // otherwise B changed its state first - counterclockwise rotation
ENCODER_slowler++;
if (ENCODER_slowler >= CALIBRATE.ENCODER_SLOW_RATE)
{
//acceleration
ENCticksInInterval++;
if((HAL_GetTick() - ENCstartMeasureTime) > ENCODER_ACCELERATION)
{
ENCstartMeasureTime = HAL_GetTick();
ENCAcceleration = (10.0f + ENCticksInInterval - 1.0f) / 10.0f;
ENCticksInInterval = 0;
}
//do rotate
FRONTPANEL_ENCODER_Rotated(CALIBRATE.ENCODER_INVERT ? -ENCAcceleration : ENCAcceleration);
ENCODER_slowler = 0;
}
}
}
ENCODER_AValDeb = HAL_GetTick();
ENClastClkVal = ENCODER_CLKVal;
}
}
void FRONTPANEL_ENCODER2_checkRotate(void)
{
uint8_t ENCODER2_DTVal = HAL_GPIO_ReadPin(ENC2_DT_GPIO_Port, ENC2_DT_Pin);
uint8_t ENCODER2_CLKVal = HAL_GPIO_ReadPin(ENC2_CLK_GPIO_Port, ENC2_CLK_Pin);
static uint32_t ENCstartMeasureTime = 0;
static int16_t ENCticksInInterval = 0;
static float32_t ENCAcceleration = 0;
static uint8_t ENClastClkVal = 0;
static bool ENCfirst = true;
if (ENCfirst)
{
ENClastClkVal = ENCODER2_CLKVal;
ENCfirst = false;
}
if (ENClastClkVal != ENCODER2_CLKVal)
{
if ((HAL_GetTick() - ENCODER2_AValDeb) < CALIBRATE.ENCODER2_DEBOUNCE)
return;
if (!CALIBRATE.ENCODER_ON_FALLING || ENCODER2_CLKVal == 0)
{
if (ENCODER2_DTVal != ENCODER2_CLKVal)
{ // If pin A changed first - clockwise rotation
ENCODER2_slowler--;
if (ENCODER2_slowler <= -CALIBRATE.ENCODER2_SLOW_RATE)
{
//acceleration
ENCticksInInterval++;
if((HAL_GetTick() - ENCstartMeasureTime) > ENCODER_ACCELERATION)
{
ENCstartMeasureTime = HAL_GetTick();
ENCAcceleration = (10.0f + ENCticksInInterval - 1.0f) / 10.0f;
ENCticksInInterval = 0;
}
//do rotate
FRONTPANEL_ENCODER2_Rotated(CALIBRATE.ENCODER2_INVERT ? ENCAcceleration : -ENCAcceleration);
ENCODER2_slowler = 0;
}
}
else
{ // otherwise B changed its state first - counterclockwise rotation
ENCODER2_slowler++;
if (ENCODER2_slowler >= CALIBRATE.ENCODER2_SLOW_RATE)
{
//acceleration
ENCticksInInterval++;
if((HAL_GetTick() - ENCstartMeasureTime) > ENCODER_ACCELERATION)
{
ENCstartMeasureTime = HAL_GetTick();
ENCAcceleration = (10.0f + ENCticksInInterval - 1.0f) / 10.0f;
ENCticksInInterval = 0;
}
//do rotate
FRONTPANEL_ENCODER2_Rotated(CALIBRATE.ENCODER2_INVERT ? -ENCAcceleration : ENCAcceleration);
ENCODER2_slowler = 0;
}
}
// if (ENCODER2_DTVal != ENCODER2_CLKVal)
// { // If pin A changed first - clockwise rotation
// FRONTPANEL_ENCODER2_Rotated(CALIBRATE.ENCODER2_INVERT ? 1 : -1);
// }
// else
// { // otherwise B changed its state first - counterclockwise rotation
// FRONTPANEL_ENCODER2_Rotated(CALIBRATE.ENCODER2_INVERT ? -1 : 1);
// }
}
ENCODER2_AValDeb = HAL_GetTick();
ENClastClkVal = ENCODER2_CLKVal;
}
}
static void FRONTPANEL_ENCODER_Rotated(float32_t direction) // rotated encoder, handler here, direction -1 - left, 1 - right
{
if (TRX_on_TX() && TRX.Encoder_OFF == true)
return;
if (TRX.Locked)
return;
if (LCD_systemMenuOpened)
{
eventRotateSystemMenu((int8_t)direction);
return;
}
if(fabsf(direction) <= ENCODER_MIN_RATE_ACCELERATION)
direction = (direction < 0.0f)? -1.0f : 1.0f;
if (TRX_IF_Gain)
{
TRX.IF_Gain += direction;
if (TRX.IF_Gain < 1)
TRX.IF_Gain = 1;
if (TRX.IF_Gain > 80)
TRX.IF_Gain = 80;
return;
}
if (TRX.ShiftEnabled)
{
TRX_SHIFT += direction * 10;
if (TRX_SHIFT > TRX.SHIFT_INTERVAL) TRX_SHIFT = TRX.SHIFT_INTERVAL;
if (TRX_SHIFT < -TRX.SHIFT_INTERVAL) TRX_SHIFT = -TRX.SHIFT_INTERVAL;
TRX_setFrequency(CurrentVFO()->Freq, CurrentVFO());
uint16_t LCD_bw_trapez_stripe_pos_new = LAY_BW_TRAPEZ_POS_X + LAY_BW_TRAPEZ_WIDTH / 2;
LCD_bw_trapez_stripe_pos_new += (int16_t)((float32_t)(LAY_BW_TRAPEZ_WIDTH * 0.9f) / 2.0f * ((float32_t)TRX_SHIFT / (float32_t)TRX.SHIFT_INTERVAL));
if (abs(LCD_bw_trapez_stripe_pos_new - LCD_bw_trapez_stripe_pos) > 2)
{
LCD_bw_trapez_stripe_pos = LCD_bw_trapez_stripe_pos_new;
LCD_UpdateQuery.StatusInfoGUI = true;
}
return;
}
VFO *vfo = CurrentVFO();
uint32_t newfreq = 0;
if (TRX.Fast)
{
newfreq = (uint32_t)((int32_t)vfo->Freq + (int32_t)((float32_t)TRX.FRQ_FAST_STEP * direction));
if ((vfo->Freq % TRX.FRQ_FAST_STEP) > 0 && fabsf(direction) <= 1.0f)
newfreq = vfo->Freq / TRX.FRQ_FAST_STEP * TRX.FRQ_FAST_STEP;
}
else
{
newfreq = (uint32_t)((int32_t)vfo->Freq + (int32_t)((float32_t)TRX.FRQ_STEP * direction));
if ((vfo->Freq % TRX.FRQ_STEP) > 0 && fabsf(direction) <= 1.0f)
newfreq = vfo->Freq / TRX.FRQ_STEP * TRX.FRQ_STEP;
}
TRX_setFrequency(newfreq, vfo);
LCD_UpdateQuery.FreqInfo = true;
NeedSaveSettings = true;
}
static void FRONTPANEL_ENCODER2_Rotated(int8_t direction) // rotated encoder, handler here, direction -1 - left, 1 - right
{
//if (TRX.Locked)
//return;
if (LCD_systemMenuOpened)
{
eventSecRotateSystemMenu(direction);
return;
}
else
{
if (TRX.TX_func_mode == 0) //function buttons scroll
{
PERIPH_FrontPanel_BottomScroll_index += direction;
if(PERIPH_FrontPanel_BottomScroll_index < 0)
PERIPH_FrontPanel_BottomScroll_index = BOTTOM_SCROLLBUTTONS_GROUPS_COUNT - 1;
if(PERIPH_FrontPanel_BottomScroll_index >= BOTTOM_SCROLLBUTTONS_GROUPS_COUNT)
PERIPH_FrontPanel_BottomScroll_index = 0;
PERIPH_FrontPanel_BottomScroll_Buttons_Active = PERIPH_FrontPanel_BottomScroll_Buttons[PERIPH_FrontPanel_BottomScroll_index];
LCD_UpdateQuery.TopButtons = true;
}
if (TRX.TX_func_mode == 1) //set volume
{
int16_t newvolume = (int16_t)TRX.Volume + direction * TRX.Volume_Step; //
newvolume /= TRX.Volume_Step;
newvolume *= TRX.Volume_Step;
if(newvolume > 100)
newvolume = 100;
if(newvolume < 0)
newvolume = 0;
TRX.Volume = newvolume;
char str[32] = {0};
sprintf(str, "VOL: %d%%",TRX.Volume);
LCD_showTooltip(str);
}
//##################################################################################
if (TRX.TX_func_mode == 2) //fast step mode
{
VFO *vfo = CurrentVFO();
uint32_t newfreq = 0;
float64_t freq_round = 0;
float64_t step = 0;
if (TRX.Fast)
{
step = (float32_t)TRX.FRQ_ENC_FAST_STEP; // Fast
freq_round = roundf((float64_t)vfo->Freq / step) * step;
newfreq = (uint32_t)((int32_t)freq_round + (int32_t)step * direction);
// step = (float32_t)TRX.FRQ_FAST_STEP * 2; // Fast
// freq_round = roundf((float64_t)vfo->Freq / step) * step;
// newfreq = (uint32_t)((int32_t)freq_round + (int32_t)step * direction);
}
else
{
step = (float32_t)TRX.FRQ_ENC_STEP; // Regular
freq_round = roundf((float64_t)vfo->Freq / step) * step;
newfreq = (uint32_t)((int32_t)freq_round + (int32_t)step * direction);
// step = (float32_t)TRX.FRQ_STEP * 2; // Regular
// freq_round = roundf((float64_t)vfo->Freq / step) * step;
// newfreq = (uint32_t)((int32_t)freq_round + (int32_t)step * direction);
}
TRX_setFrequency(newfreq, vfo);
LCD_UpdateQuery.FreqInfo = true;
}
//##################################################################################
}
}
void FRONTPANEL_check_ENC2SW(void)
{
static uint32_t menu_enc2_click_starttime = 0;
static bool ENC2SW_Last = true;
static bool ENC2SW_clicked = false;
static bool ENC2SW_hold_start = false;
static bool ENC2SW_holded = false;
ENC2SW_clicked = false;
ENC2SW_holded = false;
if (TRX.Locked)
return;
bool ENC2SW_AND_TOUCH_Now = HAL_GPIO_ReadPin(ENC2_SW_GPIO_Port, ENC2_SW_Pin);
//check hold and click
if (ENC2SW_Last != ENC2SW_AND_TOUCH_Now)
{
ENC2SW_Last = ENC2SW_AND_TOUCH_Now;
if (!ENC2SW_AND_TOUCH_Now)
{
menu_enc2_click_starttime = HAL_GetTick();
ENC2SW_hold_start = true;
}
}
if (!ENC2SW_AND_TOUCH_Now && ENC2SW_hold_start)
{
if ((HAL_GetTick() - menu_enc2_click_starttime) > KEY_HOLD_TIME)
{
ENC2SW_holded = true;
ENC2SW_hold_start = false;
}
}
if (ENC2SW_AND_TOUCH_Now && ENC2SW_hold_start)
{
if ((HAL_GetTick() - menu_enc2_click_starttime) > 1)
{
ENC2SW_clicked = true;
ENC2SW_hold_start = false;
}
}
//ENC2 Button hold
if (ENC2SW_holded)
{
FRONTPANEL_ENC2SW_hold_handler(0);
}
//ENC2 Button click
if (ENC2SW_clicked)
{
menu_enc2_click_starttime = HAL_GetTick();
FRONTPANEL_ENC2SW_click_handler(0);
}
}
static void FRONTPANEL_ENC2SW_click_handler(uint32_t parameter)
{
//ENC2 CLICK
if (!LCD_systemMenuOpened)
{
TRX.TX_func_mode++; //enc2 rotary mode
if(TRX.TX_func_mode >= 3)
TRX.TX_func_mode = 0;
if (TRX.TX_func_mode == 0)
LCD_showTooltip("BUTTONS");
if (TRX.TX_func_mode == 1)
LCD_showTooltip("SET VOLUME");
if (TRX.TX_func_mode == 2)
LCD_showTooltip("FAST STEP");
}
else
{
if (LCD_systemMenuOpened)
{
//navigate in menu
SYSMENU_eventSecEncoderClickSystemMenu();
}
}
}
static void FRONTPANEL_ENC2SW_hold_handler(uint32_t parameter)
{
// FRONTPANEL_BUTTONHANDLER_MENU();
FRONTPANEL_BUTTONHANDLER_SHIFT();
}
void FRONTPANEL_Init(void)
{
uint16_t test_value = FRONTPANEL_ReadMCP3008_Value(0, AD1_CS_GPIO_Port, AD1_CS_Pin);
if (test_value == 65535)
{
FRONTPanel_MCP3008_1_Enabled = false;
sendToDebug_strln("[ERR] Frontpanel MCP3008 - 1 not found, disabling... (FPGA SPI/I2S CLOCK ERROR?)");
LCD_showError("MCP3008 - 1 init error (FPGA I2S CLK?)", true);
}
FRONTPANEL_Process();
}
void FRONTPANEL_Process(void)
{
if (SPI_process)
return;
SPI_process = true;
FRONTPANEL_check_ENC2SW();
uint16_t buttons_count = sizeof(PERIPH_FrontPanel_Static_Buttons) / sizeof(PERIPH_FrontPanel_Button);
uint16_t mcp3008_value = 0;
bool process_static_buttons = true;
//process buttons
PERIPH_FrontPanel_Button* PERIPH_FrontPanel_Buttons = PERIPH_FrontPanel_Static_Buttons;
for (int16_t b = 0; b < buttons_count; b++)
{
//check disabled ports
if (PERIPH_FrontPanel_Buttons[b].port == 1 && !FRONTPanel_MCP3008_1_Enabled)
continue;
//get state from ADC MCP3008 (10bit - 1024values)
if (PERIPH_FrontPanel_Buttons[b].port == 1)
mcp3008_value = FRONTPANEL_ReadMCP3008_Value(PERIPH_FrontPanel_Buttons[b].channel, AD1_CS_GPIO_Port, AD1_CS_Pin);
/*sendToDebug_str("port: ");
sendToDebug_uint8(PERIPH_FrontPanel_Buttons[b].port, true);
sendToDebug_str("channel: ");
sendToDebug_uint8(PERIPH_FrontPanel_Buttons[b].channel, true);
sendToDebug_str("value: ");
sendToDebug_uint16(mcp3008_value, false);
sendToDebug_flush();*/
//set state
if (mcp3008_value >= PERIPH_FrontPanel_Buttons[b].tres_min && mcp3008_value < PERIPH_FrontPanel_Buttons[b].tres_max)
PERIPH_FrontPanel_Buttons[b].state = true;
else
PERIPH_FrontPanel_Buttons[b].state = false;
//check state
if ((PERIPH_FrontPanel_Buttons[b].prev_state != PERIPH_FrontPanel_Buttons[b].state) && PERIPH_FrontPanel_Buttons[b].state)
{
PERIPH_FrontPanel_Buttons[b].start_hold_time = HAL_GetTick();
PERIPH_FrontPanel_Buttons[b].afterhold = false;
}
//check hold state
if ((PERIPH_FrontPanel_Buttons[b].prev_state == PERIPH_FrontPanel_Buttons[b].state) && PERIPH_FrontPanel_Buttons[b].state && ((HAL_GetTick() - PERIPH_FrontPanel_Buttons[b].start_hold_time) > KEY_HOLD_TIME) && !PERIPH_FrontPanel_Buttons[b].afterhold)
{
PERIPH_FrontPanel_Buttons[b].afterhold = true;
if (!TRX.Locked || (PERIPH_FrontPanel_Buttons[b].clickHandler == FRONTPANEL_BUTTONHANDLER_LOCK)) //LOCK BUTTON
if (!LCD_systemMenuOpened || PERIPH_FrontPanel_Buttons[b].work_in_menu)
if (PERIPH_FrontPanel_Buttons[b].holdHandler != NULL)
{
WM8731_Beep();
PERIPH_FrontPanel_Buttons[b].holdHandler();
}
}
//check click state
if ((PERIPH_FrontPanel_Buttons[b].prev_state != PERIPH_FrontPanel_Buttons[b].state) && !PERIPH_FrontPanel_Buttons[b].state && ((HAL_GetTick() - PERIPH_FrontPanel_Buttons[b].start_hold_time) < KEY_HOLD_TIME) && !PERIPH_FrontPanel_Buttons[b].afterhold && !TRX.Locked)
{
if (!LCD_systemMenuOpened || PERIPH_FrontPanel_Buttons[b].work_in_menu)
if (PERIPH_FrontPanel_Buttons[b].clickHandler != NULL)
{
WM8731_Beep();
PERIPH_FrontPanel_Buttons[b].clickHandler();
}
}
//save prev state
PERIPH_FrontPanel_Buttons[b].prev_state = PERIPH_FrontPanel_Buttons[b].state;
if(process_static_buttons && b == (buttons_count - 1))
{
//repeat with dynamic buttons
process_static_buttons = false;
buttons_count = sizeof(PERIPH_FrontPanel_BottomScroll_Buttons[0]) / sizeof(PERIPH_FrontPanel_Button);
PERIPH_FrontPanel_Buttons = PERIPH_FrontPanel_BottomScroll_Buttons_Active;
b = -1;
}
}
SPI_process = false;
}
//----------------------------------------------------------------------------
void FRONTPANEL_BUTTONHANDLER_ZOOM_P(void)
{
if (TRX.FFT_Zoom == 1)
TRX.FFT_Zoom = 2;
else if (TRX.FFT_Zoom == 2)
TRX.FFT_Zoom = 4;
else if (TRX.FFT_Zoom == 4)
TRX.FFT_Zoom = 8;
else if (TRX.FFT_Zoom == 8)
TRX.FFT_Zoom = 1;
FFT_Init();
//LCD_redraw(false);
}
//----------------------------------------------------------------------------
void FRONTPANEL_BUTTONHANDLER_AsB(void) // A/B
{
// TX block
if (TRX_on_TX())
return;
TRX_TemporaryMute();
TRX.current_vfo = !TRX.current_vfo;
TRX_setFrequency(CurrentVFO()->Freq, CurrentVFO());
TRX_setMode(CurrentVFO()->Mode, CurrentVFO());
LCD_UpdateQuery.TopButtons = true;
LCD_UpdateQuery.FreqInfo = true;
LCD_UpdateQuery.StatusInfoGUI = true;
NeedSaveSettings = true;
NeedReinitAudioFilters = true;
LCD_redraw(false);
}
void FRONTPANEL_BUTTONHANDLER_TUNE(void)
{
TRX_Tune = !TRX_Tune;
TRX_ptt_hard = TRX_Tune;
LCD_UpdateQuery.StatusInfoGUIRedraw = true;
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
TRX_Restart_Mode();
}
void FRONTPANEL_BUTTONHANDLER_PRE(void)
{
TRX.ADC_Driver = !TRX.ADC_Driver;
int8_t band = getBandFromFreq(CurrentVFO()->Freq, true);
if (band > 0)
TRX.BANDS_SAVED_SETTINGS[band].ADC_Driver = TRX.ADC_Driver;
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_ATT(void)
{
TRX.ATT = !TRX.ATT;
int8_t band = getBandFromFreq(CurrentVFO()->Freq, true);
if (band > 0)
{
TRX.BANDS_SAVED_SETTINGS[band].ATT = TRX.ATT;
TRX.BANDS_SAVED_SETTINGS[band].ATT_DB = TRX.ATT_DB;
}
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_ATTHOLD(void)
{
TRX.ATT_DB += TRX.ATT_STEP;
if (TRX.ATT_DB > 31.0f)
TRX.ATT_DB = TRX.ATT_STEP;
int8_t band = getBandFromFreq(CurrentVFO()->Freq, true);
if (band > 0)
{
TRX.BANDS_SAVED_SETTINGS[band].ATT = TRX.ATT;
TRX.BANDS_SAVED_SETTINGS[band].ATT_DB = TRX.ATT_DB;
}
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_FAST(void)
{
TRX.Fast = !TRX.Fast;
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_MODE_P(void)
{
//enable claibration hidden menu!
if (LCD_systemMenuOpened)
{
sysmenu_hiddenmenu_enabled = true;
LCD_redraw(false);
LCD_UpdateQuery.TopButtons = true;
LCD_UpdateQuery.StatusInfoBar = true;
NeedSaveSettings = true;
return;
}
int8_t mode = (int8_t)CurrentVFO()->Mode;
if (mode == TRX_MODE_LSB)
mode = TRX_MODE_USB;
else if (mode == TRX_MODE_USB)
mode = TRX_MODE_LSB;
else if (mode == TRX_MODE_CW_L)
mode = TRX_MODE_CW_U;
else if (mode == TRX_MODE_CW_U)
mode = TRX_MODE_CW_L;
else if (mode == TRX_MODE_NFM)
mode = TRX_MODE_WFM;
else if (mode == TRX_MODE_WFM)
mode = TRX_MODE_NFM;
else if (mode == TRX_MODE_DIGI_L)
mode = TRX_MODE_DIGI_U;
else if (mode == TRX_MODE_DIGI_U)
mode = TRX_MODE_DIGI_L;
else if (mode == TRX_MODE_AM)
mode = TRX_MODE_IQ;
else if (mode == TRX_MODE_IQ)
{
mode = TRX_MODE_LOOPBACK;
LCD_UpdateQuery.StatusInfoGUIRedraw = true;
}
else if (mode == TRX_MODE_LOOPBACK)
{
mode = TRX_MODE_AM;
LCD_UpdateQuery.StatusInfoGUIRedraw = true;
}
TRX_setMode((uint8_t)mode, CurrentVFO());
int8_t band = getBandFromFreq(CurrentVFO()->Freq, true);
if (band > 0)
TRX.BANDS_SAVED_SETTINGS[band].Mode = (uint8_t)mode;
TRX_Temporary_Stop_BandMap = true;
}
void FRONTPANEL_BUTTONHANDLER_MODE_N(void)
{
int8_t mode = (int8_t)CurrentVFO()->Mode;
if(mode == TRX_MODE_LOOPBACK)
LCD_UpdateQuery.StatusInfoGUIRedraw = true;
if (mode == TRX_MODE_LSB)
mode = TRX_MODE_CW_L;
else if (mode == TRX_MODE_USB)
mode = TRX_MODE_CW_U;
else if (mode == TRX_MODE_CW_L || mode == TRX_MODE_CW_U)
mode = TRX_MODE_DIGI_U;
else if (mode == TRX_MODE_DIGI_L || mode == TRX_MODE_DIGI_U)
mode = TRX_MODE_NFM;
else if (mode == TRX_MODE_NFM || mode == TRX_MODE_WFM)
mode = TRX_MODE_AM;
else
{
if (CurrentVFO()->Freq < 10000000)
mode = TRX_MODE_LSB;
else
mode = TRX_MODE_USB;
}
TRX_setMode((uint8_t)mode, CurrentVFO());
int8_t band = getBandFromFreq(CurrentVFO()->Freq, true);
if (band > 0)
TRX.BANDS_SAVED_SETTINGS[band].Mode = (uint8_t)mode;
TRX_Temporary_Stop_BandMap = true;
}
void FRONTPANEL_BUTTONHANDLER_BAND_P(void)
{
int8_t band = getBandFromFreq(CurrentVFO()->Freq, true);
band++;
if (band >= BANDS_COUNT)
band = 0;
while (!BANDS[band].selectable)
{
band++;
if (band >= BANDS_COUNT)
band = 0;
}
TRX_setFrequency(TRX.BANDS_SAVED_SETTINGS[band].Freq, CurrentVFO());
TRX_setMode(TRX.BANDS_SAVED_SETTINGS[band].Mode, CurrentVFO());
TRX.ATT = TRX.BANDS_SAVED_SETTINGS[band].ATT;
TRX.ATT_DB = TRX.BANDS_SAVED_SETTINGS[band].ATT_DB;
TRX.ADC_Driver = TRX.BANDS_SAVED_SETTINGS[band].ADC_Driver;
TRX.FM_SQL_threshold = TRX.BANDS_SAVED_SETTINGS[band].FM_SQL_threshold;
TRX.IF_Gain = TRX.BANDS_SAVED_SETTINGS[band].IF_Gain;
// TRX_AutoGain_Stage = TRX.BANDS_SAVED_SETTINGS[band].AutoGain_Stage;
CurrentVFO()->AGC = TRX.BANDS_SAVED_SETTINGS[band].AGC;
TRX_Temporary_Stop_BandMap = false;
LCD_UpdateQuery.TopButtons = true;
LCD_UpdateQuery.FreqInfo = true;
}
void FRONTPANEL_BUTTONHANDLER_BAND_N(void)
{
int8_t band = getBandFromFreq(CurrentVFO()->Freq, true);
band--;
if (band < 0)
band = BANDS_COUNT - 1;
while (!BANDS[band].selectable)
{
band--;
if (band < 0)
band = BANDS_COUNT - 1;
}
TRX_setFrequency(TRX.BANDS_SAVED_SETTINGS[band].Freq, CurrentVFO());
TRX_setMode(TRX.BANDS_SAVED_SETTINGS[band].Mode, CurrentVFO());
TRX.ATT = TRX.BANDS_SAVED_SETTINGS[band].ATT;
TRX.ATT_DB = TRX.BANDS_SAVED_SETTINGS[band].ATT_DB;
TRX.ADC_Driver = TRX.BANDS_SAVED_SETTINGS[band].ADC_Driver;
TRX.FM_SQL_threshold = TRX.BANDS_SAVED_SETTINGS[band].FM_SQL_threshold;
TRX.IF_Gain = TRX.BANDS_SAVED_SETTINGS[band].IF_Gain;
// TRX_AutoGain_Stage = TRX.BANDS_SAVED_SETTINGS[band].AutoGain_Stage;
CurrentVFO()->AGC = TRX.BANDS_SAVED_SETTINGS[band].AGC;
TRX_Temporary_Stop_BandMap = false;
LCD_UpdateQuery.TopButtons = true;
LCD_UpdateQuery.FreqInfo = true;
}
void FRONTPANEL_BUTTONHANDLER_RF_POWER(void)
{
if (!LCD_systemMenuOpened)
{
LCD_systemMenuOpened = true;
SYSMENU_TRX_RFPOWER_HOTKEY();
}
else
{
eventCloseAllSystemMenu();
}
LCD_redraw(false);
}
static void SYSMENU_HANDL_TRX_AutoGain(int8_t direction)
{
if (direction > 0)
TRX.AutoGain = true;
if (direction < 0)
TRX.AutoGain = false;
TRX.ATT = false;
FPGA_NeedSendParams = true;
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_GAIN(void)
{
TRX_IF_Gain = !TRX_IF_Gain;
int8_t band = getBandFromFreq(CurrentVFO()->Freq, true);
if (band > 0)
{
TRX.BANDS_SAVED_SETTINGS[band].IF_Gain = TRX.IF_Gain;
}
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_AUTGain(void)
{
TRX.AutoGain = !TRX.AutoGain;
if(TRX.AutoGain)
TRX.AutoGain = true;
else
TRX.AutoGain = false;
TRX.ATT = false;
FPGA_NeedSendParams = true;
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_AGC(void)
{
CurrentVFO()->AGC = !CurrentVFO()->AGC;
int8_t band = getBandFromFreq(CurrentVFO()->Freq, true);
if (band > 0)
TRX.BANDS_SAVED_SETTINGS[band].AGC = CurrentVFO()->AGC;
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_AGC_SPEED(void)
{
if (!LCD_systemMenuOpened)
{
LCD_systemMenuOpened = true;
SYSMENU_AUDIO_AGC_HOTKEY();
}
else
{
eventCloseAllSystemMenu();
}
LCD_redraw(false);
}
static void FRONTPANEL_BUTTONHANDLER_SQUELCH(void)
{
if (!LCD_systemMenuOpened)
{
LCD_systemMenuOpened = true;
SYSMENU_AUDIO_SQUELCH_HOTKEY();
}
else
{
eventCloseAllSystemMenu();
}
LCD_redraw(false);
}
static void FRONTPANEL_BUTTONHANDLER_WPM(void)
{
if (!LCD_systemMenuOpened)
{
LCD_systemMenuOpened = true;
SYSMENU_CW_WPM_HOTKEY();
}
else
{
eventCloseAllSystemMenu();
}
LCD_redraw(false);
}
static void FRONTPANEL_BUTTONHANDLER_KEYER(void)
{
TRX.CW_KEYER = !TRX.CW_KEYER;
if(TRX.CW_KEYER)
LCD_showTooltip("KEYER ON");
else
LCD_showTooltip("KEYER OFF");
}
static void FRONTPANEL_BUTTONHANDLER_STEP(void)
{
if (!LCD_systemMenuOpened)
{
LCD_systemMenuOpened = true;
SYSMENU_TRX_STEP_HOTKEY();
}
else
{
eventCloseAllSystemMenu();
}
LCD_redraw(false);
}
void FRONTPANEL_BUTTONHANDLER_BW(void)
{
if (!LCD_systemMenuOpened)
{
LCD_systemMenuOpened = true;
if (CurrentVFO()->Mode == TRX_MODE_CW_L || CurrentVFO()->Mode == TRX_MODE_CW_U)
SYSMENU_AUDIO_BW_CW_HOTKEY();
else if (CurrentVFO()->Mode == TRX_MODE_NFM || CurrentVFO()->Mode == TRX_MODE_WFM)
SYSMENU_AUDIO_BW_FM_HOTKEY();
else if (CurrentVFO()->Mode == TRX_MODE_AM)
SYSMENU_AUDIO_BW_AM_HOTKEY();
else
SYSMENU_AUDIO_BW_SSB_HOTKEY();
}
else
{
eventCloseAllSystemMenu();
}
LCD_redraw(false);
}
void FRONTPANEL_BUTTONHANDLER_VOLUME(void)
{
if (!LCD_systemMenuOpened)
{
LCD_systemMenuOpened = true;
SYSMENU_AUDIO_VOLUME_HOTKEY();
}
else
{
eventCloseAllSystemMenu();
}
LCD_redraw(false);
}
void FRONTPANEL_BUTTONHANDLER_HPF(void)
{
if (!LCD_systemMenuOpened)
{
LCD_systemMenuOpened = true;
if (CurrentVFO()->Mode == TRX_MODE_CW_L || CurrentVFO()->Mode == TRX_MODE_CW_U)
SYSMENU_AUDIO_HPF_CW_HOTKEY();
else
SYSMENU_AUDIO_HPF_SSB_HOTKEY();
}
else
{
eventCloseAllSystemMenu();
}
LCD_redraw(false);
}
void FRONTPANEL_BUTTONHANDLER_ArB(void) //A=B
{
if (TRX.current_vfo)
memcpy(&TRX.VFO_A, &TRX.VFO_B, sizeof TRX.VFO_B);
else
memcpy(&TRX.VFO_B, &TRX.VFO_A, sizeof TRX.VFO_B);
LCD_showTooltip("VFO COPIED");
LCD_UpdateQuery.TopButtons = true;
LCD_UpdateQuery.FreqInfo = true;
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_NOTCH(void)
{
TRX_TemporaryMute();
if (CurrentVFO()->NotchFC > CurrentVFO()->RX_LPF_Filter_Width)
{
CurrentVFO()->NotchFC = CurrentVFO()->RX_LPF_Filter_Width;
}
if (!CurrentVFO()->AutoNotchFilter)
{
InitAutoNotchReduction();
CurrentVFO()->AutoNotchFilter = true;
}
else
CurrentVFO()->AutoNotchFilter = false;
LCD_UpdateQuery.StatusInfoGUI = true;
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_NOTCH_MANUAL(void)
{
if (CurrentVFO()->NotchFC > CurrentVFO()->RX_LPF_Filter_Width)
CurrentVFO()->NotchFC = CurrentVFO()->RX_LPF_Filter_Width;
CurrentVFO()->AutoNotchFilter = false;
LCD_UpdateQuery.TopButtons = true;
LCD_UpdateQuery.StatusInfoGUI = true;
NeedSaveSettings = true;
}
static void FRONTPANEL_BUTTONHANDLER_SHIFT(void)
{
TRX.ShiftEnabled = !TRX.ShiftEnabled;
TRX.CLAR = false;
TRX_SHIFT = 0;
TRX_setFrequency(CurrentVFO()->Freq, CurrentVFO());
LCD_UpdateQuery.TopButtons = true;
LCD_UpdateQuery.StatusInfoGUI = true;
NeedSaveSettings = true;
}
static void FRONTPANEL_BUTTONHANDLER_CLAR(void)
{
TRX.CLAR = !TRX.CLAR;
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_LOCK(void)
{
if (!LCD_systemMenuOpened)
TRX.Locked = !TRX.Locked;
LCD_UpdateQuery.TopButtons = true;
LCD_UpdateQuery.StatusInfoBar = true;
NeedSaveSettings = true;
}
static void FRONTPANEL_BUTTONHANDLER_HIDDEN_ENABLE(void)
{
if (LCD_systemMenuOpened)
{
sysmenu_hiddenmenu_enabled = true;
LCD_redraw(false);
}
LCD_UpdateQuery.TopButtons = true;
LCD_UpdateQuery.StatusInfoBar = true;
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_MENU(void)
{
if (!LCD_systemMenuOpened)
LCD_systemMenuOpened = true;
else
eventCloseSystemMenu();
LCD_redraw(false);
}
void FRONTPANEL_BUTTONHANDLER_MUTE(void)
{
TRX_Mute = !TRX_Mute;
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
}
static void FRONTPANEL_BUTTONHANDLER_BANDMAP(void)
{
TRX.BandMapEnabled = !TRX.BandMapEnabled;
if(TRX.BandMapEnabled)
LCD_showTooltip("BANDMAP ON");
else
LCD_showTooltip("BANDMAP OFF");
LCD_UpdateQuery.TopButtons = true;
NeedSaveSettings = true;
}
static uint16_t FRONTPANEL_ReadMCP3008_Value(uint8_t channel, GPIO_TypeDef *CS_PORT, uint16_t CS_PIN)
{
uint8_t outData[3] = {0};
uint8_t inData[3] = {0};
uint16_t mcp3008_value = 0;
outData[0] = 0x18 | channel;
bool res = SPI_Transmit(outData, inData, 3, CS_PORT, CS_PIN, false, SPI_FRONT_UNIT_PRESCALER);
if (res == false)
return 65535;
mcp3008_value = (uint16_t)(0 | ((inData[1] & 0x3F) << 4) | (inData[2] & 0xF0 >> 4));
//sendToDebug_uint16(mcp3008_value, false);
return mcp3008_value;
}
static void FRONTPANEL_BUTTONHANDLER_PWR_P(void)
{
int16_t newval = (int16_t)TRX.RF_Power + 10;
newval /= 10;
newval *= 10;
if(newval > 100)
newval = 100;
TRX.RF_Power = newval;
char str[32] = {0};
sprintf(str, "PWR: %d%%",TRX.RF_Power);
LCD_showTooltip(str);
NeedSaveSettings = true;
}
static void FRONTPANEL_BUTTONHANDLER_PWR_N(void)
{
int16_t newval = (int16_t)TRX.RF_Power - 10;
newval /= 10;
newval *= 10;
if(newval < 0)
newval = 0;
TRX.RF_Power = newval;
char str[32] = {0};
sprintf(str, "PWR: %d%%",TRX.RF_Power);
LCD_showTooltip(str);
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_BW_P(void)
{
char str[32] = {0};
switch (CurrentVFO()->Mode)
{
case TRX_MODE_LSB:
case TRX_MODE_USB:
case TRX_MODE_DIGI_L:
case TRX_MODE_DIGI_U:
case TRX_MODE_IQ:
case TRX_MODE_LOOPBACK:
case TRX_MODE_NO_TX:
if (TRX.RX_SSB_LPF_Filter == 0)
TRX.RX_SSB_LPF_Filter = 1400;
if (TRX.RX_SSB_LPF_Filter == 1400)
TRX.RX_SSB_LPF_Filter = 1600;
else if (TRX.RX_SSB_LPF_Filter == 1600)
TRX.RX_SSB_LPF_Filter = 1800;
else if (TRX.RX_SSB_LPF_Filter == 1800)
TRX.RX_SSB_LPF_Filter = 2100;
else if (TRX.RX_SSB_LPF_Filter == 2100)
TRX.RX_SSB_LPF_Filter = 2300;
else if (TRX.RX_SSB_LPF_Filter == 2300)
TRX.RX_SSB_LPF_Filter = 2500;
else if (TRX.RX_SSB_LPF_Filter == 2500)
TRX.RX_SSB_LPF_Filter = 2700;
else if (TRX.RX_SSB_LPF_Filter == 2700)
TRX.RX_SSB_LPF_Filter = 2900;
else if (TRX.RX_SSB_LPF_Filter == 2900)
TRX.RX_SSB_LPF_Filter = 3000;
else if (TRX.RX_SSB_LPF_Filter == 3000)
TRX.RX_SSB_LPF_Filter = 3200;
else if (TRX.RX_SSB_LPF_Filter == 3200)
TRX.RX_SSB_LPF_Filter = 3400;
sprintf(str, "BW: %d",TRX.RX_SSB_LPF_Filter);
break;
case TRX_MODE_CW_L:
case TRX_MODE_CW_U:
if (TRX.CW_LPF_Filter == 100)
TRX.CW_LPF_Filter = 150;
else if (TRX.CW_LPF_Filter == 150)
TRX.CW_LPF_Filter = 200;
else if (TRX.CW_LPF_Filter == 200)
TRX.CW_LPF_Filter = 250;
else if (TRX.CW_LPF_Filter == 250)
TRX.CW_LPF_Filter = 300;
else if (TRX.CW_LPF_Filter == 300)
TRX.CW_LPF_Filter = 350;
else if (TRX.CW_LPF_Filter == 350)
TRX.CW_LPF_Filter = 400;
else if (TRX.CW_LPF_Filter == 400)
TRX.CW_LPF_Filter = 450;
else if (TRX.CW_LPF_Filter == 450)
TRX.CW_LPF_Filter = 500;
else if (TRX.CW_LPF_Filter == 500)
TRX.CW_LPF_Filter = 550;
else if (TRX.CW_LPF_Filter == 550)
TRX.CW_LPF_Filter = 600;
else if (TRX.CW_LPF_Filter == 600)
TRX.CW_LPF_Filter = 650;
else if (TRX.CW_LPF_Filter == 650)
TRX.CW_LPF_Filter = 700;
else if (TRX.CW_LPF_Filter == 700)
TRX.CW_LPF_Filter = 750;
else if (TRX.CW_LPF_Filter == 750)
TRX.CW_LPF_Filter = 800;
else if (TRX.CW_LPF_Filter == 800)
TRX.CW_LPF_Filter = 850;
else if (TRX.CW_LPF_Filter == 850)
TRX.CW_LPF_Filter = 900;
else if (TRX.CW_LPF_Filter == 900)
TRX.CW_LPF_Filter = 950;
else if (TRX.CW_LPF_Filter == 950)
TRX.CW_LPF_Filter = 1000;
sprintf(str, "BW: %d",TRX.CW_LPF_Filter);
break;
case TRX_MODE_NFM:
case TRX_MODE_WFM:
if (TRX.RX_FM_LPF_Filter == 5000)
TRX.RX_FM_LPF_Filter = 6000;
else if (TRX.RX_FM_LPF_Filter == 6000)
TRX.RX_FM_LPF_Filter = 7000;
else if (TRX.RX_FM_LPF_Filter == 7000)
TRX.RX_FM_LPF_Filter = 8000;
else if (TRX.RX_FM_LPF_Filter == 8000)
TRX.RX_FM_LPF_Filter = 9000;
else if (TRX.RX_FM_LPF_Filter == 9000)
TRX.RX_FM_LPF_Filter = 10000;
else if (TRX.RX_FM_LPF_Filter == 10000)
TRX.RX_FM_LPF_Filter = 15000;
else if (TRX.RX_FM_LPF_Filter == 15000)
TRX.RX_FM_LPF_Filter = 20000;
sprintf(str, "BW: %d",TRX.RX_FM_LPF_Filter);
break;
case TRX_MODE_AM:
if (TRX.RX_AM_LPF_Filter == 2100)
TRX.RX_AM_LPF_Filter = 2300;
else if (TRX.RX_AM_LPF_Filter == 2300)
TRX.RX_AM_LPF_Filter = 2500;
else if (TRX.RX_AM_LPF_Filter == 2500)
TRX.RX_AM_LPF_Filter = 2700;
else if (TRX.RX_AM_LPF_Filter == 2700)
TRX.RX_AM_LPF_Filter = 2900;
else if (TRX.RX_AM_LPF_Filter == 2900)
TRX.RX_AM_LPF_Filter = 3000;
else if (TRX.RX_AM_LPF_Filter == 3000)
TRX.RX_AM_LPF_Filter = 3200;
else if (TRX.RX_AM_LPF_Filter == 3200)
TRX.RX_AM_LPF_Filter = 3400;
else if (TRX.RX_AM_LPF_Filter == 3400)
TRX.RX_AM_LPF_Filter = 3600;
else if (TRX.RX_AM_LPF_Filter == 3600)
TRX.RX_AM_LPF_Filter = 3800;
else if (TRX.RX_AM_LPF_Filter == 3800)
TRX.RX_AM_LPF_Filter = 4000;
else if (TRX.RX_AM_LPF_Filter == 4000)
TRX.RX_AM_LPF_Filter = 4500;
else if (TRX.RX_AM_LPF_Filter == 4500)
TRX.RX_AM_LPF_Filter = 5000;
else if (TRX.RX_AM_LPF_Filter == 5000)
TRX.RX_AM_LPF_Filter = 6000;
else if (TRX.RX_AM_LPF_Filter == 6000)
TRX.RX_AM_LPF_Filter = 7000;
else if (TRX.RX_AM_LPF_Filter == 7000)
TRX.RX_AM_LPF_Filter = 8000;
else if (TRX.RX_AM_LPF_Filter == 8000)
TRX.RX_AM_LPF_Filter = 9000;
else if (TRX.RX_AM_LPF_Filter == 9000)
TRX.RX_AM_LPF_Filter = 10000;
sprintf(str, "BW: %d",TRX.RX_AM_LPF_Filter);
break;
}
TRX_setMode(SecondaryVFO()->Mode, SecondaryVFO());
TRX_setMode(CurrentVFO()->Mode, CurrentVFO());
LCD_showTooltip(str);
NeedSaveSettings = true;
}
void FRONTPANEL_BUTTONHANDLER_BW_N(void)
{
char str[32] = {0};
switch (CurrentVFO()->Mode)
{
case TRX_MODE_LSB:
case TRX_MODE_USB:
case TRX_MODE_DIGI_L:
case TRX_MODE_DIGI_U:
case TRX_MODE_IQ:
case TRX_MODE_LOOPBACK:
case TRX_MODE_NO_TX:
if (TRX.RX_SSB_LPF_Filter == 1600)
TRX.RX_SSB_LPF_Filter = 1400;
else if (TRX.RX_SSB_LPF_Filter == 1800)
TRX.RX_SSB_LPF_Filter = 1600;
else if (TRX.RX_SSB_LPF_Filter == 2100)
TRX.RX_SSB_LPF_Filter = 1800;
else if (TRX.RX_SSB_LPF_Filter == 2300)
TRX.RX_SSB_LPF_Filter = 2100;
else if (TRX.RX_SSB_LPF_Filter == 2500)
TRX.RX_SSB_LPF_Filter = 2300;
else if (TRX.RX_SSB_LPF_Filter == 2700)
TRX.RX_SSB_LPF_Filter = 2500;
else if (TRX.RX_SSB_LPF_Filter == 2900)
TRX.RX_SSB_LPF_Filter = 2700;
else if (TRX.RX_SSB_LPF_Filter == 3000)
TRX.RX_SSB_LPF_Filter = 2900;
else if (TRX.RX_SSB_LPF_Filter == 3200)
TRX.RX_SSB_LPF_Filter = 3000;
else if (TRX.RX_SSB_LPF_Filter == 3400)
TRX.RX_SSB_LPF_Filter = 3200;
sprintf(str, "BW: %d",TRX.RX_SSB_LPF_Filter);
break;
case TRX_MODE_CW_L:
case TRX_MODE_CW_U:
if (TRX.CW_LPF_Filter == 1000)
TRX.CW_LPF_Filter = 950;
else if (TRX.CW_LPF_Filter == 950)
TRX.CW_LPF_Filter = 900;
else if (TRX.CW_LPF_Filter == 900)
TRX.CW_LPF_Filter = 850;
else if (TRX.CW_LPF_Filter == 850)
TRX.CW_LPF_Filter = 800;
else if (TRX.CW_LPF_Filter == 800)
TRX.CW_LPF_Filter = 750;
else if (TRX.CW_LPF_Filter == 750)
TRX.CW_LPF_Filter = 700;
else if (TRX.CW_LPF_Filter == 700)
TRX.CW_LPF_Filter = 650;
else if (TRX.CW_LPF_Filter == 650)
TRX.CW_LPF_Filter = 600;
else if (TRX.CW_LPF_Filter == 600)
TRX.CW_LPF_Filter = 550;
else if (TRX.CW_LPF_Filter == 550)
TRX.CW_LPF_Filter = 500;
else if (TRX.CW_LPF_Filter == 500)
TRX.CW_LPF_Filter = 450;
else if (TRX.CW_LPF_Filter == 450)
TRX.CW_LPF_Filter = 400;
else if (TRX.CW_LPF_Filter == 400)
TRX.CW_LPF_Filter = 350;
else if (TRX.CW_LPF_Filter == 350)
TRX.CW_LPF_Filter = 300;
else if (TRX.CW_LPF_Filter == 300)
TRX.CW_LPF_Filter = 250;
else if (TRX.CW_LPF_Filter == 250)
TRX.CW_LPF_Filter = 200;
else if (TRX.CW_LPF_Filter == 200)
TRX.CW_LPF_Filter = 150;
else if (TRX.CW_LPF_Filter == 150)
TRX.CW_LPF_Filter = 100;
sprintf(str, "BW: %d",TRX.CW_LPF_Filter);
break;
case TRX_MODE_NFM:
case TRX_MODE_WFM:
if (TRX.RX_FM_LPF_Filter == 6000)
TRX.RX_FM_LPF_Filter = 5000;
else if (TRX.RX_FM_LPF_Filter == 7000)
TRX.RX_FM_LPF_Filter = 6000;
else if (TRX.RX_FM_LPF_Filter == 8000)
TRX.RX_FM_LPF_Filter = 7000;
else if (TRX.RX_FM_LPF_Filter == 9000)
TRX.RX_FM_LPF_Filter = 8000;
else if (TRX.RX_FM_LPF_Filter == 10000)
TRX.RX_FM_LPF_Filter = 9000;
else if (TRX.RX_FM_LPF_Filter == 15000)
TRX.RX_FM_LPF_Filter = 10000;
else if (TRX.RX_FM_LPF_Filter == 20000)
TRX.RX_FM_LPF_Filter = 15000;
sprintf(str, "BW: %d",TRX.RX_FM_LPF_Filter);
break;
case TRX_MODE_AM:
if (TRX.RX_AM_LPF_Filter == 2300)
TRX.RX_AM_LPF_Filter = 2100;
else if (TRX.RX_AM_LPF_Filter == 2500)
TRX.RX_AM_LPF_Filter = 2300;
else if (TRX.RX_AM_LPF_Filter == 2700)
TRX.RX_AM_LPF_Filter = 2500;
else if (TRX.RX_AM_LPF_Filter == 2900)
TRX.RX_AM_LPF_Filter = 2700;
else if (TRX.RX_AM_LPF_Filter == 3000)
TRX.RX_AM_LPF_Filter = 2900;
else if (TRX.RX_AM_LPF_Filter == 3200)
TRX.RX_AM_LPF_Filter = 3000;
else if (TRX.RX_AM_LPF_Filter == 3400)
TRX.RX_AM_LPF_Filter = 3200;
else if (TRX.RX_AM_LPF_Filter == 3600)
TRX.RX_AM_LPF_Filter = 3400;
else if (TRX.RX_AM_LPF_Filter == 3800)
TRX.RX_AM_LPF_Filter = 3400;
else if (TRX.RX_AM_LPF_Filter == 4000)
TRX.RX_AM_LPF_Filter = 3800;
else if (TRX.RX_AM_LPF_Filter == 4500)
TRX.RX_AM_LPF_Filter = 3800;
else if (TRX.RX_AM_LPF_Filter == 5000)
TRX.RX_AM_LPF_Filter = 4500;
else if (TRX.RX_AM_LPF_Filter == 6000)
TRX.RX_AM_LPF_Filter = 5000;
else if (TRX.RX_AM_LPF_Filter == 7000)
TRX.RX_AM_LPF_Filter = 6000;
else if (TRX.RX_AM_LPF_Filter == 8000)
TRX.RX_AM_LPF_Filter = 7000;
else if (TRX.RX_AM_LPF_Filter == 9000)
TRX.RX_AM_LPF_Filter = 8000;
else if (TRX.RX_AM_LPF_Filter == 10000)
TRX.RX_AM_LPF_Filter = 9000;
sprintf(str, "BW: %d",TRX.RX_AM_LPF_Filter);
break;
}
TRX_setMode(SecondaryVFO()->Mode, SecondaryVFO());
TRX_setMode(CurrentVFO()->Mode, CurrentVFO());
LCD_showTooltip(str);
NeedSaveSettings = true;
}