Merge branch '1o11main'

This commit is contained in:
Krzysiek Egzmont
2023-10-02 03:01:28 +02:00
39 changed files with 699 additions and 529 deletions

View File

@@ -4,13 +4,15 @@
# 1 = enable # 1 = enable
# #
ENABLE_SWD := 0 ENABLE_SWD := 0
ENABLE_OVERLAY := 1 ENABLE_OVERLAY := 0
ENABLE_LTO := 1
ENABLE_UART := 1 ENABLE_UART := 1
ENABLE_AIRCOPY := 0 ENABLE_AIRCOPY := 0
ENABLE_FMRADIO := 0 ENABLE_FMRADIO := 0
ENABLE_NOAA := 0 ENABLE_NOAA := 0
ENABLE_VOICE := 0 ENABLE_VOICE := 0
ENABLE_ALARM := 0 ENABLE_ALARM := 0
ENABLE_TX1750 := 0
ENABLE_BIG_FREQ := 1 ENABLE_BIG_FREQ := 1
ENABLE_SMALL_BOLD := 1 ENABLE_SMALL_BOLD := 1
ENABLE_KEEP_MEM_NAME := 1 ENABLE_KEEP_MEM_NAME := 1
@@ -19,22 +21,28 @@ ENABLE_TX_WHEN_AM := 0
ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1 ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1
ENABLE_MAIN_KEY_HOLD := 1 ENABLE_MAIN_KEY_HOLD := 1
ENABLE_BOOT_BEEPS := 0 ENABLE_BOOT_BEEPS := 0
ENABLE_COMPANDER := 1 ENABLE_COMPANDER := 0
ENABLE_SHOW_CHARGE_LEVEL := 1 ENABLE_SHOW_CHARGE_LEVEL := 1
ENABLE_REVERSE_BAT_SYMBOL := 1 ENABLE_REVERSE_BAT_SYMBOL := 1
ENABLE_NO_SCAN_TIMEOUT := 1 ENABLE_CODE_SCAN_TIMEOUT := 0
ENABLE_AM_FIX := 1 ENABLE_AM_FIX := 1
ENABLE_AM_FIX_SHOW_DATA := 1 ENABLE_AM_FIX_SHOW_DATA := 1
ENABLE_SQUELCH_LOWER := 1 ENABLE_SQUELCH_LOWER := 1
ENABLE_RSSI_BAR := 1 ENABLE_RSSI_BAR := 1
ENABLE_AUDIO_BAR := 1 ENABLE_AUDIO_BAR := 0
ENABLE_SPECTRUM := 1 ENABLE_SPECTRUM := 1
#ENABLE_COPY_CHAN_TO_VFO := 1 #ENABLE_COPY_CHAN_TO_VFO := 1
#ENABLE_SINGLE_VFO_CHAN := 1 #ENABLE_SINGLE_VFO_CHAN := 1
#ENABLE_BAND_SCOPE := 1 #ENABLE_BAND_SCOPE := 1
#############################################################
TARGET = firmware TARGET = firmware
ifeq ($(ENABLE_LTO),1)
ENABLE_OVERLAY := 0
endif
BSP_DEFINITIONS := $(wildcard hardware/*/*.def) BSP_DEFINITIONS := $(wildcard hardware/*/*.def)
BSP_HEADERS := $(patsubst hardware/%,bsp/%,$(BSP_DEFINITIONS)) BSP_HEADERS := $(patsubst hardware/%,bsp/%,$(BSP_DEFINITIONS))
BSP_HEADERS := $(patsubst %.def,%.h,$(BSP_HEADERS)) BSP_HEADERS := $(patsubst %.def,%.h,$(BSP_HEADERS))
@@ -158,6 +166,11 @@ CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delet
#CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=gnu99 -MMD #CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=gnu99 -MMD
#CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=gnu11 -MMD #CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=gnu11 -MMD
ifeq ($(ENABLE_LTO),1)
# CFLAGS += -flto
CFLAGS += -flto=2
endif
CFLAGS += -DPRINTF_INCLUDE_CONFIG_H CFLAGS += -DPRINTF_INCLUDE_CONFIG_H
CFLAGS += -DGIT_HASH=\"$(GIT_HASH)\" CFLAGS += -DGIT_HASH=\"$(GIT_HASH)\"
@@ -167,15 +180,15 @@ endif
ifeq ($(ENABLE_SWD),1) ifeq ($(ENABLE_SWD),1)
CFLAGS += -DENABLE_SWD CFLAGS += -DENABLE_SWD
endif endif
ifeq ($(ENABLE_OVERLAY),1)
CFLAGS += -DENABLE_OVERLAY
endif
ifeq ($(ENABLE_AIRCOPY),1) ifeq ($(ENABLE_AIRCOPY),1)
CFLAGS += -DENABLE_AIRCOPY CFLAGS += -DENABLE_AIRCOPY
endif endif
ifeq ($(ENABLE_FMRADIO),1) ifeq ($(ENABLE_FMRADIO),1)
CFLAGS += -DENABLE_FMRADIO CFLAGS += -DENABLE_FMRADIO
endif endif
ifeq ($(ENABLE_OVERLAY),1)
CFLAGS += -DENABLE_OVERLAY
endif
ifeq ($(ENABLE_UART),1) ifeq ($(ENABLE_UART),1)
CFLAGS += -DENABLE_UART CFLAGS += -DENABLE_UART
endif endif
@@ -194,6 +207,9 @@ endif
ifeq ($(ENABLE_ALARM),1) ifeq ($(ENABLE_ALARM),1)
CFLAGS += -DENABLE_ALARM CFLAGS += -DENABLE_ALARM
endif endif
ifeq ($(ENABLE_TX1750),1)
CFLAGS += -DENABLE_TX1750
endif
ifeq ($(ENABLE_KEEP_MEM_NAME),1) ifeq ($(ENABLE_KEEP_MEM_NAME),1)
CFLAGS += -DKEEP_MEM_NAME CFLAGS += -DKEEP_MEM_NAME
endif endif
@@ -221,8 +237,8 @@ endif
ifeq ($(ENABLE_REVERSE_BAT_SYMBOL),1) ifeq ($(ENABLE_REVERSE_BAT_SYMBOL),1)
CFLAGS += -DENABLE_REVERSE_BAT_SYMBOL CFLAGS += -DENABLE_REVERSE_BAT_SYMBOL
endif endif
ifeq ($(ENABLE_NO_SCAN_TIMEOUT),1) ifeq ($(ENABLE_CODE_SCAN_TIMEOUT),1)
CFLAGS += -DENABLE_NO_SCAN_TIMEOUT CFLAGS += -DENABLE_CODE_SCAN_TIMEOUT
endif endif
ifeq ($(ENABLE_AM_FIX),1) ifeq ($(ENABLE_AM_FIX),1)
CFLAGS += -DENABLE_AM_FIX CFLAGS += -DENABLE_AM_FIX

View File

@@ -52,13 +52,15 @@ You'll find the options at the top of "Makefile" ('0' = disable, '1' = enable) .
``` ```
ENABLE_SWD := 0 only needed if using CPU's SWD port (debugging/programming) ENABLE_SWD := 0 only needed if using CPU's SWD port (debugging/programming)
ENABLE_OVERLAY := 1 cpu FLASH stuff ENABLE_OVERLAY := 0 cpu FLASH stuff
ENABLE_LTO := 0 **experimental, reduces size of compiled firmware but might break EEPROM reads - DISABLE overlay if you enable this
ENABLE_UART := 1 without this you can't configure radio via PC ENABLE_UART := 1 without this you can't configure radio via PC
ENABLE_AIRCOPY := 0 easier to just enter frequency ENABLE_AIRCOPY := 0 easier to just enter frequency
ENABLE_FMRADIO := 1 WBFM VHF band 2 RX ENABLE_FMRADIO := 1 WBFM VHF band 2 RX
ENABLE_NOAA := 0 everything NOAA ENABLE_NOAA := 0 everything NOAA
ENABLE_VOICE := 0 want to hear voices ? ENABLE_VOICE := 0 want to hear voices ?
ENABLE_ALARM := 0 TX alarms ENABLE_ALARM := 0 TX alarms
ENABLE_1750HZ := 0 side key 1750Hz TX tone
ENABLE_BIG_FREQ := 0 big font frequencies ENABLE_BIG_FREQ := 0 big font frequencies
ENABLE_SMALL_BOLD := 1 bold channel name/no. (when name + freq channel display mode) ENABLE_SMALL_BOLD := 1 bold channel name/no. (when name + freq channel display mode)
ENABLE_KEEP_MEM_NAME := 1 maintain channel name when (re)saving memory channel ENABLE_KEEP_MEM_NAME := 1 maintain channel name when (re)saving memory channel
@@ -70,7 +72,7 @@ ENABLE_BOOT_BEEPS := 0 give user audio feedback on volume knob
ENABLE_COMPANDER := 1 compander option (per channel) ENABLE_COMPANDER := 1 compander option (per channel)
ENABLE_SHOW_CHARGE_LEVEL := 0 show the charge level when the radio is on charge ENABLE_SHOW_CHARGE_LEVEL := 0 show the charge level when the radio is on charge
ENABLE_REVERSE_BAT_SYMBOL := 1 mirror the battery symbol on the status bar (+ pole on the right) ENABLE_REVERSE_BAT_SYMBOL := 1 mirror the battery symbol on the status bar (+ pole on the right)
ENABLE_NO_SCAN_TIMEOUT := 1 remove the 32 sec timeout from the CTCSS/DCS scan (press exit butt to end scan) ENABLE_CODE_SCAN_TIMEOUT := 0 enable/disable 32-sec CTCSS/DCS scan timeout (press exit butt to end scan if disabled)
ENABLE_AM_FIX := 1 dynamically adjust the front end gains when in AM mode to helo prevent AM demodulator saturation - ignore the on-screen RSSI (for now) ENABLE_AM_FIX := 1 dynamically adjust the front end gains when in AM mode to helo prevent AM demodulator saturation - ignore the on-screen RSSI (for now)
ENABLE_AM_FIX_SHOW_DATA := 1 show debug data for the AM fix ENABLE_AM_FIX_SHOW_DATA := 1 show debug data for the AM fix
ENABLE_SQUELCH_LOWER := 1 squelch settings more sensitive - plan to let user adjust it in the menu ENABLE_SQUELCH_LOWER := 1 squelch settings more sensitive - plan to let user adjust it in the menu

View File

@@ -438,7 +438,7 @@ const uint8_t orig_pga = 6; // -3dB
} }
} }
if (diff_dB >= -4) // 4dB hysterisis (help reduce gain hunting) if (diff_dB >= -6) // 6dB hysterisis (help reduce gain hunting)
hold_counter[vfo] = 30; // 300ms hold hold_counter[vfo] = 30; // 300ms hold
if (hold_counter[vfo] == 0) if (hold_counter[vfo] == 0)

View File

