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 zcmZ7(3wRUt{dadsdVK>0OhY5(Dta@bzdS#=If{&!m@ zfTyIb>ia;qW%>#9C@iAcqipBt+5&LMX5&$DFO(USSHw&ol!0Ogy8VaMpyppYUDva8 zqR)dT#Xed9r4#w7$T!k?L$uJSK2x9HZGouvR#MJC4K`3YXwwz?lFT$Z09=EI za*PF@PHR^Zl001Fez2cXr=WuY zbnv9QwIU;)6)u1Z_h8T@yxMOQFD)RAwIeYW z38~bw_>1A*8vj$T9Fh%zBHxGOwfSi1x)=<6IMg?u4p5XKQ@{n_w^%9uJ+ygW{5{Fk zQPiA)m7S+vk&3;n`%f}m?&xQqeW!Nc+*xKD7`aR0J_i*UOxS>$w*$TkGTd*(#}Lz( zpv#LD8!%k2cwiMG-bEIM`=xjg;kOco@?4$xrg#L;7ZRp&qe|#M6OZBf^#t(QT}(3* zI4=(F24S*FoB(C^wOw2CyICl1d8X#9|DUfGO7|s6ylqwz?-Mao00c@g3X{~Aqn^18F(y>GWvaIYX=Lo1WT_o@%Dvdsbo;?-O5KITOZJ`p4@>P0 zfz_GE(6Ot=HWRl^dcwNW8BuQ-Z0Ext?&?4g8u zW$pl7iD?{2hYW%2u0mf@E03`~#k)W-sfNHkVv$eAUE%sti^Zx?gcfEhZuB*~YZ}Ix zh}vMah^-g1K_09`XfWyq8dm6g;#!PEHBHa!8_^F!gDst58`L4!GUPWNTY}JUqQ(FX zH9G(07|R1kn#~Q_T~pAZThV;Btebx`7D3@k6mg(%=CKNdPDL|Oc)l*&^EF{CLDUei z*A@Hv8XSBPZs4OK5`CE-eM|faO!51n#ayn`)>7>WnBR4i9aXQC>IJD)=rS01emJ{3 zp%oPo8Z>`GxU)_4{t0 z?%Q6H{rd&Jj%xPfObc*pJiDcd&?}oMKCLOEmA-S;Sp%7tX3tIuxLz~MPsCw0Ri?H5 zNTcSR8yBnbY^yaO&0$V!=SS^unt#nz(Cp&UuAWsvt{lkk{dLZH9(0*-hg^u7Fbk~JgfsQjsN95+8gOelU_I8MH8ufXqb7{(vzW!V&;|p0hp5Qm z(OcmT*aTbQasBCl%aFn3GD(V|>%m6bXg^)ZBt{CS47{!q|es z{~Dx(^8Q9I*kQ2$)7SMt?uroyGX}SoJX>{Ey1Q^t#vP@6@ac7ZrY_)9T6ub->@{^I zwDak$HO2VuV$_#)@d`437%?$K3>T$&UlHUjpzPFuMJQ02Gd9@hO=#_DG9?Ty_BM2V zDoV*X@-FOqQ)Nm^r+6QO`zX7=RiCRF%60mawFadB1L<<9kfR=|r6L(I)|N4Fo#6?c z;S*$-j`YWou0{Ws{(YVP0n%p)W_6#gezF2wR?pRkbGi+#Jt$#{?iO=SlLAiF^GF;s z=y^Pca#u?j3}%)rOjJ#0%3y;xsU3)0d|S9#733-iJnbkeVx7G~@TasS#y=M?QhAlM zFsa|Go6A$~7s)GYv!1b&*dt@HGrEcWsjsvTllgc71%6iP`r3;PWsqg36o*RqnCHC^hgLVLfDD$Z6Uo&)D0mAVizEGuZ-vgp(Y$F@)El#0-PV*;lMiiS&0fSoa9rJ}_jy6;dY_-st9JZ9 z17_+X9qUVWje9&TWP_K{LkWG&gO?EMO}b_D^#$G6w^NNi91%OMynu5z`6~Dy3R}Qs zrE#z3IN*3nTbX>`n_2e9k1m7DX+Z4LwRlZF{$3d8mv0FB#U}4EX8@LtWblpNC&iVX zM&}ZQ4`Zr#Vyde~GPr}%MsJS0&U5Do!yiEWTBp3yGk2uP`8{t*c&M8nUl7m+=F7H?5#n;FNRJ01E^#j!hauraOo!N>;n~8 z)}JOT;7D+j6(Tc}ZeXYH58kim%9*0Zt4i|nPJ-geQo&)t)2|cvN`(i61Lm6!Rzn|q z(J68iluOy1dH5uxuO)HD1VXDnrB zGE>+-EZ_w5(r*l^0*zsKNC%-fP8|tXc8UO$Q delta 3917 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 Y=8*+~j_b!n4~i_UMzhf0%mo7Z)wfN96aWAK delta 4434 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 Y=8*+~j_b!q2#zWE5VO$V%mo5$L*n3Yi2wiq diff --git a/ui/main.c b/ui/main.c index 141ff4d..fc798c3 100644 --- a/ui/main.c +++ b/ui/main.c @@ -320,10 +320,11 @@ void UI_DisplayMain(void) { const unsigned int rx_line = (gEeprom.RX_CHANNEL == 0) ? line0 : line1; const unsigned int tx_line = (gEeprom.TX_CHANNEL == 0) ? line0 : line1; + const unsigned int line = (vfo_num == 0) ? line0 : line1; uint8_t channel = gEeprom.TX_CHANNEL; const bool same_vfo = (channel == vfo_num) ? true : false; - uint8_t *p_line0 = gFrameBuffer[tx_line + 0]; - uint8_t *p_line1 = gFrameBuffer[tx_line + 1]; + uint8_t *p_line0 = gFrameBuffer[line + 0]; + uint8_t *p_line1 = gFrameBuffer[line + 1]; if (single_vfo) { // we're in single VFO mode - screen is dedicated to just one VFO @@ -419,7 +420,7 @@ void UI_DisplayMain(void) if (channel == vfo_num) { // show the TX symbol duff_beer = 1; - UI_PrintStringSmall("TX", 14, 0, Line); + UI_PrintStringSmall("TX", 14, 0, line); } } } @@ -427,7 +428,7 @@ void UI_DisplayMain(void) { // receiving .. show the RX symbol duff_beer = 2; if ((gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR) && gEeprom.RX_CHANNEL == vfo_num) - UI_PrintStringSmall("RX", 14, 0, Line); + UI_PrintStringSmall("RX", 14, 0, rx_line); } if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) @@ -437,9 +438,9 @@ void UI_DisplayMain(void) if (!inputting) NUMBER_ToDigits(gEeprom.ScreenChannel[vfo_num] + 1, String); // show the memory channel number else - memmove(String + 5, gInputBox, 3); // show the input text - UI_PrintStringSmall("M", x, 0, Line + 1); - UI_DisplaySmallDigits(3, String + 5, x + 7, Line + 1, inputting); + memmove(String + 5, gInputBox, 3); // show the input text + UI_PrintStringSmall("M", x, 0, line + 1); + UI_DisplaySmallDigits(3, String + 5, x + 7, line + 1, inputting); } else if (IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num])) @@ -448,7 +449,7 @@ void UI_DisplayMain(void) const unsigned int x = 2; // was 14 // sprintf(String, "FB%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 else @@ -461,7 +462,7 @@ void UI_DisplayMain(void) { // user entering channel number 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 @@ -487,7 +488,7 @@ void UI_DisplayMain(void) else if (gInputBoxIndex > 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;