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

887 lines
20 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.
*/
#include <string.h>
#include "app/action.h"
#include "app/app.h"
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_FMRADIO
#include "app/fm.h"
#endif
2023-09-09 08:03:56 +01:00
#include "app/generic.h"
#include "app/main.h"
#include "app/scanner.h"
#include "audio.h"
#include "board.h"
2023-09-27 23:22:01 +01:00
#include "driver/bk4819.h"
2023-09-09 08:03:56 +01:00
#include "dtmf.h"
#include "frequencies.h"
#include "misc.h"
#include "radio.h"
#include "settings.h"
#include "ui/inputbox.h"
#include "ui/ui.h"
#ifdef ENABLE_SPECTRUM
// #include "app/spectrum.h"
#endif
2023-09-09 08:03:56 +01:00
void toggle_chan_scanlist(void)
{ // toggle the selected channels scanlist setting
2023-10-08 20:23:37 +01:00
if (g_screen_to_display == DISPLAY_SCANNER || !IS_USER_CHANNEL(g_tx_vfo->channel_save))
return;
2023-10-08 20:23:37 +01:00
if (g_tx_vfo->scanlist_1_participation)
{
2023-10-08 20:23:37 +01:00
if (g_tx_vfo->scanlist_2_participation)
g_tx_vfo->scanlist_1_participation = 0;
else
2023-10-08 20:23:37 +01:00
g_tx_vfo->scanlist_2_participation = 1;
}
else
{
2023-10-08 20:23:37 +01:00
if (g_tx_vfo->scanlist_2_participation)
g_tx_vfo->scanlist_2_participation = 0;
else
2023-10-08 20:23:37 +01:00
g_tx_vfo->scanlist_1_participation = 1;
}
2023-10-08 20:23:37 +01:00
SETTINGS_UpdateChannel(g_tx_vfo->channel_save, g_tx_vfo, true);
2023-10-08 20:23:37 +01:00
g_vfo_configure_mode = VFO_CONFIGURE;
g_flag_reset_vfos = true;
}
2023-10-08 17:14:13 +01:00
static void processFKeyFunction(const key_code_t Key, const bool beep)
2023-09-09 08:03:56 +01:00
{
uint8_t Band;
2023-10-08 17:14:13 +01:00
uint8_t Vfo = g_eeprom.tx_vfo;
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
if (g_screen_to_display == DISPLAY_MENU)
2023-10-05 17:38:25 +01:00
{
// if (beep)
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
return;
2023-10-05 17:38:25 +01:00
}
2023-10-08 20:23:37 +01:00
2023-10-05 17:38:25 +01:00
// if (beep)
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-10-05 17:38:25 +01:00
2023-09-09 08:03:56 +01:00
switch (Key)
{
case KEY_0:
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_FMRADIO
ACTION_FM();
2023-09-25 13:27:52 +01:00
#else
// TODO: make use of this function key
2023-09-14 09:56:30 +01:00
#endif
2023-09-09 08:03:56 +01:00
break;
2023-09-14 19:38:28 +01:00
2023-09-09 08:03:56 +01:00
case KEY_1:
2023-10-08 20:23:37 +01:00
if (!IS_FREQ_CHANNEL(g_tx_vfo->channel_save))
2023-09-09 08:03:56 +01:00
{
g_fkey_pressed = false;
2023-10-08 20:23:37 +01:00
g_update_status = true;
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-09-09 08:03:56 +01:00
return;
}
2023-10-08 20:23:37 +01:00
Band = g_tx_vfo->band + 1;
if (g_setting_350_enable || Band != BAND5_350MHz)
2023-09-09 08:03:56 +01:00
{
2023-09-25 18:08:21 +01:00
if (Band > BAND7_470MHz)
2023-09-09 08:03:56 +01:00
Band = BAND1_50MHz;
}
else
Band = BAND6_400MHz;
2023-10-08 20:23:37 +01:00
g_tx_vfo->band = Band;
2023-09-09 08:03:56 +01:00
2023-10-08 17:14:13 +01:00
g_eeprom.screen_channel[Vfo] = FREQ_CHANNEL_FIRST + Band;
g_eeprom.freq_channel[Vfo] = FREQ_CHANNEL_FIRST + Band;
2023-09-25 18:08:21 +01:00
2023-10-08 20:23:37 +01:00
g_request_save_vfo = true;
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
2023-10-03 00:14:36 +01:00
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MAIN;
if (beep)
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-09-09 08:03:56 +01:00
break;
2023-09-14 19:38:28 +01:00
2023-09-09 08:03:56 +01:00
case KEY_2:
2023-10-08 17:14:13 +01:00
if (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_CHAN_A)
g_eeprom.cross_vfo_rx_tx = CROSS_BAND_CHAN_B;
2023-09-09 08:03:56 +01:00
else
2023-10-08 17:14:13 +01:00
if (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_CHAN_B)
g_eeprom.cross_vfo_rx_tx = CROSS_BAND_CHAN_A;
2023-09-09 08:03:56 +01:00
else
2023-10-08 17:14:13 +01:00
if (g_eeprom.dual_watch == DUAL_WATCH_CHAN_A)
g_eeprom.dual_watch = DUAL_WATCH_CHAN_B;
2023-09-09 08:03:56 +01:00
else
2023-10-08 17:14:13 +01:00
if (g_eeprom.dual_watch == DUAL_WATCH_CHAN_B)
g_eeprom.dual_watch = DUAL_WATCH_CHAN_A;
2023-09-09 08:03:56 +01:00
else
2023-10-08 17:14:13 +01:00
g_eeprom.tx_vfo = (Vfo + 1) & 1u;
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
g_request_save_settings = 1;
g_flag_reconfigure_vfos = true;
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MAIN;
if (beep)
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-09-09 08:03:56 +01:00
break;
2023-09-14 19:38:28 +01:00
2023-09-09 08:03:56 +01:00
case KEY_3:
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_NOAA
2023-10-08 20:23:37 +01:00
if (g_eeprom.vfo_open && IS_NOT_NOAA_CHANNEL(g_tx_vfo->channel_save))
2023-09-09 08:03:56 +01:00
#else
2023-10-08 17:14:13 +01:00
if (g_eeprom.vfo_open)
2023-09-09 08:03:56 +01:00
#endif
{
uint8_t Channel;
2023-09-14 19:38:28 +01:00
2023-10-08 20:23:37 +01:00
if (IS_USER_CHANNEL(g_tx_vfo->channel_save))
{ // swap to frequency mode
2023-10-08 17:14:13 +01:00
g_eeprom.screen_channel[Vfo] = g_eeprom.freq_channel[g_eeprom.tx_vfo];
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = VOICE_ID_FREQUENCY_MODE;
2023-09-09 08:03:56 +01:00
#endif
2023-10-08 20:23:37 +01:00
g_request_save_vfo = true;
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
2023-09-09 08:03:56 +01:00
break;
}
2023-09-12 11:01:34 +01:00
2023-10-08 17:14:13 +01:00
Channel = RADIO_FindNextChannel(g_eeprom.user_channel[g_eeprom.tx_vfo], 1, false, 0);
2023-09-09 08:03:56 +01:00
if (Channel != 0xFF)
{ // swap to channel mode
2023-10-08 17:14:13 +01:00
g_eeprom.screen_channel[Vfo] = Channel;
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-09-09 08:03:56 +01:00
AUDIO_SetVoiceID(0, VOICE_ID_CHANNEL_MODE);
AUDIO_SetDigitVoice(1, Channel + 1);
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)0xFE;
2023-09-09 08:03:56 +01:00
#endif
2023-10-08 20:23:37 +01:00
g_request_save_vfo = true;
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
2023-09-09 08:03:56 +01:00
break;
}
}
2023-09-12 11:01:34 +01:00
if (beep)
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
break;
2023-09-14 19:38:28 +01:00
2023-09-09 08:03:56 +01:00
case KEY_4:
g_fkey_pressed = false;
2023-10-08 20:23:37 +01:00
g_flag_start_scan = true;
g_scan_single_frequency = false;
g_backup_cross_vfo_rx_tx = g_eeprom.cross_vfo_rx_tx;
2023-10-08 17:14:13 +01:00
g_eeprom.cross_vfo_rx_tx = CROSS_BAND_OFF;
2023-10-08 20:23:37 +01:00
g_update_status = true;
// if (beep)
2023-10-08 20:23:37 +01:00
// g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-09-09 08:03:56 +01:00
break;
2023-09-14 19:38:28 +01:00
2023-09-09 08:03:56 +01:00
case KEY_5:
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_NOAA
2023-10-08 20:23:37 +01:00
if (IS_NOT_NOAA_CHANNEL(g_tx_vfo->channel_save))
2023-09-12 11:01:34 +01:00
{
2023-10-08 17:14:13 +01:00
g_eeprom.screen_channel[Vfo] = g_eeprom.noaa_channel[g_eeprom.tx_vfo];
2023-09-12 11:01:34 +01:00
}
2023-09-09 08:03:56 +01:00
else
{
2023-10-08 17:14:13 +01:00
g_eeprom.screen_channel[Vfo] = g_eeprom.freq_channel[g_eeprom.tx_vfo];
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = VOICE_ID_FREQUENCY_MODE;
2023-09-09 08:03:56 +01:00
#endif
}
2023-10-08 20:23:37 +01:00
g_request_save_vfo = true;
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
2023-09-18 00:48:40 +01:00
#else
#ifdef ENABLE_VOX
toggle_chan_scanlist();
#endif
2023-09-09 08:03:56 +01:00
#endif
2023-09-09 08:03:56 +01:00
break;
2023-09-14 19:38:28 +01:00
2023-09-09 08:03:56 +01:00
case KEY_6:
ACTION_Power();
break;
2023-09-14 19:38:28 +01:00
2023-09-09 08:03:56 +01:00
case KEY_7:
#ifdef ENABLE_VOX
ACTION_Vox();
#else
toggle_chan_scanlist();
#endif
2023-09-09 08:03:56 +01:00
break;
2023-09-14 19:38:28 +01:00
2023-09-09 08:03:56 +01:00
case KEY_8:
2023-10-08 20:23:37 +01:00
g_tx_vfo->frequency_reverse = g_tx_vfo->frequency_reverse == false;
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
break;
2023-09-14 19:38:28 +01:00
2023-09-09 08:03:56 +01:00
case KEY_9:
2023-10-08 17:14:13 +01:00
if (RADIO_CheckValidChannel(g_eeprom.chan_1_call, false, 0))
2023-09-09 08:03:56 +01:00
{
2023-10-08 17:14:13 +01:00
g_eeprom.user_channel[Vfo] = g_eeprom.chan_1_call;
g_eeprom.screen_channel[Vfo] = g_eeprom.chan_1_call;
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-09-09 08:03:56 +01:00
AUDIO_SetVoiceID(0, VOICE_ID_CHANNEL_MODE);
2023-10-08 17:14:13 +01:00
AUDIO_SetDigitVoice(1, g_eeprom.chan_1_call + 1);
g_another_voice_id = (voice_id_t)0xFE;
2023-09-09 08:03:56 +01:00
#endif
2023-10-08 20:23:37 +01:00
g_request_save_vfo = true;
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
2023-09-09 08:03:56 +01:00
break;
}
if (beep)
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
break;
2023-09-14 19:38:28 +01:00
2023-09-09 08:03:56 +01:00
default:
2023-10-08 20:23:37 +01:00
g_update_status = true;
g_fkey_pressed = false;
if (beep)
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-09-09 08:03:56 +01:00
break;
}
}
2023-10-08 20:23:37 +01:00
static void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held)
2023-09-14 19:38:28 +01:00
{
2023-10-08 20:23:37 +01:00
if (key_held)
2023-09-14 19:38:28 +01:00
{ // key held down
2023-10-08 20:23:37 +01:00
if (key_pressed)
{
2023-10-08 20:23:37 +01:00
if (g_screen_to_display == DISPLAY_MAIN)
2023-09-14 19:38:28 +01:00
{
2023-10-08 20:23:37 +01:00
if (g_input_box_index > 0)
{ // delete any inputted chars
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
g_request_display_screen = DISPLAY_MAIN;
}
g_fkey_pressed = false;
2023-10-08 20:23:37 +01:00
g_update_status = true;
processFKeyFunction(Key, false);
2023-09-14 19:38:28 +01:00
}
}
2023-09-14 19:38:28 +01:00
return;
}
2023-10-08 20:23:37 +01:00
if (key_pressed)
{ // key is pressed
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; // beep when key is pressed
return; // don't use the key till it's released
}
if (!g_fkey_pressed)
{ // F-key wasn't pressed
2023-10-08 17:14:13 +01:00
const uint8_t Vfo = g_eeprom.tx_vfo;
2023-09-14 19:38:28 +01:00
2023-10-08 20:23:37 +01:00
g_key_input_count_down = key_input_timeout_500ms;
2023-09-14 19:38:28 +01:00
INPUTBOX_Append(Key);
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MAIN;
2023-09-14 19:38:28 +01:00
2023-10-08 20:23:37 +01:00
if (IS_USER_CHANNEL(g_tx_vfo->channel_save))
{ // user is entering channel number
2023-09-14 19:38:28 +01:00
uint16_t Channel;
2023-10-08 20:23:37 +01:00
if (g_input_box_index != 3)
2023-09-14 19:38:28 +01:00
{
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)Key;
2023-09-14 19:38:28 +01:00
#endif
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MAIN;
2023-09-14 19:38:28 +01:00
return;
}
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
2023-09-14 19:38:28 +01:00
2023-10-08 20:23:37 +01:00
Channel = ((g_input_box[0] * 100) + (g_input_box[1] * 10) + g_input_box[2]) - 1;
2023-09-14 19:38:28 +01:00
if (!RADIO_CheckValidChannel(Channel, false, 0))
{
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
2023-09-14 19:38:28 +01:00
return;
}
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)Key;
2023-09-14 19:38:28 +01:00
#endif
2023-10-08 17:14:13 +01:00
g_eeprom.user_channel[Vfo] = (uint8_t)Channel;
g_eeprom.screen_channel[Vfo] = (uint8_t)Channel;
2023-10-08 20:23:37 +01:00
g_request_save_vfo = true;
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
2023-09-14 19:38:28 +01:00
return;
}
// #ifdef ENABLE_NOAA
2023-10-08 20:23:37 +01:00
// if (IS_NOT_NOAA_CHANNEL(g_tx_vfo->channel_save))
// #endif
2023-10-08 20:23:37 +01:00
if (IS_FREQ_CHANNEL(g_tx_vfo->channel_save))
2023-10-05 22:44:44 +01:00
{ // user is entering a frequency
2023-09-14 19:38:28 +01:00
uint32_t Frequency;
2023-10-08 20:23:37 +01:00
if (g_input_box_index < 6)
2023-09-14 19:38:28 +01:00
{
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)Key;
2023-09-14 19:38:28 +01:00
#endif
2023-09-14 19:38:28 +01:00
return;
}
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
2023-09-14 19:38:28 +01:00
2023-10-08 20:23:37 +01:00
NUMBER_Get(g_input_box, &Frequency);
2023-09-14 19:38:28 +01:00
// clamp the frequency entered to some valid value
2023-10-08 20:23:37 +01:00
if (Frequency < FREQ_BAND_TABLE[0].lower)
{
2023-10-08 20:23:37 +01:00
Frequency = FREQ_BAND_TABLE[0].lower;
}
else
2023-10-02 14:13:27 +01:00
if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower)
2023-09-28 10:17:45 +01:00
{
2023-10-02 14:13:27 +01:00
const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2;
Frequency = (Frequency < center) ? BX4819_band1.upper : BX4819_band2.lower;
}
else
2023-10-08 20:23:37 +01:00
if (Frequency > FREQ_BAND_TABLE[ARRAY_SIZE(FREQ_BAND_TABLE) - 1].upper)
{
2023-10-08 20:23:37 +01:00
Frequency = FREQ_BAND_TABLE[ARRAY_SIZE(FREQ_BAND_TABLE) - 1].upper;
}
2023-09-14 19:38:28 +01:00
{
2023-09-28 10:17:45 +01:00
const FREQUENCY_Band_t band = FREQUENCY_GetBand(Frequency);
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)Key;
2023-09-28 10:17:45 +01:00
#endif
2023-10-08 20:23:37 +01:00
if (g_tx_vfo->band != band)
2023-09-14 19:38:28 +01:00
{
2023-10-08 20:23:37 +01:00
g_tx_vfo->band = band;
2023-10-08 17:14:13 +01:00
g_eeprom.screen_channel[Vfo] = band + FREQ_CHANNEL_FIRST;
g_eeprom.freq_channel[Vfo] = band + FREQ_CHANNEL_FIRST;
2023-09-28 10:17:45 +01:00
SETTINGS_SaveVfoIndices();
RADIO_ConfigureChannel(Vfo, VFO_CONFIGURE_RELOAD);
2023-09-14 19:38:28 +01:00
}
2023-09-28 22:22:06 +01:00
// Frequency += 75; // is this meant to be rounding ?
2023-10-08 20:23:37 +01:00
Frequency += g_tx_vfo->step_freq / 2; // no idea, but this is
2023-10-08 20:23:37 +01:00
Frequency = FREQUENCY_FloorToStep(Frequency, g_tx_vfo->step_freq, FREQ_BAND_TABLE[g_tx_vfo->band].lower);
2023-10-02 14:13:27 +01:00
if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower)
2023-09-28 10:17:45 +01:00
{ // clamp the frequency to the limit
2023-10-02 14:13:27 +01:00
const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2;
2023-10-08 20:23:37 +01:00
Frequency = (Frequency < center) ? BX4819_band1.upper - g_tx_vfo->step_freq : BX4819_band2.lower;
2023-09-28 10:17:45 +01:00
}
2023-10-08 20:23:37 +01:00
g_tx_vfo->freq_config_rx.frequency = Frequency;
2023-10-08 20:23:37 +01:00
g_request_save_channel = 1;
2023-09-28 10:17:45 +01:00
return;
2023-09-14 19:38:28 +01:00
}
2023-09-14 19:38:28 +01:00
}
#ifdef ENABLE_NOAA
else
2023-10-08 20:23:37 +01:00
if (IS_NOAA_CHANNEL(g_tx_vfo->channel_save))
{ // user is entering NOAA channel
2023-09-14 19:38:28 +01:00
uint8_t Channel;
2023-10-08 20:23:37 +01:00
if (g_input_box_index != 2)
2023-09-14 19:38:28 +01:00
{
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)Key;
2023-09-14 19:38:28 +01:00
#endif
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MAIN;
2023-09-14 19:38:28 +01:00
return;
}
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
2023-09-14 19:38:28 +01:00
2023-10-08 20:23:37 +01:00
Channel = (g_input_box[0] * 10) + g_input_box[1];
if (Channel >= 1 && Channel <= ARRAY_SIZE(NoaaFrequencyTable))
2023-09-14 19:38:28 +01:00
{
Channel += NOAA_CHANNEL_FIRST;
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)Key;
2023-09-14 19:38:28 +01:00
#endif
2023-10-08 17:14:13 +01:00
g_eeprom.noaa_channel[Vfo] = Channel;
g_eeprom.screen_channel[Vfo] = Channel;
2023-10-08 20:23:37 +01:00
g_request_save_vfo = true;
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
2023-09-14 19:38:28 +01:00
return;
}
}
#endif
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MAIN;
g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
2023-09-14 19:38:28 +01:00
return;
}
g_fkey_pressed = false;
2023-10-08 20:23:37 +01:00
g_update_status = true;
2023-09-14 19:38:28 +01:00
processFKeyFunction(Key, true);
2023-09-14 19:38:28 +01:00
}
2023-10-08 20:23:37 +01:00
static void MAIN_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)
2023-09-30 11:22:19 +01:00
{ // exit key pressed
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-09-11 00:02:57 +01:00
2023-10-08 20:23:37 +01:00
if (g_dtmf_call_state != DTMF_CALL_STATE_NONE && g_current_function != FUNCTION_TRANSMIT)
2023-09-30 11:22:19 +01:00
{ // clear CALL mode being displayed
2023-10-08 20:23:37 +01:00
g_dtmf_call_state = DTMF_CALL_STATE_NONE;
g_update_display = true;
2023-09-30 11:22:19 +01:00
return;
}
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_FMRADIO
2023-10-08 20:23:37 +01:00
if (!g_fm_radio_mode)
2023-09-14 09:56:30 +01:00
#endif
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
if (g_scan_state_dir == SCAN_OFF)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
if (g_input_box_index == 0)
2023-09-09 08:03:56 +01:00
return;
2023-10-08 20:23:37 +01:00
g_input_box[--g_input_box_index] = 10;
2023-09-11 00:02:57 +01:00
2023-10-08 20:23:37 +01:00
g_key_input_count_down = key_input_timeout_500ms;
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-10-08 20:23:37 +01:00
if (g_input_box_index == 0)
2023-10-08 17:14:13 +01:00
g_another_voice_id = VOICE_ID_CANCEL;
2023-09-09 08:03:56 +01:00
#endif
}
else
{
SCANNER_Stop();
2023-09-11 00:02:57 +01:00
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = VOICE_ID_SCANNING_STOP;
2023-09-09 08:03:56 +01:00
#endif
}
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MAIN;
2023-09-09 08:03:56 +01:00
return;
}
2023-09-11 00:02:57 +01:00
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_FMRADIO
ACTION_FM();
#endif
return;
}
2023-10-08 20:23:37 +01:00
if (key_held && key_pressed)
2023-09-30 11:22:19 +01:00
{ // exit key held down
2023-10-08 20:23:37 +01:00
if (g_input_box_index > 0 || g_dtmf_input_box_index > 0 || g_dtmf_input_mode)
{ // cancel key input mode (channel/frequency entry)
2023-10-08 20:23:37 +01:00
g_dtmf_input_mode = false;
g_dtmf_input_box_index = 0;
memset(g_dtmf_string, 0, sizeof(g_dtmf_string));
g_input_box_index = 0;
g_request_display_screen = DISPLAY_MAIN;
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
}
2023-09-09 08:03:56 +01:00
}
}
2023-10-08 20:23:37 +01:00
static void MAIN_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_pressed && !key_held)
2023-10-05 17:38:25 +01:00
// menu key pressed
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-10-05 17:38:25 +01:00
2023-10-08 20:23:37 +01:00
if (key_held)
2023-09-30 11:22:19 +01:00
{ // menu key held down (long press)
2023-10-08 20:23:37 +01:00
if (key_pressed)
{ // long press MENU key
g_fkey_pressed = false;
2023-10-08 20:23:37 +01:00
if (g_screen_to_display == DISPLAY_MAIN)
{
2023-10-08 20:23:37 +01:00
if (g_input_box_index > 0)
{ // delete any inputted chars
2023-10-08 20:23:37 +01:00
g_input_box_index = 0;
g_request_display_screen = DISPLAY_MAIN;
}
g_fkey_pressed = false;
2023-10-08 20:23:37 +01:00
g_update_status = true;
#ifdef ENABLE_COPY_CHAN_TO_VFO
2023-10-08 20:23:37 +01:00
if (g_eeprom.vfo_open && g_css_scan_mode == CSS_SCAN_MODE_OFF)
{
2023-10-08 20:23:37 +01:00
if (g_scan_state_dir != SCAN_OFF)
{
2023-10-08 20:23:37 +01:00
if (g_current_function != FUNCTION_INCOMING ||
g_rx_reception_mode == RX_MODE_NONE ||
g_scan_pause_delay_in_10ms == 0)
{ // scan is running (not paused)
return;
}
}
2023-10-08 20:23:37 +01:00
const unsigned int vfo = get_RX_VFO();
2023-10-05 00:26:37 +01:00
2023-10-08 17:14:13 +01:00
if (IS_USER_CHANNEL(g_eeprom.screen_channel[vfo]))
{ // copy channel to VFO, then swap to the VFO
2023-10-08 20:23:37 +01:00
const unsigned int channel = FREQ_CHANNEL_FIRST + g_eeprom.vfo_info[vfo].band;
2023-10-05 00:26:37 +01:00
2023-10-08 17:14:13 +01:00
g_eeprom.screen_channel[vfo] = channel;
2023-10-08 20:23:37 +01:00
g_eeprom.vfo_info[vfo].channel_save = channel;
2023-10-08 17:14:13 +01:00
g_eeprom.tx_vfo = vfo;
RADIO_SelectVfos();
2023-10-08 20:23:37 +01:00
RADIO_ApplyOffset(g_rx_vfo);
RADIO_ConfigureSquelchAndOutputPower(g_rx_vfo);
RADIO_SetupRegisters(true);
2023-10-08 20:23:37 +01:00
g_request_save_vfo = true;
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
2023-10-05 00:26:37 +01:00
2023-10-08 20:23:37 +01:00
g_update_status = true;
g_update_display = true;
2023-10-04 22:08:13 +01:00
}
}
2023-10-05 00:07:35 +01:00
else
{
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
2023-10-05 00:07:35 +01:00
}
#endif
}
}
return;
}
2023-10-08 20:23:37 +01:00
if (!key_pressed && !g_dtmf_input_mode)
2023-09-30 11:22:19 +01:00
{ // menu key released
2023-10-08 20:23:37 +01:00
const bool flag = (g_input_box_index == 0);
g_input_box_index = 0;
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
if (flag)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
g_flag_refresh_menu = true;
g_request_display_screen = DISPLAY_MENU;
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-10-08 17:14:13 +01:00
g_another_voice_id = VOICE_ID_MENU;
2023-09-09 08:03:56 +01:00
#endif
}
else
{
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MAIN;
2023-09-09 08:03:56 +01:00
}
}
}
2023-10-08 20:23:37 +01:00
static void MAIN_Key_STAR(bool key_pressed, bool key_held)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
if (g_current_function == FUNCTION_TRANSMIT)
return;
2023-10-08 20:23:37 +01:00
if (g_input_box_index > 0)
{ // entering a frequency or DTMF string
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
return;
}
if (key_held && !g_fkey_pressed)
{ // long press .. toggle scanning
2023-10-08 20:23:37 +01:00
if (!key_pressed)
return; // released
ACTION_Scan(false);
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
return;
}
2023-10-04 18:54:26 +01:00
2023-10-08 20:23:37 +01:00
if (key_pressed)
{ // just pressed
2023-10-08 20:23:37 +01:00
// g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
g_beep_to_play = BEEP_880HZ_40MS_OPTIONAL;
return;
}
2023-10-08 20:23:37 +01:00
// just released
2023-10-08 20:23:37 +01:00
if (!g_fkey_pressed)
{ // pressed without the F-key
2023-09-09 08:03:56 +01:00
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_NOAA
2023-10-08 20:23:37 +01:00
if (g_scan_state_dir == SCAN_OFF && IS_NOT_NOAA_CHANNEL(g_tx_vfo->channel_save))
2023-09-09 08:03:56 +01:00
#else
2023-10-08 20:23:37 +01:00
if (g_scan_state_dir == SCAN_OFF)
2023-09-09 08:03:56 +01:00
#endif
{ // start entering a DTMF string
2023-10-08 20:23:37 +01:00
memmove(g_dtmf_input_box, g_dtmf_string, MIN(sizeof(g_dtmf_input_box), sizeof(g_dtmf_string) - 1));
g_dtmf_input_box_index = 0;
g_dtmf_input_mode = true;
2023-10-08 20:23:37 +01:00
g_key_input_count_down = key_input_timeout_500ms;
2023-10-08 20:23:37 +01:00
g_request_display_screen = DISPLAY_MAIN;
2023-09-09 08:03:56 +01:00
}
}
else
{ // with the F-key
g_fkey_pressed = false;
2023-09-09 08:03:56 +01:00
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_NOAA
2023-10-08 20:23:37 +01:00
if (IS_NOAA_CHANNEL(g_tx_vfo->channel_save))
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-10-08 20:23:37 +01:00
}
2023-09-09 08:03:56 +01:00
#endif
// scan the CTCSS/DCS code
2023-10-08 20:23:37 +01:00
g_flag_start_scan = true;
g_scan_single_frequency = true;
g_backup_cross_vfo_rx_tx = g_eeprom.cross_vfo_rx_tx;
2023-10-08 17:14:13 +01:00
g_eeprom.cross_vfo_rx_tx = CROSS_BAND_OFF;
2023-09-09 08:03:56 +01:00
}
// g_ptt_was_released = true; // why is this being set ?
2023-10-08 20:23:37 +01:00
g_update_status = true;
2023-09-09 08:03:56 +01:00
}
static void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t Direction)
2023-09-09 08:03:56 +01:00
{
2023-10-08 17:14:13 +01:00
uint8_t Channel = g_eeprom.screen_channel[g_eeprom.tx_vfo];
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
if (key_held || !key_pressed)
{ // long press
2023-10-08 20:23:37 +01:00
if (g_input_box_index > 0)
2023-09-09 08:03:56 +01:00
return;
2023-10-08 20:23:37 +01:00
if (!key_pressed)
2023-09-09 08:03:56 +01:00
{
2023-10-08 20:23:37 +01:00
if (!key_held)
2023-09-09 08:03:56 +01:00
return;
if (IS_FREQ_CHANNEL(Channel))
return;
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-10-08 20:23:37 +01:00
AUDIO_SetDigitVoice(0, g_tx_vfo->channel_save + 1);
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)0xFE;
2023-09-09 08:03:56 +01:00
#endif
2023-09-14 19:38:28 +01:00
2023-09-09 08:03:56 +01:00
return;
}
}
else
{
2023-10-08 20:23:37 +01:00
if (g_input_box_index > 0)
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
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-10-08 20:23:37 +01:00
if (g_scan_state_dir == SCAN_OFF)
2023-09-09 08:03:56 +01:00
{
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_NOAA
2023-09-09 08:03:56 +01:00
if (IS_NOT_NOAA_CHANNEL(Channel))
#endif
{
uint8_t Next;
if (IS_FREQ_CHANNEL(Channel))
{ // step/down in frequency
2023-10-08 20:23:37 +01:00
const uint32_t frequency = APP_SetFrequencyByStep(g_tx_vfo, Direction);
if (RX_freq_check(frequency) < 0)
{ // frequency not allowed
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
return;
}
2023-10-08 20:23:37 +01:00
g_tx_vfo->freq_config_rx.frequency = frequency;
2023-10-08 20:23:37 +01:00
g_request_save_channel = 1;
2023-09-09 08:03:56 +01:00
return;
}
Next = RADIO_FindNextChannel(Channel + Direction, Direction, false, 0);
if (Next == 0xFF)
return;
if (Channel == Next)
return;
2023-10-08 20:23:37 +01:00
g_eeprom.user_channel[g_eeprom.tx_vfo] = Next;
2023-10-08 17:14:13 +01:00
g_eeprom.screen_channel[g_eeprom.tx_vfo] = Next;
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
if (!key_held)
2023-09-09 08:03:56 +01:00
{
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-09-09 08:03:56 +01:00
AUDIO_SetDigitVoice(0, Next + 1);
2023-10-08 17:14:13 +01:00
g_another_voice_id = (voice_id_t)0xFE;
2023-09-09 08:03:56 +01:00
#endif
}
}
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_NOAA
2023-09-09 08:03:56 +01:00
else
{
2023-10-08 17:14:13 +01:00
Channel = NOAA_CHANNEL_FIRST + NUMBER_AddWithWraparound(g_eeprom.screen_channel[g_eeprom.tx_vfo] - NOAA_CHANNEL_FIRST, Direction, 0, 9);
g_eeprom.noaa_channel[g_eeprom.tx_vfo] = Channel;
g_eeprom.screen_channel[g_eeprom.tx_vfo] = Channel;
2023-09-09 08:03:56 +01:00
}
#endif
2023-09-14 19:38:28 +01:00
2023-10-08 20:23:37 +01:00
g_request_save_vfo = true;
g_vfo_configure_mode = VFO_CONFIGURE_RELOAD;
2023-09-09 08:03:56 +01:00
return;
}
2023-10-05 23:58:55 +01:00
// jump to the next channel
2023-09-09 08:03:56 +01:00
CHANNEL_Next(false, Direction);
2023-10-08 20:23:37 +01:00
g_scan_pause_delay_in_10ms = 1;
g_schedule_scan_listen = false;
2023-09-09 08:03:56 +01:00
// g_ptt_was_released = true; // why is this being set ?
2023-09-09 08:03:56 +01:00
}
2023-10-08 20:23:37 +01:00
void MAIN_ProcessKeys(key_code_t Key, bool key_pressed, bool key_held)
2023-09-09 08:03:56 +01:00
{
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_FMRADIO
2023-10-08 20:23:37 +01:00
if (g_fm_radio_mode && Key != KEY_PTT && Key != KEY_EXIT)
2023-09-14 09:56:30 +01:00
{
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-14 09:56:30 +01:00
return;
}
#endif
2023-09-09 08:03:56 +01:00
2023-10-08 20:23:37 +01:00
if (g_dtmf_input_mode && key_pressed && !key_held)
2023-09-09 08:03:56 +01:00
{
const char Character = DTMF_GetCharacter(Key);
if (Character != 0xFF)
{ // add key to DTMF string
DTMF_Append(Character);
2023-10-08 20:23:37 +01:00
g_key_input_count_down = key_input_timeout_500ms;
g_request_display_screen = DISPLAY_MAIN;
// g_ptt_was_released = true; // why is this being set ?
2023-10-08 20:23:37 +01:00
g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL;
return;
2023-09-09 08:03:56 +01:00
}
}
// TODO: ???
// if (Key > KEY_PTT)
// {
// Key = KEY_SIDE2; // what's this doing ???
// }
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
MAIN_Key_DIGITS(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
MAIN_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
MAIN_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
MAIN_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
MAIN_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
MAIN_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
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;
}
}