@@ -235,17 +235,27 @@ void ACTION_Vox(void)
gUpdateStatus = true; gUpdateStatus = true;
} }
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
static void ACTION_AlarmOr1750(bool b1750) static void ACTION_AlarmOr1750(bool b1750)
{ {
gInputBoxIndex = 0; gInputBoxIndex = 0;
gAlarmState = b1750 ? ALARM_STATE_TX1750 : ALARM_STATE_TXALARM;
gAlarmRunningCounter = 0; #if defined(ENABLE_ALARM) && defined(ENABLE_TX1750)
gFlagPrepareTX = true; 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;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
} }
#endif #endif
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
void ACTION_FM(void) void ACTION_FM(void)
{ {
@@ -368,7 +378,7 @@ void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
break; break;
#endif #endif
case ACTION_OPT_1750: case ACTION_OPT_1750:
#ifdef ENABLE_ALARM #ifdef ENABLE_TX1750
ACTION_AlarmOr1750(true); ACTION_AlarmOr1750(true);
#endif #endif
break; break;

View File

@@ -1832,7 +1832,7 @@ void APP_TimeSlice500ms(void)
} }
else else
#endif #endif
#ifdef ENABLE_NO_SCAN_TIMEOUT #ifndef ENABLE_CODE_SCAN_TIMEOUT
if (gScreenToDisplay != DISPLAY_SCANNER) if (gScreenToDisplay != DISPLAY_SCANNER)
#endif #endif
GUI_SelectNextDisplay(DISPLAY_MAIN); GUI_SelectNextDisplay(DISPLAY_MAIN);
@@ -1918,7 +1918,7 @@ void APP_TimeSlice500ms(void)
{ {
gScanProgressIndicator++; gScanProgressIndicator++;
#ifndef ENABLE_NO_SCAN_TIMEOUT #ifdef ENABLE_CODE_SCAN_TIMEOUT
if (gScanProgressIndicator > 32) if (gScanProgressIndicator > 32)
{ {
if (gScanCssState == SCAN_CSS_STATE_SCANNING && !gScanSingleFrequency) if (gScanCssState == SCAN_CSS_STATE_SCANNING && !gScanSingleFrequency)
@@ -1968,7 +1968,7 @@ void APP_TimeSlice500ms(void)
} }
} }
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
static void ALARM_Off(void) static void ALARM_Off(void)
{ {
gAlarmState = ALARM_STATE_OFF; gAlarmState = ALARM_STATE_OFF;
@@ -2181,15 +2181,12 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gUpdateStatus = true; gUpdateStatus = true;
} }
if (gF_LOCK && (Key == KEY_PTT || Key == KEY_SIDE2 || Key == KEY_SIDE1))
return;
if (!bFlag) if (!bFlag)
{ {
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT)
{ // transmitting { // transmitting
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
if (gAlarmState == ALARM_STATE_OFF) if (gAlarmState == ALARM_STATE_OFF)
#endif #endif
{ {
@@ -2245,7 +2242,7 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
} }
} }
} }
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
else else
if (!bKeyHeld && bKeyPressed) if (!bKeyHeld && bKeyPressed)
{ {
@@ -2437,8 +2434,8 @@ Skip:
if (gFlagRefreshSetting) if (gFlagRefreshSetting)
{ {
MENU_ShowCurrentSetting();
gFlagRefreshSetting = false; gFlagRefreshSetting = false;
MENU_ShowCurrentSetting();
} }
if (gFlagStartScan) if (gFlagStartScan)

View File

@@ -362,9 +362,6 @@ void DTMF_Reply(void)
switch (gDTMF_ReplyState) switch (gDTMF_ReplyState)
{ {
case DTMF_REPLY_NONE:
return;
case DTMF_REPLY_ANI: case DTMF_REPLY_ANI:
if (gDTMF_CallMode == DTMF_CALL_MODE_DTMF) if (gDTMF_CallMode == DTMF_CALL_MODE_DTMF)
{ {
@@ -387,7 +384,10 @@ void DTMF_Reply(void)
break; break;
default: default:
if (gDTMF_CallState != DTMF_CALL_STATE_NONE || (gCurrentVfo->DTMF_PTT_ID_TX_MODE != PTT_ID_BOT && gCurrentVfo->DTMF_PTT_ID_TX_MODE != PTT_ID_BOTH)) case DTMF_REPLY_NONE:
if (gDTMF_CallState != DTMF_CALL_STATE_NONE ||
gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_OFF ||
gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOT)
{ {
gDTMF_ReplyState = DTMF_REPLY_NONE; gDTMF_ReplyState = DTMF_REPLY_NONE;
return; return;

View File

@@ -602,8 +602,11 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
if (bFlag) if (bFlag)
{ {
gFlagRefreshSetting = true; gFlagRefreshSetting = true;
gFlagBackupSetting = true;
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_MENU; gAnotherVoiceID = VOICE_ID_MENU;
#endif #endif
@@ -735,7 +738,7 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
{ // step/down in frequency { // step/down in frequency
const uint32_t frequency = APP_SetFrequencyByStep(gTxVfo, Direction); const uint32_t frequency = APP_SetFrequencyByStep(gTxVfo, Direction);
if (RX_FREQUENCY_Check(frequency) < 0) if (RX_freq_check(frequency) < 0)
{ // frequency not allowed { // frequency not allowed
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
return; return;

View File

@@ -47,6 +47,27 @@
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif #endif
void writeXtalFreqCal(const int32_t value)
{
struct
{
int16_t BK4819_XtalFreqLow;
uint16_t EEPROM_1F8A;
uint16_t EEPROM_1F8C;
uint8_t VOLUME_GAIN;
uint8_t DAC_GAIN;
} __attribute__((packed)) Misc;
gEeprom.BK4819_XTAL_FREQ_LOW = value;
BK4819_WriteRegister(BK4819_REG_3B, 22656 + gEeprom.BK4819_XTAL_FREQ_LOW);
// radio 1 .. 04 00 46 00 50 00 2C 0E
// radio 2 .. 05 00 46 00 50 00 2C 0E
EEPROM_ReadBuffer(0x1F88, &Misc, 8);
Misc.BK4819_XtalFreqLow = gEeprom.BK4819_XTAL_FREQ_LOW;
EEPROM_WriteBuffer(0x1F88, &Misc);
}
void MENU_StartCssScan(int8_t Direction) void MENU_StartCssScan(int8_t Direction)
{ {
gCssScanMode = CSS_SCAN_MODE_SCANNING; gCssScanMode = CSS_SCAN_MODE_SCANNING;
@@ -299,6 +320,11 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
*pMax = +50; *pMax = +50;
break; break;
case MENU_BATCAL:
*pMin = 1760; // 0
*pMax = 2000; // 2300
break;
default: default:
return -1; return -1;
} }
@@ -552,7 +578,7 @@ void MENU_AcceptSetting(void)
gSetting_mic_bar = gSubMenuSelection; gSetting_mic_bar = gSubMenuSelection;
break; break;
#endif #endif
#ifdef ENABLE_COMPANDER #ifdef ENABLE_COMPANDER
case MENU_COMPAND: case MENU_COMPAND:
gTxVfo->Compander = gSubMenuSelection; gTxVfo->Compander = gSubMenuSelection;
@@ -711,25 +737,14 @@ void MENU_AcceptSetting(void)
break; break;
case MENU_F_CALI: case MENU_F_CALI:
gEeprom.BK4819_XTAL_FREQ_LOW = gSubMenuSelection; if (gF_LOCK)
BK4819_WriteRegister(BK4819_REG_3B, 22656 + gEeprom.BK4819_XTAL_FREQ_LOW); writeXtalFreqCal(gSubMenuSelection);
{
struct
{
int16_t BK4819_XtalFreqLow;
uint16_t EEPROM_1F8A;
uint16_t EEPROM_1F8C;
uint8_t VOLUME_GAIN;
uint8_t DAC_GAIN;
} __attribute__((packed)) Misc;
// radio 1 .. 04 00 46 00 50 00 2C 0E
// radio 2 .. 05 00 46 00 50 00 2C 0E
EEPROM_ReadBuffer(0x1F88, &Misc, 8);
Misc.BK4819_XtalFreqLow = gEeprom.BK4819_XTAL_FREQ_LOW;
EEPROM_WriteBuffer(0x1F88, &Misc);
}
return; return;
case MENU_BATCAL:
gBatteryCalibration[3] = gSubMenuSelection;
EEPROM_WriteBuffer(0x1F40, gBatteryCalibration);
break;
} }
gRequestSaveSettings = true; gRequestSaveSettings = true;
@@ -956,7 +971,7 @@ void MENU_ShowCurrentSetting(void)
gSubMenuSelection = gSetting_mic_bar; gSubMenuSelection = gSetting_mic_bar;
break; break;
#endif #endif
#ifdef ENABLE_COMPANDER #ifdef ENABLE_COMPANDER
case MENU_COMPAND: case MENU_COMPAND:
gSubMenuSelection = gTxVfo->Compander; gSubMenuSelection = gTxVfo->Compander;
@@ -1042,7 +1057,7 @@ void MENU_ShowCurrentSetting(void)
gSubMenuSelection = gSetting_AM_fix; gSubMenuSelection = gSetting_AM_fix;
break; break;
#endif #endif
#ifdef ENABLE_AM_FIX_TEST1 #ifdef ENABLE_AM_FIX_TEST1
case MENU_AM_FIX_TEST1: case MENU_AM_FIX_TEST1:
gSubMenuSelection = gSetting_AM_fix_test1; gSubMenuSelection = gSetting_AM_fix_test1;
@@ -1094,6 +1109,19 @@ void MENU_ShowCurrentSetting(void)
case MENU_F_CALI: case MENU_F_CALI:
gSubMenuSelection = gEeprom.BK4819_XTAL_FREQ_LOW; gSubMenuSelection = gEeprom.BK4819_XTAL_FREQ_LOW;
break; break;
case MENU_BATCAL:
gSubMenuSelection = gBatteryCalibration[3];
break;
default:
return;
}
// if (gFlagBackupSetting)
{ // save a copy incase the user wants to back out
// gFlagBackupSetting = false;
gSubMenuSelection_original = gSubMenuSelection;
} }
} }
@@ -1143,11 +1171,12 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gInputBoxIndex = 0; gInputBoxIndex = 0;
Value = (gInputBox[0] * 10) + gInputBox[1]; Value = (gInputBox[0] * 10) + gInputBox[1];
if (Value > 0 && Value <= gMenuListCount) if (Value > 0 && Value <= gMenuListCount)
{ {
gMenuCursor = Value - 1; gMenuCursor = Value - 1;
gFlagRefreshSetting = true; gFlagRefreshSetting = true;
gFlagBackupSetting = true;
return; return;
} }
@@ -1156,13 +1185,14 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gInputBox[0] = gInputBox[1]; gInputBox[0] = gInputBox[1];
gInputBoxIndex = 1; gInputBoxIndex = 1;
case 1: case 1:
Value = gInputBox[0]; Value = gInputBox[0];
if (Value > 0 && Value <= gMenuListCount) if (Value > 0 && Value <= gMenuListCount)
{ {
gMenuCursor = Value - 1; gMenuCursor = Value - 1;
gFlagRefreshSetting = true; gFlagRefreshSetting = true;
gFlagBackupSetting = true;
return; return;
} }
break; break;
@@ -1271,6 +1301,17 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
{ {
if (gIsInSubMenu) if (gIsInSubMenu)
{ {
// ***********************
// restore original value
if (gMenuCursor == MENU_F_CALI)
{
// if (gF_LOCK)
// writeXtalFreqCal(gSubMenuSelection_original);
}
// ***********************
if (gInputBoxIndex == 0 || gMenuCursor != MENU_OFFSET) if (gInputBoxIndex == 0 || gMenuCursor != MENU_OFFSET)
{ {
gAskForConfirmation = 0; gAskForConfirmation = 0;
@@ -1285,6 +1326,8 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
else else
gInputBox[--gInputBoxIndex] = 10; gInputBox[--gInputBoxIndex] = 10;
// ***********************
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
return; return;
} }
@@ -1294,7 +1337,7 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
#endif #endif
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
if (gEeprom.BACKLIGHT == 0) if (gEeprom.BACKLIGHT == 0)
{ {
gBacklightCountdown = 0; gBacklightCountdown = 0;
@@ -1338,13 +1381,13 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
gAskForConfirmation = 0; gAskForConfirmation = 0;
gIsInSubMenu = true; gIsInSubMenu = true;
// if (gMenuCursor != MENU_D_LIST) // if (gMenuCursor != MENU_D_LIST)
{ {
gInputBoxIndex = 0; gInputBoxIndex = 0;
edit_index = -1; edit_index = -1;
} }
return; return;
} }
@@ -1570,8 +1613,11 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
if (!gIsInSubMenu) if (!gIsInSubMenu)
{ {
gMenuCursor = NUMBER_AddWithWraparound(gMenuCursor, -Direction, 0, gMenuListCount - 1); gMenuCursor = NUMBER_AddWithWraparound(gMenuCursor, -Direction, 0, gMenuListCount - 1);
gFlagRefreshSetting = true;
gFlagRefreshSetting = true;
gFlagBackupSetting = true;
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
if (gMenuCursor != MENU_ABR && gEeprom.BACKLIGHT == 0) if (gMenuCursor != MENU_ABR && gEeprom.BACKLIGHT == 0)
@@ -1579,7 +1625,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
gBacklightCountdown = 0; gBacklightCountdown = 0;
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF
} }
return; return;
} }
@@ -1615,7 +1661,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
bCheckScanList = true; bCheckScanList = true;
break; break;
default: default:
MENU_ClampSelection(Direction); MENU_ClampSelection(Direction);
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
return; return;

View File

@@ -224,7 +224,7 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
case 2: case 2:
if (!gScanSingleFrequency) if (!gScanSingleFrequency)
{ {
RADIO_InitInfo(gTxVfo, gTxVfo->CHANNEL_SAVE, FREQUENCY_GetBand(gScanFrequency), gScanFrequency); RADIO_InitInfo(gTxVfo, gTxVfo->CHANNEL_SAVE, gScanFrequency);
if (gScanUseCssResult) if (gScanUseCssResult)
{ {
@@ -367,7 +367,7 @@ void SCANNER_Start(void)
BackupStep = gRxVfo->STEP_SETTING; BackupStep = gRxVfo->STEP_SETTING;
BackupFrequency = gRxVfo->StepFrequency; BackupFrequency = gRxVfo->StepFrequency;
RADIO_InitInfo(gRxVfo, gRxVfo->CHANNEL_SAVE, gRxVfo->Band, gRxVfo->pRX->Frequency); RADIO_InitInfo(gRxVfo, gRxVfo->CHANNEL_SAVE, gRxVfo->pRX->Frequency);
gRxVfo->STEP_SETTING = BackupStep; gRxVfo->STEP_SETTING = BackupStep;
gRxVfo->StepFrequency = BackupFrequency; gRxVfo->StepFrequency = BackupFrequency;

View File

@@ -324,7 +324,7 @@ const uint8_t BITMAP_AntennaLevel6[3] =
0b00000000 0b00000000
}; };
const uint8_t BITMAP_CurrentIndicator[8] = const uint8_t BITMAP_MARKER[8] =
{ {
0b11111111, 0b11111111,
0b11111111, 0b11111111,

View File

@@ -52,7 +52,7 @@ extern const uint8_t BITMAP_AntennaLevel4[3];
extern const uint8_t BITMAP_AntennaLevel5[3]; extern const uint8_t BITMAP_AntennaLevel5[3];
extern const uint8_t BITMAP_AntennaLevel6[3]; extern const uint8_t BITMAP_AntennaLevel6[3];
extern const uint8_t BITMAP_CurrentIndicator[8]; extern const uint8_t BITMAP_MARKER[8];
extern const uint8_t BITMAP_VFO_Default[8]; extern const uint8_t BITMAP_VFO_Default[8];
extern const uint8_t BITMAP_VFO_NotDefault[8]; extern const uint8_t BITMAP_VFO_NotDefault[8];

View File

@@ -861,7 +861,7 @@ void BOARD_FactoryReset(bool bIsAll)
if (bIsAll) if (bIsAll)
{ {
RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_FIRST + BAND6_400MHz, BAND6_400MHz, 43350000); RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_FIRST + BAND6_400MHz, 43350000);
// set the first few memory channels // set the first few memory channels
for (i = 0; i < ARRAY_SIZE(gDefaultFrequencyTable); i++) for (i = 0; i < ARRAY_SIZE(gDefaultFrequencyTable); i++)

2
dcs.c
View File

@@ -91,7 +91,7 @@ uint8_t DCS_GetCdcssCode(uint32_t Code)
return 0xFF; return 0xFF;
} }
uint8_t DCS_GetCtcssCode(uint16_t Code) uint8_t DCS_GetCtcssCode(int Code)
{ {
unsigned int i; unsigned int i;
uint8_t Result = 0xFF; uint8_t Result = 0xFF;

2
dcs.h
View File

@@ -39,7 +39,7 @@ extern const uint16_t DCS_Options[104];
uint32_t DCS_GetGolayCodeWord(DCS_CodeType_t CodeType, uint8_t Option); uint32_t DCS_GetGolayCodeWord(DCS_CodeType_t CodeType, uint8_t Option);
uint8_t DCS_GetCdcssCode(uint32_t Code); uint8_t DCS_GetCdcssCode(uint32_t Code);
uint8_t DCS_GetCtcssCode(uint16_t Code); uint8_t DCS_GetCtcssCode(int Code);
#endif #endif

View File

@@ -465,7 +465,7 @@ void BK4819_SetCTCSSFrequency(uint32_t FreqControlWord)
// freq(Hz) * 20.64888 for XTAL 13M/26M or // freq(Hz) * 20.64888 for XTAL 13M/26M or
// freq(Hz) * 20.97152 for XTAL 12.8M/19.2M/25.6M/38.4M // freq(Hz) * 20.97152 for XTAL 12.8M/19.2M/25.6M/38.4M
// //
BK4819_WriteRegister(BK4819_REG_07, BK4819_REG_07_MODE_CTC1 | (((FreqControlWord * 2064888u) + 500000u) / 1000000u)); // with rounding BK4819_WriteRegister(BK4819_REG_07, BK4819_REG_07_MODE_CTC1 | (((FreqControlWord * 206488u) + 50000u) / 100000u)); // with rounding
} }
// freq_10Hz is CTCSS Hz * 10 // freq_10Hz is CTCSS Hz * 10

View File

@@ -19,180 +19,122 @@
#include "driver/gpio.h" #include "driver/gpio.h"
#include "driver/keyboard.h" #include "driver/keyboard.h"
#include "driver/systick.h" #include "driver/systick.h"
#include "driver/i2c.h"
#include "misc.h"
KEY_Code_t gKeyReading0 = KEY_INVALID; KEY_Code_t gKeyReading0 = KEY_INVALID;
KEY_Code_t gKeyReading1 = KEY_INVALID; KEY_Code_t gKeyReading1 = KEY_INVALID;
uint16_t gDebounceCounter; uint16_t gDebounceCounter;
bool gWasFKeyPressed; bool gWasFKeyPressed;
static const struct {
// Using a 16 bit pre-calculated shift and invert is cheaper
// than using 8 bit and doing shift and invert in code.
uint16_t set_to_zero_mask;
//We are very fortunate.
//The key and pin defines fit together in a single u8,
//making this very efficient
struct {
uint8_t key : 5; //Key 23 is highest
uint8_t pin : 3; //Pin 6 is highest
} pins[4];
} keyboard[5] = {
/* Zero row */
{
//Set to zero to handle special case of nothing pulled down.
.set_to_zero_mask = ~(0),
.pins = {
{ .key = KEY_SIDE1, .pin = GPIOA_PIN_KEYBOARD_0},
{ .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1},
/* Duplicate to fill the array with valid values */
{ .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1},
{ .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1},
}
},
/* First row */
{
.set_to_zero_mask = ~(1 << GPIOA_PIN_KEYBOARD_4),
.pins = {
{ .key = KEY_MENU, .pin = GPIOA_PIN_KEYBOARD_0},
{ .key = KEY_1, .pin = GPIOA_PIN_KEYBOARD_1},
{ .key = KEY_4, .pin = GPIOA_PIN_KEYBOARD_2},
{ .key = KEY_7, .pin = GPIOA_PIN_KEYBOARD_3},
}
},
/* Second row */
{
.set_to_zero_mask = ~(1 << GPIOA_PIN_KEYBOARD_5),
.pins = {
{ .key = KEY_UP, .pin = GPIOA_PIN_KEYBOARD_0},
{ .key = KEY_2 , .pin = GPIOA_PIN_KEYBOARD_1},
{ .key = KEY_5 , .pin = GPIOA_PIN_KEYBOARD_2},
{ .key = KEY_8 , .pin = GPIOA_PIN_KEYBOARD_3},
}
},
/* Third row */
{
.set_to_zero_mask = ~(1 << GPIOA_PIN_KEYBOARD_6),
.pins = {
{ .key = KEY_DOWN, .pin = GPIOA_PIN_KEYBOARD_0},
{ .key = KEY_3 , .pin = GPIOA_PIN_KEYBOARD_1},
{ .key = KEY_6 , .pin = GPIOA_PIN_KEYBOARD_2},
{ .key = KEY_9 , .pin = GPIOA_PIN_KEYBOARD_3},
}
},
/* Fourth row */
{
.set_to_zero_mask = ~(1 << GPIOA_PIN_KEYBOARD_7),
.pins = {
{ .key = KEY_EXIT, .pin = GPIOA_PIN_KEYBOARD_0},
{ .key = KEY_STAR, .pin = GPIOA_PIN_KEYBOARD_1},
{ .key = KEY_0 , .pin = GPIOA_PIN_KEYBOARD_2},
{ .key = KEY_F , .pin = GPIOA_PIN_KEYBOARD_3},
}
},
};
KEY_Code_t KEYBOARD_Poll(void) KEY_Code_t KEYBOARD_Poll(void)
{ {
KEY_Code_t Key = KEY_INVALID; KEY_Code_t Key = KEY_INVALID;
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4); // if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT))
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_5); // return KEY_PTT;
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_7);
SYSTICK_DelayUs(1);
// ***************** // *****************
// Keys connected to gnd for(int j = 0; j < ARRAY_SIZE(keyboard); j++) {
//Set all high
GPIOA->DATA |= 1 << GPIOA_PIN_KEYBOARD_4 |
1 << GPIOA_PIN_KEYBOARD_5 |
1 << GPIOA_PIN_KEYBOARD_6 |
1 << GPIOA_PIN_KEYBOARD_7 ;
//Clear the pin we are selecting
GPIOA->DATA &= keyboard[j].set_to_zero_mask;
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0)) //Wait for the pins to stabilize. 1 works for me.
{ SYSTICK_DelayUs(2);
Key = KEY_SIDE1;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1)) // Read all 4 GPIO pins at once
{ uint16_t reg = GPIOA->DATA;
Key = KEY_SIDE2; for(int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++)
goto Bye; {
} uint16_t mask = 1 << keyboard[j].pins[i].pin;
if(! (reg & mask)) {
Key = keyboard[j].pins[i].key;
break;
}
}
// Original doesn't do PTT if (Key != KEY_INVALID)
break;
}
// ***************** //Create I2C stop condition. Since we might have toggled I2C pins.
// First row //This leaves GPIOA_PIN_KEYBOARD_4 and GPIOA_PIN_KEYBOARD_5 high
I2C_Stop();
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4); // Reset VOICE pins
SYSTICK_DelayUs(1);
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0))
{
Key = KEY_MENU;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1))
{
Key = KEY_1;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2))
{
Key = KEY_4;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3))
{
Key = KEY_7;
goto Bye;
}
// *****************
// Second row
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_5);
SYSTICK_DelayUs(1);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4);
SYSTICK_DelayUs(1);
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0))
{
Key = KEY_UP;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1))
{
Key = KEY_2;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2))
{
Key = KEY_5;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3))
{
Key = KEY_8;
goto Bye;
}
// *****************
// Third row
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4);
SYSTICK_DelayUs(1);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_5);
SYSTICK_DelayUs(1);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4);
SYSTICK_DelayUs(1);
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6);
SYSTICK_DelayUs(1);
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0))
{
Key = KEY_DOWN;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1))
{
Key = KEY_3;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2))
{
Key = KEY_6;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3))
{
Key = KEY_9;
goto Bye;
}
// *****************
// Fourth row
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_7);
SYSTICK_DelayUs(1);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6);
SYSTICK_DelayUs(1);
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0))
{
Key = KEY_EXIT;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1))
{
Key = KEY_STAR;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2))
{
Key = KEY_0;
goto Bye;
}
if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3))
{
Key = KEY_F;
goto Bye;
}
// *****************
Bye:
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_5);
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6); GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6);
GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_7); GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_7);

