From fa4ae2caa681bc6a8b9fdae6fbea58ba6a5e2bc9 Mon Sep 17 00:00:00 2001 From: OneOfEleven Date: Sun, 1 Oct 2023 12:44:22 +0100 Subject: [PATCH] Fix what I did last --- Makefile | 11 ++++++--- README.md | 1 + firmware.bin | Bin 58764 -> 58764 bytes firmware.packed.bin | Bin 58782 -> 58782 bytes ui/main.c | 59 ++++++++++++++++++++++---------------------- ui/menu.c | 48 ++++++++++++++++++++++++++++------- 6 files changed, 78 insertions(+), 41 deletions(-) diff --git a/Makefile b/Makefile index 571b92f..bc40e52 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,7 @@ # ENABLE_SWD := 0 ENABLE_OVERLAY := 1 +ENABLE_LTO := 0 ENABLE_UART := 1 ENABLE_AIRCOPY := 0 ENABLE_FMRADIO := 1 @@ -154,20 +155,24 @@ 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=gnu11 -MMD +ifeq ($(ENABLE_LTO),1) + CFLAGS += -flto +endif + CFLAGS += -DPRINTF_INCLUDE_CONFIG_H CFLAGS += -DGIT_HASH=\"$(GIT_HASH)\" ifeq ($(ENABLE_SWD),1) CFLAGS += -DENABLE_SWD endif +ifeq ($(ENABLE_OVERLAY),1) + CFLAGS += -DENABLE_OVERLAY +endif ifeq ($(ENABLE_AIRCOPY),1) CFLAGS += -DENABLE_AIRCOPY endif ifeq ($(ENABLE_FMRADIO),1) CFLAGS += -DENABLE_FMRADIO endif -ifeq ($(ENABLE_OVERLAY),1) - CFLAGS += -DENABLE_OVERLAY -endif ifeq ($(ENABLE_UART),1) CFLAGS += -DENABLE_UART endif diff --git a/README.md b/README.md index 9b4fe41..118addb 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ 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_OVERLAY := 1 cpu FLASH stuff +ENABLE_LTO := 0 **experimental, reduces size of compiled firmware but might break EEPROM reads ENABLE_UART := 1 without this you can't configure radio via PC ENABLE_AIRCOPY := 0 easier to just enter frequency ENABLE_FMRADIO := 1 WBFM VHF band 2 RX diff --git a/firmware.bin b/firmware.bin index 1bbe20030e75557643c7ce676319a9b18ee3bed6..e7a58e7d4632e55367d8a35e7589a7e912970046 100644 GIT binary patch delta 3922 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 delta 3917 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 R!+b+S-6RNi^MU(kSOH`a$K?P3 diff --git a/firmware.packed.bin b/firmware.packed.bin index 52864bc97de15445ca75128f7c5f42b7fcaa504e..4e938b74dd1797b019649fb9e2ec94547d2a66cf 100644 GIT binary patch delta 4434 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 delta 4434 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 g=z<1MQqHr9tc`uIkGpg9Y5ow{eBu5XR;C 0 && IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]) && gEeprom.TX_CHANNEL == vfo_num) { // user entering a frequency - UI_DisplayFrequency(gInputBox, 32, Line, true, false); + UI_DisplayFrequency(gInputBox, 32, line, true, false); center_line_is_free = false; } @@ -497,7 +498,7 @@ void UI_DisplayMain(void) if (gCurrentFunction == FUNCTION_TRANSMIT) { // transmitting 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; } @@ -523,19 +524,19 @@ void UI_DisplayMain(void) #ifdef ENABLE_BIG_FREQ NUMBER_ToDigits(frequency, String); // 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 - UI_DisplaySmallDigits(2, String + 6, 113, Line + 1, true); + UI_DisplaySmallDigits(2, String + 6, 113, line + 1, true); #else // show the frequency in the main font sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000); - UI_PrintString(String, 32, 0, Line, 8); + UI_PrintString(String, 32, 0, line, 8); #endif break; case MDF_CHANNEL: // show the channel number sprintf(String, "CH-%03u", gEeprom.ScreenChannel[vfo_num] + 1); - UI_PrintString(String, 32, 0, Line, 8); + UI_PrintString(String, 32, 0, line, 8); break; case MDF_NAME: // show the channel name @@ -549,19 +550,19 @@ void UI_DisplayMain(void) if (gEeprom.CHANNEL_DISPLAY_MODE == MDF_NAME) { - UI_PrintString(String, 32, 0, Line, 8); + UI_PrintString(String, 32, 0, line, 8); } else { #ifdef ENABLE_SMALL_BOLD - UI_PrintStringSmallBold(String, 32 + 4, 0, Line); + UI_PrintStringSmallBold(String, 32 + 4, 0, line); #else - UI_PrintStringSmall(String, 32 + 4, 0, Line); + UI_PrintStringSmall(String, 32 + 4, 0, line); #endif // show the channel frequency below the channel number/name 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; @@ -572,13 +573,13 @@ void UI_DisplayMain(void) #ifdef ENABLE_BIG_FREQ NUMBER_ToDigits(frequency, String); // 8 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 - UI_DisplaySmallDigits(2, String + 6, 113, Line + 1, true); + UI_DisplaySmallDigits(2, String + 6, 113, line + 1, true); #else // show the frequency in the main font sprintf(String, "%03u.%05u", frequency / 100000, frequency % 100000); - UI_PrintString(String, 32, 0, Line, 8); + UI_PrintString(String, 32, 0, line, 8); #endif #ifdef ENABLE_COMPANDER @@ -652,7 +653,7 @@ void UI_DisplayMain(void) if (code_type >= 0 && code_type < ARRAY_SIZE(code_list)) 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_NORMAL || state == VFO_STATE_ALARM) { // show the TX power @@ -660,7 +661,7 @@ void UI_DisplayMain(void) const unsigned int i = gEeprom.VfoInfo[vfo_num].OUTPUT_POWER; String[0] = (i >= 0 && i < ARRAY_SIZE(pwr_list)) ? pwr_list[i] : '\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) @@ -669,12 +670,12 @@ void UI_DisplayMain(void) const unsigned int i = gEeprom.VfoInfo[vfo_num].TX_OFFSET_FREQUENCY_DIRECTION; String[0] = (i < sizeof(dir_list)) ? dir_list[i] : '?'; 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 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 String[0] = '\0'; @@ -683,16 +684,16 @@ void UI_DisplayMain(void) String[0] = 'N'; 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 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 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) diff --git a/ui/menu.c b/ui/menu.c index 2399cf6..b09205b 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -347,19 +347,47 @@ void UI_DisplayMenu(void) char String[16]; char Contact[16]; + // clear the screen memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); - for (i = 0; i < 3; i++) - if (gMenuCursor > 0 || i > 0) - if ((gMenuListCount - 1) != gMenuCursor || i != 2) - UI_PrintString(MenuList[gMenuCursor + i - 1].name, 0, 0, i * 2, 8); + // draw the left menu list + #if 0 + for (i = 0; i < 3; 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 menu list text pixels - for (i = 0; i < (8 * menu_list_width); i++) + // 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; + } + #else { - gFrameBuffer[2][i] ^= 0xFF; - gFrameBuffer[3][i] ^= 0xFF; + const int menu_index = gMenuCursor; // current selected menu item + i = 1; + while (i < 2) + { // leading menu items + const int k = menu_index + i - 2; + 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); + i++; + } } + #endif // draw vertical separating dotted line for (i = 0; i < 7; i++) @@ -369,10 +397,12 @@ void UI_DisplayMenu(void) sprintf(String, "%2u.%u", 1 + gMenuCursor, gMenuListCount); UI_PrintStringSmall(String, 8, 0, 6); - // draw the little marker + // 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)); + // ************** + memset(String, 0, sizeof(String)); bool already_printed = false;