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

428 lines
8.6 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-30 11:22:19 +01:00
#include <string.h>
2023-09-09 08:03:56 +01:00
#include "app/action.h"
#include "app/app.h"
#include "app/dtmf.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/scanner.h"
#include "audio.h"
#include "bsp/dp32g030/gpio.h"
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_FMRADIO
#include "driver/bk1080.h"
#endif
2023-09-09 08:03:56 +01:00
#include "driver/bk4819.h"
#include "driver/gpio.h"
#include "functions.h"
#include "misc.h"
#include "settings.h"
#include "ui/inputbox.h"
#include "ui/ui.h"
static void ACTION_FlashLight(void)
{
switch (gFlashLightState)
{
case 0:
gFlashLightState++;
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
break;
case 1:
gFlashLightState++;
break;
default:
gFlashLightState = 0;
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
}
}
void ACTION_Power(void)
{
if (++gTxVfo->OUTPUT_POWER > OUTPUT_POWER_HIGH)
gTxVfo->OUTPUT_POWER = OUTPUT_POWER_LOW;
gRequestSaveChannel = 1;
//gRequestSaveChannel = 2; // auto save the channel
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
gAnotherVoiceID = VOICE_ID_POWER;
#endif
gRequestDisplayScreen = gScreenToDisplay;
}
void ACTION_Monitor(void)
2023-09-09 08:03:56 +01:00
{
if (gCurrentFunction != FUNCTION_MONITOR)
{ // enable the monitor
2023-09-09 08:03:56 +01:00
RADIO_SelectVfos();
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_NOAA
2023-09-09 08:03:56 +01:00
if (gRxVfo->CHANNEL_SAVE >= NOAA_CHANNEL_FIRST && gIsNoaaMode)
gNoaaChannel = gRxVfo->CHANNEL_SAVE - NOAA_CHANNEL_FIRST;
#endif
RADIO_SetupRegisters(true);
2023-09-22 13:52:17 +01:00
APP_StartListening(FUNCTION_MONITOR, false);
2023-09-09 08:03:56 +01:00
return;
}
gMonitor = false;
2023-10-05 23:58:55 +01:00
if (gScanStateDir != SCAN_OFF)
2023-09-09 08:03:56 +01:00
{
2023-10-05 23:58:55 +01:00
gScanPauseDelayIn_10ms = scan_pause_delay_in_1_10ms;
gScheduleScanListen = false;
gScanPauseMode = true;
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 (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF && gIsNoaaMode)
{
2023-09-25 13:27:52 +01:00
gNOAA_Countdown_10ms = NOAA_countdown_10ms;
gScheduleNOAA = false;
2023-09-09 08:03:56 +01:00
}
#endif
2023-09-09 08:03:56 +01:00
RADIO_SetupRegisters(true);
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_FMRADIO
if (gFmRadioMode)
{
FM_Start();
gRequestDisplayScreen = DISPLAY_FM;
}
else
#endif
2023-10-03 00:14:36 +01:00
gRequestDisplayScreen = gScreenToDisplay;
2023-09-09 08:03:56 +01:00
}
void ACTION_Scan(bool bRestart)
{
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_FMRADIO
if (gFmRadioMode)
2023-09-09 08:03:56 +01:00
{
if (gCurrentFunction != FUNCTION_RECEIVE &&
gCurrentFunction != FUNCTION_MONITOR &&
gCurrentFunction != FUNCTION_TRANSMIT)
2023-09-09 08:03:56 +01:00
{
2023-09-14 09:56:30 +01:00
GUI_SelectNextDisplay(DISPLAY_FM);
gMonitor = false;
2023-09-14 09:56:30 +01:00
if (gFM_ScanState != FM_SCAN_OFF)
2023-09-09 08:03:56 +01:00
{
2023-09-14 09:56:30 +01:00
FM_PlayAndUpdate();
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
#endif
2023-09-09 08:03:56 +01:00
}
else
{
2023-09-14 09:56:30 +01:00
uint16_t Frequency;
2023-09-14 09:56:30 +01:00
if (bRestart)
{
gFM_AutoScan = true;
gFM_ChannelPosition = 0;
FM_EraseChannels();
Frequency = gEeprom.FM_LowerLimit;
}
else
{
gFM_AutoScan = false;
gFM_ChannelPosition = 0;
Frequency = gEeprom.FM_FrequencyPlaying;
}
2023-09-14 09:56:30 +01:00
BK1080_GetFrequencyDeviation(Frequency);
FM_Tune(Frequency, 1, bRestart);
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_BEGIN;
#endif
2023-09-09 08:03:56 +01:00
}
}
2023-09-14 09:56:30 +01:00
return;
2023-09-09 08:03:56 +01:00
}
2023-09-14 09:56:30 +01:00
#endif
2023-09-09 08:03:56 +01:00
if (gScreenToDisplay != DISPLAY_SCANNER)
2023-09-20 11:23:45 +01:00
{ // not scanning
gMonitor = false;
2023-09-30 11:22:19 +01:00
DTMF_clear_RX();
gDTMF_RX_live_timeout = 0;
memset(gDTMF_RX_live, 0, sizeof(gDTMF_RX_live));
2023-09-09 08:03:56 +01:00
RADIO_SelectVfos();
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_NOAA
2023-09-09 08:03:56 +01:00
if (IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE))
#endif
{
GUI_SelectNextDisplay(DISPLAY_MAIN);
2023-09-11 00:02:57 +01:00
2023-10-05 23:58:55 +01:00
if (gScanStateDir != SCAN_OFF)
{ // already scanning
if (gNextMrChannel <= MR_CHANNEL_LAST)
{ // channel mode
// keep scanning but toggle between scan lists
2023-10-04 22:08:13 +01:00
gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 3;
2023-10-05 23:58:55 +01:00
// jump to the next channel
CHANNEL_Next(true, gScanStateDir);
gScanPauseDelayIn_10ms = 1;
gScheduleScanListen = false;
2023-10-04 19:01:00 +01:00
gUpdateStatus = true;
2023-10-05 23:58:55 +01:00
}
else
{ // stop scanning
2023-10-04 19:01:00 +01:00
SCANNER_Stop();
2023-09-11 00:02:57 +01:00
2023-10-04 19:01:00 +01:00
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
#endif
2023-10-05 23:58:55 +01:00
}
2023-09-09 08:03:56 +01:00
}
else
2023-10-05 23:58:55 +01:00
{ // start scanning
CHANNEL_Next(true, SCAN_FWD);
2023-09-11 00:02:57 +01:00
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-09-09 08:03:56 +01:00
AUDIO_SetVoiceID(0, VOICE_ID_SCANNING_BEGIN);
AUDIO_PlaySingleVoice(true);
#endif
// clear the other vfo's rssi level (to hide the antenna symbol)
gVFO_RSSI_bar_level[(gEeprom.RX_VFO + 1) & 1u] = 0;
// let the user see DW is not active
gDualWatchActive = false;
gUpdateStatus = true;
2023-09-09 08:03:56 +01:00
}
}
}
2023-09-20 11:23:45 +01:00
else
2023-10-05 23:58:55 +01:00
// if (!bRestart)
if (!bRestart && gNextMrChannel <= MR_CHANNEL_LAST)
{ // channel mode, keep scanning but toggle between scan lists
2023-10-04 22:08:13 +01:00
gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 3;
2023-10-05 23:58:55 +01:00
// jump to the next channel
CHANNEL_Next(true, gScanStateDir);
gScanPauseDelayIn_10ms = 1;
gScheduleScanListen = false;
2023-10-04 18:54:26 +01:00
gUpdateStatus = true;
}
else
{ // stop scanning
gMonitor = false;
2023-10-04 18:54:26 +01:00
2023-09-20 11:23:45 +01:00
SCANNER_Stop();
2023-10-04 18:54:26 +01:00
2023-09-20 11:23:45 +01:00
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
#endif
2023-10-04 18:54:26 +01:00
2023-09-20 11:23:45 +01:00
gRequestDisplayScreen = DISPLAY_MAIN;
}
2023-09-09 08:03:56 +01:00
}
#ifdef ENABLE_VOX
void ACTION_Vox(void)
{
gEeprom.VOX_SWITCH = !gEeprom.VOX_SWITCH;
gRequestSaveSettings = true;
gFlagReconfigureVfos = true;
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_VOX;
#endif
gUpdateStatus = true;
}
#endif
2023-09-09 08:03:56 +01:00
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
static void ACTION_AlarmOr1750(const bool b1750)
2023-09-09 09:01:52 +01:00
{
gInputBoxIndex = 0;
#if defined(ENABLE_ALARM) && defined(ENABLE_TX1750)
gAlarmState = b1750 ? ALARM_STATE_TX1750 : ALARM_STATE_TXALARM;
gAlarmRunningCounter = 0;
#elif defined(ENABLE_ALARM)
gAlarmState = ALARM_STATE_TXALARM;
gAlarmRunningCounter = 0;
#else
gAlarmState = ALARM_STATE_TX1750;
#endif
gFlagPrepareTX = true;
2023-10-03 00:14:36 +01:00
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
2023-10-03 00:14:36 +01:00
gRequestDisplayScreen = DISPLAY_MAIN;
2023-09-09 09:01:52 +01:00
}
#endif
2023-09-09 08:03:56 +01:00
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_FMRADIO
void ACTION_FM(void)
2023-09-09 08:03:56 +01:00
{
2023-09-14 09:56:30 +01:00
if (gCurrentFunction != FUNCTION_TRANSMIT && gCurrentFunction != FUNCTION_MONITOR)
2023-09-09 08:03:56 +01:00
{
2023-09-14 09:56:30 +01:00
if (gFmRadioMode)
{
FM_TurnOff();
2023-09-14 09:56:30 +01:00
gInputBoxIndex = 0;
#ifdef ENABLE_VOX
gVoxResumeCountdown = 80;
#endif
2023-09-14 09:56:30 +01:00
gFlagReconfigureVfos = true;
2023-10-03 00:14:36 +01:00
2023-09-14 09:56:30 +01:00
gRequestDisplayScreen = DISPLAY_MAIN;
return;
}
gMonitor = false;
2023-09-14 09:56:30 +01:00
RADIO_SelectVfos();
RADIO_SetupRegisters(true);
2023-09-14 09:56:30 +01:00
FM_Start();
2023-10-03 00:14:36 +01:00
gInputBoxIndex = 0;
2023-09-14 09:56:30 +01:00
gRequestDisplayScreen = DISPLAY_FM;
2023-09-09 08:03:56 +01:00
}
}
2023-09-14 09:56:30 +01:00
#endif
2023-09-09 08:03:56 +01:00
void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{
2023-09-12 11:01:34 +01:00
uint8_t Short = ACTION_OPT_NONE;
uint8_t Long = ACTION_OPT_NONE;
2023-09-09 08:03:56 +01:00
if (gScreenToDisplay == DISPLAY_MAIN && gDTMF_InputMode)
{
if (Key == KEY_SIDE1 && !bKeyHeld && bKeyPressed)
{
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
if (gDTMF_InputBox_Index > 0)
2023-09-09 08:03:56 +01:00
{
gDTMF_InputBox[--gDTMF_InputBox_Index] = '-';
if (gDTMF_InputBox_Index > 0)
2023-09-09 08:03:56 +01:00
{
2023-09-10 17:57:12 +01:00
gPttWasReleased = true;
2023-09-09 08:03:56 +01:00
gRequestDisplayScreen = DISPLAY_MAIN;
return;
}
}
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_VOICE
2023-09-09 08:03:56 +01:00
gAnotherVoiceID = VOICE_ID_CANCEL;
#endif
2023-09-09 08:03:56 +01:00
gRequestDisplayScreen = DISPLAY_MAIN;
gDTMF_InputMode = false;
}
gPttWasReleased = true;
return;
}
if (Key == KEY_SIDE1)
{
Short = gEeprom.KEY_1_SHORT_PRESS_ACTION;
Long = gEeprom.KEY_1_LONG_PRESS_ACTION;
}
else
2023-09-12 11:01:34 +01:00
if (Key == KEY_SIDE2)
2023-09-09 08:03:56 +01:00
{
Short = gEeprom.KEY_2_SHORT_PRESS_ACTION;
Long = gEeprom.KEY_2_LONG_PRESS_ACTION;
}
if (!bKeyHeld && bKeyPressed)
{
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
return;
}
if (bKeyHeld || bKeyPressed)
{
if (!bKeyHeld)
return;
Short = Long;
2023-09-12 11:01:34 +01:00
2023-09-09 08:03:56 +01:00
if (!bKeyPressed)
return;
}
switch (Short)
{
2023-09-12 11:01:34 +01:00
default:
case ACTION_OPT_NONE:
2023-09-12 11:01:34 +01:00
break;
case ACTION_OPT_FLASHLIGHT:
2023-09-09 08:03:56 +01:00
ACTION_FlashLight();
break;
2023-09-12 11:01:34 +01:00
case ACTION_OPT_POWER:
2023-09-09 08:03:56 +01:00
ACTION_Power();
break;
2023-09-12 11:01:34 +01:00
case ACTION_OPT_MONITOR:
2023-09-09 08:03:56 +01:00
ACTION_Monitor();
break;
2023-09-12 11:01:34 +01:00
case ACTION_OPT_SCAN:
2023-09-09 08:03:56 +01:00
ACTION_Scan(true);
break;
2023-09-12 11:01:34 +01:00
case ACTION_OPT_VOX:
#ifdef ENABLE_VOX
ACTION_Vox();
#endif
2023-09-09 08:03:56 +01:00
break;
2023-09-12 11:01:34 +01:00
case ACTION_OPT_ALARM:
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_ALARM
2023-09-09 09:01:52 +01:00
ACTION_AlarmOr1750(false);
#endif
2023-09-09 08:03:56 +01:00
break;
2023-09-14 09:56:30 +01:00
#ifdef ENABLE_FMRADIO
case ACTION_OPT_FM:
ACTION_FM();
break;
#endif
2023-09-12 11:01:34 +01:00
case ACTION_OPT_1750:
#ifdef ENABLE_TX1750
2023-09-09 09:01:52 +01:00
ACTION_AlarmOr1750(true);
#endif
2023-09-09 08:03:56 +01:00
break;
}
}