BIN
firmware.bin Normal file

Binary file not shown.

BIN
firmware.packed.bin Normal file

Binary file not shown.

View File

@@ -157,7 +157,7 @@ uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower)
return Lower + (Step * Index); return Lower + (Step * Index);
} }
/* /*
int TX_FREQUENCY_Check(VFO_Info_t *pInfo) int TX_freq_check(VFO_Info_t *pInfo)
{ // return '0' if TX frequency is allowed { // return '0' if TX frequency is allowed
// otherwise return '-1' // otherwise return '-1'
@@ -168,7 +168,7 @@ int TX_FREQUENCY_Check(VFO_Info_t *pInfo)
return -1; return -1;
#endif #endif
*/ */
int TX_FREQUENCY_Check(const uint32_t Frequency) int TX_freq_check(const uint32_t Frequency)
{ // return '0' if TX frequency is allowed { // return '0' if TX frequency is allowed
// otherwise return '-1' // otherwise return '-1'
@@ -205,6 +205,8 @@ int TX_FREQUENCY_Check(const uint32_t Frequency)
case F_LOCK_CE: case F_LOCK_CE:
if (Frequency >= 14400000 && Frequency < 14600000) if (Frequency >= 14400000 && Frequency < 14600000)
return 0; return 0;
if (Frequency >= 43000000 && Frequency < 44000000)
return 0;
break; break;
case F_LOCK_GB: case F_LOCK_GB:
@@ -233,7 +235,7 @@ int TX_FREQUENCY_Check(const uint32_t Frequency)
return -1; return -1;
} }
int RX_FREQUENCY_Check(const uint32_t Frequency) int RX_freq_check(const uint32_t Frequency)
{ // return '0' if RX frequency is allowed { // return '0' if RX frequency is allowed
// otherwise return '-1' // otherwise return '-1'

View File

@@ -55,9 +55,9 @@ FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency);
uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency); uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency);
uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower); uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower);
//int TX_FREQUENCY_Check(VFO_Info_t *pInfo); //int TX_freq_check(VFO_Info_t *pInfo);
int TX_FREQUENCY_Check(const uint32_t Frequency); int TX_freq_check(const uint32_t Frequency);
int RX_FREQUENCY_Check(const uint32_t Frequency); int RX_freq_check(const uint32_t Frequency);
#endif #endif

View File

@@ -192,18 +192,27 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
DTMF_Reply(); DTMF_Reply();
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
if (gAlarmState != ALARM_STATE_OFF) if (gAlarmState != ALARM_STATE_OFF)
{ {
BK4819_TransmitTone(true, (gAlarmState == ALARM_STATE_TX1750) ? 1750 : 500); #ifdef ENABLE_TX1750
if (gAlarmState == ALARM_STATE_TX1750)
BK4819_TransmitTone(true, 1750);
#endif
#ifdef ENABLE_ALARM
if (gAlarmState == ALARM_STATE_TXALARM)
BK4819_TransmitTone(true, 500);
#endif
SYSTEM_DelayMs(2); SYSTEM_DelayMs(2);
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
gAlarmToneCounter = 0; #ifdef ENABLE_ALARM
gEnableSpeaker = true; gAlarmToneCounter = 0;
#endif
gEnableSpeaker = true;
break; break;
} }
#endif #endif
if (gCurrentVfo->SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable) if (gCurrentVfo->SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable)
BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1); BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1);
else else

View File

@@ -66,21 +66,20 @@ Volts Percent Volts Percent Volts Percent Volts Percent
7.96478 75 7.72911 48 7.51285 21 7.96478 75 7.72911 48 7.51285 21
7.95983 74 7.72097 47 7.49832 20 7.95983 74 7.72097 47 7.49832 20
*/ */
uint8_t BATTERY_VoltsToPercent(uint16_t voltage_10mV) unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV)
{ {
if(voltage_10mV>814) if (voltage_10mV > 814)
return 100; return 100;
else if(voltage_10mV>756) if (voltage_10mV > 756)
return 132*voltage_10mV/100-974; return ((132ul * voltage_10mV) / 100) - 974u;
else if(voltage_10mV>729) if (voltage_10mV > 729)
return 63*voltage_10mV/100-452; return ((63ul * voltage_10mV) / 100) - 452u;
else if(voltage_10mV>600) if (voltage_10mV > 600)
return 52*voltage_10mV/1000-31; return ((52ul * voltage_10mV) / 1000) - 31u;
else return 0;
return 0;
} }
void BATTERY_GetReadings(bool bDisplayBatteryLevel) void BATTERY_GetReadings(const bool bDisplayBatteryLevel)
{ {
const uint8_t PreviousBatteryLevel = gBatteryDisplayLevel; const uint8_t PreviousBatteryLevel = gBatteryDisplayLevel;
const uint16_t Voltage = (gBatteryVoltages[0] + gBatteryVoltages[1] + gBatteryVoltages[2] + gBatteryVoltages[3]) / 4; const uint16_t Voltage = (gBatteryVoltages[0] + gBatteryVoltages[1] + gBatteryVoltages[2] + gBatteryVoltages[3]) / 4;

View File

@@ -33,8 +33,8 @@ extern uint16_t gBatteryCheckCounter;
extern volatile uint16_t gPowerSave_10ms; extern volatile uint16_t gPowerSave_10ms;
uint8_t BATTERY_VoltsToPercent(uint16_t voltage_10mV); unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV);
void BATTERY_GetReadings(bool bDisplayBatteryLevel); void BATTERY_GetReadings(const bool bDisplayBatteryLevel);
#endif #endif

View File

@@ -39,15 +39,16 @@ BOOT_Mode_t BOOT_GetMode(void)
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
if (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT)) if (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT))
return BOOT_MODE_NORMAL; return BOOT_MODE_NORMAL; // PTT not pressed
Keys[i] = KEYBOARD_Poll(); Keys[i] = KEYBOARD_Poll();
SYSTEM_DelayMs(20); SYSTEM_DelayMs(20);
} }
if (Keys[0] == Keys[1]) if (Keys[0] == Keys[1])
{ {
gKeyReading0 = Keys[0]; gKeyReading0 = Keys[0];
gKeyReading1 = Keys[0]; gKeyReading1 = Keys[0];
gDebounceCounter = 2; gDebounceCounter = 2;
if (Keys[0] == KEY_SIDE1) if (Keys[0] == KEY_SIDE1)
@@ -66,16 +67,7 @@ void BOOT_ProcessMode(BOOT_Mode_t Mode)
{ {
if (Mode == BOOT_MODE_F_LOCK) if (Mode == BOOT_MODE_F_LOCK)
{ {
// enable all the menu items
gMenuListCount = 0;
// while (MenuList[gMenuListCount].name != NULL)
while (MenuList[gMenuListCount].name[0] != '\0')
gMenuListCount++;
gMenuCursor = MENU_350TX;
gSubMenuSelection = gSetting_350TX;
GUI_SelectNextDisplay(DISPLAY_MENU); GUI_SelectNextDisplay(DISPLAY_MENU);
gF_LOCK = true;
} }
#ifdef ENABLE_AIRCOPY #ifdef ENABLE_AIRCOPY
else else
@@ -86,15 +78,15 @@ void BOOT_ProcessMode(BOOT_Mode_t Mode)
gEeprom.VOX_SWITCH = false; gEeprom.VOX_SWITCH = false;
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
gEeprom.AUTO_KEYPAD_LOCK = false; gEeprom.AUTO_KEYPAD_LOCK = false;
gEeprom.KEY_1_SHORT_PRESS_ACTION = 0; gEeprom.KEY_1_SHORT_PRESS_ACTION = ACTION_OPT_NONE;
gEeprom.KEY_1_LONG_PRESS_ACTION = 0; gEeprom.KEY_1_LONG_PRESS_ACTION = ACTION_OPT_NONE;
gEeprom.KEY_2_SHORT_PRESS_ACTION = 0; gEeprom.KEY_2_SHORT_PRESS_ACTION = ACTION_OPT_NONE;
gEeprom.KEY_2_LONG_PRESS_ACTION = 0; gEeprom.KEY_2_LONG_PRESS_ACTION = ACTION_OPT_NONE;
RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_LAST - 1, 5, 41002500); RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_LAST - 1, 41002500);
gRxVfo->CHANNEL_BANDWIDTH = BANDWIDTH_NARROW; gRxVfo->CHANNEL_BANDWIDTH = BANDWIDTH_WIDE;
gRxVfo->OUTPUT_POWER = 0; gRxVfo->OUTPUT_POWER = OUTPUT_POWER_LOW;
RADIO_ConfigureSquelchAndOutputPower(gRxVfo); RADIO_ConfigureSquelchAndOutputPower(gRxVfo);
@@ -105,6 +97,7 @@ void BOOT_ProcessMode(BOOT_Mode_t Mode)
BK4819_ResetFSK(); BK4819_ResetFSK();
gAircopyState = AIRCOPY_READY; gAircopyState = AIRCOPY_READY;
GUI_SelectNextDisplay(DISPLAY_AIRCOPY); GUI_SelectNextDisplay(DISPLAY_AIRCOPY);
} }
#endif #endif

