From bd9f337a5b908ac3b4ceb549e9c1befc9cd063bc Mon Sep 17 00:00:00 2001 From: OneOfEleven Date: Thu, 5 Oct 2023 15:26:08 +0100 Subject: [PATCH] Make all warnings vanish over to bricky's house ! --- Makefile | 1 + am_fix.c | 2 +- app/app.c | 9 +++++++-- app/dtmf.c | 5 +++++ app/menu.c | 19 +++++++++++++++++-- app/scanner.c | 10 +++++----- app/uart.c | 2 +- audio.c | 5 +++++ driver/adc.c | 4 ++-- driver/aes.c | 2 ++ driver/keyboard.c | 4 ++-- driver/spi.c | 4 ++-- firmware.bin | Bin 53888 -> 53888 bytes firmware.packed.bin | Bin 53906 -> 53906 bytes misc.h | 22 +++++++++------------- radio.c | 24 +++++++++++++++++------- settings.c | 20 +++++++++----------- ui/main.c | 36 ++++++++++++++++++++++++++---------- ui/menu.c | 5 +++++ 19 files changed, 116 insertions(+), 58 deletions(-) diff --git a/Makefile b/Makefile index 52f4113..3be841a 100644 --- a/Makefile +++ b/Makefile @@ -200,6 +200,7 @@ endif # May cause unhelpful build failures #CFLAGS += -Wpadded +CFLAGS += -Wextra CFLAGS += -DPRINTF_INCLUDE_CONFIG_H CFLAGS += -DGIT_HASH=\"$(GIT_HASH)\" diff --git a/am_fix.c b/am_fix.c index 51c11ae..09d67e9 100644 --- a/am_fix.c +++ b/am_fix.c @@ -475,7 +475,7 @@ void AM_fix_print_data(const int vfo, char *s) { - if (s != NULL && vfo >= 0 && vfo < ARRAY_SIZE(gain_table_index)) + if (s != NULL && vfo >= 0 && vfo < (int)ARRAY_SIZE(gain_table_index)) { const unsigned int index = gain_table_index[vfo]; // sprintf(s, "%2u.%u %4ddB %3u", index, ARRAY_SIZE(gain_table) - 1, gain_table[index].gain_dB, prev_rssi[vfo]); diff --git a/app/app.c b/app/app.c index 025544d..b4786e4 100644 --- a/app/app.c +++ b/app/app.c @@ -647,6 +647,9 @@ static void MR_NextChannel(void) if (enabled) { + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + switch (gCurrentScanList) { case SCAN_NEXT_CHAN_SCANLIST1: @@ -680,7 +683,7 @@ static void MR_NextChannel(void) // { // chan = (gEeprom.RX_VFO + 1) & 1u; // chan = gEeprom.ScreenChannel[chan]; -// if (IS_MR_CHANNEL(chan)) +// if (chan <= MR_CHANNEL_LAST) // { // gCurrentScanList = SCAN_NEXT_CHAN_DUAL_WATCH; // gNextMrChannel = chan; @@ -695,6 +698,8 @@ static void MR_NextChannel(void) chan = 0xff; break; } + + #pragma GCC diagnostic pop } if (!enabled || chan == 0xff) @@ -2042,7 +2047,7 @@ void CHANNEL_Next(bool bFlag, int8_t Direction) gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST1; gScanState = Direction; - if (IS_MR_CHANNEL(gNextMrChannel)) + if (gNextMrChannel <= MR_CHANNEL_LAST) { if (bFlag) gRestoreMrChannel = gNextMrChannel; diff --git a/app/dtmf.c b/app/dtmf.c index ffb9241..0f96941 100644 --- a/app/dtmf.c +++ b/app/dtmf.c @@ -331,6 +331,9 @@ void DTMF_HandleRequest(void) gUpdateDisplay = true; + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + switch (gEeprom.DTMF_DECODE_RESPONSE) { case DTMF_DEC_RESPONSE_BOTH: @@ -348,6 +351,8 @@ void DTMF_HandleRequest(void) break; } + #pragma GCC diagnostic pop + if (gDTMF_IsGroupCall) gDTMF_ReplyState = DTMF_REPLY_NONE; } diff --git a/app/menu.c b/app/menu.c index 45ec8a5..018795b 100644 --- a/app/menu.c +++ b/app/menu.c @@ -408,6 +408,9 @@ void MENU_AcceptSetting(void) gRequestSaveChannel = 1; return; + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + case MENU_T_CTCS: pConfig = &gTxVfo->freq_config_TX; case MENU_R_CTCS: @@ -436,6 +439,8 @@ void MENU_AcceptSetting(void) gRequestSaveChannel = 1; return; + #pragma GCC diagnostic pop + case MENU_SFT_D: gTxVfo->TX_OFFSET_FREQUENCY_DIRECTION = gSubMenuSelection; gRequestSaveChannel = 1; @@ -1170,7 +1175,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (edit_index < 10) { - if (Key >= KEY_0 && Key <= KEY_9) + if (/* Key >= KEY_0 && */ Key <= KEY_9) { edit[edit_index] = '0' + Key - KEY_0; @@ -1193,6 +1198,9 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (!gIsInSubMenu) { + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + switch (gInputBoxIndex) { case 2: @@ -1224,6 +1232,8 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) break; } + #pragma GCC diagnostic pop + gInputBoxIndex = 0; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; @@ -1269,7 +1279,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) Value = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1; - if (IS_MR_CHANNEL(Value)) + if (Value <= MR_CHANNEL_LAST) { #ifdef ENABLE_VOICE gAnotherVoiceID = (VOICE_ID_t)Key; @@ -1661,6 +1671,9 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) VFO = 0; + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + switch (gMenuCursor) { case MENU_DEL_CH: @@ -1681,6 +1694,8 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) return; } + #pragma GCC diagnostic pop + Channel = RADIO_FindNextChannel(gSubMenuSelection + Direction, Direction, bCheckScanList, VFO); if (Channel != 0xFF) gSubMenuSelection = Channel; diff --git a/app/scanner.c b/app/scanner.c index b203ad4..b74fc27 100644 --- a/app/scanner.c +++ b/app/scanner.c @@ -67,7 +67,7 @@ static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gInputBoxIndex = 0; Channel = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1; - if (IS_MR_CHANNEL(Channel)) + if (Channel <= MR_CHANNEL_LAST) { #ifdef ENABLE_VOICE gAnotherVoiceID = (VOICE_ID_t)Key; @@ -193,7 +193,7 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) } } - if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) + if (gTxVfo->CHANNEL_SAVE <= MR_CHANNEL_LAST) { gScannerEditState = 1; gScanChannel = gTxVfo->CHANNEL_SAVE; @@ -247,7 +247,7 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) gTxVfo->freq_config_TX.Code = gScanCssResultCode; } - if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) + if (gTxVfo->CHANNEL_SAVE <= MR_CHANNEL_LAST) { Channel = gScanChannel; gEeprom.MrChannel[gEeprom.TX_VFO] = Channel; @@ -428,7 +428,7 @@ void SCANNER_Stop(void) if (!bScanKeepFrequency) { - if (IS_MR_CHANNEL(gNextMrChannel)) + if (gNextMrChannel <= MR_CHANNEL_LAST) { gEeprom.MrChannel[gEeprom.RX_VFO] = gRestoreMrChannel; gEeprom.ScreenChannel[gEeprom.RX_VFO] = Previous; @@ -446,7 +446,7 @@ void SCANNER_Stop(void) return; } - if (!IS_MR_CHANNEL(gRxVfo->CHANNEL_SAVE)) + if (gRxVfo->CHANNEL_SAVE > MR_CHANNEL_LAST) { RADIO_ApplyOffset(gRxVfo); RADIO_ConfigureSquelchAndOutputPower(gRxVfo); diff --git a/app/uart.c b/app/uart.c index c109419..f54e722 100644 --- a/app/uart.c +++ b/app/uart.c @@ -450,7 +450,7 @@ bool UART_IsCommandAvailable(void) Index = DMA_INDEX(gUART_WriteIndex, 2); Size = (UART_DMA_Buffer[DMA_INDEX(Index, 1)] << 8) | UART_DMA_Buffer[Index]; - if ((Size + 8) > sizeof(UART_DMA_Buffer)) + if ((Size + 8u) > sizeof(UART_DMA_Buffer)) { gUART_WriteIndex = DmaLength; return false; diff --git a/audio.c b/audio.c index 671d386..b46fd44 100644 --- a/audio.c +++ b/audio.c @@ -142,6 +142,9 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) SYSTEM_DelayMs(60); + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + switch (Beep) { case BEEP_880HZ_60MS_TRIPLE_BEEP: @@ -181,6 +184,8 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) break; } + #pragma GCC diagnostic pop + SYSTEM_DelayMs(Duration); BK4819_EnterTxMute(); SYSTEM_DelayMs(20); diff --git a/driver/adc.c b/driver/adc.c index 6f0214b..bde01f0 100644 --- a/driver/adc.c +++ b/driver/adc.c @@ -134,9 +134,9 @@ void ADC_Configure(ADC_Config_t *pAdc) ; if (SARADC_IE == 0) { - NVIC_DisableIRQ(DP32_SARADC_IRQn); + NVIC_DisableIRQ((IRQn_Type)DP32_SARADC_IRQn); } else { - NVIC_EnableIRQ(DP32_SARADC_IRQn); + NVIC_EnableIRQ((IRQn_Type)DP32_SARADC_IRQn); } } diff --git a/driver/aes.c b/driver/aes.c index 17a3990..6a8b5c0 100644 --- a/driver/aes.c +++ b/driver/aes.c @@ -24,6 +24,8 @@ static void AES_Setup_ENC_CBC(bool IsDecrypt, const void *pKey, const void *pIv) const uint32_t *pK = (const uint32_t *)pKey; const uint32_t *pI = (const uint32_t *)pIv; + (void)IsDecrypt; // unused + AES_CR = (AES_CR & ~AES_CR_EN_MASK) | AES_CR_EN_BITS_DISABLE; AES_CR = AES_CR_CHMOD_BITS_CBC; AES_KEYR3 = pK[0]; diff --git a/driver/keyboard.c b/driver/keyboard.c index e490a13..91285df 100644 --- a/driver/keyboard.c +++ b/driver/keyboard.c @@ -103,7 +103,7 @@ KEY_Code_t KEYBOARD_Poll(void) // ***************** - for (int j = 0; j < ARRAY_SIZE(keyboard); j++) + for (unsigned int j = 0; j < ARRAY_SIZE(keyboard); j++) { //Set all high GPIOA->DATA |= 1u << GPIOA_PIN_KEYBOARD_4 | @@ -118,7 +118,7 @@ KEY_Code_t KEYBOARD_Poll(void) // Read all 4 GPIO pins at once uint16_t reg = GPIOA->DATA; - for (int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++) + for (unsigned int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++) { uint16_t mask = 1u << keyboard[j].pins[i].pin; if (!(reg & mask)) diff --git a/driver/spi.c b/driver/spi.c index 9fb5e02..4a1a279 100644 --- a/driver/spi.c +++ b/driver/spi.c @@ -93,9 +93,9 @@ void SPI_Configure(volatile SPI_Port_t *pPort, SPI_Config_t *pConfig) if (pPort->IE) { if (pPort == SPI0) { - NVIC_EnableIRQ(DP32_SPI0_IRQn); + NVIC_EnableIRQ((IRQn_Type)DP32_SPI0_IRQn); } else if (pPort == SPI1) { - NVIC_EnableIRQ(DP32_SPI1_IRQn); + NVIC_EnableIRQ((IRQn_Type)DP32_SPI1_IRQn); } } } diff --git a/firmware.bin b/firmware.bin index 1c41ed71bafb87c6582928a0bf533aaf43b99353..021cb5e75cdecebbb8396298f6a14c5a919459f1 100644 GIT binary patch delta 3344 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 C87-{< delta 3363 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 diff --git a/firmware.packed.bin b/firmware.packed.bin index 09cbff680524f678b2a798eac2f924c1453ffbfd..7f88a7a9fa8f8d3255a908b9e4fc43982ddc2c4e 100644 GIT binary patch delta 6676 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 delta 6676 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 diff --git a/misc.h b/misc.h index d19c28e..7de519d 100644 --- a/misc.h +++ b/misc.h @@ -24,26 +24,22 @@ #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #endif -#define IS_MR_CHANNEL(x) ((x) >= MR_CHANNEL_FIRST && (x) <= MR_CHANNEL_LAST) -#define IS_FREQ_CHANNEL(x) ((x) >= FREQ_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST) -#define IS_VALID_CHANNEL(x) ((x) < LAST_CHANNEL) +#define IS_MR_CHANNEL(x) ((x) >= MR_CHANNEL_FIRST && (x) <= MR_CHANNEL_LAST) +#define IS_FREQ_CHANNEL(x) ((x) >= FREQ_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST) +#define IS_VALID_CHANNEL(x) ((x) < LAST_CHANNEL) -#ifdef ENABLE_NOAA - #define IS_NOAA_CHANNEL(x) ((x) >= NOAA_CHANNEL_FIRST && (x) <= NOAA_CHANNEL_LAST) - #define IS_NOT_NOAA_CHANNEL(x) ((x) >= MR_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST) -#endif +#define IS_NOAA_CHANNEL(x) ((x) >= NOAA_CHANNEL_FIRST && (x) <= NOAA_CHANNEL_LAST) +#define IS_NOT_NOAA_CHANNEL(x) ((x) >= MR_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST) -enum { +typedef enum { MR_CHANNEL_FIRST = 0, MR_CHANNEL_LAST = 199u, FREQ_CHANNEL_FIRST = 200u, FREQ_CHANNEL_LAST = 206u, - #ifdef ENABLE_NOAA - NOAA_CHANNEL_FIRST = 207u, - NOAA_CHANNEL_LAST = 216u, - #endif + NOAA_CHANNEL_FIRST = 207u, + NOAA_CHANNEL_LAST = 216u, LAST_CHANNEL -}; +} channel_num_t; enum { FLASHLIGHT_OFF = 0, diff --git a/radio.c b/radio.c index f712f2d..bced7d7 100644 --- a/radio.c +++ b/radio.c @@ -51,7 +51,7 @@ bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO) uint8_t PriorityCh1; uint8_t PriorityCh2; - if (!IS_MR_CHANNEL(Channel)) + if (Channel > MR_CHANNEL_LAST) return false; Attributes = gMR_ChannelAttributes[Channel]; @@ -176,7 +176,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure } #endif - if (IS_MR_CHANNEL(Channel)) + if (Channel <= MR_CHANNEL_LAST) { Channel = RADIO_FindNextChannel(Channel, RADIO_CHANNEL_UP, false, VFO); if (Channel == 0xFF) @@ -200,7 +200,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure uint8_t Index; - if (IS_MR_CHANNEL(Channel)) + if (Channel <= MR_CHANNEL_LAST) { Channel = gEeprom.FreqChannel[VFO]; gEeprom.ScreenChannel[VFO] = gEeprom.FreqChannel[VFO]; @@ -218,7 +218,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure Band = BAND6_400MHz; } - if (IS_MR_CHANNEL(Channel)) + if (Channel <= MR_CHANNEL_LAST) { gEeprom.VfoInfo[VFO].Band = Band; gEeprom.VfoInfo[VFO].SCANLIST1_PARTICIPATION = !!(Attributes & MR_CH_SCANLIST1); @@ -235,7 +235,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure gEeprom.VfoInfo[VFO].SCANLIST2_PARTICIPATION = bParticipation2; gEeprom.VfoInfo[VFO].CHANNEL_SAVE = Channel; - if (IS_MR_CHANNEL(Channel)) + if (Channel <= MR_CHANNEL_LAST) Base = Channel * 16; else Base = 0x0C80 + ((Channel - FREQ_CHANNEL_FIRST) * 32) + (VFO * 16); @@ -380,13 +380,13 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure if (Frequency >= 10800000 && Frequency < 13600000) gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY_DIRECTION = TX_OFFSET_FREQUENCY_DIRECTION_OFF; else - if (!IS_MR_CHANNEL(Channel)) + if (Channel > MR_CHANNEL_LAST) gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY = FREQUENCY_FloorToStep(gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY, gEeprom.VfoInfo[VFO].StepFrequency, 0); RADIO_ApplyOffset(pRadio); memset(gEeprom.VfoInfo[VFO].Name, 0, sizeof(gEeprom.VfoInfo[VFO].Name)); - if (IS_MR_CHANNEL(Channel)) + if (Channel < MR_CHANNEL_LAST) { // 16 bytes allocated to the channel name but only 10 used, the rest are 0's EEPROM_ReadBuffer(0x0F50 + (Channel * 16), gEeprom.VfoInfo[VFO].Name + 0, 8); EEPROM_ReadBuffer(0x0F58 + (Channel * 16), gEeprom.VfoInfo[VFO].Name + 8, 2); @@ -576,6 +576,9 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_GREEN, false); + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + switch (Bandwidth) { default: @@ -591,6 +594,8 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) break; } + #pragma GCC diagnostic pop + BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_RED, false); BK4819_SetupPowerAmplifier(0, 0); @@ -825,6 +830,9 @@ void RADIO_SetTxParameters(void) BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2, false); + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + switch (Bandwidth) { default: @@ -840,6 +848,8 @@ void RADIO_SetTxParameters(void) break; } + #pragma GCC diagnostic pop + BK4819_SetFrequency(gCurrentVfo->pTX->Frequency); // TX compressor diff --git a/settings.c b/settings.c index 8bec24b..7755012 100644 --- a/settings.c +++ b/settings.c @@ -184,10 +184,6 @@ void SETTINGS_SaveSettings(void) EEPROM_WriteBuffer(0x0F40, State); } -void SETTINGS_LoadChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO) -{ -} - void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, uint8_t Mode) { #ifdef ENABLE_NOAA @@ -197,13 +193,13 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, const uint16_t OffsetMR = Channel * 16; uint16_t OffsetVFO = OffsetMR; - if (!IS_MR_CHANNEL(Channel)) + if (Channel > MR_CHANNEL_LAST) { // it's a VFO, not a channel OffsetVFO = (VFO == 0) ? 0x0C80 : 0x0C90; OffsetVFO += (Channel - FREQ_CHANNEL_FIRST) * 32; } - if (Mode >= 2 || !IS_MR_CHANNEL(Channel)) + if (Mode >= 2 || Channel > MR_CHANNEL_LAST) { // copy VFO to a channel uint8_t State[8]; @@ -228,8 +224,9 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, SETTINGS_UpdateChannel(Channel, pVFO, true); - if (IS_MR_CHANNEL(Channel)) - { + if (Channel <= MR_CHANNEL_LAST) + { // it's a memory channel + #ifndef ENABLE_KEEP_MEM_NAME // clear/reset the channel name //memset(&State, 0xFF, sizeof(State)); @@ -262,7 +259,7 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep) uint8_t Attributes = 0xFF; // default attributes uint16_t Offset = 0x0D60 + (Channel & ~7u); - Attributes &= ~MR_CH_COMPAND; // default to '0' = compander disabled + Attributes &= (uint8_t)(~MR_CH_COMPAND); // default to '0' = compander disabled EEPROM_ReadBuffer(Offset, State, sizeof(State)); @@ -280,8 +277,9 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep) gMR_ChannelAttributes[Channel] = Attributes; // #ifndef ENABLE_KEEP_MEM_NAME - if (IS_MR_CHANNEL(Channel)) - { + if (Channel <= MR_CHANNEL_LAST) + { // it's a memory channel + const uint16_t OffsetMR = Channel * 16; if (!keep) { // clear/reset the channel name diff --git a/ui/main.c b/ui/main.c index 3f2c910..c829cf3 100644 --- a/ui/main.c +++ b/ui/main.c @@ -14,6 +14,10 @@ * limitations under the License. */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + #pragma GCC diagnostic pop + #include #include // abs() @@ -42,6 +46,9 @@ center_line_t center_line = CENTER_LINE_NONE; void UI_drawBars(uint8_t *p, const unsigned int level) { + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + switch (level) { default: @@ -54,6 +61,8 @@ void UI_drawBars(uint8_t *p, const unsigned int level) case 1: memmove(p + 0, BITMAP_Antenna, sizeof(BITMAP_Antenna)); case 0: break; } + + #pragma GCC diagnostic pop } #ifdef ENABLE_AUDIO_BAR @@ -214,6 +223,8 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo) { #ifdef ENABLE_RSSI_BAR + (void)vfo; // unused + // optional larger RSSI dBm, S-point and bar level if (center_line != CENTER_LINE_RSSI) @@ -333,13 +344,13 @@ void UI_DisplayMain(void) for (vfo_num = 0; vfo_num < 2; vfo_num++) { const unsigned int line = (vfo_num == 0) ? line0 : line1; - uint8_t channel = gEeprom.TX_VFO; -// uint8_t tx_channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO; + unsigned int channel = gEeprom.TX_VFO; +// unsigned int tx_channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO; const bool same_vfo = (channel == vfo_num) ? true : false; uint8_t *p_line0 = gFrameBuffer[line + 0]; uint8_t *p_line1 = gFrameBuffer[line + 1]; - uint8_t mode = 0; - uint8_t state; + unsigned int mode = 0; + unsigned int state; if (single_vfo) { // we're in single VFO mode - screen is dedicated to just one VFO @@ -457,7 +468,7 @@ void UI_DisplayMain(void) } } - if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) + if (gEeprom.ScreenChannel[vfo_num] <= MR_CHANNEL_LAST) { // channel mode const unsigned int x = 2; const bool inputting = (gInputBoxIndex == 0 || gEeprom.TX_VFO != vfo_num) ? false : true; @@ -508,7 +519,7 @@ void UI_DisplayMain(void) if (state != VFO_STATE_NORMAL) { const char *state_list[] = {"", "BUSY", "BAT LOW", "TX DISABLE", "TIMEOUT", "ALARM", "VOLT HIGH"}; - if (state >= 0 && state < ARRAY_SIZE(state_list)) + if (state < ARRAY_SIZE(state_list)) UI_PrintString(state_list[state], 31, 0, line, 8); } else @@ -528,8 +539,8 @@ void UI_DisplayMain(void) frequency = gEeprom.VfoInfo[vfo_num].pTX->Frequency; } - if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) - { // channel mode + if (gEeprom.ScreenChannel[vfo_num] <= MR_CHANNEL_LAST) + { // it's a channel // show the channel symbols const uint8_t attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]]; @@ -546,6 +557,9 @@ void UI_DisplayMain(void) #endif + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + switch (gEeprom.CHANNEL_DISPLAY_MODE) { case MDF_FREQUENCY: // show the channel frequency @@ -595,6 +609,8 @@ void UI_DisplayMain(void) break; } + + #pragma GCC diagnostic pop } else { // frequency mode @@ -660,7 +676,7 @@ void UI_DisplayMain(void) const FREQ_Config_t *pConfig = (mode == 1) ? gEeprom.VfoInfo[vfo_num].pTX : gEeprom.VfoInfo[vfo_num].pRX; const unsigned int code_type = pConfig->CodeType; const char *code_list[] = {"", "CT", "DCS", "DCR"}; - if (code_type >= 0 && code_type < ARRAY_SIZE(code_list)) + if (code_type < ARRAY_SIZE(code_list)) strcpy(String, code_list[code_type]); } UI_PrintStringSmall(String, LCD_WIDTH + 24, 0, line + 1); @@ -669,7 +685,7 @@ void UI_DisplayMain(void) { // show the TX power const char pwr_list[] = "LMH"; 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 < ARRAY_SIZE(pwr_list)) ? pwr_list[i] : '\0'; String[1] = '\0'; UI_PrintStringSmall(String, LCD_WIDTH + 46, 0, line + 1); } diff --git a/ui/menu.c b/ui/menu.c index 424e137..26b3cc0 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -436,6 +436,9 @@ void UI_DisplayMenu(void) bool already_printed = false; + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + switch (gMenuCursor) { case MENU_SQL: @@ -806,6 +809,8 @@ void UI_DisplayMenu(void) } } + #pragma GCC diagnostic pop + if (!already_printed) { // we now do multi-line text in a single string