diff --git a/Makefile b/Makefile index 3074bac..6cb1dce 100644 --- a/Makefile +++ b/Makefile @@ -163,7 +163,8 @@ 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=gnu11 -MMD ifeq ($(ENABLE_LTO),1) - CFLAGS += -flto +# CFLAGS += -flto + CFLAGS += -flto=2 endif CFLAGS += -DPRINTF_INCLUDE_CONFIG_H diff --git a/app/app.c b/app/app.c index cc6b2b6..38556e0 100644 --- a/app/app.c +++ b/app/app.c @@ -2434,8 +2434,8 @@ Skip: if (gFlagRefreshSetting) { - MENU_ShowCurrentSetting(); gFlagRefreshSetting = false; + MENU_ShowCurrentSetting(); } if (gFlagStartScan) diff --git a/app/main.c b/app/main.c index f7c9e8a..b5f4fcc 100644 --- a/app/main.c +++ b/app/main.c @@ -596,8 +596,11 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) if (bFlag) { - gFlagRefreshSetting = true; + gFlagRefreshSetting = true; + gFlagBackupSetting = true; + gRequestDisplayScreen = DISPLAY_MENU; + #ifdef ENABLE_VOICE gAnotherVoiceID = VOICE_ID_MENU; #endif diff --git a/app/menu.c b/app/menu.c index c19fcd4..722a461 100644 --- a/app/menu.c +++ b/app/menu.c @@ -32,6 +32,7 @@ #include "driver/gpio.h" #include "driver/keyboard.h" #include "frequencies.h" +#include "helper/battery.h" #include "misc.h" #include "settings.h" #if defined(ENABLE_OVERLAY) @@ -46,6 +47,27 @@ #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #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) { gCssScanMode = CSS_SCAN_MODE_SCANNING; @@ -268,6 +290,11 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) *pMax = ARRAY_SIZE(gSubMenu_PTT_ID) - 1; break; + case MENU_VOL: + *pMin = 1760; // 0 + *pMax = 2000; // 2300 + break; + case MENU_BAT_TXT: *pMin = 0; *pMax = ARRAY_SIZE(gSubMenu_BAT_TXT) - 1; @@ -546,7 +573,7 @@ void MENU_AcceptSetting(void) gSetting_mic_bar = gSubMenuSelection; break; #endif - + #ifdef ENABLE_COMPANDER case MENU_COMPAND: gTxVfo->Compander = gSubMenuSelection; @@ -589,6 +616,11 @@ void MENU_AcceptSetting(void) gRequestSaveChannel = 1; return; + case MENU_VOL: + if (gF_LOCK) + EEPROM_WriteBuffer(0x1F40, gBatteryCalibration); + break; + case MENU_BAT_TXT: gSetting_battery_text = gSubMenuSelection; break; @@ -699,24 +731,8 @@ void MENU_AcceptSetting(void) break; case MENU_F_CALI: - gEeprom.BK4819_XTAL_FREQ_LOW = gSubMenuSelection; - BK4819_WriteRegister(BK4819_REG_3B, 22656 + gEeprom.BK4819_XTAL_FREQ_LOW); - { - 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); - } + if (gF_LOCK) + writeXtalFreqCal(gSubMenuSelection); return; } @@ -944,7 +960,7 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gSetting_mic_bar; break; #endif - + #ifdef ENABLE_COMPANDER case MENU_COMPAND: gSubMenuSelection = gTxVfo->Compander; @@ -993,6 +1009,10 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gTxVfo->DTMF_PTT_ID_TX_MODE; break; + case MENU_VOL: + gSubMenuSelection = gBatteryCalibration[3]; + return; + case MENU_BAT_TXT: gSubMenuSelection = gSetting_battery_text; return; @@ -1026,7 +1046,7 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gSetting_AM_fix; break; #endif - + #ifdef ENABLE_AM_FIX_TEST1 case MENU_AM_FIX_TEST1: gSubMenuSelection = gSetting_AM_fix_test1; @@ -1079,6 +1099,12 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gEeprom.BK4819_XTAL_FREQ_LOW; break; } + +// if (gFlagBackupSetting) + { // save a copy incase the user wants to back out +// gFlagBackupSetting = false; + gSubMenuSelection_original = gSubMenuSelection; + } } static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) @@ -1127,11 +1153,12 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gInputBoxIndex = 0; Value = (gInputBox[0] * 10) + gInputBox[1]; - + if (Value > 0 && Value <= gMenuListCount) { gMenuCursor = Value - 1; gFlagRefreshSetting = true; + gFlagBackupSetting = true; return; } @@ -1140,13 +1167,14 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gInputBox[0] = gInputBox[1]; gInputBoxIndex = 1; - + case 1: Value = gInputBox[0]; if (Value > 0 && Value <= gMenuListCount) { gMenuCursor = Value - 1; gFlagRefreshSetting = true; + gFlagBackupSetting = true; return; } break; @@ -1255,6 +1283,29 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld) { if (gIsInSubMenu) { + // *********************** + // restore original value + + if (gMenuCursor == MENU_VOL) + { + if (gF_LOCK) + { + EEPROM_ReadBuffer(0x1F40, gBatteryCalibration, 8); + +// gBatteryCalibration[3] = gSubMenuSelection_original; + + BATTERY_GetReadings(true); + } + } + else + if (gMenuCursor == MENU_F_CALI) + { +// if (gF_LOCK) +// writeXtalFreqCal(gSubMenuSelection_original); + } + + // *********************** + if (gInputBoxIndex == 0 || gMenuCursor != MENU_OFFSET) { gAskForConfirmation = 0; @@ -1269,6 +1320,8 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld) else gInputBox[--gInputBoxIndex] = 10; + // *********************** + gRequestDisplayScreen = DISPLAY_MENU; return; } @@ -1278,7 +1331,7 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld) #endif gRequestDisplayScreen = DISPLAY_MAIN; - + if (gEeprom.BACKLIGHT == 0) { gBacklightCountdown = 0; @@ -1322,13 +1375,13 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) gAskForConfirmation = 0; gIsInSubMenu = true; - + // if (gMenuCursor != MENU_D_LIST) { gInputBoxIndex = 0; edit_index = -1; } - + return; } @@ -1554,8 +1607,11 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) if (!gIsInSubMenu) { - gMenuCursor = NUMBER_AddWithWraparound(gMenuCursor, -Direction, 0, gMenuListCount - 1); - gFlagRefreshSetting = true; + gMenuCursor = NUMBER_AddWithWraparound(gMenuCursor, -Direction, 0, gMenuListCount - 1); + + gFlagRefreshSetting = true; + gFlagBackupSetting = true; + gRequestDisplayScreen = DISPLAY_MENU; if (gMenuCursor != MENU_ABR && gEeprom.BACKLIGHT == 0) @@ -1563,7 +1619,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) gBacklightCountdown = 0; GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF } - + return; } @@ -1599,7 +1655,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) bCheckScanList = true; break; - default: + default: MENU_ClampSelection(Direction); gRequestDisplayScreen = DISPLAY_MENU; return; diff --git a/firmware.bin b/firmware.bin index 3bd605f..6734d79 100644 Binary files a/firmware.bin and b/firmware.bin differ diff --git a/firmware.packed.bin b/firmware.packed.bin index b3e7da9..48a816b 100644 Binary files a/firmware.packed.bin and b/firmware.packed.bin differ diff --git a/helper/boot.c b/helper/boot.c index c65d7a4..981910b 100644 --- a/helper/boot.c +++ b/helper/boot.c @@ -40,9 +40,7 @@ BOOT_Mode_t BOOT_GetMode(void) { if (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT)) return BOOT_MODE_NORMAL; // PTT not pressed - Keys[i] = KEYBOARD_Poll(); - SYSTEM_DelayMs(20); } diff --git a/main.c b/main.c index 40203e0..93561e0 100644 --- a/main.c +++ b/main.c @@ -103,25 +103,21 @@ void Main(void) #endif BootMode = BOOT_GetMode(); - if (BootMode == BOOT_MODE_F_LOCK) - { // enable all the menu items - gMenuListCount = 0; - while (MenuList[gMenuListCount].name[0] != '\0') - gMenuListCount++; - gSubMenuSelection = gSetting_350TX; - gMenuCursor = MENU_350TX; - } - else - { // hide the hidden menu items - gMenuListCount = 0; - while (MenuList[gMenuListCount].name[0] != '\0') - gMenuListCount++; - gMenuListCount -= 8; // disable the last 'n' items - } + // count the number of menu items + gMenuListCount = 0; + while (MenuList[gMenuListCount].name[0] != '\0') + gMenuListCount++; - // wait for user to release all keys/butts before moving on - if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) || KEYBOARD_Poll() != KEY_INVALID) + if (BootMode == BOOT_MODE_F_LOCK) + gF_LOCK = true; // flag to say use the hidden menu items + else + gMenuListCount -= 8; // 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(); @@ -131,6 +127,9 @@ void Main(void) 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) diff --git a/misc.c b/misc.c index 7538119..8380729 100644 --- a/misc.c +++ b/misc.c @@ -166,8 +166,11 @@ bool gRequestSaveSettings; bool gRequestSaveFM; #endif bool gFlagPrepareTX; + bool gFlagAcceptSetting; bool gFlagRefreshSetting; +bool gFlagBackupSetting; + bool gFlagSaveVfo; bool gFlagSaveSettings; bool gFlagSaveChannel; @@ -217,6 +220,8 @@ uint8_t gNeverUsed; bool gUpdateDisplay; +bool gF_LOCK = false; + uint8_t gShowChPrefix; volatile bool gNextTimeslice; diff --git a/misc.h b/misc.h index fdcb35c..2494a2b 100644 --- a/misc.h +++ b/misc.h @@ -230,8 +230,11 @@ extern bool gRequestSaveSettings; #endif extern uint8_t gKeypadLocked; 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 gFlagSaveSettings; extern bool gFlagSaveChannel; @@ -277,6 +280,7 @@ extern uint8_t gNeverUsed; #endif extern volatile bool gNextTimeslice; extern bool gUpdateDisplay; +extern bool gF_LOCK; #ifdef ENABLE_FMRADIO extern uint8_t gFM_ChannelPosition; #endif diff --git a/ui/menu.c b/ui/menu.c index 690577a..56ac599 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -206,9 +206,12 @@ const char gSubMenu_XB[3][10] = const char gSubMenu_SC_REV[3][13] = { - "TIME\nOPER", - "CARRIER\nOPER", - "SEARCH\nOPER" +// "TIME\nOPER", +// "CARRIER\nOPER", +// "SEARCH\nOPER" + "TIME", + "CARRIER", + "SEARCH" }; const char gSubMenu_MDF[4][15] = @@ -332,9 +335,10 @@ bool gIsInSubMenu; uint8_t gMenuCursor; int8_t gMenuScrollDirection; int32_t gSubMenuSelection; +int32_t gSubMenuSelection_original = 0; // copy of the original value // 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]; int edit_index; @@ -344,7 +348,7 @@ void UI_DisplayMenu(void) const unsigned int menu_item_x1 = (8 * menu_list_width) + 2; const unsigned int menu_item_x2 = LCD_WIDTH - 1; unsigned int i; - char String[16]; + char String[64]; char Contact[16]; // clear the screen @@ -728,21 +732,21 @@ void UI_DisplayMenu(void) break; case MENU_VOL: - // 1st text line - sprintf(String, "%u.%02uV", gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100); - 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); - sprintf(String, "%u%%", BATTERY_VoltsToPercent(gBatteryVoltageAverage)); - 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; + BATTERY_GetReadings(true); + sprintf(String, "%u.%02uV\n%u%%\n%u", + gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100, + BATTERY_VoltsToPercent(gBatteryVoltageAverage), + gSubMenuSelection); + } + else + { + sprintf(String, "%u.%02uV\n%u%%", + gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100, + BATTERY_VoltsToPercent(gBatteryVoltageAverage)); } - - already_printed = true; break; case MENU_RESET: @@ -755,20 +759,15 @@ void UI_DisplayMenu(void) 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 BK4819_WriteRegister(BK4819_REG_3B, value); - sprintf(String, "%d", gSubMenuSelection); - UI_PrintString(String, menu_item_x1, menu_item_x2, 0, 8); - - 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; + sprintf(String, "%d\n%u.%06u\nMHz", + gSubMenuSelection, + xtal_Hz / 1000000, xtal_Hz % 1000000); } break; } diff --git a/ui/menu.h b/ui/menu.h index 51404df..e9e1e5d 100644 --- a/ui/menu.h +++ b/ui/menu.h @@ -156,6 +156,7 @@ extern bool gIsInSubMenu; extern uint8_t gMenuCursor; extern int8_t gMenuScrollDirection; extern int32_t gSubMenuSelection; +extern int32_t gSubMenuSelection_original; extern char edit_original[17]; extern char edit[17];