40
main.c
View File

@@ -50,6 +50,7 @@ void _putchar(char c)
void Main(void) void Main(void)
{ {
unsigned int i; unsigned int i;
BOOT_Mode_t BootMode;
// Enable clock gating of blocks we need // Enable clock gating of blocks we need
SYSCON_DEV_CLK_GATE = 0 SYSCON_DEV_CLK_GATE = 0
@@ -67,7 +68,7 @@ void Main(void)
UART_Init(); UART_Init();
boot_counter_10ms = 250; // 2.5 sec boot_counter_10ms = 250; // 2.5 sec
UART_Send(UART_Version, strlen(UART_Version)); UART_Send(UART_Version, strlen(UART_Version));
// Not implementing authentic device checks // Not implementing authentic device checks
@@ -101,12 +102,36 @@ void Main(void)
AM_fix_init(); AM_fix_init();
#endif #endif
// count the number of menu list items BootMode = BOOT_GetMode();
// count the number of menu items
gMenuListCount = 0; gMenuListCount = 0;
while (MenuList[gMenuListCount].name[0] != '\0') while (MenuList[gMenuListCount].name[0] != '\0')
gMenuListCount++; gMenuListCount++;
gMenuListCount -= 8; // disable the last 'n' items
if (BootMode == BOOT_MODE_F_LOCK)
gF_LOCK = true; // flag to say use the hidden menu items
else
gMenuListCount -= 9; // hide the last few menu items
// wait for user to release all butts before moving on
if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) ||
KEYBOARD_Poll() != KEY_INVALID ||
BootMode != BOOT_MODE_NORMAL)
{ // keys are pressed
UI_DisplayReleaseKeys();
BACKLIGHT_TurnOn();
i = 0;
while (i < 50) // 500ms
{
i = (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) && KEYBOARD_Poll() == KEY_INVALID) ? i + 1 : 0;
SYSTEM_DelayMs(10);
}
gKeyReading0 = KEY_INVALID;
gKeyReading1 = KEY_INVALID;
gDebounceCounter = 0;
}
if (!gChargingWithTypeC && !gBatteryDisplayLevel) if (!gChargingWithTypeC && !gBatteryDisplayLevel)
{ {
FUNCTION_Select(FUNCTION_POWER_SAVE); FUNCTION_Select(FUNCTION_POWER_SAVE);
@@ -120,9 +145,8 @@ void Main(void)
} }
else else
{ {
BOOT_Mode_t BootMode;
UI_DisplayWelcome(); UI_DisplayWelcome();
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();
if (gEeprom.POWER_ON_DISPLAY_MODE != POWER_ON_DISPLAY_MODE_NONE) if (gEeprom.POWER_ON_DISPLAY_MODE != POWER_ON_DISPLAY_MODE_NONE)
@@ -131,7 +155,7 @@ void Main(void)
{ {
if (KEYBOARD_Poll() != KEY_INVALID) if (KEYBOARD_Poll() != KEY_INVALID)
{ // halt boot beeps { // halt boot beeps
boot_counter_10ms = 0; boot_counter_10ms = 0;
break; break;
} }
#ifdef ENABLE_BOOT_BEEPS #ifdef ENABLE_BOOT_BEEPS
@@ -141,8 +165,6 @@ void Main(void)
} }
} }
BootMode = BOOT_GetMode();
if (gEeprom.POWER_ON_PASSWORD < 1000000) if (gEeprom.POWER_ON_PASSWORD < 1000000)
{ {
bIsInLockScreen = true; bIsInLockScreen = true;
@@ -179,6 +201,8 @@ void Main(void)
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
RADIO_ConfigureNOAA(); RADIO_ConfigureNOAA();
#endif #endif
// ******************
} }
while (1) while (1)

14
misc.c
View File

@@ -63,6 +63,9 @@ const uint16_t NOAA_countdown_10ms = 5000 / 10; // 5 seconds
const uint16_t NOAA_countdown_2_10ms = 500 / 10; // 500ms const uint16_t NOAA_countdown_2_10ms = 500 / 10; // 500ms
const uint16_t NOAA_countdown_3_10ms = 200 / 10; // 200ms const uint16_t NOAA_countdown_3_10ms = 200 / 10; // 200ms
//const uint16_t gMax_bat_v = 840; // 8.4V
//const uint16_t gMin_bat_v = 660; // 6.6V
const uint32_t gDefaultAesKey[4] = {0x4AA5CC60, 0x0312CC5F, 0xFFD2DABB, 0x6BBA7F92}; const uint32_t gDefaultAesKey[4] = {0x4AA5CC60, 0x0312CC5F, 0xFFD2DABB, 0x6BBA7F92};
const uint8_t gMicGain_dB2[5] = {3, 8, 16, 24, 31}; const uint8_t gMicGain_dB2[5] = {3, 8, 16, 24, 31};
@@ -146,7 +149,7 @@ uint8_t gReducedService;
uint8_t gBatteryVoltageIndex; uint8_t gBatteryVoltageIndex;
CssScanMode_t gCssScanMode; CssScanMode_t gCssScanMode;
bool gUpdateRSSI; bool gUpdateRSSI;
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
AlarmState_t gAlarmState; AlarmState_t gAlarmState;
#endif #endif
uint8_t gVoltageMenuCountdown; uint8_t gVoltageMenuCountdown;
@@ -163,8 +166,11 @@ bool gRequestSaveSettings;
bool gRequestSaveFM; bool gRequestSaveFM;
#endif #endif
bool gFlagPrepareTX; bool gFlagPrepareTX;
bool gFlagAcceptSetting; bool gFlagAcceptSetting;
bool gFlagRefreshSetting; bool gFlagRefreshSetting;
bool gFlagBackupSetting;
bool gFlagSaveVfo; bool gFlagSaveVfo;
bool gFlagSaveSettings; bool gFlagSaveSettings;
bool gFlagSaveChannel; bool gFlagSaveChannel;
@@ -190,7 +196,7 @@ uint8_t gRestoreMrChannel;
uint8_t gCurrentScanList; uint8_t gCurrentScanList;
uint8_t gPreviousMrChannel; uint8_t gPreviousMrChannel;
uint32_t gRestoreFrequency; uint32_t gRestoreFrequency;
uint8_t gRxVfoIsActive; bool gRxVfoIsActive;
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
uint8_t gAlarmToneCounter; uint8_t gAlarmToneCounter;
uint16_t gAlarmRunningCounter; uint16_t gAlarmRunningCounter;
@@ -213,7 +219,9 @@ uint8_t gNeverUsed;
#endif #endif
bool gUpdateDisplay; bool gUpdateDisplay;
bool gF_LOCK;
bool gF_LOCK = false;
uint8_t gShowChPrefix; uint8_t gShowChPrefix;
volatile bool gNextTimeslice; volatile bool gNextTimeslice;

14
misc.h
View File

@@ -128,6 +128,9 @@ extern const uint16_t scan_pause_delay_in_2_10ms;
extern const uint16_t scan_pause_delay_in_3_10ms; extern const uint16_t scan_pause_delay_in_3_10ms;
extern const uint16_t scan_pause_delay_in_4_10ms; extern const uint16_t scan_pause_delay_in_4_10ms;
//extern const uint16_t gMax_bat_v;
//extern const uint16_t gMin_bat_v;
extern const uint8_t gMicGain_dB2[5]; extern const uint8_t gMicGain_dB2[5];
extern bool gSetting_350TX; extern bool gSetting_350TX;
@@ -227,8 +230,11 @@ extern bool gRequestSaveSettings;
#endif #endif
extern uint8_t gKeypadLocked; extern uint8_t gKeypadLocked;
extern bool gFlagPrepareTX; extern bool gFlagPrepareTX;
extern bool gFlagAcceptSetting;
extern bool gFlagRefreshSetting; extern bool gFlagAcceptSetting; // accept menu setting
extern bool gFlagRefreshSetting; // refresh menu display
extern bool gFlagBackupSetting; // save a copy of the current menu setting
extern bool gFlagSaveVfo; extern bool gFlagSaveVfo;
extern bool gFlagSaveSettings; extern bool gFlagSaveSettings;
extern bool gFlagSaveChannel; extern bool gFlagSaveChannel;
@@ -254,7 +260,7 @@ extern uint8_t gRestoreMrChannel;
extern uint8_t gCurrentScanList; extern uint8_t gCurrentScanList;
extern uint8_t gPreviousMrChannel; extern uint8_t gPreviousMrChannel;
extern uint32_t gRestoreFrequency; extern uint32_t gRestoreFrequency;
extern uint8_t gRxVfoIsActive; extern bool gRxVfoIsActive;
extern uint8_t gAlarmToneCounter; extern uint8_t gAlarmToneCounter;
extern uint16_t gAlarmRunningCounter; extern uint16_t gAlarmRunningCounter;
extern bool gKeyBeingHeld; extern bool gKeyBeingHeld;
@@ -274,10 +280,10 @@ extern uint8_t gNeverUsed;
#endif #endif
extern volatile bool gNextTimeslice; extern volatile bool gNextTimeslice;
extern bool gUpdateDisplay; extern bool gUpdateDisplay;
extern bool gF_LOCK;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
extern uint8_t gFM_ChannelPosition; extern uint8_t gFM_ChannelPosition;
#endif #endif
extern bool gF_LOCK;
extern uint8_t gShowChPrefix; extern uint8_t gShowChPrefix;
extern volatile uint8_t gFoundCDCSSCountdown_10ms; extern volatile uint8_t gFoundCDCSSCountdown_10ms;
extern volatile uint8_t gFoundCTCSSCountdown_10ms; extern volatile uint8_t gFoundCTCSSCountdown_10ms;

70
radio.c
View File

