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

2203 lines
50 KiB
C
Raw Normal View History

2023-09-09 08:03:56 +01:00
/* Copyright 2023 Dual Tachyon
* https://github.com/DualTachyon
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
2023-09-16 07:08:18 +01:00
#if !defined(ENABLE_OVERLAY)
#include "ARMCM0.h"
#endif
2023-09-09 08:03:56 +01:00
#include "app/dtmf.h"
#include "app/generic.h"
#include "app/menu.h"
#include "app/search.h"
2023-09-09 08:03:56 +01:00
#include "audio.h"
#include "board.h"
#include "bsp/dp32g030/gpio.h"
#include "driver/backlight.h"
#include "driver/bk4819.h"
#include "driver/eeprom.h"
2023-09-09 08:03:56 +01:00
#include "driver/gpio.h"
#include "driver/keyboard.h"
#include "driver/st7565.h"
2023-10-27 10:52:32 +01:00
#if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG)
#include "driver/uart.h"
#endif
2023-09-09 08:03:56 +01:00
#include "frequencies.h"
2023-11-23 20:43:13 +00:00
#include "functions.h"
#include "helper/battery.h"
2023-09-09 08:03:56 +01:00
#include "misc.h"
#include "settings.h"
2023-09-16 07:08:18 +01:00
#if defined(ENABLE_OVERLAY)
#include "sram-overlay.h"
#endif
2023-09-09 08:03:56 +01:00
#include "ui/inputbox.h"
#include "ui/menu.h"
#include "ui/menu.h"
2023-11-18 18:44:10 +00:00
#ifdef ENABLE_PANADAPTER
#include "panadapter.h"
#endif
2023-11-02 21:44:53 +00:00
#include "radio.h"
#include "settings.h"
2023-09-09 08:03:56 +01:00
#include "ui/ui.h"
2023-10-04 10:01:07 +01:00
#ifdef ENABLE_F_CAL_MENU
void writeXtalFreqCal(const int32_t value, const bool update_eeprom)
{
2023-11-05 23:16:19 +00:00
BK4819_write_reg(0x3B, 22656 + value);
2023-10-04 10:01:07 +01:00
if (update_eeprom)
{
2023-11-03 11:18:53 +00:00
g_eeprom.calib.bk4819_xtal_freq_low = value;
2023-10-04 10:01:07 +01:00
// radio 1 .. 04 00 46 00 50 00 2C 0E
// radio 2 .. 05 00 46 00 50 00 2C 0E
//
2023-11-03 11:18:53 +00:00
EEPROM_WriteBuffer8(0x1F88, &g_eeprom.calib.bk4819_xtal_freq_low);
2023-10-04 10:01:07 +01:00
}
}
#endif
void MENU_start_css_scan(int8_t Direction)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
g_css_scan_mode = CSS_SCAN_MODE_SCANNING;
g_update_status = true;
2023-10-20 16:06:38 +01:00
g_menu_scroll_direction = Direction;
2023-09-19 11:44:49 +01:00
RADIO_select_vfos();
2023-09-09 08:03:56 +01:00
MENU_SelectNextCode();
2023-09-19 11:44:49 +01:00
2023-11-07 08:48:32 +00:00
g_scan_tick_10ms = scan_pause_css_10ms;
2023-09-09 08:03:56 +01:00
}
void MENU_stop_css_scan(void)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
g_css_scan_mode = CSS_SCAN_MODE_OFF;
g_update_status = true;
2023-09-09 08:03:56 +01:00
RADIO_setup_registers(true);
2023-09-09 08:03:56 +01:00
}
int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
2023-09-09 08:03:56 +01:00
{
switch (Cursor)
{
case MENU_SQL:
case MENU_CHAN_SQL:
2023-09-09 08:03:56 +01:00
*pMin = 0;
*pMax = 9;
break;
2023-09-10 09:57:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_STEP:
2023-09-15 15:53:37 +01:00
*pMin = 0;
2023-10-08 20:23:37 +01:00
*pMax = ARRAY_SIZE(STEP_FREQ_TABLE) - 1;
2023-09-15 15:53:37 +01:00
break;
2023-09-10 09:57:49 +01:00
case MENU_AUTO_BACKLITE:
2023-09-09 08:03:56 +01:00
*pMin = 0;
2023-10-08 20:23:37 +01:00
*pMax = ARRAY_SIZE(g_sub_menu_backlight) - 1;
2023-09-09 08:03:56 +01:00
break;
2023-09-15 17:45:07 +01:00
2023-10-14 10:33:21 +01:00
case MENU_FREQ_LOCK:
2023-09-15 17:45:07 +01:00
*pMin = 0;
2023-10-18 13:00:57 +01:00
*pMax = FREQ_LOCK_LAST - 1;
2023-09-15 17:45:07 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_MEM_DISP:
2023-09-15 17:45:07 +01:00
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_mem_disp) - 1;
2023-09-15 17:45:07 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_TX_POWER:
2023-09-15 17:45:07 +01:00
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_tx_power) - 1;
2023-09-15 17:45:07 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_SHIFT_DIR:
2023-09-15 17:45:07 +01:00
*pMin = 0;
2023-10-08 20:23:37 +01:00
*pMax = ARRAY_SIZE(g_sub_menu_shift_dir) - 1;
2023-09-15 17:45:07 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_DUAL_WATCH:
2023-09-15 17:45:07 +01:00
*pMin = 0;
// *pMax = ARRAY_SIZE(g_sub_menu_dual_watch) - 1;
2023-10-08 20:23:37 +01:00
*pMax = ARRAY_SIZE(g_sub_menu_off_on) - 1;
2023-09-15 17:45:07 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_SCAN_HOLD:
2023-10-25 19:26:22 +01:00
*pMin = 2; // 1 second
*pMax = 40; // 20 seconds
break;
case MENU_CROSS_VFO:
2023-09-30 11:22:19 +01:00
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_cross_vfo) - 1;
2023-09-30 11:22:19 +01:00
break;
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-09-09 08:03:56 +01:00
case MENU_VOICE:
2023-09-15 17:45:07 +01:00
*pMin = 0;
2023-10-08 20:23:37 +01:00
*pMax = ARRAY_SIZE(g_sub_menu_voice) - 1;
2023-09-15 17:45:07 +01:00
break;
2023-09-09 08:03:56 +01:00
#endif
2023-09-19 11:44:49 +01:00
case MENU_SCAN_CAR_RESUME:
2023-09-15 17:45:07 +01:00
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_scan_car_resume) - 1;
2023-09-15 17:45:07 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_ROGER_MODE:
2023-09-09 08:03:56 +01:00
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_roger_mode) - 1;
2023-09-09 08:03:56 +01:00
break;
2023-09-10 09:57:49 +01:00
case MENU_PON_MSG:
*pMin = 0;
2023-10-08 20:23:37 +01:00
*pMax = ARRAY_SIZE(g_sub_menu_pwr_on_msg) - 1;
break;
case MENU_RX_CDCSS:
case MENU_TX_CDCSS:
2023-09-09 08:03:56 +01:00
*pMin = 0;
*pMax = 208;
//*pMax = (ARRAY_SIZE(DCS_CODE_LIST) * 2);
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_RX_CTCSS:
case MENU_TX_CTCSS:
2023-09-09 08:03:56 +01:00
*pMin = 0;
*pMax = ARRAY_SIZE(CTCSS_TONE_LIST) - 1;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_BANDWIDTH:
2023-09-15 17:45:07 +01:00
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_bandwidth) - 1;
2023-09-15 17:45:07 +01:00
break;
#ifdef ENABLE_ALARM
case MENU_ALARM_MODE:
2023-09-15 17:45:07 +01:00
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_alarm_mode) - 1;
2023-09-15 17:45:07 +01:00
break;
#endif
#ifdef ENABLE_SIDE_BUTT_MENU
case MENU_SIDE1_SHORT:
case MENU_SIDE1_LONG:
case MENU_SIDE2_SHORT:
case MENU_SIDE2_LONG:
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_side_butt) - 1;
break;
#endif
2023-10-06 22:16:03 +01:00
2023-09-15 17:45:07 +01:00
case MENU_RESET:
2023-09-16 09:10:10 +01:00
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_reset) - 1;
2023-09-16 09:10:10 +01:00
break;
2023-09-15 17:45:07 +01:00
2023-10-04 16:37:11 +01:00
case MENU_COMPAND:
case MENU_AUTO_BACKLITE_ON_TX_RX:
2023-10-04 16:37:11 +01:00
*pMin = 0;
2023-10-08 20:23:37 +01:00
*pMax = ARRAY_SIZE(g_sub_menu_rx_tx) - 1;
2023-10-04 16:37:11 +01:00
break;
2023-09-16 09:10:10 +01:00
2023-10-18 11:31:30 +01:00
#ifdef ENABLE_CONTRAST
case MENU_CONTRAST:
//*pMin = 0;
//*pMax = 63;
*pMin = 26;
*pMax = 45;
break;
#endif
2023-09-23 17:23:21 +01:00
#ifdef ENABLE_AM_FIX_TEST1
case MENU_AM_FIX_TEST1:
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_AM_FIX_test1) - 1;
2023-09-23 17:23:21 +01:00
break;
#endif
#ifdef ENABLE_AM_FIX
2023-10-24 18:36:29 +01:00
// case MENU_AM_FIX:
2023-09-23 17:23:21 +01:00
#endif
2023-11-18 18:44:10 +00:00
#ifdef ENABLE_PANADAPTER
case MENU_PANADAPTER:
#endif
2023-10-18 11:31:30 +01:00
#ifdef ENABLE_TX_AUDIO_BAR
2023-10-17 21:22:40 +01:00
case MENU_TX_BAR:
#endif
2023-12-01 10:34:53 +00:00
case MENU_RX_BAR:
case MENU_BUSY_CHAN_LOCK:
2023-09-09 08:03:56 +01:00
case MENU_BEEP:
#ifdef ENABLE_KEYLOCK
2023-11-09 12:22:54 +00:00
case MENU_AUTO_KEY_LOCK:
#endif
#ifdef ENABLE_SCAN_RANGES
case MENU_SCAN_RANGES:
#endif
2023-11-24 11:52:11 +00:00
#ifdef ENABLE_NOAA
case MENU_NOAA_SCAN:
#endif
case MENU_350_TX:
case MENU_174_TX:
case MENU_470_TX:
case MENU_350_EN:
case MENU_SCRAMBLER_EN:
case MENU_TX_EN:
2023-09-09 08:03:56 +01:00
case MENU_S_ADD1:
case MENU_S_ADD2:
case MENU_STE:
case MENU_DTMF_ST:
2023-12-08 14:04:02 +00:00
#ifdef ENABLE_DTMF_CALLING
case MENU_DTMF_DCD:
#endif
#ifdef ENABLE_DTMF_LIVE_DECODER
case MENU_DTMF_LIVE_DEC:
#endif
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_off_on) - 1;
break;
2023-10-30 01:51:41 +00:00
case MENU_MOD_MODE:
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_mod_mode) - 1;
break;
case MENU_SCRAMBLER:
*pMin = 0;
2023-11-04 02:33:04 +00:00
*pMax = 31;
break;
case MENU_TX_TO:
2023-09-28 17:39:45 +01:00
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_tx_timeout) - 1;
2023-09-28 17:39:45 +01:00
break;
#ifdef ENABLE_VOX
case MENU_VOX:
#endif
2023-09-09 08:03:56 +01:00
case MENU_RP_STE:
*pMin = 0;
*pMax = 10;
break;
2023-09-19 11:44:49 +01:00
case MENU_MEM_SAVE:
2023-09-09 08:03:56 +01:00
case MENU_1_CALL:
case MENU_MEM_DEL:
case MENU_MEM_NAME:
2023-09-09 08:03:56 +01:00
*pMin = 0;
2023-10-08 17:14:13 +01:00
*pMax = USER_CHANNEL_LAST;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_SLIST1:
case MENU_SLIST2:
*pMin = -1;
2023-10-08 17:14:13 +01:00
*pMax = USER_CHANNEL_LAST;
2023-09-19 11:44:49 +01:00
break;
case MENU_BAT_SAVE:
2023-09-15 17:45:07 +01:00
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_bat_save) - 1;
2023-09-15 17:45:07 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_MIC_GAIN:
2023-09-09 08:03:56 +01:00
*pMin = 0;
*pMax = 4;
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_S_LIST:
2023-10-04 22:08:13 +01:00
*pMin = 0;
// *pMax = 1;
2023-09-09 08:03:56 +01:00
*pMax = 2;
break;
2023-09-19 11:44:49 +01:00
2023-10-25 13:07:12 +01:00
#ifdef ENABLE_MDC1200
2023-10-25 19:26:22 +01:00
case MENU_MDC1200_MODE:
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_mdc1200_mode) - 1;
break;
2023-10-25 13:07:12 +01:00
case MENU_MDC1200_ID:
*pMin = 0;
*pMax = 0xffff;
break;
#endif
2023-09-09 08:03:56 +01:00
case MENU_PTT_ID:
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_ptt_id) - 1;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-12-08 14:04:02 +00:00
#ifdef ENABLE_DTMF_CALLING
case MENU_DTMF_RSP:
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_dtmf_rsp) - 1;
break;
case MENU_DTMF_HOLD:
*pMin = DTMF_HOLD_MIN;
*pMax = DTMF_HOLD_MAX;
break;
case MENU_DTMF_LIST:
*pMin = 1;
*pMax = 16;
break;
#endif
case MENU_BAT_TXT:
*pMin = 0;
*pMax = ARRAY_SIZE(g_sub_menu_bat_text) - 1;
break;
2023-12-06 08:42:17 +00:00
#ifdef ENABLE_DTMF_TIMING_SETTINGS
case MENU_DTMF_PRE:
*pMin = 3;
*pMax = 99;
break;
case MENU_DTMF_1ST_PERSIST:
case MENU_DTMF_HASH_PERSIST:
case MENU_DTMF_PERSIST:
case MENU_DTMF_INTERVAL:
*pMin = 5;
*pMax = 20;
break;
2023-12-06 08:42:17 +00:00
#endif
2023-09-19 11:44:49 +01:00
2023-11-23 20:43:13 +00:00
#ifdef ENABLE_TX_POWER_CAL_MENU
case MENU_TX_CALI:
*pMin = 0;
*pMax = 255;
break;
#endif
#ifdef ENABLE_FM_DEV_CAL_MENU
case MENU_TX_FM_DEV_CAL:
*pMin = FM_DEV_LIMIT_LOWER;
*pMax = FM_DEV_LIMIT_UPPER;
break;
#endif
#ifdef ENABLE_F_CAL_MENU
case MENU_F_CALI:
*pMin = -50;
*pMax = +50;
break;
#endif
2023-09-19 11:44:49 +01:00
case MENU_BAT_CAL:
*pMin = 1600; // 0
*pMax = 2200; // 2300
2023-10-02 01:09:35 +01:00
break;
2023-09-09 08:03:56 +01:00
default:
return -1;
}
return 0;
}
void MENU_AcceptSetting(void)
{
int32_t Min;
int32_t Max;
2023-09-09 08:03:56 +01:00
uint8_t Code;
2023-10-08 20:23:37 +01:00
freq_config_t *pConfig = &g_tx_vfo->freq_config_rx;
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
if (!MENU_GetLimits(g_menu_cursor, &Min, &Max))
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
if (g_sub_menu_selection < Min) g_sub_menu_selection = Min;
2023-09-09 08:03:56 +01:00
else
2023-10-08 20:23:37 +01:00
if (g_sub_menu_selection > Max) g_sub_menu_selection = Max;
2023-09-09 08:03:56 +01:00
}
2023-10-08 20:23:37 +01:00
switch (g_menu_cursor)
2023-09-09 08:03:56 +01:00
{
default:
return;
2023-09-09 08:03:56 +01:00
case MENU_SQL:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.squelch_level = g_sub_menu_selection;
2023-11-09 05:59:50 +00:00
RADIO_ConfigureSquelch(g_tx_vfo);
g_vfo_configure_mode = VFO_CONFIGURE;
break;
case MENU_CHAN_SQL:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel.squelch_level = g_sub_menu_selection;
2023-11-09 05:59:50 +00:00
RADIO_ConfigureSquelch(g_tx_vfo);
2023-11-02 21:44:53 +00:00
g_request_save_channel = 1;
2023-10-19 19:30:53 +01:00
return;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_STEP:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel.step_setting = step_freq_table_sorted[g_sub_menu_selection];
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
case MENU_TX_POWER:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel.tx_power = g_sub_menu_selection;
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
case MENU_TX_CDCSS:
2023-10-08 20:23:37 +01:00
pConfig = &g_tx_vfo->freq_config_tx;
2023-09-09 08:03:56 +01:00
// Fallthrough
case MENU_RX_CDCSS:
2023-10-08 20:23:37 +01:00
if (g_sub_menu_selection == 0)
2023-09-09 08:03:56 +01:00
{
2023-10-08 17:14:13 +01:00
if (pConfig->code_type != CODE_TYPE_DIGITAL && pConfig->code_type != CODE_TYPE_REVERSE_DIGITAL)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
return;
}
2023-10-08 17:14:13 +01:00
Code = 0;
pConfig->code_type = CODE_TYPE_NONE;
2023-09-09 08:03:56 +01:00
}
else
2023-10-08 20:23:37 +01:00
if (g_sub_menu_selection < 105)
2023-09-09 08:03:56 +01:00
{
2023-10-08 17:14:13 +01:00
pConfig->code_type = CODE_TYPE_DIGITAL;
2023-10-08 20:23:37 +01:00
Code = g_sub_menu_selection - 1;
2023-09-09 08:03:56 +01:00
}
else
{
2023-10-08 17:14:13 +01:00
pConfig->code_type = CODE_TYPE_REVERSE_DIGITAL;
2023-10-08 20:23:37 +01:00
Code = g_sub_menu_selection - 105;
2023-09-09 08:03:56 +01:00
}
2023-09-19 11:44:49 +01:00
2023-10-08 17:14:13 +01:00
pConfig->code = Code;
2023-10-08 20:23:37 +01:00
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
case MENU_TX_CTCSS:
2023-10-08 20:23:37 +01:00
pConfig = &g_tx_vfo->freq_config_tx;
2023-10-28 23:11:57 +01:00
// Fallthrough
case MENU_RX_CTCSS:
2023-10-08 20:23:37 +01:00
if (g_sub_menu_selection == 0)
2023-09-09 08:03:56 +01:00
{
2023-10-08 17:14:13 +01:00
if (pConfig->code_type != CODE_TYPE_CONTINUOUS_TONE)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
return;
}
2023-10-08 20:23:37 +01:00
Code = 0;
pConfig->code = Code;
pConfig->code_type = CODE_TYPE_NONE;
2023-10-03 00:14:36 +01:00
BK4819_disable_sub_audible();
2023-09-09 08:03:56 +01:00
}
else
2023-10-03 00:14:36 +01:00
{
2023-10-08 17:14:13 +01:00
pConfig->code_type = CODE_TYPE_CONTINUOUS_TONE;
2023-10-08 20:23:37 +01:00
Code = g_sub_menu_selection - 1;
pConfig->code = Code;
2023-10-03 00:14:36 +01:00
BK4819_set_CTCSS_freq(CTCSS_TONE_LIST[Code]);
2023-09-09 08:03:56 +01:00
}
2023-10-08 20:23:37 +01:00
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
case MENU_SHIFT_DIR:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel.tx_offset_dir = g_sub_menu_selection;
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_OFFSET:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel.tx_offset = g_sub_menu_selection;
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
case MENU_BANDWIDTH:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel.channel_bandwidth = g_sub_menu_selection;
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
case MENU_SCRAMBLER:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel.scrambler = g_sub_menu_selection;
2023-10-03 00:14:36 +01:00
#if 0
2023-11-04 02:33:04 +00:00
if (g_eeprom.config.setting.enable_scrambler)
BK4819_set_scrambler(g_tx_vfo->channel.scrambler);
2023-10-03 00:14:36 +01:00
else
2023-11-04 02:33:04 +00:00
BK4819_set_scrambler(0);
2023-10-03 00:14:36 +01:00
#endif
2023-10-19 19:30:53 +01:00
g_request_save_channel = IS_FREQ_CHANNEL(g_tx_vfo->channel_save) ? 2 : 1;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
case MENU_BUSY_CHAN_LOCK:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel.busy_channel_lock = g_sub_menu_selection;
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
case MENU_MEM_SAVE:
2023-10-08 20:23:37 +01:00
g_tx_vfo->channel_save = g_sub_menu_selection;
#if 0
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.indices.vfo[0].user = g_sub_menu_selection;
#else
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.indices.vfo[g_eeprom.config.setting.tx_vfo_num].user = g_sub_menu_selection;
#endif
2023-10-08 20:23:37 +01:00
g_request_save_channel = 2;
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
2023-11-02 10:00:51 +00:00
g_flag_reset_vfos = true;
return;
case MENU_MEM_NAME:
2023-11-06 18:36:42 +00:00
{
2023-11-06 18:52:18 +00:00
const unsigned int chan = g_sub_menu_selection;
t_channel_name *chan_name = &g_eeprom.config.channel_name[chan];
int i;
2023-11-06 18:36:42 +00:00
// trailing trim
2023-11-02 22:39:50 +00:00
for (i = 9; i >= 0; i--)
{
2023-11-06 18:52:18 +00:00
if (g_edit[i] != ' ' && g_edit[i] != '_' && g_edit[i] != 0 && g_edit[i] != 0xff)
break;
2023-10-08 20:23:37 +01:00
g_edit[i] = ' ';
}
2023-11-06 18:36:42 +00:00
// save the channel name
2023-11-06 18:52:18 +00:00
if (g_eeprom.config.channel_attributes[chan].band <= BAND7_470MHz)
{
memset(chan_name, 0, sizeof(t_channel_name));
memcpy(chan_name->name, g_edit, sizeof(chan_name->name));
SETTINGS_save_chan_name(chan);
}
}
2023-09-20 11:58:47 +01:00
2023-10-08 20:23:37 +01:00
g_flag_reconfigure_vfos = true;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
case MENU_BAT_SAVE:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.battery_save_ratio = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
#ifdef ENABLE_VOX
case MENU_VOX:
g_eeprom.config.setting.vox_enabled = (g_sub_menu_selection != 0) ? 1 : 0;
if (g_eeprom.config.setting.vox_enabled)
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.vox_level = g_sub_menu_selection - 1;
2023-10-08 20:23:37 +01:00
g_flag_reconfigure_vfos = true;
g_update_status = true;
break;
#endif
2023-09-19 11:44:49 +01:00
case MENU_AUTO_BACKLITE:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.backlight_time = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_AUTO_BACKLITE_ON_TX_RX:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.backlight_on_tx_rx = g_sub_menu_selection;
break;
2023-10-18 11:31:30 +01:00
#ifdef ENABLE_CONTRAST
case MENU_CONTRAST:
2023-11-03 23:14:56 +00:00
g_eeprom.config.setting.lcd_contrast = g_sub_menu_selection;
ST7565_SetContrast(g_eeprom.config.setting.lcd_contrast);
2023-10-18 11:31:30 +01:00
break;
#endif
case MENU_DUAL_WATCH:
2023-11-02 10:00:51 +00:00
// g_eeprom.config.setting.dual_watch = g_sub_menu_selection;
g_eeprom.config.setting.dual_watch = (g_sub_menu_selection > 0) ? 1 + g_eeprom.config.setting.tx_vfo_num : DUAL_WATCH_OFF;
2023-10-07 10:14:23 +01:00
2023-10-08 20:23:37 +01:00
g_flag_reconfigure_vfos = true;
g_update_status = true;
break;
2023-09-19 11:44:49 +01:00
case MENU_SCAN_HOLD:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.scan_hold_time = g_sub_menu_selection;
break;
case MENU_CROSS_VFO:
2023-11-02 10:00:51 +00:00
if (IS_NOAA_CHANNEL(g_eeprom.config.setting.indices.vfo[0].screen))
return;
2023-11-02 10:00:51 +00:00
if (IS_NOAA_CHANNEL(g_eeprom.config.setting.indices.vfo[1].screen))
return;
2023-09-19 11:44:49 +01:00
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.cross_vfo = g_sub_menu_selection;
2023-10-08 20:23:37 +01:00
g_flag_reconfigure_vfos = true;
g_update_status = true;
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_BEEP:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.beep_control = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_TX_TO:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.tx_timeout = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-09-09 08:03:56 +01:00
case MENU_VOICE:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.voice_prompt = g_sub_menu_selection;
2023-10-08 20:23:37 +01:00
g_update_status = true;
break;
2023-09-09 08:03:56 +01:00
#endif
2023-09-19 11:44:49 +01:00
case MENU_SCAN_CAR_RESUME:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.carrier_search_mode = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_MEM_DISP:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.channel_display_mode = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
#ifdef ENABLE_KEYLOCK
case MENU_AUTO_KEY_LOCK:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.auto_key_lock = g_sub_menu_selection;
g_key_lock_tick_500ms = key_lock_timeout_500ms;
2023-09-09 08:03:56 +01:00
break;
#endif
2023-09-19 11:44:49 +01:00
2023-11-09 12:22:54 +00:00
#ifdef ENABLE_SCAN_RANGES
case MENU_SCAN_RANGES:
g_eeprom.config.setting.scan_ranges_enable = g_sub_menu_selection;
break;
#endif
2023-09-09 08:03:56 +01:00
case MENU_S_ADD1:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel_attributes.scanlist1 = g_sub_menu_selection;
2023-10-19 14:21:37 +01:00
SETTINGS_save_chan_attribs_name(g_tx_vfo->channel_save, g_tx_vfo);
2023-10-08 20:23:37 +01:00
g_vfo_configure_mode = VFO_CONFIGURE;
g_flag_reset_vfos = true;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_S_ADD2:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel_attributes.scanlist2 = g_sub_menu_selection;
2023-10-19 14:21:37 +01:00
SETTINGS_save_chan_attribs_name(g_tx_vfo->channel_save, g_tx_vfo);
g_vfo_configure_mode = VFO_CONFIGURE;
2023-10-08 20:23:37 +01:00
g_flag_reset_vfos = true;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_STE:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.tail_tone_elimination = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_RP_STE:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.repeater_tail_tone_elimination = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_MIC_GAIN:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.mic_sensitivity = g_sub_menu_selection;
g_mic_sensitivity_tuning = g_mic_gain_dB_2[g_eeprom.config.setting.mic_sensitivity];
BK4819_set_mic_gain(g_mic_sensitivity_tuning);
2023-10-08 20:23:37 +01:00
g_flag_reconfigure_vfos = true;
break;
2023-09-19 11:44:49 +01:00
2023-11-18 18:44:10 +00:00
#ifdef ENABLE_PANADAPTER
case MENU_PANADAPTER:
g_eeprom.config.setting.panadapter = g_sub_menu_selection;
break;
#endif
2023-10-18 11:31:30 +01:00
#ifdef ENABLE_TX_AUDIO_BAR
2023-10-17 21:22:40 +01:00
case MENU_TX_BAR:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.mic_bar = g_sub_menu_selection;
break;
#endif
2023-12-01 10:34:53 +00:00
case MENU_RX_BAR:
g_eeprom.config.setting.enable_rssi_bar = g_sub_menu_selection;
break;
2023-10-04 16:37:11 +01:00
case MENU_COMPAND:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel.compand = g_sub_menu_selection;
2023-10-17 21:22:40 +01:00
#if 1
g_request_save_channel = 1;
#else
2023-11-02 10:00:51 +00:00
SETTINGS_save_channel(g_sub_menu_selection, g_eeprom.config.setting.tx_vfo_num, g_tx_vfo, 3);
2023-10-17 21:22:40 +01:00
g_flag_reconfigure_vfos = true;
#endif
2023-10-04 16:37:11 +01:00
return;
2023-09-15 10:57:26 +01:00
2023-09-09 08:03:56 +01:00
case MENU_1_CALL:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.call1 = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_S_LIST:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.scan_list_default = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_ALARM
case MENU_ALARM_MODE:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.alarm_mode = g_sub_menu_selection;
2023-09-09 09:01:52 +01:00
break;
#endif
2023-09-19 11:44:49 +01:00
case MENU_DTMF_ST:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.dtmf.side_tone = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-12-08 14:04:02 +00:00
#ifdef ENABLE_DTMF_CALLING
case MENU_DTMF_RSP:
g_eeprom.config.setting.dtmf.decode_response = g_sub_menu_selection;
break;
case MENU_DTMF_HOLD:
g_eeprom.config.setting.dtmf.auto_reset_time = g_sub_menu_selection;
break;
2023-09-19 11:44:49 +01:00
2023-12-08 14:04:02 +00:00
case MENU_DTMF_DCD:
g_tx_vfo->channel.dtmf_decoding_enable = g_sub_menu_selection;
DTMF_clear_RX();
g_request_save_channel = 1;
return;
case MENU_DTMF_LIST:
g_dtmf_chosen_contact = g_sub_menu_selection - 1;
if (g_dtmf_is_contact_valid)
{
GUI_SelectNextDisplay(DISPLAY_MAIN);
g_dtmf_input_mode = true;
g_dtmf_input_box_index = 3;
memcpy(g_dtmf_input_box, g_dtmf_id, 4);
g_request_display_screen = DISPLAY_INVALID;
}
return;
#endif
2023-09-19 11:44:49 +01:00
2023-12-06 08:42:17 +00:00
#ifdef ENABLE_DTMF_TIMING_SETTINGS
case MENU_DTMF_PRE:
g_eeprom.config.setting.dtmf.preload_time = g_sub_menu_selection;
break;
case MENU_DTMF_1ST_PERSIST:
g_eeprom.config.setting.dtmf.first_code_persist_time = g_sub_menu_selection;
break;
case MENU_DTMF_HASH_PERSIST:
g_eeprom.config.setting.dtmf.hash_code_persist_time = g_sub_menu_selection;
break;
2023-12-06 08:42:17 +00:00
case MENU_DTMF_PERSIST:
g_eeprom.config.setting.dtmf.code_persist_time = g_sub_menu_selection;
break;
case MENU_DTMF_INTERVAL:
g_eeprom.config.setting.dtmf.code_interval_time = g_sub_menu_selection;
break;
2023-12-06 08:42:17 +00:00
#endif
2023-09-19 11:44:49 +01:00
2023-10-25 13:07:12 +01:00
#ifdef ENABLE_MDC1200
2023-10-25 19:26:22 +01:00
case MENU_MDC1200_MODE:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel.mdc1200_mode = g_sub_menu_selection;
2023-10-25 19:26:22 +01:00
g_request_save_channel = 1;
break;
2023-10-25 13:07:12 +01:00
case MENU_MDC1200_ID:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.mdc1200_id = g_sub_menu_selection;
2023-10-25 13:07:12 +01:00
break;
#endif
2023-09-09 08:03:56 +01:00
case MENU_PTT_ID:
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel.dtmf_ptt_id_tx_mode = g_sub_menu_selection;
2023-11-24 10:55:47 +00:00
if (g_tx_vfo->channel.dtmf_ptt_id_tx_mode == PTT_ID_EOT ||
2023-11-02 21:44:53 +00:00
g_tx_vfo->channel.dtmf_ptt_id_tx_mode == PTT_ID_BOTH ||
g_tx_vfo->channel.dtmf_ptt_id_tx_mode == PTT_ID_APOLLO)
{
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.roger_mode = ROGER_MODE_OFF;
break;
}
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
case MENU_BAT_TXT:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.battery_text = g_sub_menu_selection;
break;
#ifdef ENABLE_DTMF_LIVE_DECODER
case MENU_DTMF_LIVE_DEC:
g_eeprom.config.setting.dtmf_live_decoder = g_sub_menu_selection;
g_dtmf_rx_live_timeout = 0;
memset(g_dtmf_rx_live, 0, sizeof(g_dtmf_rx_live));
if (!g_eeprom.config.setting.dtmf_live_decoder)
BK4819_DisableDTMF();
g_flag_reconfigure_vfos = true;
g_update_status = true;
break;
#endif
case MENU_PON_MSG:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.power_on_display_mode = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_ROGER_MODE:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.roger_mode = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_MOD_MODE:
2023-11-06 14:46:39 +00:00
g_tx_vfo->channel.mod_mode = g_sub_menu_selection;
g_request_save_channel = 1;
2023-10-19 19:30:53 +01:00
return;
2023-10-24 18:36:29 +01:00
/*
2023-09-21 23:25:46 +01:00
#ifdef ENABLE_AM_FIX
2023-09-21 23:06:47 +01:00
case MENU_AM_FIX:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.am_fix = g_sub_menu_selection;
2023-10-08 20:23:37 +01:00
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
g_flag_reset_vfos = true;
2023-09-21 23:06:47 +01:00
break;
#endif
2023-10-24 18:36:29 +01:00
*/
2023-09-23 17:23:21 +01:00
#ifdef ENABLE_AM_FIX_TEST1
case MENU_AM_FIX_TEST1:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.am_fix_test1 = g_sub_menu_selection;
2023-10-08 20:23:37 +01:00
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
g_flag_reset_vfos = true;
2023-09-23 17:23:21 +01:00
break;
#endif
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_NOAA
case MENU_NOAA_SCAN:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.noaa_auto_scan = g_sub_menu_selection;
2023-10-08 20:23:37 +01:00
g_flag_reconfigure_vfos = true;
break;
2023-09-09 08:03:56 +01:00
#endif
2023-09-19 11:44:49 +01:00
case MENU_MEM_DEL:
2023-10-19 14:21:37 +01:00
SETTINGS_save_chan_attribs_name(g_sub_menu_selection, NULL);
2023-10-08 20:23:37 +01:00
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
g_flag_reset_vfos = true;
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
#ifdef ENABLE_SIDE_BUTT_MENU
2023-12-08 14:04:02 +00:00
case MENU_SIDE1_SHORT:
g_eeprom.config.setting.key1_short = g_sub_menu_selection;
break;
case MENU_SIDE1_LONG:
g_eeprom.config.setting.key1_long = g_sub_menu_selection;
break;
case MENU_SIDE2_SHORT:
g_eeprom.config.setting.key2_short = g_sub_menu_selection;
break;
case MENU_SIDE2_LONG:
g_eeprom.config.setting.key2_long = g_sub_menu_selection;
break;
#endif
2023-10-06 22:16:03 +01:00
2023-09-09 08:03:56 +01:00
case MENU_RESET:
2023-11-02 10:00:51 +00:00
SETTINGS_factory_reset(g_sub_menu_selection);
2023-09-09 08:03:56 +01:00
return;
2023-09-19 11:44:49 +01:00
case MENU_350_TX:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.enable_tx_350 = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-10-14 10:33:21 +01:00
case MENU_FREQ_LOCK:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.freq_lock = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_174_TX:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.enable_tx_200 = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_470_TX:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.enable_tx_470 = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_350_EN:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.enable_350 = g_sub_menu_selection;
2023-10-08 20:23:37 +01:00
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
g_flag_reset_vfos = true;
break;
2023-09-19 11:44:49 +01:00
case MENU_SCRAMBLER_EN:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.enable_scrambler = g_sub_menu_selection;
2023-11-04 01:59:17 +00:00
g_flag_reconfigure_vfos = true;
break;
2023-09-19 09:16:57 +01:00
case MENU_TX_EN:
2023-11-02 10:00:51 +00:00
g_eeprom.config.setting.tx_enable = g_sub_menu_selection;
break;
2023-09-19 11:44:49 +01:00
2023-11-23 20:43:13 +00:00
#ifdef ENABLE_TX_POWER_CAL_MENU
case MENU_TX_CALI:
{
const unsigned int seg = FREQUENCY_band_segment(g_current_vfo->p_tx->frequency);
const unsigned int band = (unsigned int)FREQUENCY_GetBand(g_current_vfo->p_tx->frequency);
g_eeprom.calib.tx_band_power[band].level[g_current_vfo->channel.tx_power][seg] = g_sub_menu_selection;
SETTINGS_write_eeprom_calib();
RADIO_ConfigureTXPower(g_current_vfo);
if (g_current_function == FUNCTION_TRANSMIT && g_current_display_screen != DISPLAY_AIRCOPY)
2023-11-24 08:16:38 +00:00
BK4819_SetupPowerAmplifier(g_current_vfo->txp_reg_value, g_current_vfo->p_tx->frequency);
2023-11-23 20:43:13 +00:00
}
break;
#endif
#ifdef ENABLE_FM_DEV_CAL_MENU
case MENU_TX_FM_DEV_CAL:
g_eeprom.calib.deviation = g_sub_menu_selection;
{
uint16_t index = (uint16_t)(((uint8_t *)&g_eeprom.calib.deviation) - ((uint8_t *)&g_eeprom));
index &= ~7u;
2023-11-29 20:25:45 +00:00
EEPROM_WriteBuffer8(index, ((uint8_t *)&g_eeprom) + index);
}
break;
#endif
2023-11-23 20:43:13 +00:00
#ifdef ENABLE_F_CAL_MENU
case MENU_F_CALI:
2023-10-08 20:23:37 +01:00
writeXtalFreqCal(g_sub_menu_selection, true);
return;
2023-11-23 20:43:13 +00:00
#endif
2023-10-02 01:09:35 +01:00
case MENU_BAT_CAL:
{
2023-11-02 10:00:51 +00:00
g_eeprom.calib.battery[0] = (520ul * g_sub_menu_selection) / 760; // 5.20V empty, blinking above this value, reduced functionality below
g_eeprom.calib.battery[1] = (700ul * g_sub_menu_selection) / 760; // 7.00V, ~5%, 1 bars above this value
g_eeprom.calib.battery[2] = (745ul * g_sub_menu_selection) / 760; // 7.45V, ~17%, 2 bars above this value
g_eeprom.calib.battery[3] = g_sub_menu_selection; // 7.6V, ~29%, 3 bars above this value
g_eeprom.calib.battery[4] = (788ul * g_sub_menu_selection) / 760; // 7.88V, ~65%, 4 bars above this value
g_eeprom.calib.battery[5] = 2300;
2023-11-02 10:00:51 +00:00
EEPROM_WriteBuffer8(0x1F40, &g_eeprom.calib.battery[0]);
EEPROM_WriteBuffer8(0x1F48, &g_eeprom.calib.battery[4]);
2023-10-02 01:09:35 +01:00
break;
}
2023-09-09 08:03:56 +01:00
}
2023-10-08 20:23:37 +01:00
g_request_save_settings = true;
2023-09-09 08:03:56 +01:00
}
void MENU_SelectNextCode(void)
{
int32_t UpperLimit;
2023-09-09 08:03:56 +01:00
if (g_menu_cursor == MENU_RX_CDCSS)
2023-09-09 08:03:56 +01:00
UpperLimit = 208;
//UpperLimit = ARRAY_SIZE(DCS_CODE_LIST);
2023-09-09 08:03:56 +01:00
else
if (g_menu_cursor == MENU_RX_CTCSS)
UpperLimit = ARRAY_SIZE(CTCSS_TONE_LIST) - 1;
2023-09-09 08:03:56 +01:00
else
return;
2023-10-20 16:06:38 +01:00
g_sub_menu_selection = NUMBER_AddWithWraparound(g_sub_menu_selection, g_menu_scroll_direction, 1, UpperLimit);
2023-09-09 08:03:56 +01:00
if (g_menu_cursor == MENU_RX_CDCSS)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
if (g_sub_menu_selection > 104)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
g_selected_code_type = CODE_TYPE_REVERSE_DIGITAL;
g_selected_code = g_sub_menu_selection - 105;
2023-09-09 08:03:56 +01:00
}
else
{
2023-10-08 20:23:37 +01:00
g_selected_code_type = CODE_TYPE_DIGITAL;
g_selected_code = g_sub_menu_selection - 1;
2023-09-09 08:03:56 +01:00
}
}
else
{
2023-10-08 20:23:37 +01:00
g_selected_code_type = CODE_TYPE_CONTINUOUS_TONE;
g_selected_code = g_sub_menu_selection - 1;
2023-09-09 08:03:56 +01:00
}
RADIO_setup_registers(true);
2023-09-09 08:03:56 +01:00
2023-11-07 08:48:32 +00:00
g_scan_tick_10ms = (g_selected_code_type == CODE_TYPE_CONTINUOUS_TONE) ? scan_pause_ctcss_10ms : scan_pause_cdcss_10ms;
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
g_update_display = true;
2023-09-09 08:03:56 +01:00
}
static void MENU_ClampSelection(int8_t Direction)
{
int32_t Min;
int32_t Max;
2023-09-26 17:35:03 +01:00
2023-10-08 20:23:37 +01:00
if (!MENU_GetLimits(g_menu_cursor, &Min, &Max))
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
int32_t Selection = g_sub_menu_selection;
2023-09-09 08:03:56 +01:00
if (Selection < Min) Selection = Min;
else
if (Selection > Max) Selection = Max;
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = NUMBER_AddWithWraparound(Selection, Direction, Min, Max);
2023-09-09 08:03:56 +01:00
}
}
void MENU_ShowCurrentSetting(void)
{
2023-10-08 20:23:37 +01:00
switch (g_menu_cursor)
2023-09-09 08:03:56 +01:00
{
case MENU_SQL:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.squelch_level;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_CHAN_SQL:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = g_tx_vfo->channel.squelch_level;
break;
2023-09-09 08:03:56 +01:00
case MENU_STEP:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = FREQUENCY_get_step_index(STEP_FREQ_TABLE[g_tx_vfo->channel.step_setting]);
2023-09-09 08:03:56 +01:00
break;
case MENU_TX_POWER:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = g_tx_vfo->channel.tx_power;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_RX_CDCSS:
2023-10-08 20:23:37 +01:00
switch (g_tx_vfo->freq_config_rx.code_type)
2023-09-09 08:03:56 +01:00
{
case CODE_TYPE_DIGITAL:
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = g_tx_vfo->freq_config_rx.code + 1;
2023-09-09 08:03:56 +01:00
break;
case CODE_TYPE_REVERSE_DIGITAL:
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = g_tx_vfo->freq_config_rx.code + 105;
2023-09-09 08:03:56 +01:00
break;
default:
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = 0;
2023-09-09 08:03:56 +01:00
break;
}
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_RESET:
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = 0;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_RX_CTCSS:
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = (g_tx_vfo->freq_config_rx.code_type == CODE_TYPE_CONTINUOUS_TONE) ? g_tx_vfo->freq_config_rx.code + 1 : 0;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_TX_CDCSS:
2023-10-08 20:23:37 +01:00
switch (g_tx_vfo->freq_config_tx.code_type)
2023-09-09 08:03:56 +01:00
{
case CODE_TYPE_DIGITAL:
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = g_tx_vfo->freq_config_tx.code + 1;
2023-09-09 08:03:56 +01:00
break;
case CODE_TYPE_REVERSE_DIGITAL:
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = g_tx_vfo->freq_config_tx.code + 105;
2023-09-09 08:03:56 +01:00
break;
default:
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = 0;
2023-09-09 08:03:56 +01:00
break;
}
break;
2023-09-19 11:44:49 +01:00
case MENU_TX_CTCSS:
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = (g_tx_vfo->freq_config_tx.code_type == CODE_TYPE_CONTINUOUS_TONE) ? g_tx_vfo->freq_config_tx.code + 1 : 0;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_SHIFT_DIR:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = g_tx_vfo->channel.tx_offset_dir;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_OFFSET:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = g_tx_vfo->channel.tx_offset;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_BANDWIDTH:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = g_tx_vfo->channel.channel_bandwidth;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_SCRAMBLER:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = g_tx_vfo->channel.scrambler;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_BUSY_CHAN_LOCK:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = g_tx_vfo->channel.busy_channel_lock;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_MEM_SAVE:
2023-11-24 17:51:59 +00:00
#if 0
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.indices.vfo[0].user;
2023-11-24 17:51:59 +00:00
#else
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.indices.vfo[g_eeprom.config.setting.tx_vfo_num].user;
2023-11-24 17:51:59 +00:00
#endif
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_MEM_NAME:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.indices.vfo[g_eeprom.config.setting.tx_vfo_num].user;
break;
case MENU_BAT_SAVE:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.battery_save_ratio;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
#ifdef ENABLE_VOX
case MENU_VOX:
g_sub_menu_selection = g_eeprom.config.setting.vox_enabled ? g_eeprom.config.setting.vox_level + 1 : 0;
break;
#endif
case MENU_AUTO_BACKLITE:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.backlight_time;
2023-11-11 13:09:24 +00:00
// BACKLIGHT_turn_on(0);
BACKLIGHT_turn_on(5);
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_AUTO_BACKLITE_ON_TX_RX:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.backlight_on_tx_rx;
break;
2023-11-03 23:14:56 +00:00
#ifdef ENABLE_CONTRAST
2023-10-18 11:31:30 +01:00
case MENU_CONTRAST:
2023-11-03 23:14:56 +00:00
g_sub_menu_selection = g_eeprom.config.setting.lcd_contrast;
2023-10-18 11:31:30 +01:00
break;
2023-11-03 23:14:56 +00:00
#endif
case MENU_DUAL_WATCH:
2023-11-02 10:00:51 +00:00
// g_sub_menu_selection = g_eeprom.config.setting.dual_watch;
g_sub_menu_selection = (g_eeprom.config.setting.dual_watch == DUAL_WATCH_OFF) ? 0 : 1;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_SCAN_HOLD:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.scan_hold_time;
break;
case MENU_CROSS_VFO:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.cross_vfo;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_BEEP:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.beep_control;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_TX_TO:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.tx_timeout;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-11-18 18:44:10 +00:00
#ifdef ENABLE_VOICE
2023-09-09 08:03:56 +01:00
case MENU_VOICE:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.voice_prompt;
2023-09-09 08:03:56 +01:00
break;
2023-11-18 18:44:10 +00:00
#endif
2023-09-19 11:44:49 +01:00
case MENU_SCAN_CAR_RESUME:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.carrier_search_mode;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_MEM_DISP:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.channel_display_mode;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
#ifdef ENABLE_KEYLOCK
2023-12-08 14:04:02 +00:00
case MENU_AUTO_KEY_LOCK:
g_sub_menu_selection = g_eeprom.config.setting.auto_key_lock;
break;
#endif
2023-09-19 11:44:49 +01:00
2023-11-09 12:22:54 +00:00
#ifdef ENABLE_SCAN_RANGES
case MENU_SCAN_RANGES:
g_sub_menu_selection = g_eeprom.config.setting.scan_ranges_enable;
break;
#endif
2023-09-09 08:03:56 +01:00
case MENU_S_ADD1:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = g_tx_vfo->channel_attributes.scanlist1;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_S_ADD2:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = g_tx_vfo->channel_attributes.scanlist2;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_STE:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.tail_tone_elimination;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_RP_STE:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.repeater_tail_tone_elimination;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_MIC_GAIN:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.mic_sensitivity;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-11-18 18:44:10 +00:00
#ifdef ENABLE_PANADAPTER
case MENU_PANADAPTER:
g_sub_menu_selection = g_eeprom.config.setting.panadapter;
break;
#endif
#ifdef ENABLE_TX_AUDIO_BAR
2023-10-17 21:22:40 +01:00
case MENU_TX_BAR:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.mic_bar;
break;
2023-11-18 18:44:10 +00:00
#endif
2023-12-01 10:34:53 +00:00
case MENU_RX_BAR:
g_sub_menu_selection = g_eeprom.config.setting.enable_rssi_bar;
break;
2023-10-04 16:37:11 +01:00
case MENU_COMPAND:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = g_tx_vfo->channel.compand;
2023-10-04 16:37:11 +01:00
return;
2023-09-15 10:57:26 +01:00
2023-09-09 08:03:56 +01:00
case MENU_1_CALL:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.call1;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_S_LIST:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.scan_list_default;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_SLIST1:
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = RADIO_FindNextChannel(0, 1, true, 0);
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-09-09 08:03:56 +01:00
case MENU_SLIST2:
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = RADIO_FindNextChannel(0, 1, true, 1);
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-12-08 14:04:02 +00:00
#ifdef ENABLE_ALARM
case MENU_ALARM_MODE:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.alarm_mode;
2023-09-09 09:01:52 +01:00
break;
2023-12-08 14:04:02 +00:00
#endif
2023-09-19 11:44:49 +01:00
case MENU_DTMF_ST:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.dtmf.side_tone;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-12-08 14:04:02 +00:00
#ifdef ENABLE_DTMF_CALLING
case MENU_DTMF_RSP:
g_sub_menu_selection = g_eeprom.config.setting.dtmf.decode_response;
break;
case MENU_DTMF_HOLD:
g_sub_menu_selection = g_eeprom.config.setting.dtmf.auto_reset_time;
if (g_sub_menu_selection <= DTMF_HOLD_MIN)
g_sub_menu_selection = DTMF_HOLD_MIN;
else
if (g_sub_menu_selection <= 10)
g_sub_menu_selection = 10;
else
if (g_sub_menu_selection <= 20)
g_sub_menu_selection = 20;
else
if (g_sub_menu_selection <= 30)
g_sub_menu_selection = 30;
else
if (g_sub_menu_selection <= 40)
g_sub_menu_selection = 40;
else
if (g_sub_menu_selection <= 50)
g_sub_menu_selection = 50;
else
if (g_sub_menu_selection < DTMF_HOLD_MAX)
g_sub_menu_selection = 50;
else
g_sub_menu_selection = DTMF_HOLD_MAX;
break;
2023-12-08 14:04:02 +00:00
case MENU_DTMF_DCD:
g_sub_menu_selection = g_tx_vfo->channel.dtmf_decoding_enable;
break;
2023-12-08 14:04:02 +00:00
case MENU_DTMF_LIST:
g_sub_menu_selection = g_dtmf_chosen_contact + 1;
break;
#endif
2023-09-19 11:44:49 +01:00
2023-12-06 08:42:17 +00:00
#ifdef ENABLE_DTMF_TIMING_SETTINGS
case MENU_DTMF_PRE:
g_sub_menu_selection = g_eeprom.config.setting.dtmf.preload_time;
break;
case MENU_DTMF_1ST_PERSIST:
g_sub_menu_selection = g_eeprom.config.setting.dtmf.first_code_persist_time;
break;
case MENU_DTMF_HASH_PERSIST:
g_sub_menu_selection = g_eeprom.config.setting.dtmf.hash_code_persist_time;
break;
2023-12-06 08:42:17 +00:00
case MENU_DTMF_PERSIST:
g_sub_menu_selection = g_eeprom.config.setting.dtmf.code_persist_time;
break;
case MENU_DTMF_INTERVAL:
g_sub_menu_selection = g_eeprom.config.setting.dtmf.code_interval_time;
break;
2023-12-06 08:42:17 +00:00
#endif
2023-09-19 11:44:49 +01:00
2023-10-25 13:07:12 +01:00
#ifdef ENABLE_MDC1200
2023-10-25 19:26:22 +01:00
case MENU_MDC1200_MODE:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = g_tx_vfo->channel.mdc1200_mode;
2023-10-25 19:26:22 +01:00
break;
2023-10-25 13:07:12 +01:00
case MENU_MDC1200_ID:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.mdc1200_id;
2023-10-25 13:07:12 +01:00
break;
#endif
2023-09-09 08:03:56 +01:00
case MENU_PTT_ID:
2023-11-02 21:44:53 +00:00
g_sub_menu_selection = g_tx_vfo->channel.dtmf_ptt_id_tx_mode;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_BAT_TXT:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.battery_text;
return;
#ifdef ENABLE_DTMF_LIVE_DECODER
case MENU_DTMF_LIVE_DEC:
g_sub_menu_selection = g_eeprom.config.setting.dtmf_live_decoder;
break;
#endif
case MENU_PON_MSG:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.power_on_display_mode;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_ROGER_MODE:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.roger_mode;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_MOD_MODE:
2023-11-06 14:46:39 +00:00
g_sub_menu_selection = g_tx_vfo->channel.mod_mode;
2023-09-09 08:03:56 +01:00
break;
2023-10-24 18:36:29 +01:00
/*
2023-12-08 14:04:02 +00:00
#ifdef ENABLE_AM_FIX
2023-09-21 23:06:47 +01:00
case MENU_AM_FIX:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.am_fix;
2023-09-21 23:06:47 +01:00
break;
2023-12-08 14:04:02 +00:00
#endif
2023-10-24 18:36:29 +01:00
*/
2023-12-08 14:04:02 +00:00
#ifdef ENABLE_AM_FIX_TEST1
2023-09-23 17:23:21 +01:00
case MENU_AM_FIX_TEST1:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.am_fix_test1;
2023-09-23 17:23:21 +01:00
break;
2023-12-08 14:04:02 +00:00
#endif
2023-09-23 17:23:21 +01:00
2023-12-08 14:04:02 +00:00
#ifdef ENABLE_NOAA
case MENU_NOAA_SCAN:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.noaa_auto_scan;
2023-09-09 08:03:56 +01:00
break;
2023-12-08 14:04:02 +00:00
#endif
2023-09-19 11:44:49 +01:00
case MENU_MEM_DEL:
2023-12-08 14:04:02 +00:00
#if 0
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = RADIO_FindNextChannel(g_eeprom.config.setting.indices.vfo[0].user, 1, false, 1);
2023-12-08 14:04:02 +00:00
#else
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = RADIO_FindNextChannel(g_eeprom.config.setting.indices.vfo[g_eeprom.config.setting.tx_vfo_num].user, 1, false, 1);
2023-12-08 14:04:02 +00:00
#endif
2023-10-06 22:16:03 +01:00
break;
2023-12-08 14:04:02 +00:00
#ifdef ENABLE_SIDE_BUTT_MENU
case MENU_SIDE1_SHORT:
g_sub_menu_selection = g_eeprom.config.setting.key1_short;
break;
case MENU_SIDE1_LONG:
g_sub_menu_selection = g_eeprom.config.setting.key1_long;
break;
case MENU_SIDE2_SHORT:
g_sub_menu_selection = g_eeprom.config.setting.key2_short;
break;
case MENU_SIDE2_LONG:
g_sub_menu_selection = g_eeprom.config.setting.key2_long;
break;
#endif
2023-10-06 22:16:03 +01:00
case MENU_350_TX:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.enable_tx_350;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-10-14 10:33:21 +01:00
case MENU_FREQ_LOCK:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.freq_lock;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_174_TX:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.enable_tx_200;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_470_TX:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.enable_tx_470;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_350_EN:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.enable_350;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 11:44:49 +01:00
case MENU_SCRAMBLER_EN:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.enable_scrambler;
2023-09-09 08:03:56 +01:00
break;
2023-09-19 09:16:57 +01:00
case MENU_TX_EN:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.config.setting.tx_enable;
2023-09-19 09:16:57 +01:00
break;
2023-09-19 11:44:49 +01:00
2023-11-23 20:43:13 +00:00
#ifdef ENABLE_TX_POWER_CAL_MENU
case MENU_TX_CALI:
{
const unsigned int seg = FREQUENCY_band_segment(g_current_vfo->p_tx->frequency);
const unsigned int band = (unsigned int)FREQUENCY_GetBand(g_current_vfo->p_tx->frequency);
g_sub_menu_selection = g_eeprom.calib.tx_band_power[band].level[g_current_vfo->channel.tx_power][seg];
}
break;
#endif
#ifdef ENABLE_FM_DEV_CAL_MENU
case MENU_TX_FM_DEV_CAL:
g_sub_menu_selection = g_eeprom.calib.deviation;
break;
#endif
2023-11-03 11:18:53 +00:00
#ifdef ENABLE_F_CAL_MENU
case MENU_F_CALI:
2023-11-03 11:18:53 +00:00
g_sub_menu_selection = g_eeprom.calib.bk4819_xtal_freq_low;
break;
2023-11-03 11:18:53 +00:00
#endif
2023-10-02 01:09:35 +01:00
case MENU_BAT_CAL:
2023-11-02 10:00:51 +00:00
g_sub_menu_selection = g_eeprom.calib.battery[3];
2023-10-02 01:09:35 +01:00
break;
2023-10-02 01:09:35 +01:00
default:
return;
2023-09-09 08:03:56 +01:00
}
}
2023-10-08 20:23:37 +01:00
static void MENU_Key_0_to_9(key_code_t Key, bool key_pressed, bool key_held)
2023-09-09 08:03:56 +01:00
{
2023-10-20 18:00:36 +01:00
unsigned int index;
int32_t min;
int32_t max;
uint32_t value = 0;
2023-10-08 20:23:37 +01:00
if (key_held || !key_pressed)
2023-09-09 08:03:56 +01:00
return;
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-09-09 08:03:56 +01:00
2023-11-24 17:51:59 +00:00
if (g_menu_cursor == MENU_TX_POWER && g_sub_menu_selection == OUTPUT_POWER_USER && g_edit_index >= 0)
{ // currently editing the user TX power level
return;
}
2023-10-08 20:23:37 +01:00
if (g_menu_cursor == MENU_MEM_NAME && g_edit_index >= 0)
2023-09-20 11:58:47 +01:00
{ // currently editing the channel name
2023-10-08 20:23:37 +01:00
if (g_edit_index < 10)
2023-09-20 11:58:47 +01:00
{
2023-10-10 00:00:22 +01:00
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wtype-limits"
2023-10-05 16:28:20 +01:00
if (Key >= KEY_0 && Key <= KEY_9)
2023-09-20 11:58:47 +01:00
{
2023-10-08 20:23:37 +01:00
g_edit[g_edit_index] = '0' + Key - KEY_0;
2023-09-20 11:58:47 +01:00
2023-10-08 20:23:37 +01:00
if (++g_edit_index >= 10)
2023-09-20 11:58:47 +01:00
{ // exit edit
2023-10-14 09:43:53 +01:00
g_flag_accept_setting = false;
2023-10-08 20:23:37 +01:00
g_ask_for_confirmation = 1;
2023-09-20 11:58:47 +01:00
}
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
2023-09-20 11:58:47 +01:00
}
2023-10-10 00:00:22 +01:00
#pragma GCC diagnostic pop
2023-09-20 11:58:47 +01:00
}
return;
}
2023-10-20 18:00:36 +01:00
INPUTBOX_append(Key);
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
2023-09-09 08:03:56 +01:00
2023-10-20 18:00:36 +01:00
if (!g_in_sub_menu)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
switch (g_input_box_index)
2023-09-09 08:03:56 +01:00
{
2023-09-26 17:35:03 +01:00
case 2:
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
2023-09-26 17:35:03 +01:00
2023-10-20 18:00:36 +01:00
value = (g_input_box[0] * 10) + g_input_box[1];
2023-10-20 18:00:36 +01:00
if (value > 0 && value <= g_menu_list_count)
2023-09-09 08:03:56 +01:00
{
2023-10-20 18:00:36 +01:00
g_menu_cursor = value - 1;
2023-11-10 07:31:50 +00:00
g_update_menu = true;
2023-09-09 08:03:56 +01:00
return;
}
2023-10-20 18:00:36 +01:00
if (value <= g_menu_list_count)
2023-09-26 17:35:03 +01:00
break;
2023-10-08 20:23:37 +01:00
g_input_box[0] = g_input_box[1];
g_input_box_index = 1;
2023-10-28 23:11:57 +01:00
// Fallthrough
2023-09-26 17:35:03 +01:00
case 1:
2023-10-20 18:00:36 +01:00
value = g_input_box[0];
if (value > 0 && value <= g_menu_list_count)
2023-09-09 08:03:56 +01:00
{
2023-10-20 18:00:36 +01:00
g_menu_cursor = value - 1;
2023-11-10 07:31:50 +00:00
g_update_menu = true;
2023-09-09 08:03:56 +01:00
return;
}
break;
}
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
return;
2023-09-09 08:03:56 +01:00
}
2023-10-08 20:23:37 +01:00
if (g_menu_cursor == MENU_OFFSET)
{
uint32_t Frequency;
2023-09-09 08:03:56 +01:00
2023-11-03 10:39:43 +00:00
NUMBER_Get(g_input_box, &Frequency);
if (g_input_box_index > 0)
g_sub_menu_selection = Frequency;
2023-10-26 13:46:12 +01:00
if (g_input_box_index < 8)
2023-10-20 18:00:36 +01:00
{ // not yet enough characters
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)Key;
2023-10-20 18:00:36 +01:00
#endif
2023-09-09 08:03:56 +01:00
return;
}
2023-11-03 10:39:43 +00:00
g_input_box_index = 0;
2023-10-20 18:00:36 +01:00
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)Key;
2023-10-20 18:00:36 +01:00
#endif
2023-09-19 11:44:49 +01:00
2023-10-26 13:46:12 +01:00
#if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG)
UART_printf("offset 3 %u\r\n", Frequency);
#endif
#if 0
{ // round
const uint32_t step_size = g_tx_vfo->step_freq;
Frequency = ((Frequency + (step_size / 2)) / step_size) * step_size;
}
#endif
#if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG)
2023-11-03 10:39:43 +00:00
// UART_printf("offset 4 %u\r\n", Frequency);
2023-10-26 13:46:12 +01:00
#endif
2023-10-26 13:46:12 +01:00
g_sub_menu_selection = Frequency;
2023-10-20 18:00:36 +01:00
return;
}
#ifdef ENABLE_FM_DEV_CAL_MENU
if (g_menu_cursor == MENU_BAT_CAL || g_menu_cursor == MENU_TX_FM_DEV_CAL)
#else
if (g_menu_cursor == MENU_BAT_CAL)
#endif
2023-10-20 18:00:36 +01:00
{
g_sub_menu_selection = INPUTBOX_value(); // get the current value from the input box
2023-11-29 21:48:02 +00:00
#ifdef ENABLE_FM_DEV_CAL_MENU
if (g_current_function == FUNCTION_TRANSMIT)
if (g_menu_cursor == MENU_TX_FM_DEV_CAL)
2023-11-29 21:48:02 +00:00
BK4819_set_TX_deviation(g_sub_menu_selection);
#endif
2023-10-20 18:00:36 +01:00
if (g_input_box_index < 4)
{ // not yet enough characters
#ifdef ENABLE_VOICE
g_another_voice_id = (voice_id_t)Key;
#endif
return;
}
#ifdef ENABLE_VOICE
g_another_voice_id = (voice_id_t)Key;
#endif
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
return;
}
2023-09-09 08:03:56 +01:00
if (g_menu_cursor == MENU_MEM_SAVE ||
g_menu_cursor == MENU_MEM_DEL ||
2023-10-08 20:23:37 +01:00
g_menu_cursor == MENU_1_CALL ||
g_menu_cursor == MENU_MEM_NAME)
{ // enter 3-digit channel number
2023-10-08 20:23:37 +01:00
if (g_input_box_index < 3)
{
2023-10-20 18:00:36 +01:00
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)Key;
2023-10-20 18:00:36 +01:00
#endif
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
return;
2023-09-09 08:03:56 +01:00
}
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
2023-10-20 18:00:36 +01:00
value = ((g_input_box[0] * 100) + (g_input_box[1] * 10) + g_input_box[2]) - 1;
2023-10-20 18:00:36 +01:00
if (value <= USER_CHANNEL_LAST)
2023-10-08 20:23:37 +01:00
{ // user channel
2023-10-20 18:00:36 +01:00
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)Key;
2023-10-20 18:00:36 +01:00
#endif
g_sub_menu_selection = value;
return;
}
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
return;
}
2023-09-09 08:03:56 +01:00
2023-10-20 18:00:36 +01:00
if (MENU_GetLimits(g_menu_cursor, &min, &max))
{
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
return;
}
2023-09-19 11:44:49 +01:00
2023-10-20 18:00:36 +01:00
index = (max >= 100000) ? 6 : (max >= 10000) ? 5 : (max >= 1000) ? 4 : (max >= 100) ? 3 : (max >= 10) ? 2 : 1;
// NUMBER_Get(g_input_box, &value);
2023-10-08 20:23:37 +01:00
switch (g_input_box_index)
{
case 1:
2023-10-20 18:00:36 +01:00
value = g_input_box[0];
break;
case 2:
2023-10-20 18:00:36 +01:00
value = (g_input_box[0] * 10) + g_input_box[1];
break;
case 3:
2023-10-20 18:00:36 +01:00
value = (g_input_box[0] * 100) + (g_input_box[1] * 10) + g_input_box[2];
break;
case 4:
value = (g_input_box[0] * 1000) + (g_input_box[1] * 100) + (g_input_box[2] * 10) + g_input_box[3];
break;
}
2023-10-20 18:00:36 +01:00
if (index == g_input_box_index)
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
2023-10-20 18:00:36 +01:00
if ((int32_t)value <= max)
{
2023-10-20 18:00:36 +01:00
g_sub_menu_selection = value;
return;
2023-09-09 08:03:56 +01:00
}
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
2023-09-09 08:03:56 +01:00
}
2023-10-08 20:23:37 +01:00
static void MENU_Key_EXIT(bool key_pressed, bool key_held)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
if (key_held || !key_pressed)
return;
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-09-19 11:44:49 +01:00
2023-10-08 20:23:37 +01:00
if (g_css_scan_mode == CSS_SCAN_MODE_OFF)
{
2023-10-20 18:00:36 +01:00
if (g_in_sub_menu)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
if (g_input_box_index == 0 || g_menu_cursor != MENU_OFFSET)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
g_ask_for_confirmation = 0;
2023-10-20 18:00:36 +01:00
g_in_sub_menu = false;
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
2023-11-10 07:31:50 +00:00
g_update_menu = true;
2023-09-09 08:03:56 +01:00
2023-11-03 10:39:43 +00:00
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = VOICE_ID_CANCEL;
2023-11-03 10:39:43 +00:00
#endif
2023-09-09 08:03:56 +01:00
}
else
2023-10-08 20:23:37 +01:00
g_input_box[--g_input_box_index] = 10;
2023-09-09 08:03:56 +01:00
// ***********************
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
return;
2023-09-09 08:03:56 +01:00
}
2023-11-03 10:39:43 +00:00
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = VOICE_ID_CANCEL;
2023-11-03 10:39:43 +00:00
#endif
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MAIN;
2023-11-02 10:00:51 +00:00
if (g_eeprom.config.setting.backlight_time == 0)
2023-11-10 13:23:32 +00:00
BACKLIGHT_turn_off();
2023-09-09 08:03:56 +01:00
}
else
{
MENU_stop_css_scan();
2023-11-03 10:39:43 +00:00
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = VOICE_ID_SCANNING_STOP;
2023-11-03 10:39:43 +00:00
#endif
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
}
2023-10-08 20:23:37 +01:00
g_ptt_was_released = true;
2023-09-09 08:03:56 +01:00
}
2023-10-08 20:23:37 +01:00
static void MENU_Key_MENU(const bool key_pressed, const bool key_held)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
if (key_held || !key_pressed)
return;
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
g_request_display_screen = DISPLAY_MENU;
2023-10-20 18:00:36 +01:00
if (!g_in_sub_menu)
2023-09-09 08:03:56 +01:00
{
2023-10-26 13:46:12 +01:00
#ifdef ENABLE_VOICE
if (g_menu_cursor != MENU_SCRAMBLER)
2023-10-08 20:23:37 +01:00
g_another_voice_id = g_menu_list[g_menu_list_sorted[g_menu_cursor]].voice_id;
2023-10-26 13:46:12 +01:00
#endif
2023-09-19 11:44:49 +01:00
2023-10-26 13:46:12 +01:00
#if 1
if (g_menu_cursor == MENU_MEM_DEL || g_menu_cursor == MENU_MEM_NAME)
2023-11-06 18:52:18 +00:00
if (!RADIO_channel_valid(g_sub_menu_selection, false, 0))
return; // invalid channel
2023-10-26 13:46:12 +01:00
#endif
2023-09-19 11:44:49 +01:00
2023-10-08 20:23:37 +01:00
g_ask_for_confirmation = 0;
2023-10-20 18:00:36 +01:00
g_in_sub_menu = true;
2023-11-25 08:52:23 +00:00
g_input_box_index = 0;
g_edit_index = -1;
return;
}
2023-11-24 17:51:59 +00:00
if (g_menu_cursor == MENU_TX_POWER)
{
2023-11-25 08:52:23 +00:00
if (g_sub_menu_selection == OUTPUT_POWER_USER)
2023-11-24 17:51:59 +00:00
{
if (g_edit_index < 0)
2023-11-25 08:52:23 +00:00
{ // start editing the power level
2023-11-24 17:51:59 +00:00
g_edit_index = g_tx_vfo->channel.tx_power_user;
}
else
{ // save the new power level
2023-11-24 17:51:59 +00:00
g_tx_vfo->channel.tx_power_user = g_edit_index;
g_request_save_channel = 1;
2023-11-25 08:52:23 +00:00
g_flag_accept_setting = true;
2023-11-24 17:51:59 +00:00
g_in_sub_menu = false;
g_edit_index = -1;
}
return;
}
}
2023-10-08 20:23:37 +01:00
if (g_menu_cursor == MENU_MEM_NAME)
{
2023-10-08 20:23:37 +01:00
if (g_edit_index < 0)
{ // enter channel name edit mode
2023-11-06 18:52:18 +00:00
if (!RADIO_channel_valid(g_sub_menu_selection, false, 0))
return;
2023-09-20 11:58:47 +01:00
2023-11-02 10:00:51 +00:00
SETTINGS_fetch_channel_name(g_edit, g_sub_menu_selection);
2023-09-20 11:58:47 +01:00
// pad the channel name out with '_'
2023-10-08 20:23:37 +01:00
g_edit_index = strlen(g_edit);
while (g_edit_index < 10)
g_edit[g_edit_index++] = '_';
g_edit[g_edit_index] = 0;
g_edit_index = 0; // 'g_edit_index' is going to be used as the cursor position
2023-09-20 11:23:45 +01:00
// make a copy so we can test for change when exiting the menu item
memcpy(g_edit_original, g_edit, sizeof(g_edit_original));
2023-09-20 11:58:47 +01:00
return;
2023-09-09 08:03:56 +01:00
}
2023-11-24 17:51:59 +00:00
2023-10-08 20:23:37 +01:00
if (g_edit_index >= 0 && g_edit_index < 10)
{ // editing the channel name characters
2023-09-20 11:58:47 +01:00
2023-10-08 20:23:37 +01:00
if (++g_edit_index < 10)
return; // next char
2023-09-20 11:58:47 +01:00
// exit
2023-10-08 20:23:37 +01:00
if (memcmp(g_edit_original, g_edit, sizeof(g_edit_original)) == 0)
2023-09-20 11:58:47 +01:00
{ // no change - drop it
2023-10-14 09:43:53 +01:00
g_flag_accept_setting = false;
2023-11-24 17:51:59 +00:00
g_in_sub_menu = false;
2023-10-08 20:23:37 +01:00
g_ask_for_confirmation = 0;
2023-09-20 11:23:45 +01:00
}
else
{
2023-10-14 09:43:53 +01:00
g_flag_accept_setting = false;
2023-10-08 20:23:37 +01:00
g_ask_for_confirmation = 0;
2023-09-20 11:23:45 +01:00
}
}
}
2023-09-20 11:23:45 +01:00
// exiting the sub menu
2023-09-20 11:58:47 +01:00
2023-10-20 18:00:36 +01:00
if (g_in_sub_menu)
{
2023-10-08 20:23:37 +01:00
if (g_menu_cursor == MENU_RESET ||
g_menu_cursor == MENU_MEM_SAVE ||
g_menu_cursor == MENU_MEM_DEL ||
2023-10-08 20:23:37 +01:00
g_menu_cursor == MENU_MEM_NAME)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
switch (g_ask_for_confirmation)
2023-09-20 11:23:45 +01:00
{
case 0:
2023-10-08 20:23:37 +01:00
g_ask_for_confirmation = 1;
2023-09-20 11:23:45 +01:00
break;
2023-09-20 11:58:47 +01:00
2023-09-20 11:23:45 +01:00
case 1:
2023-10-08 20:23:37 +01:00
g_ask_for_confirmation = 2;
2023-09-20 11:58:47 +01:00
2023-09-20 11:23:45 +01:00
UI_DisplayMenu();
2023-09-20 11:58:47 +01:00
2023-10-08 20:23:37 +01:00
if (g_menu_cursor == MENU_RESET)
2023-09-20 11:23:45 +01:00
{
2023-10-26 13:46:12 +01:00
#ifdef ENABLE_VOICE
2023-09-20 11:23:45 +01:00
AUDIO_SetVoiceID(0, VOICE_ID_CONFIRM);
AUDIO_PlaySingleVoice(true);
2023-10-26 13:46:12 +01:00
#endif
2023-09-20 11:58:47 +01:00
2023-09-20 11:23:45 +01:00
MENU_AcceptSetting();
2023-09-20 11:58:47 +01:00
2023-10-26 13:46:12 +01:00
#if defined(ENABLE_OVERLAY)
2023-09-20 11:23:45 +01:00
overlay_FLASH_RebootToBootloader();
2023-10-26 13:46:12 +01:00
#else
2023-09-20 11:23:45 +01:00
NVIC_SystemReset();
2023-10-26 13:46:12 +01:00
#endif
2023-09-20 11:23:45 +01:00
}
2023-09-20 11:58:47 +01:00
2023-10-14 09:43:53 +01:00
g_flag_accept_setting = true;
2023-10-26 13:46:12 +01:00
g_in_sub_menu = false;
2023-10-08 20:23:37 +01:00
g_ask_for_confirmation = 0;
2023-09-20 11:23:45 +01:00
}
}
else
{
2023-10-14 09:43:53 +01:00
g_flag_accept_setting = true;
2023-10-26 13:46:12 +01:00
g_in_sub_menu = false;
}
}
2023-09-20 11:58:47 +01:00
2023-10-08 20:23:37 +01:00
if (g_css_scan_mode != CSS_SCAN_MODE_OFF)
{
2023-10-26 13:46:12 +01:00
g_css_scan_mode = CSS_SCAN_MODE_OFF;
2023-10-08 20:23:37 +01:00
g_update_status = true;
2023-09-09 08:03:56 +01:00
}
2023-09-20 11:58:47 +01:00
2023-10-26 13:46:12 +01:00
#ifdef ENABLE_VOICE
if (g_menu_cursor == MENU_SCRAMBLER)
2023-10-08 20:23:37 +01:00
g_another_voice_id = (g_sub_menu_selection == 0) ? VOICE_ID_SCRAMBLER_OFF : VOICE_ID_SCRAMBLER_ON;
else
2023-10-08 17:14:13 +01:00
g_another_voice_id = VOICE_ID_CONFIRM;
2023-10-26 13:46:12 +01:00
#endif
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
2023-09-09 08:03:56 +01:00
}
2023-10-08 20:23:37 +01:00
static void MENU_Key_STAR(const bool key_pressed, const bool key_held)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
if (key_held || !key_pressed)
return;
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
if (g_menu_cursor == MENU_MEM_NAME && g_edit_index >= 0)
2023-09-20 11:58:47 +01:00
{ // currently editing the channel name
2023-10-08 20:23:37 +01:00
if (g_edit_index < 10)
2023-09-20 11:58:47 +01:00
{
2023-10-08 20:23:37 +01:00
g_edit[g_edit_index] = '-';
2023-09-20 11:58:47 +01:00
2023-10-08 20:23:37 +01:00
if (++g_edit_index >= 10)
2023-09-20 11:58:47 +01:00
{ // exit edit
2023-10-14 09:43:53 +01:00
g_flag_accept_setting = false;
2023-10-08 20:23:37 +01:00
g_ask_for_confirmation = 1;
2023-09-20 11:58:47 +01:00
}
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
2023-09-20 11:58:47 +01:00
}
return;
}
RADIO_select_vfos();
2023-11-06 14:46:39 +00:00
if (IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save) && g_rx_vfo->channel.mod_mode == MOD_MODE_FM)
{
if (g_menu_cursor == MENU_RX_CTCSS || g_menu_cursor == MENU_RX_CDCSS)
{ // scan CTCSS or DCS to find the tone/code of the incoming signal
2023-10-08 20:23:37 +01:00
if (g_css_scan_mode == CSS_SCAN_MODE_OFF)
2023-09-09 08:03:56 +01:00
{
MENU_start_css_scan(1);
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
#ifdef ENABLE_VOICE
AUDIO_SetVoiceID(0, VOICE_ID_SCANNING_BEGIN);
AUDIO_PlaySingleVoice(1);
#endif
}
else
{
MENU_stop_css_scan();
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = VOICE_ID_SCANNING_STOP;
#endif
2023-09-09 08:03:56 +01:00
}
}
2023-10-08 20:23:37 +01:00
g_ptt_was_released = true;
return;
2023-09-09 08:03:56 +01:00
}
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
2023-09-09 08:03:56 +01:00
}
2023-10-08 20:23:37 +01:00
static void MENU_Key_UP_DOWN(bool key_pressed, bool key_held, int8_t Direction)
2023-09-09 08:03:56 +01:00
{
uint8_t VFO;
uint8_t Channel;
bool bCheckScanList;
2023-11-24 17:51:59 +00:00
if (g_menu_cursor == MENU_TX_POWER && g_in_sub_menu && g_sub_menu_selection == OUTPUT_POWER_USER && g_edit_index >= 0)
{
if (key_pressed)
{
g_edit_index += Direction;
g_edit_index = (g_edit_index < 1) ? 1 : (g_edit_index > 15) ? 15 : g_edit_index;
g_request_display_screen = DISPLAY_MENU;
}
return;
}
2023-10-20 18:00:36 +01:00
if (g_menu_cursor == MENU_MEM_NAME && g_in_sub_menu && g_edit_index >= 0)
{ // change the character
2023-10-08 20:23:37 +01:00
if (key_pressed && g_edit_index < 10 && Direction != 0)
{
2023-11-06 18:52:18 +00:00
#if 0
const char unwanted[] = "$%&!\"':;?^`|{}";
char c = g_edit[g_edit_index] + Direction;
unsigned int i = 0;
while (i < sizeof(unwanted) && c >= 32 && c <= 126)
{
if (c == unwanted[i++])
{ // choose next character
c += Direction;
i = 0;
}
}
2023-11-06 18:52:18 +00:00
g_edit[g_edit_index] = (c < 32) ? 126 : (c > 126) ? 32 : c;
#else
// choose next character
char c = g_edit[g_edit_index] + Direction;
while (c < 32 || c > 126)
c += Direction;
g_edit[g_edit_index] = c;
#endif
2023-09-20 11:58:47 +01:00
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
}
return;
}
2023-10-08 20:23:37 +01:00
if (!key_held)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
if (!key_pressed)
2023-09-09 08:03:56 +01:00
return;
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
2023-09-09 08:03:56 +01:00
}
else
2023-10-08 20:23:37 +01:00
if (!key_pressed)
2023-09-09 08:03:56 +01:00
return;
2023-10-08 20:23:37 +01:00
if (g_css_scan_mode != CSS_SCAN_MODE_OFF)
2023-09-09 08:03:56 +01:00
{
MENU_start_css_scan(Direction);
2023-10-08 20:23:37 +01:00
g_ptt_was_released = true;
g_request_display_screen = DISPLAY_MENU;
2023-09-09 08:03:56 +01:00
return;
}
2023-10-20 18:00:36 +01:00
if (!g_in_sub_menu)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
g_menu_cursor = NUMBER_AddWithWraparound(g_menu_cursor, -Direction, 0, g_menu_list_count - 1);
2023-11-10 07:31:50 +00:00
g_update_menu = true;
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
2023-09-20 13:01:08 +01:00
2023-11-02 10:00:51 +00:00
if (g_menu_cursor != MENU_AUTO_BACKLITE && g_eeprom.config.setting.backlight_time == 0)
2023-11-10 13:23:32 +00:00
BACKLIGHT_turn_off();
2023-09-09 08:03:56 +01:00
return;
}
VFO = 0;
2023-10-08 20:23:37 +01:00
switch (g_menu_cursor)
2023-09-09 08:03:56 +01:00
{
2023-10-26 13:46:12 +01:00
case MENU_OFFSET:
{
2023-10-27 14:34:52 +01:00
const int32_t max_freq = MAX_TX_OFFSET;
2023-10-26 13:46:12 +01:00
const int32_t step_size = g_tx_vfo->step_freq;
int32_t offset = (int32_t)g_sub_menu_selection + (Direction * step_size);
2023-10-26 13:46:12 +01:00
// wrap
if (offset >= max_freq)
offset = 0;
2023-10-26 13:46:12 +01:00
else
if (offset < 0)
offset = max_freq - step_size;
#if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG)
UART_printf("offset 1 %u %u\r\n", offset, step_size);
#endif
offset = ((offset + (step_size / 2)) / step_size) * step_size; // round
#if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG)
UART_printf("offset 2 %u %u\r\n", offset, step_size);
#endif
2023-10-26 13:46:12 +01:00
g_sub_menu_selection = offset;
g_request_display_screen = DISPLAY_MENU;
return;
}
case MENU_MEM_DEL:
2023-09-09 08:03:56 +01:00
case MENU_1_CALL:
case MENU_MEM_NAME:
2023-09-09 08:03:56 +01:00
bCheckScanList = false;
break;
2023-09-09 08:03:56 +01:00
case MENU_SLIST2:
VFO = 1;
2023-10-28 23:11:57 +01:00
// Fallthrough
2023-09-09 08:03:56 +01:00
case MENU_SLIST1:
bCheckScanList = true;
break;
default:
2023-09-09 08:03:56 +01:00
MENU_ClampSelection(Direction);
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
2023-09-09 08:03:56 +01:00
return;
}
2023-10-08 20:23:37 +01:00
Channel = RADIO_FindNextChannel(g_sub_menu_selection + Direction, Direction, bCheckScanList, VFO);
2023-09-09 08:03:56 +01:00
if (Channel != 0xFF)
2023-10-08 20:23:37 +01:00
g_sub_menu_selection = Channel;
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
2023-09-09 08:03:56 +01:00
}
void MENU_process_key(key_code_t Key, bool key_pressed, bool key_held)
2023-09-09 08:03:56 +01:00
{
switch (Key)
{
case KEY_0:
case KEY_1:
case KEY_2:
case KEY_3:
case KEY_4:
case KEY_5:
case KEY_6:
case KEY_7:
case KEY_8:
case KEY_9:
2023-10-08 20:23:37 +01:00
MENU_Key_0_to_9(Key, key_pressed, key_held);
2023-09-09 08:03:56 +01:00
break;
case KEY_MENU:
2023-10-08 20:23:37 +01:00
MENU_Key_MENU(key_pressed, key_held);
2023-09-09 08:03:56 +01:00
break;
case KEY_UP:
2023-10-08 20:23:37 +01:00
MENU_Key_UP_DOWN(key_pressed, key_held, 1);
2023-09-09 08:03:56 +01:00
break;
case KEY_DOWN:
2023-10-08 20:23:37 +01:00
MENU_Key_UP_DOWN(key_pressed, key_held, -1);
2023-09-09 08:03:56 +01:00
break;
case KEY_EXIT:
2023-10-08 20:23:37 +01:00
MENU_Key_EXIT(key_pressed, key_held);
2023-09-09 08:03:56 +01:00
break;
case KEY_STAR:
2023-10-08 20:23:37 +01:00
MENU_Key_STAR(key_pressed, key_held);
2023-09-09 08:03:56 +01:00
break;
case KEY_F:
2023-10-08 20:23:37 +01:00
if (g_menu_cursor == MENU_MEM_NAME && g_edit_index >= 0)
2023-09-20 11:58:47 +01:00
{ // currently editing the channel name
2023-10-08 20:23:37 +01:00
if (!key_held && key_pressed)
2023-09-20 11:58:47 +01:00
{
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
if (g_edit_index < 10)
2023-09-20 12:02:50 +01:00
{
2023-10-08 20:23:37 +01:00
g_edit[g_edit_index] = ' ';
if (++g_edit_index >= 10)
2023-09-20 12:02:50 +01:00
{ // exit edit
2023-10-14 09:43:53 +01:00
g_flag_accept_setting = false;
2023-10-08 20:23:37 +01:00
g_ask_for_confirmation = 1;
2023-09-20 12:02:50 +01:00
}
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MENU;
2023-09-20 11:58:47 +01:00
}
}
break;
}
2023-10-08 20:23:37 +01:00
GENERIC_Key_F(key_pressed, key_held);
2023-09-09 08:03:56 +01:00
break;
case KEY_PTT:
2023-10-08 20:23:37 +01:00
GENERIC_Key_PTT(key_pressed);
2023-09-09 08:03:56 +01:00
break;
default:
2023-10-08 20:23:37 +01:00
if (!key_held && key_pressed)
g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
2023-09-09 08:03:56 +01:00
break;
}
if (g_current_display_screen == DISPLAY_MENU)
{
if (g_menu_cursor == MENU_VOLTAGE ||
2023-11-23 20:43:13 +00:00
#ifdef ENABLE_F_CAL_MENU
g_menu_cursor == MENU_F_CALI ||
#endif
g_menu_cursor == MENU_BAT_CAL)
{
2023-10-29 22:33:38 +00:00
g_menu_tick_10ms = menu_timeout_long_500ms;
}
else
{
2023-10-29 22:33:38 +00:00
g_menu_tick_10ms = menu_timeout_500ms;
}
}
2023-09-09 08:03:56 +01:00
}