@@ -114,25 +114,24 @@ uint8_t RADIO_FindNextChannel(uint8_t Channel, int8_t Direction, bool bCheckScan
return 0xFF; return 0xFF;
} }
void RADIO_InitInfo(VFO_Info_t *pInfo, uint8_t ChannelSave, uint8_t Band, uint32_t Frequency) void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t Frequency)
{ {
memset(pInfo, 0, sizeof(*pInfo)); memset(pInfo, 0, sizeof(*pInfo));
pInfo->Band = Band; pInfo->Band = FREQUENCY_GetBand(Frequency);
pInfo->SCANLIST1_PARTICIPATION = true; pInfo->SCANLIST1_PARTICIPATION = true;
pInfo->SCANLIST2_PARTICIPATION = true; pInfo->SCANLIST2_PARTICIPATION = true;
pInfo->STEP_SETTING = STEP_12_5kHz; pInfo->STEP_SETTING = STEP_12_5kHz;
pInfo->StepFrequency = 2500; pInfo->StepFrequency = 2500;
pInfo->CHANNEL_SAVE = ChannelSave; pInfo->CHANNEL_SAVE = ChannelSave;
pInfo->FrequencyReverse = false; pInfo->FrequencyReverse = false;
pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW; pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW;
pInfo->freq_config_RX.Frequency = Frequency; pInfo->freq_config_RX.Frequency = Frequency;
pInfo->freq_config_TX.Frequency = Frequency; pInfo->freq_config_TX.Frequency = Frequency;
pInfo->pRX = &pInfo->freq_config_RX; pInfo->pRX = &pInfo->freq_config_RX;
pInfo->pTX = &pInfo->freq_config_TX; pInfo->pTX = &pInfo->freq_config_TX;
pInfo->TX_OFFSET_FREQUENCY = 1000000;
#ifdef ENABLE_COMPANDER #ifdef ENABLE_COMPANDER
pInfo->Compander = 0; // off pInfo->Compander = 0; // off
#endif #endif
if (ChannelSave == (FREQ_CHANNEL_FIRST + BAND2_108MHz)) if (ChannelSave == (FREQ_CHANNEL_FIRST + BAND2_108MHz))
@@ -167,7 +166,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (Channel >= NOAA_CHANNEL_FIRST) if (Channel >= NOAA_CHANNEL_FIRST)
{ {
RADIO_InitInfo(pRadio, gEeprom.ScreenChannel[VFO], 2, NoaaFrequencyTable[Channel - NOAA_CHANNEL_FIRST]); RADIO_InitInfo(pRadio, gEeprom.ScreenChannel[VFO], NoaaFrequencyTable[Channel - NOAA_CHANNEL_FIRST]);
if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF)
return; return;
@@ -211,7 +210,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
Index = Channel - FREQ_CHANNEL_FIRST; Index = Channel - FREQ_CHANNEL_FIRST;
RADIO_InitInfo(pRadio, Channel, Index, LowerLimitFrequencyBandTable[Index]); RADIO_InitInfo(pRadio, Channel, LowerLimitFrequencyBandTable[Index]);
return; return;
} }
@@ -893,8 +892,9 @@ void RADIO_SetVfoState(VfoState_t State)
} }
else else
{ {
const uint8_t Channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL; unsigned int chan = (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive) ? (gEeprom.RX_CHANNEL + 1) & 1 : gEeprom.RX_CHANNEL; // 1of11
VfoState[Channel] = State; chan = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.TX_CHANNEL : chan;
VfoState[chan] = State;
} }
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
@@ -916,7 +916,7 @@ void RADIO_PrepareTX(void)
gScheduleDualWatch = false; gScheduleDualWatch = false;
if (!gRxVfoIsActive) if (!gRxVfoIsActive)
{ { // use the TX vfo
gEeprom.RX_CHANNEL = gEeprom.TX_CHANNEL; gEeprom.RX_CHANNEL = gEeprom.TX_CHANNEL;
gRxVfo = &gEeprom.VfoInfo[gEeprom.TX_CHANNEL]; gRxVfo = &gEeprom.VfoInfo[gEeprom.TX_CHANNEL];
gRxVfoIsActive = true; gRxVfoIsActive = true;
@@ -929,10 +929,16 @@ void RADIO_PrepareTX(void)
RADIO_SelectCurrentVfo(); RADIO_SelectCurrentVfo();
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) && defined(ENABLE_TX1750)
if (gAlarmState == ALARM_STATE_OFF || if (gAlarmState == ALARM_STATE_OFF ||
gAlarmState == ALARM_STATE_TX1750 || gAlarmState == ALARM_STATE_TX1750 ||
(gAlarmState == ALARM_STATE_ALARM && gEeprom.ALARM_MODE == ALARM_MODE_TONE)) (gAlarmState == ALARM_STATE_ALARM && gEeprom.ALARM_MODE == ALARM_MODE_TONE))
#elif defined(ENABLE_ALARM)
if (gAlarmState == ALARM_STATE_OFF ||
(gAlarmState == ALARM_STATE_ALARM && gEeprom.ALARM_MODE == ALARM_MODE_TONE))
#elif defined(ENABLE_TX1750)
if (gAlarmState == ALARM_STATE_OFF ||
gAlarmState == ALARM_STATE_TX1750)
#endif #endif
{ {
#ifndef ENABLE_TX_WHEN_AM #ifndef ENABLE_TX_WHEN_AM
@@ -947,8 +953,8 @@ void RADIO_PrepareTX(void)
State = VFO_STATE_TX_DISABLE; State = VFO_STATE_TX_DISABLE;
} }
else else
//if (TX_FREQUENCY_Check(gCurrentVfo->pTX->Frequency) == 0 || gCurrentVfo->CHANNEL_SAVE <= FREQ_CHANNEL_LAST) //if (TX_freq_check(gCurrentVfo->pTX->Frequency) == 0 || gCurrentVfo->CHANNEL_SAVE <= FREQ_CHANNEL_LAST)
if (TX_FREQUENCY_Check(gCurrentVfo->pTX->Frequency) == 0) if (TX_freq_check(gCurrentVfo->pTX->Frequency) == 0)
{ // TX frequency is allowed { // TX frequency is allowed
if (gCurrentVfo->BUSY_CHANNEL_LOCK && gCurrentFunction == FUNCTION_RECEIVE) if (gCurrentVfo->BUSY_CHANNEL_LOCK && gCurrentFunction == FUNCTION_RECEIVE)
State = VFO_STATE_BUSY; // busy RX'ing a station State = VFO_STATE_BUSY; // busy RX'ing a station
@@ -967,7 +973,7 @@ void RADIO_PrepareTX(void)
if (State != VFO_STATE_NORMAL) if (State != VFO_STATE_NORMAL)
{ // TX not allowed { // TX not allowed
RADIO_SetVfoState(State); RADIO_SetVfoState(State);
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
gAlarmState = ALARM_STATE_OFF; gAlarmState = ALARM_STATE_OFF;
#endif #endif
gDTMF_ReplyState = DTMF_REPLY_NONE; gDTMF_ReplyState = DTMF_REPLY_NONE;
@@ -995,15 +1001,18 @@ void RADIO_PrepareTX(void)
FUNCTION_Select(FUNCTION_TRANSMIT); FUNCTION_Select(FUNCTION_TRANSMIT);
gTxTimerCountdown_500ms = 0; // no timeout gTxTimerCountdown_500ms = 0; // no timeout
#ifdef ENABLE_ALARM
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
if (gAlarmState == ALARM_STATE_OFF) if (gAlarmState == ALARM_STATE_OFF)
#endif #endif
{ {
if (gEeprom.TX_TIMEOUT_TIMER == 1) if (gEeprom.TX_TIMEOUT_TIMER == 0)
gTxTimerCountdown_500ms = 60; // 30 sec gTxTimerCountdown_500ms = 60; // 30 sec
else else
if (gEeprom.TX_TIMEOUT_TIMER >= 2) if (gEeprom.TX_TIMEOUT_TIMER < (ARRAY_SIZE(gSubMenu_TOT) - 1))
gTxTimerCountdown_500ms = (gEeprom.TX_TIMEOUT_TIMER - 1) * 120; // minutes gTxTimerCountdown_500ms = 120 * gEeprom.TX_TIMEOUT_TIMER; // minutes
else
gTxTimerCountdown_500ms = 120 * 15; // 15 minutes
} }
gTxTimeoutReached = false; gTxTimeoutReached = false;
@@ -1051,8 +1060,9 @@ void RADIO_SendEndOfTransmission(void)
if (gEeprom.ROGER == ROGER_MODE_MDC) if (gEeprom.ROGER == ROGER_MODE_MDC)
BK4819_PlayRogerMDC(); BK4819_PlayRogerMDC();
if (gDTMF_CallState == DTMF_CALL_STATE_NONE && (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_EOT || gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH)) if (gDTMF_CallState == DTMF_CALL_STATE_NONE &&
{ (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_EOT || gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH))
{ // end-of-tx
if (gEeprom.DTMF_SIDE_TONE) if (gEeprom.DTMF_SIDE_TONE)
{ {
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);

View File

@@ -159,7 +159,7 @@ extern VfoState_t VfoState[2];
bool RADIO_CheckValidChannel(uint16_t ChNum, bool bCheckScanList, uint8_t RadioNum); bool RADIO_CheckValidChannel(uint16_t ChNum, bool bCheckScanList, uint8_t RadioNum);
uint8_t RADIO_FindNextChannel(uint8_t ChNum, int8_t Direction, bool bCheckScanList, uint8_t RadioNum); uint8_t RADIO_FindNextChannel(uint8_t ChNum, int8_t Direction, bool bCheckScanList, uint8_t RadioNum);
void RADIO_InitInfo(VFO_Info_t *pInfo, uint8_t ChannelSave, uint8_t ChIndex, uint32_t Frequency); void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t Frequency);
void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure); void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure);
void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo); void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo);
void RADIO_ApplyOffset(VFO_Info_t *pInfo); void RADIO_ApplyOffset(VFO_Info_t *pInfo);

View File

@@ -121,7 +121,7 @@ void SETTINGS_SaveSettings(void)
EEPROM_WriteBuffer(0x0EA0, State); EEPROM_WriteBuffer(0x0EA0, State);
#endif #endif
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
State[0] = gEeprom.ALARM_MODE; State[0] = gEeprom.ALARM_MODE;
#else #else
State[0] = false; State[0] = false;

View File

@@ -176,7 +176,7 @@ typedef struct {
#endif #endif
bool AUTO_KEYPAD_LOCK; bool AUTO_KEYPAD_LOCK;
#ifdef ENABLE_ALARM #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
ALARM_Mode_t ALARM_MODE; ALARM_Mode_t ALARM_MODE;
#endif #endif
POWER_OnDisplayMode_t POWER_ON_DISPLAY_MODE; POWER_OnDisplayMode_t POWER_ON_DISPLAY_MODE;

234
ui/main.c
View File

@@ -96,18 +96,18 @@ bool center_line_is_free = true;
#endif #endif
uint8_t *pLine = gFrameBuffer[line]; uint8_t *p_line = gFrameBuffer[line];
memset(pLine, 0, LCD_WIDTH); memset(p_line, 0, LCD_WIDTH);
#if 1 #if 1
// solid bar // solid bar
for (i = 0; i < bar_width; i++) for (i = 0; i < bar_width; i++)
pLine[bar_x + i] = (i > len) ? ((i & 1) == 0) ? 0x41 : 0x00 : ((i & 1) == 0) ? 0x7f : 0x3e; p_line[bar_x + i] = (i > len) ? ((i & 1) == 0) ? 0x41 : 0x00 : ((i & 1) == 0) ? 0x7f : 0x3e;
#else #else
// knuled bar // knuled bar
for (i = 0; i < bar_width; i += 2) for (i = 0; i < bar_width; i += 2)
pLine[bar_x + i] = (i <= len) ? 0x7f : 0x41; p_line[bar_x + i] = (i <= len) ? 0x7f : 0x41;
#endif #endif
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT)
@@ -124,6 +124,7 @@ bool center_line_is_free = true;
const int16_t s9_dBm = s0_dBm + (6 * 9); // S9 .. 6dB/S-Point const int16_t s9_dBm = s0_dBm + (6 * 9); // S9 .. 6dB/S-Point
const int16_t bar_max_dBm = s9_dBm + 30; // S9+30dB const int16_t bar_max_dBm = s9_dBm + 30; // S9+30dB
// const int16_t bar_min_dBm = s0_dBm + (6 * 0); // S0
const int16_t bar_min_dBm = s0_dBm + (6 * 4); // S4 const int16_t bar_min_dBm = s0_dBm + (6 * 4); // S4
// ************ // ************
@@ -138,7 +139,7 @@ bool center_line_is_free = true;
const unsigned int len = ((clamped_dBm - bar_min_dBm) * bar_width) / bar_range_dB; const unsigned int len = ((clamped_dBm - bar_min_dBm) * bar_width) / bar_range_dB;
const unsigned int line = 3; const unsigned int line = 3;
uint8_t *pLine = gFrameBuffer[line]; uint8_t *p_line = gFrameBuffer[line];
char s[16]; char s[16];
unsigned int i; unsigned int i;
@@ -149,12 +150,12 @@ bool center_line_is_free = true;
return; // display is in use return; // display is in use
if (now) if (now)
memset(pLine, 0, LCD_WIDTH); memset(p_line, 0, LCD_WIDTH);
if (rssi_dBm >= (s9_dBm + 6)) if (rssi_dBm >= (s9_dBm + 6))
{ // S9+XXdB, 1dB increment { // S9+XXdB, 1dB increment
const char *fmt[] = {"%-4d +%u ", "%-4d +%u "}; const char *fmt[] = {"%-4d +%u ", "%-4d +%2u "};
const unsigned int dB = rssi_dBm - s9_dBm; const unsigned int dB = ((rssi_dBm - s9_dBm) <= 99) ? rssi_dBm - s9_dBm : 99;
sprintf(s, (dB < 10) ? fmt[0] : fmt[1], rssi_dBm, dB); sprintf(s, (dB < 10) ? fmt[0] : fmt[1], rssi_dBm, dB);
} }
else else
@@ -167,11 +168,11 @@ bool center_line_is_free = true;
#if 1 #if 1
// solid bar // solid bar
for (i = 0; i < bar_width; i++) for (i = 0; i < bar_width; i++)
pLine[bar_x + i] = (i > len) ? ((i & 1) == 0) ? 0x41 : 0x00 : ((i & 1) == 0) ? 0x7f : 0x3e; p_line[bar_x + i] = (i > len) ? ((i & 1) == 0) ? 0x41 : 0x00 : ((i & 1) == 0) ? 0x7f : 0x3e;
#else #else
// knuled bar // knuled bar
for (i = 0; i < bar_width; i += 2) for (i = 0; i < bar_width; i += 2)
pLine[bar_x + i] = (i <= len) ? 0x7f : 0x41; p_line[bar_x + i] = (i <= len) ? 0x7f : 0x41;
#endif #endif
if (now) if (now)
@@ -186,24 +187,18 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo)
if (!center_line_is_free) if (!center_line_is_free)
return; return;
const bool rx = (gCurrentFunction == FUNCTION_RECEIVE || if (gCurrentFunction == FUNCTION_RECEIVE ||
gCurrentFunction == FUNCTION_MONITOR || gCurrentFunction == FUNCTION_MONITOR ||
gCurrentFunction == FUNCTION_INCOMING); gCurrentFunction == FUNCTION_INCOMING)
{
#if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA) UI_DisplayRSSIBar(rssi, true);
if (gEeprom.VfoInfo[gEeprom.RX_CHANNEL].AM_mode && gSetting_AM_fix) }
{ // AM test data is currently being shown
}
else
#endif
if (rx)
UI_DisplayRSSIBar(rssi, true);
#else #else
// const int16_t dBm = (rssi / 2) - 160; // const int16_t dBm = (rssi / 2) - 160;
const uint8_t Line = (vfo == 0) ? 3 : 7; const uint8_t Line = (vfo == 0) ? 3 : 7;
uint8_t *pLine = gFrameBuffer[Line - 1]; uint8_t *p_line = gFrameBuffer[Line - 1];
// TODO: sort out all 8 values from the eeprom // TODO: sort out all 8 values from the eeprom
@@ -258,31 +253,31 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo)
if (gCurrentFunction == FUNCTION_TRANSMIT || gScreenToDisplay != DISPLAY_MAIN) if (gCurrentFunction == FUNCTION_TRANSMIT || gScreenToDisplay != DISPLAY_MAIN)
return; // display is in use return; // display is in use
pLine = gFrameBuffer[Line - 1]; p_line = gFrameBuffer[Line - 1];
memset(pLine, 0, 23); memset(p_line, 0, 23);
if (rssi_level > 0) if (rssi_level > 0)
{ {
//if (rssi_level >= 1) //if (rssi_level >= 1)
memmove(pLine, BITMAP_Antenna, 5); memmove(p_line, BITMAP_Antenna, 5);
if (rssi_level >= 2) if (rssi_level >= 2)
memmove(pLine + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1)); memmove(p_line + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1));
if (rssi_level >= 3) if (rssi_level >= 3)
memmove(pLine + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2)); memmove(p_line + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2));
if (rssi_level >= 4) if (rssi_level >= 4)
memmove(pLine + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3)); memmove(p_line + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3));
if (rssi_level >= 5) if (rssi_level >= 5)
memmove(pLine + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4)); memmove(p_line + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4));
if (rssi_level >= 6) if (rssi_level >= 6)
memmove(pLine + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5)); memmove(p_line + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5));
if (rssi_level >= 7) if (rssi_level >= 7)
memmove(pLine + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6)); memmove(p_line + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6));
} }
else else
pLine = NULL; p_line = NULL;
ST7565_DrawLine(0, Line, 23, pLine); ST7565_DrawLine(0, Line, 23, p_line);
#endif #endif
} }
@@ -290,9 +285,12 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo)
void UI_DisplayMain(void) void UI_DisplayMain(void)
{ {
char String[16]; const unsigned int line0 = 0; // text screen line
unsigned int vfo_num; const unsigned int line1 = 4;
char String[16];
unsigned int vfo_num;
// true if the center screen line is available to use
center_line_is_free = true; center_line_is_free = true;
// #ifdef SINGLE_VFO_CHAN // #ifdef SINGLE_VFO_CHAN
@@ -301,6 +299,7 @@ void UI_DisplayMain(void)
const bool single_vfo = false; const bool single_vfo = false;
// #endif // #endif
// clear the screen
memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); memset(gFrameBuffer, 0, sizeof(gFrameBuffer));
if (gEeprom.KEY_LOCK && gKeypadLocked > 0) if (gEeprom.KEY_LOCK && gKeypadLocked > 0)
@@ -313,25 +312,28 @@ void UI_DisplayMain(void)
for (vfo_num = 0; vfo_num < 2; vfo_num++) for (vfo_num = 0; vfo_num < 2; vfo_num++)
{ {
uint8_t Channel = gEeprom.TX_CHANNEL; const unsigned int line = (vfo_num == 0) ? line0 : line1;
bool bIsSameVfo = !!(Channel == vfo_num); uint8_t channel = gEeprom.TX_CHANNEL;
uint8_t Line = (vfo_num == 0) ? 0 : 4; // uint8_t tx_channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL;
uint8_t *pLine0 = gFrameBuffer[Line + 0]; const bool same_vfo = (channel == vfo_num) ? true : false;
uint8_t *pLine1 = gFrameBuffer[Line + 1]; uint8_t *p_line0 = gFrameBuffer[line + 0];
uint8_t *p_line1 = gFrameBuffer[line + 1];
uint32_t duff_beer = 0;
uint8_t state;
if (single_vfo) if (single_vfo)
{ // we're in single VFO mode - screen is dedicated to just one VFO { // we're in single VFO mode - screen is dedicated to just one VFO
if (!bIsSameVfo) if (!same_vfo)
continue; // skip the unused vfo continue; // skip the unused vfo
} }
if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive) if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive)
Channel = gEeprom.RX_CHANNEL; // we're currently monitoring the other VFO channel = gEeprom.RX_CHANNEL; // we're currently monitoring the other VFO
if (Channel != vfo_num) if (channel != vfo_num)
{ {
if (gDTMF_CallState != DTMF_CALL_STATE_NONE || gDTMF_IsTx || gDTMF_InputMode) if (gDTMF_CallState != DTMF_CALL_STATE_NONE || gDTMF_IsTx || gDTMF_InputMode)
{ // show DTMF stuff { // show DTMF stuff
@@ -382,24 +384,22 @@ void UI_DisplayMain(void)
} }
// highlight the selected/used VFO with a marker // highlight the selected/used VFO with a marker
if (!single_vfo && bIsSameVfo) if (!single_vfo && same_vfo)
memmove(pLine0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); memmove(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default));
else else
if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF) if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF)
memmove(pLine0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault)); memmove(p_line0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault));
} }
else else
if (!single_vfo) if (!single_vfo)
{ // highlight the selected/used VFO with a marker { // highlight the selected/used VFO with a marker
if (bIsSameVfo) if (same_vfo)
memmove(pLine0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); memmove(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default));
else else
//if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF) //if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF)
memmove(pLine0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault)); memmove(p_line0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault));
} }
uint32_t duff_beer = 0;
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT)
{ // transmitting { // transmitting
@@ -409,11 +409,11 @@ void UI_DisplayMain(void)
else else
#endif #endif
{ {
Channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL; channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL;
if (Channel == vfo_num) if (channel == vfo_num)
{ // show the TX symbol { // show the TX symbol
duff_beer = 1; duff_beer = 1;
UI_PrintStringSmall("TX", 14, 0, Line); UI_PrintStringSmall("TX", 14, 0, line);
} }
} }
} }
@@ -421,7 +421,7 @@ void UI_DisplayMain(void)
{ // receiving .. show the RX symbol { // receiving .. show the RX symbol
duff_beer = 2; duff_beer = 2;
if ((gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR) && gEeprom.RX_CHANNEL == vfo_num) if ((gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR) && gEeprom.RX_CHANNEL == vfo_num)
UI_PrintStringSmall("RX", 14, 0, Line); UI_PrintStringSmall("RX", 14, 0, line);
} }
if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num]))
@@ -431,9 +431,9 @@ void UI_DisplayMain(void)
if (!inputting) if (!inputting)
NUMBER_ToDigits(gEeprom.ScreenChannel[vfo_num] + 1, String); // show the memory channel number NUMBER_ToDigits(gEeprom.ScreenChannel[vfo_num] + 1, String); // show the memory channel number
else else
memmove(String + 5, gInputBox, 3); // show the input text memmove(String + 5, gInputBox, 3); // show the input text
UI_PrintStringSmall("M", x, 0, Line + 1); UI_PrintStringSmall("M", x, 0, line + 1);
UI_DisplaySmallDigits(3, String + 5, x + 7, Line + 1, inputting); UI_DisplaySmallDigits(3, String + 5, x + 7, line + 1, inputting);
} }
else else
if (IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num])) if (IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]))
@@ -442,7 +442,7 @@ void UI_DisplayMain(void)
const unsigned int x = 2; // was 14 const unsigned int x = 2; // was 14
// sprintf(String, "FB%u", 1 + gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST); // sprintf(String, "FB%u", 1 + gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST);
sprintf(String, "VFO%u", 1 + gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST); sprintf(String, "VFO%u", 1 + gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST);
UI_PrintStringSmall(String, x, 0, Line + 1); UI_PrintStringSmall(String, x, 0, line + 1);
} }
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
else else
@@ -455,40 +455,33 @@ void UI_DisplayMain(void)
{ // user entering channel number { // user entering channel number
sprintf(String, "N%u%u", '0' + gInputBox[0], '0' + gInputBox[1]); sprintf(String, "N%u%u", '0' + gInputBox[0], '0' + gInputBox[1]);
} }
UI_PrintStringSmall(String, 7, 0, Line + 1); UI_PrintStringSmall(String, 7, 0, line + 1);
} }
#endif #endif
// ************ // ************
uint8_t State = VfoState[vfo_num]; state = VfoState[vfo_num];
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
if (gCurrentFunction == FUNCTION_TRANSMIT && gAlarmState == ALARM_STATE_ALARM) if (gCurrentFunction == FUNCTION_TRANSMIT && gAlarmState == ALARM_STATE_ALARM)
{ {
Channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL; channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL;
if (Channel == vfo_num) if (channel == vfo_num)
State = VFO_STATE_ALARM; state = VFO_STATE_ALARM;
} }
#endif #endif
if (State != VFO_STATE_NORMAL) if (state != VFO_STATE_NORMAL)
{ {
const char *state_list[] = {"", "BUSY", "BAT LOW", "TX DISABLE", "TIMEOUT", "ALARM", "VOLT HIGH"}; const char *state_list[] = {"", "BUSY", "BAT LOW", "TX DISABLE", "TIMEOUT", "ALARM", "VOLT HIGH"};
if (State >= 0 && State < ARRAY_SIZE(state_list)) if (state >= 0 && state < ARRAY_SIZE(state_list))
{ UI_PrintString(state_list[state], 31, 0, line, 8);
UI_PrintString(state_list[State], 31, 0, Line, 8);
}
//else
//{
// sprintf(String, "State %u ?", State);
// UI_PrintString(String, 31, 0, Line, 8);
//}
} }
else else
if (gInputBoxIndex > 0 && IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]) && gEeprom.TX_CHANNEL == vfo_num) if (gInputBoxIndex > 0 && IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]) && gEeprom.TX_CHANNEL == vfo_num)
{ // user entering a frequency { // user entering a frequency
UI_DisplayFrequency(gInputBox, 32, Line, true, false); UI_DisplayFrequency(gInputBox, 32, line, true, false);
center_line_is_free = false; center_line_is_free = false;
} }
@@ -497,8 +490,8 @@ void UI_DisplayMain(void)
uint32_t frequency = gEeprom.VfoInfo[vfo_num].pRX->Frequency; uint32_t frequency = gEeprom.VfoInfo[vfo_num].pRX->Frequency;
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT)
{ // transmitting { // transmitting
Channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL; channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL;
if (Channel == vfo_num) if (channel == vfo_num)
frequency = gEeprom.VfoInfo[vfo_num].pTX->Frequency; frequency = gEeprom.VfoInfo[vfo_num].pTX->Frequency;
} }
@@ -508,13 +501,13 @@ void UI_DisplayMain(void)
// show the channel symbols // show the channel symbols
const uint8_t attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]]; const uint8_t attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]];
if (attributes & MR_CH_SCANLIST1) if (attributes & MR_CH_SCANLIST1)
memmove(pLine0 + 113, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); memmove(p_line0 + 113, BITMAP_ScanList1, sizeof(BITMAP_ScanList1));
if (attributes & MR_CH_SCANLIST2) if (attributes & MR_CH_SCANLIST2)
memmove(pLine0 + 120, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); memmove(p_line0 + 120, BITMAP_ScanList2, sizeof(BITMAP_ScanList2));
#ifndef ENABLE_BIG_FREQ #ifndef ENABLE_BIG_FREQ
#ifdef ENABLE_COMPANDER #ifdef ENABLE_COMPANDER
if ((attributes & MR_CH_COMPAND) > 0) if ((attributes & MR_CH_COMPAND) > 0)
memmove(pLine0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand)); memmove(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand));
#endif #endif
#endif #endif
@@ -524,19 +517,19 @@ void UI_DisplayMain(void)
#ifdef ENABLE_BIG_FREQ #ifdef ENABLE_BIG_FREQ
NUMBER_ToDigits(frequency, String); NUMBER_ToDigits(frequency, String);
// show the main large frequency digits // show the main large frequency digits
UI_DisplayFrequency(String, 32, Line, false, false); UI_DisplayFrequency(String, 32, line, false, false);
// show the remaining 2 small frequency digits // show the remaining 2 small frequency digits
UI_DisplaySmallDigits(2, String + 6, 113, Line + 1, true); UI_DisplaySmallDigits(2, String + 6, 113, line + 1, true);
#else #else
// show the frequency in the main font // show the frequency in the main font
sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000);
UI_PrintString(String, 32, 0, Line, 8); UI_PrintString(String, 32, 0, line, 8);
#endif #endif
break; break;
case MDF_CHANNEL: // show the channel number case MDF_CHANNEL: // show the channel number
sprintf(String, "CH-%03u", gEeprom.ScreenChannel[vfo_num] + 1); sprintf(String, "CH-%03u", gEeprom.ScreenChannel[vfo_num] + 1);
UI_PrintString(String, 32, 0, Line, 8); UI_PrintString(String, 32, 0, line, 8);
break; break;
case MDF_NAME: // show the channel name case MDF_NAME: // show the channel name
@@ -550,19 +543,19 @@ void UI_DisplayMain(void)
if (gEeprom.CHANNEL_DISPLAY_MODE == MDF_NAME) if (gEeprom.CHANNEL_DISPLAY_MODE == MDF_NAME)
{ {
UI_PrintString(String, 32, 0, Line, 8); UI_PrintString(String, 32, 0, line, 8);
} }
else else
{ {
#ifdef ENABLE_SMALL_BOLD #ifdef ENABLE_SMALL_BOLD
UI_PrintStringSmallBold(String, 32 + 4, 0, Line); UI_PrintStringSmallBold(String, 32 + 4, 0, line);
#else #else
UI_PrintStringSmall(String, 32 + 4, 0, Line); UI_PrintStringSmall(String, 32 + 4, 0, line);
#endif #endif
// show the channel frequency below the channel number/name // show the channel frequency below the channel number/name
sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000);
UI_PrintStringSmall(String, 32 + 4, 0, Line + 1); UI_PrintStringSmall(String, 32 + 4, 0, line + 1);
} }
break; break;
@@ -573,13 +566,13 @@ void UI_DisplayMain(void)
#ifdef ENABLE_BIG_FREQ #ifdef ENABLE_BIG_FREQ
NUMBER_ToDigits(frequency, String); // 8 digits NUMBER_ToDigits(frequency, String); // 8 digits
// show the main large frequency digits // show the main large frequency digits
UI_DisplayFrequency(String, 32, Line, false, false); UI_DisplayFrequency(String, 32, line, false, false);
// show the remaining 2 small frequency digits // show the remaining 2 small frequency digits
UI_DisplaySmallDigits(2, String + 6, 113, Line + 1, true); UI_DisplaySmallDigits(2, String + 6, 113, line + 1, true);
#else #else
// show the frequency in the main font // show the frequency in the main font
sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000); sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000);
UI_PrintString(String, 32, 0, Line, 8); UI_PrintString(String, 32, 0, line, 8);
#endif #endif
#ifdef ENABLE_COMPANDER #ifdef ENABLE_COMPANDER
@@ -587,9 +580,9 @@ void UI_DisplayMain(void)
const uint8_t attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]]; const uint8_t attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]];
if ((attributes & MR_CH_COMPAND) > 0) if ((attributes & MR_CH_COMPAND) > 0)
#ifdef ENABLE_BIG_FREQ #ifdef ENABLE_BIG_FREQ
memmove(pLine0 + 120, BITMAP_compand, sizeof(BITMAP_compand)); memmove(p_line0 + 120, BITMAP_compand, sizeof(BITMAP_compand));
#else #else
memmove(pLine0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand)); memmove(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand));
#endif #endif
#endif #endif
} }
@@ -621,20 +614,20 @@ void UI_DisplayMain(void)
if (Level >= 1) if (Level >= 1)
{ {
uint8_t *pLine = pLine1 + LCD_WIDTH; uint8_t *p_line = p_line1 + LCD_WIDTH;
memmove(pLine + 0, BITMAP_Antenna, sizeof(BITMAP_Antenna)); memmove(p_line + 0, BITMAP_Antenna, sizeof(BITMAP_Antenna));
if (Level >= 2) if (Level >= 2)
memmove(pLine + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1)); memmove(p_line + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1));
if (Level >= 3) if (Level >= 3)
memmove(pLine + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2)); memmove(p_line + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2));
if (Level >= 4) if (Level >= 4)
memmove(pLine + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3)); memmove(p_line + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3));
if (Level >= 5) if (Level >= 5)
memmove(pLine + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4)); memmove(p_line + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4));
if (Level >= 6) if (Level >= 6)
memmove(pLine + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5)); memmove(p_line + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5));
if (Level >= 7) if (Level >= 7)
memmove(pLine + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6)); memmove(p_line + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6));
} }
} }
@@ -653,15 +646,15 @@ void UI_DisplayMain(void)
if (code_type >= 0 && code_type < ARRAY_SIZE(code_list)) if (code_type >= 0 && code_type < ARRAY_SIZE(code_list))
strcpy(String, code_list[code_type]); strcpy(String, code_list[code_type]);
} }
UI_PrintStringSmall(String, LCD_WIDTH + 24, 0, Line + 1); UI_PrintStringSmall(String, LCD_WIDTH + 24, 0, line + 1);
if (State != VFO_STATE_TX_DISABLE) if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM)
{ // show the TX power { // show the TX power
const char pwr_list[] = "LMH"; const char pwr_list[] = "LMH";
const unsigned int i = gEeprom.VfoInfo[vfo_num].OUTPUT_POWER; const unsigned int i = gEeprom.VfoInfo[vfo_num].OUTPUT_POWER;
String[0] = (i >= 0 && i < ARRAY_SIZE(pwr_list)) ? pwr_list[i] : '\0'; String[0] = (i >= 0 && i < ARRAY_SIZE(pwr_list)) ? pwr_list[i] : '\0';
String[1] = '\0'; String[1] = '\0';
UI_PrintStringSmall(String, LCD_WIDTH + 46, 0, Line + 1); UI_PrintStringSmall(String, LCD_WIDTH + 46, 0, line + 1);
} }
if (gEeprom.VfoInfo[vfo_num].freq_config_RX.Frequency != gEeprom.VfoInfo[vfo_num].freq_config_TX.Frequency) if (gEeprom.VfoInfo[vfo_num].freq_config_RX.Frequency != gEeprom.VfoInfo[vfo_num].freq_config_TX.Frequency)
@@ -670,12 +663,12 @@ void UI_DisplayMain(void)
const unsigned int i = gEeprom.VfoInfo[vfo_num].TX_OFFSET_FREQUENCY_DIRECTION; const unsigned int i = gEeprom.VfoInfo[vfo_num].TX_OFFSET_FREQUENCY_DIRECTION;
String[0] = (i < sizeof(dir_list)) ? dir_list[i] : '?'; String[0] = (i < sizeof(dir_list)) ? dir_list[i] : '?';
String[1] = '\0'; String[1] = '\0';
UI_PrintStringSmall(String, LCD_WIDTH + 54, 0, Line + 1); UI_PrintStringSmall(String, LCD_WIDTH + 54, 0, line + 1);
} }
// show the TX/RX reverse symbol // show the TX/RX reverse symbol
if (gEeprom.VfoInfo[vfo_num].FrequencyReverse) if (gEeprom.VfoInfo[vfo_num].FrequencyReverse)
UI_PrintStringSmall("R", LCD_WIDTH + 62, 0, Line + 1); UI_PrintStringSmall("R", LCD_WIDTH + 62, 0, line + 1);
{ // show the narrow band symbol { // show the narrow band symbol
String[0] = '\0'; String[0] = '\0';
@@ -684,16 +677,16 @@ void UI_DisplayMain(void)
String[0] = 'N'; String[0] = 'N';
String[1] = '\0'; String[1] = '\0';
} }
UI_PrintStringSmall(String, LCD_WIDTH + 70, 0, Line + 1); UI_PrintStringSmall(String, LCD_WIDTH + 70, 0, line + 1);
} }
// show the DTMF decoding symbol // show the DTMF decoding symbol
if (gEeprom.VfoInfo[vfo_num].DTMF_DECODING_ENABLE || gSetting_KILLED) if (gEeprom.VfoInfo[vfo_num].DTMF_DECODING_ENABLE || gSetting_KILLED)
UI_PrintStringSmall("DTMF", LCD_WIDTH + 78, 0, Line + 1); UI_PrintStringSmall("DTMF", LCD_WIDTH + 78, 0, line + 1);
// show the audio scramble symbol // show the audio scramble symbol
if (gEeprom.VfoInfo[vfo_num].SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable) if (gEeprom.VfoInfo[vfo_num].SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable)
UI_PrintStringSmall("SCR", LCD_WIDTH + 106, 0, Line + 1); UI_PrintStringSmall("SCR", LCD_WIDTH + 106, 0, line + 1);
} }
if (center_line_is_free) if (center_line_is_free)
@@ -705,7 +698,10 @@ void UI_DisplayMain(void)
#ifdef ENABLE_AUDIO_BAR #ifdef ENABLE_AUDIO_BAR
if (gSetting_mic_bar && gCurrentFunction == FUNCTION_TRANSMIT) if (gSetting_mic_bar && gCurrentFunction == FUNCTION_TRANSMIT)
{
UI_DisplayAudioBar(); UI_DisplayAudioBar();
center_line_is_free = false;
}
else else
#endif #endif
@@ -714,16 +710,20 @@ void UI_DisplayMain(void)
{ {
AM_fix_print_data(gEeprom.RX_CHANNEL, String); AM_fix_print_data(gEeprom.RX_CHANNEL, String);
UI_PrintStringSmall(String, 2, 0, 3); UI_PrintStringSmall(String, 2, 0, 3);
center_line_is_free = false;
} }
else else
#endif #endif
#ifdef ENABLE_RSSI_BAR #ifdef ENABLE_RSSI_BAR
if (rx) if (rx)
{
UI_DisplayRSSIBar(gCurrentRSSI[gEeprom.RX_CHANNEL], false); UI_DisplayRSSIBar(gCurrentRSSI[gEeprom.RX_CHANNEL], false);
center_line_is_free = false;
}
else else
#endif #endif
if (rx || gCurrentFunction == FUNCTION_FOREGROUND || gCurrentFunction == FUNCTION_POWER_SAVE) if (rx || gCurrentFunction == FUNCTION_FOREGROUND || gCurrentFunction == FUNCTION_POWER_SAVE)
{ {
#if 1 #if 1
@@ -734,6 +734,7 @@ void UI_DisplayMain(void)
strcpy(String, "DTMF "); strcpy(String, "DTMF ");
strcat(String, gDTMF_RX_live + idx); strcat(String, gDTMF_RX_live + idx);
UI_PrintStringSmall(String, 2, 0, 3); UI_PrintStringSmall(String, 2, 0, 3);
center_line_is_free = false;
} }
#else #else
if (gSetting_live_DTMF_decoder && gDTMF_RX_index > 0) if (gSetting_live_DTMF_decoder && gDTMF_RX_index > 0)
@@ -743,6 +744,7 @@ void UI_DisplayMain(void)
strcpy(String, "DTMF "); strcpy(String, "DTMF ");
strcat(String, gDTMF_RX + idx); strcat(String, gDTMF_RX + idx);
UI_PrintStringSmall(String, 2, 0, 3); UI_PrintStringSmall(String, 2, 0, 3);
center_line_is_free = false;
} }
#endif #endif
@@ -750,9 +752,11 @@ void UI_DisplayMain(void)
else else
if (gChargingWithTypeC) if (gChargingWithTypeC)
{ // charging .. show the battery state { // charging .. show the battery state
const uint16_t percent = BATTERY_VoltsToPercent(gBatteryVoltageAverage); sprintf(String, "Charge %u.%02uV %u%%",
sprintf(String, "Charge %u.%02uV %u%%", gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100, percent); gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100,
UI_PrintStringSmall(String, 2, 0, 3); BATTERY_VoltsToPercent(gBatteryVoltageAverage));
UI_PrintStringSmall(String, 2, 0, 3);
center_line_is_free = false;
} }
#endif #endif
} }

244
ui/menu.c
View File

@@ -91,11 +91,11 @@ const t_menu_item MenuList[] =
{"ANI-ID", VOICE_ID_ANI_CODE, MENU_ANI_ID }, {"ANI-ID", VOICE_ID_ANI_CODE, MENU_ANI_ID },
{"UPCODE", VOICE_ID_INVALID, MENU_UPCODE }, {"UPCODE", VOICE_ID_INVALID, MENU_UPCODE },
{"DWCODE", VOICE_ID_INVALID, MENU_DWCODE }, {"DWCODE", VOICE_ID_INVALID, MENU_DWCODE },
{"PTT-ID", VOICE_ID_INVALID, MENU_PTT_ID },
{"D-ST", VOICE_ID_INVALID, MENU_D_ST }, {"D-ST", VOICE_ID_INVALID, MENU_D_ST },
{"D-RSP", VOICE_ID_INVALID, MENU_D_RSP }, {"D-RSP", VOICE_ID_INVALID, MENU_D_RSP },
{"D-HOLD", VOICE_ID_INVALID, MENU_D_HOLD }, {"D-HOLD", VOICE_ID_INVALID, MENU_D_HOLD },
{"D-PRE", VOICE_ID_INVALID, MENU_D_PRE }, {"D-PRE", VOICE_ID_INVALID, MENU_D_PRE },
{"PTT-ID", VOICE_ID_INVALID, MENU_PTT_ID },
{"D-DCD", VOICE_ID_INVALID, MENU_D_DCD }, {"D-DCD", VOICE_ID_INVALID, MENU_D_DCD },
{"D-LIST", VOICE_ID_INVALID, MENU_D_LIST }, {"D-LIST", VOICE_ID_INVALID, MENU_D_LIST },
{"D-LIVE", VOICE_ID_INVALID, MENU_D_LIVE_DEC }, // live DTMF decoder {"D-LIVE", VOICE_ID_INVALID, MENU_D_LIVE_DEC }, // live DTMF decoder
@@ -127,6 +127,7 @@ const t_menu_item MenuList[] =
{"TX-EN", VOICE_ID_INVALID, MENU_TX_EN }, // enable TX {"TX-EN", VOICE_ID_INVALID, MENU_TX_EN }, // enable TX
{"F-CALI", VOICE_ID_INVALID, MENU_F_CALI }, // reference xtal calibration {"F-CALI", VOICE_ID_INVALID, MENU_F_CALI }, // reference xtal calibration
{"BATCAL", VOICE_ID_INVALID, MENU_BATCAL }, // battery voltage calibration
{"", VOICE_ID_INVALID, 0xff } // end of list - DO NOT delete or move this this {"", VOICE_ID_INVALID, 0xff } // end of list - DO NOT delete or move this this
}; };
@@ -168,7 +169,6 @@ const char gSubMenu_SAVE[5][4] =
const char gSubMenu_TOT[11][7] = const char gSubMenu_TOT[11][7] =
{ {
"OFF",
"30 sec", "30 sec",
"1 min", "1 min",
"2 min", "2 min",
@@ -178,21 +178,22 @@ const char gSubMenu_TOT[11][7] =
"6 min", "6 min",
"7 min", "7 min",
"8 min", "8 min",
"9 min" "9 min",
"15 min"
}; };
const char gSubMenu_CHAN[3][7] = const char gSubMenu_CHAN[3][10] =
{ {
"OFF", "OFF",
"CHAN A", "UPPER\nVFO",
"CHAN B" "LOWER\nVFO"
}; };
const char gSubMenu_XB[3][7] = const char gSubMenu_XB[3][10] =
{ {
"SAME", "MAIN\nVFO",
"CHAN A", "UPPER\nVFO",
"CHAN B" "LOWER\nVFO"
}; };
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -204,19 +205,22 @@ const char gSubMenu_XB[3][7] =
}; };
#endif #endif
const char gSubMenu_SC_REV[3][3] = const char gSubMenu_SC_REV[3][13] =
{ {
"TO", // "TIME\nOPER",
"CO", // "CARRIER\nOPER",
"SE" // "SEARCH\nOPER"
"TIME",
"CARRIER",
"SEARCH"
}; };
const char gSubMenu_MDF[4][8] = const char gSubMenu_MDF[4][15] =
{ {
"FREQ", "FREQ",
"CHAN", "CHANNEL\nNUMBER",
"NAME", "NAME",
"NAM+FRE" "NAME\n+\nFREQ"
}; };
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
@@ -235,19 +239,19 @@ const char gSubMenu_D_RSP[4][6] =
"BOTH" "BOTH"
}; };
const char gSubMenu_PTT_ID[4][5] = const char gSubMenu_PTT_ID[4][7] =
{ {
"OFF", "OFF",
"BOT", "KEY UP",
"EOT", "KEY DN",
"BOTH" "BOTH"
}; };
const char gSubMenu_PONMSG[4][5] = const char gSubMenu_PONMSG[4][8] =
{ {
"FULL", "FULL",
"MSG", "MESSAGE",
"VOL", "VOLTAGE",
"NONE" "NONE"
}; };
@@ -332,9 +336,10 @@ bool gIsInSubMenu;
uint8_t gMenuCursor; uint8_t gMenuCursor;
int8_t gMenuScrollDirection; int8_t gMenuScrollDirection;
int32_t gSubMenuSelection; int32_t gSubMenuSelection;
int32_t gSubMenuSelection_original = 0; // copy of the original value
// edit box // edit box
char edit_original[17]; // a copy of the text before editing so that we can easily test for changes/difference char edit_original[17] = {0}; // a copy of the text before editing so that we can easily test for changes/difference
char edit[17]; char edit[17];
int edit_index; int edit_index;
@@ -344,34 +349,89 @@ void UI_DisplayMenu(void)
const unsigned int menu_item_x1 = (8 * menu_list_width) + 2; const unsigned int menu_item_x1 = (8 * menu_list_width) + 2;
const unsigned int menu_item_x2 = LCD_WIDTH - 1; const unsigned int menu_item_x2 = LCD_WIDTH - 1;
unsigned int i; unsigned int i;
char String[16]; char String[64];
char Contact[16]; char Contact[16];
// clear the screen
memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); memset(gFrameBuffer, 0, sizeof(gFrameBuffer));
for (i = 0; i < 3; i++) // draw the left menu list
if (gMenuCursor > 0 || i > 0) #if 0
if ((gMenuListCount - 1) != gMenuCursor || i != 2)
UI_PrintString(MenuList[gMenuCursor + i - 1].name, 0, 0, i * 2, 8);
// invert the menu list text pixels for (i = 0; i < 3; i++)
for (i = 0; i < (8 * menu_list_width); i++) if (gMenuCursor > 0 || i > 0)
if ((gMenuListCount - 1) != gMenuCursor || i != 2)
UI_PrintString(MenuList[gMenuCursor + i - 1].name, 0, 0, i * 2, 8);
// invert the current menu list item text pixels
for (i = 0; i < (8 * menu_list_width); i++)
{
gFrameBuffer[2][i] ^= 0xFF;
gFrameBuffer[3][i] ^= 0xFF;
}
// draw vertical separating dotted line
for (i = 0; i < 7; i++)
gFrameBuffer[i][(8 * menu_list_width) + 1] = 0xAA;
// draw the little triangle marker if we're in the sub-menu
if (gIsInSubMenu)
memmove(gFrameBuffer[0] + (8 * menu_list_width) + 1, BITMAP_CurrentIndicator, sizeof(BITMAP_CurrentIndicator));
// draw the menu index number/count
sprintf(String, "%2u.%u", 1 + gMenuCursor, gMenuListCount);
UI_PrintStringSmall(String, 2, 0, 6);
#else
{ {
gFrameBuffer[2][i] ^= 0xFF; const int menu_index = gMenuCursor; // current selected menu item
gFrameBuffer[3][i] ^= 0xFF; i = 1;
if (!gIsInSubMenu)
{
while (i < 2)
{ // leading menu items
const int k = menu_index + i - 2;
if (k < 0)
UI_PrintStringSmall(MenuList[gMenuListCount + k].name, 0, 0, i); // wrap-a-round
else
if (k >= 0 && k < (int)gMenuListCount)
UI_PrintStringSmall(MenuList[k].name, 0, 0, i);
i++;
}
// current menu item
if (menu_index >= 0 && menu_index < (int)gMenuListCount)
UI_PrintString(MenuList[menu_index].name, 0, 0, 2, 8);
i++;
while (i < 4)
{ // trailing menu item
const int k = menu_index + i - 2;
if (k >= 0 && k < (int)gMenuListCount)
UI_PrintStringSmall(MenuList[k].name, 0, 0, 1 + i);
else
if (k >= (int)gMenuListCount)
UI_PrintStringSmall(MenuList[gMenuListCount - k].name, 0, 0, 1 + i); // wrap-a-round
i++;
}
// draw the menu index number/count
sprintf(String, "%2u.%u", 1 + gMenuCursor, gMenuListCount);
UI_PrintStringSmall(String, 2, 0, 6);
}
else
if (menu_index >= 0 && menu_index < (int)gMenuListCount)
{ // current menu item
strcpy(String, MenuList[menu_index].name);
// strcat(String, ":");
UI_PrintString(String, 0, 0, 0, 8);
// UI_PrintStringSmall(String, 0, 0, 0);
}
} }
#endif
// draw vertical separating dotted line // **************
for (i = 0; i < 7; i++)
gFrameBuffer[i][(8 * menu_list_width) + 1] = 0xAA;
// draw the menu index number/count
sprintf(String, "%2u.%u", 1 + gMenuCursor, gMenuListCount);
UI_PrintStringSmall(String, 8, 0, 6);
// draw the little marker
if (gIsInSubMenu)
memmove(gFrameBuffer[0] + (8 * menu_list_width) + 1, BITMAP_CurrentIndicator, sizeof(BITMAP_CurrentIndicator));
memset(String, 0, sizeof(String)); memset(String, 0, sizeof(String));
@@ -673,29 +733,9 @@ void UI_DisplayMenu(void)
break; break;
case MENU_VOL: case MENU_VOL:
sprintf(String, "%u.%02uV\n%u%%",
// 1st text line gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100,
sprintf(String, "%u.%02uV", gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100); BATTERY_VoltsToPercent(gBatteryVoltageAverage));
UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8);
{ // 2nd text line .. percentage
UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8);
const uint16_t percent = BATTERY_VoltsToPercent(gBatteryVoltageAverage);
sprintf(String, "%u%%", percent);
UI_PrintString(String, menu_item_x1, menu_item_x2, 3, 8);
#if 0
sprintf(String, "Curr %u", gBatteryCurrent); // needs scaling into mA
UI_PrintString(String, menu_item_x1, menu_item_x2, 5, 8);
#endif
}
if(gF_LOCK){
gBatteryCalibration[3] = gSubMenuSelection;
sprintf(String, "%u", gSubMenuSelection);
UI_PrintString(String, menu_item_x1, menu_item_x2, 5, 8);
}
already_printed = true;
break; break;
case MENU_RESET: case MENU_RESET:
@@ -708,26 +748,72 @@ void UI_DisplayMenu(void)
case MENU_F_CALI: case MENU_F_CALI:
{ {
const uint32_t value = 22656 + gSubMenuSelection; const uint32_t value = 22656 + gSubMenuSelection;
const uint32_t xtal_Hz = (0x4f0000u + value) * 5;
//gEeprom.BK4819_XTAL_FREQ_LOW = gSubMenuSelection; // already set when the user was adjusting the value //gEeprom.BK4819_XTAL_FREQ_LOW = gSubMenuSelection; // already set when the user was adjusting the value
BK4819_WriteRegister(BK4819_REG_3B, value); BK4819_WriteRegister(BK4819_REG_3B, value);
sprintf(String, "%d", gSubMenuSelection); sprintf(String, "%d\n%u.%06u\nMHz",
UI_PrintString(String, menu_item_x1, menu_item_x2, 0, 8); gSubMenuSelection,
xtal_Hz / 1000000, xtal_Hz % 1000000);
const uint32_t xtal_Hz = (0x4f0000u + value) * 5;
sprintf(String, "%u.%06u", xtal_Hz / 1000000, xtal_Hz % 1000000);
UI_PrintString(String, menu_item_x1, menu_item_x2, 2, 8);
UI_PrintString("MHz", menu_item_x1, menu_item_x2, 4, 8);
already_printed = true;
} }
break; break;
case MENU_BATCAL:
{
const uint16_t vol = (uint32_t)gBatteryVoltageAverage * gBatteryCalibration[3] / gSubMenuSelection;
sprintf(String, "%u.%02uV\n%u", vol / 100, vol % 100, gSubMenuSelection);
break;
}
} }
if (!already_printed) if (!already_printed)
UI_PrintString(String, menu_item_x1, menu_item_x2, 2, 8); {
unsigned int y;
unsigned int k = 0;
unsigned int lines = 1;
unsigned int len = strlen(String);
bool small = false;
if (len > 0)
{
// count number of lines
for (i = 0; i < len; i++)
{
if (String[i] == '\n' && i < (len - 1))
{
lines++;
String[i] = 0;
}
}
if (lines > 3)
{ // use small text
small = true;
if (lines > 7)
lines = 7;
}
// move the 1st line up
if (small)
y = 3 - ((lines + 0) / 2);
else
y = 2 - ((lines + 0) / 2);
for (i = 0; i < len && lines > 0; lines--)
{
if (small)
UI_PrintStringSmall(String + k, menu_item_x1, menu_item_x2, y);
else
UI_PrintString(String + k, menu_item_x1, menu_item_x2, y, 8);
while (i < len && String[i] >= 32)
i++;
k = ++i;
y += small ? 1 : 2;
}
}
}
if (gMenuCursor == MENU_SLIST1 || gMenuCursor == MENU_SLIST2) if (gMenuCursor == MENU_SLIST1 || gMenuCursor == MENU_SLIST2)
{ {

View File

@@ -79,11 +79,11 @@ enum
MENU_ANI_ID, MENU_ANI_ID,
MENU_UPCODE, MENU_UPCODE,
MENU_DWCODE, MENU_DWCODE,
MENU_PTT_ID,
MENU_D_ST, MENU_D_ST,
MENU_D_RSP, MENU_D_RSP,
MENU_D_HOLD, MENU_D_HOLD,
MENU_D_PRE, MENU_D_PRE,
MENU_PTT_ID,
MENU_D_DCD, MENU_D_DCD,
MENU_D_LIST, MENU_D_LIST,
MENU_D_LIVE_DEC, MENU_D_LIVE_DEC,
@@ -113,7 +113,8 @@ enum
MENU_SCREN, MENU_SCREN,
MENU_TX_EN, // enable TX MENU_TX_EN, // enable TX
MENU_F_CALI // reference xtal calibration MENU_F_CALI, // reference xtal calibration
MENU_BATCAL // battery voltage calibration
}; };
extern const t_menu_item MenuList[]; extern const t_menu_item MenuList[];
@@ -124,19 +125,19 @@ extern const char gSubMenu_W_N[2][7];
extern const char gSubMenu_OFF_ON[2][4]; extern const char gSubMenu_OFF_ON[2][4];
extern const char gSubMenu_SAVE[5][4]; extern const char gSubMenu_SAVE[5][4];
extern const char gSubMenu_TOT[11][7]; extern const char gSubMenu_TOT[11][7];
extern const char gSubMenu_CHAN[3][7]; extern const char gSubMenu_CHAN[3][10];
extern const char gSubMenu_XB[3][7]; extern const char gSubMenu_XB[3][10];
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
extern const char gSubMenu_VOICE[3][4]; extern const char gSubMenu_VOICE[3][4];
#endif #endif
extern const char gSubMenu_SC_REV[3][3]; extern const char gSubMenu_SC_REV[3][13];
extern const char gSubMenu_MDF[4][8]; extern const char gSubMenu_MDF[4][15];
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
extern const char gSubMenu_AL_MOD[2][5]; extern const char gSubMenu_AL_MOD[2][5];
#endif #endif
extern const char gSubMenu_D_RSP[4][6]; extern const char gSubMenu_D_RSP[4][6];
extern const char gSubMenu_PTT_ID[4][5]; extern const char gSubMenu_PTT_ID[4][7];
extern const char gSubMenu_PONMSG[4][5]; extern const char gSubMenu_PONMSG[4][8];
extern const char gSubMenu_ROGER[3][6]; extern const char gSubMenu_ROGER[3][6];
extern const char gSubMenu_RESET[2][4]; extern const char gSubMenu_RESET[2][4];
extern const char gSubMenu_F_LOCK[6][4]; extern const char gSubMenu_F_LOCK[6][4];
@@ -156,6 +157,7 @@ extern bool gIsInSubMenu;
extern uint8_t gMenuCursor; extern uint8_t gMenuCursor;
extern int8_t gMenuScrollDirection; extern int8_t gMenuScrollDirection;
extern int32_t gSubMenuSelection; extern int32_t gSubMenuSelection;
extern int32_t gSubMenuSelection_original;
extern char edit_original[17]; extern char edit_original[17];
extern char edit[17]; extern char edit[17];

View File

@@ -169,8 +169,7 @@ void UI_DisplayStatus(const bool test_display)
case 2: // percentage case 2: // percentage
{ {
const uint16_t percent = BATTERY_VoltsToPercent(gBatteryVoltageAverage); sprintf(s, "%u%%", BATTERY_VoltsToPercent(gBatteryVoltageAverage));
sprintf(s, "%u%%", percent);
space_needed = (7 * strlen(s)); space_needed = (7 * strlen(s));
if (x2 >= (x1 + space_needed)) if (x2 >= (x1 + space_needed))
UI_PrintStringSmallBuffer(s, line + x2 - space_needed); UI_PrintStringSmallBuffer(s, line + x2 - space_needed);

View File

@@ -91,7 +91,6 @@ void GUI_SelectNextDisplay(GUI_DisplayType_t Display)
gAskForConfirmation = 0; gAskForConfirmation = 0;
gDTMF_InputMode = false; gDTMF_InputMode = false;
gDTMF_InputIndex = 0; gDTMF_InputIndex = 0;
gF_LOCK = false;
gAskToSave = false; gAskToSave = false;
gAskToDelete = false; gAskToDelete = false;

View File

@@ -27,6 +27,18 @@
#include "ui/status.h" #include "ui/status.h"
#include "version.h" #include "version.h"
void UI_DisplayReleaseKeys(void)
{
memset(gStatusLine, 0, sizeof(gStatusLine));
memset(gFrameBuffer, 0, sizeof(gFrameBuffer));
UI_PrintString("RELEASE", 0, 127, 1, 10);
UI_PrintString("ALL KEYS", 0, 127, 3, 10);
ST7565_BlitStatusLine(); // blank status line
ST7565_BlitFullScreen();
}
void UI_DisplayWelcome(void) void UI_DisplayWelcome(void)
{ {
char WelcomeString0[16]; char WelcomeString0[16];

View File

@@ -17,6 +17,7 @@
#ifndef UI_WELCOME_H #ifndef UI_WELCOME_H
#define UI_WELCOME_H #define UI_WELCOME_H
void UI_DisplayReleaseKeys(void);
void UI_DisplayWelcome(void); void UI_DisplayWelcome(void);
#endif #endif

View File

@@ -4,7 +4,7 @@
#ifdef GIT_HASH #ifdef GIT_HASH
#define VER GIT_HASH #define VER GIT_HASH
#else #else
#define VER "230929" #define VER "231002"
#endif #endif
#ifndef ONE_OF_ELEVEN_VER #ifndef ONE_OF_ELEVEN_VER