diff --git a/Makefile b/Makefile index e3294a0..b907f2a 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ ENABLE_KILL_REVIVE := 0 ENABLE_AM_FIX := 1 ENABLE_AM_FIX_SHOW_DATA := 0 # Squelch 12 B .. can't be right ? -ENABLE_SQUELCH_MORE_SENSITIVE := 1 +ENABLE_SQUELCH_MORE_SENSITIVE := 0 ENABLE_SQ_OPEN_WITH_UP_DN_BUTTS := 1 ENABLE_FASTER_CHANNEL_SCAN := 1 ENABLE_COPY_CHAN_TO_VFO_TO_CHAN := 1 diff --git a/app/app.c b/app/app.c index 4394378..3e9248e 100644 --- a/app/app.c +++ b/app/app.c @@ -324,7 +324,7 @@ static void APP_process_rx(void) if (g_squelch_open || g_monitor_enabled) { if (g_eeprom.config.setting.backlight_on_tx_rx >= 2) - backlight_turn_on(backlight_tx_rx_time_500ms); // keep the backlight on while we're receiving + BACKLIGHT_turn_on(backlight_tx_rx_time_10ms); // keep the backlight on while we're receiving if (!g_end_of_rx_detected_maybe && IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save)) { @@ -467,7 +467,7 @@ bool APP_start_listening(void) BK4819_set_GPIO_pin(BK4819_GPIO6_PIN2_GREEN, true); // LED on if (g_eeprom.config.setting.backlight_on_tx_rx >= 2) - backlight_turn_on(backlight_tx_rx_time_500ms); + BACKLIGHT_turn_on(backlight_tx_rx_time_10ms); #ifdef ENABLE_MDC1200 // MDC1200_reset_rx(); @@ -1780,7 +1780,7 @@ void APP_process_functions(void) case FUNCTION_TRANSMIT: if (g_eeprom.config.setting.backlight_on_tx_rx == 1 || g_eeprom.config.setting.backlight_on_tx_rx == 3) - backlight_turn_on(backlight_tx_rx_time_500ms); + BACKLIGHT_turn_on(backlight_tx_rx_time_10ms); break; case FUNCTION_NEW_RECEIVE: @@ -2025,17 +2025,6 @@ void APP_time_slice_500ms(void) // g_update_display = true; // can't do this if not FM scanning, it causes audio clicks #endif - if (g_backlight_tick_500ms > 0 && - !g_ask_to_save && - g_css_scan_mode == CSS_SCAN_MODE_OFF && - g_current_display_screen != DISPLAY_AIRCOPY) - { - if (g_current_display_screen != DISPLAY_MENU || g_menu_cursor != MENU_AUTO_BACKLITE) // don't turn off backlight if user is in backlight menu option - if (--g_backlight_tick_500ms == 0) - if (g_eeprom.config.setting.backlight_time < (ARRAY_SIZE(g_sub_menu_backlight) - 1)) - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn backlight off - } - if (g_reduced_service) { BOARD_ADC_GetBatteryInfo(&g_usb_current_voltage, &g_usb_current); @@ -2104,10 +2093,7 @@ void APP_time_slice_500ms(void) g_menu_tick_10ms = 0; if (g_eeprom.config.setting.backlight_time == 0) - { - g_backlight_tick_500ms = 0; - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF - } + BACKLIGHT_turn_off(); if (g_input_box_index > 0 || g_dtmf_input_mode) AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL); @@ -2204,7 +2190,7 @@ void APP_time_slice_500ms(void) ST7565_HardwareReset(); if (g_eeprom.config.setting.backlight_time < (ARRAY_SIZE(g_sub_menu_backlight) - 1)) - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight off + BACKLIGHT_turn_off(); } #ifdef ENABLE_VOICE else @@ -2301,6 +2287,17 @@ void APP_time_slice_10ms(void) { g_flash_light_blink_tick_10ms++; + if (g_backlight_tick_10ms > 0 && + !g_ask_to_save && + g_css_scan_mode == CSS_SCAN_MODE_OFF && + g_current_display_screen != DISPLAY_AIRCOPY) + { + if (g_current_display_screen != DISPLAY_MENU || g_menu_cursor != MENU_AUTO_BACKLITE) // don't turn off backlight if user is in backlight menu option + if (g_eeprom.config.setting.backlight_time < (ARRAY_SIZE(g_sub_menu_backlight) - 1)) + if (--g_backlight_tick_10ms <= 100) + BACKLIGHT_set_brightness(g_backlight_tick_10ms); + } + if (g_flag_save_vfo) { SETTINGS_save_vfo_indices(); @@ -2502,13 +2499,13 @@ static void APP_process_key(const key_code_t Key, const bool key_pressed, const RADIO_set_vfo_state(VFO_STATE_NORMAL); #if 0 // remember the current backlight state (on / off) - const bool backlight_was_on = GPIO_CheckBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); + const bool backlight_was_on = g_backlight_on; if (Key == KEY_EXIT && !backlight_was_on && g_eeprom.config.setting.backlight_time > 0) { // just turn the back light on for now so the user can see what's what if (!key_pressed && !key_held) { // key has been released - backlight_turn_on(0); + BACKLIGHT_turn_on(0); } g_beep_to_play = BEEP_NONE; return; @@ -2518,7 +2515,7 @@ static void APP_process_key(const key_code_t Key, const bool key_pressed, const // turn the backlight on if (key_pressed) if (Key != KEY_PTT) - backlight_turn_on(0); + BACKLIGHT_turn_on(0); if (g_current_function == FUNCTION_POWER_SAVE) FUNCTION_Select(FUNCTION_FOREGROUND); diff --git a/app/menu.c b/app/menu.c index 3ae9115..71657fd 100644 --- a/app/menu.c +++ b/app/menu.c @@ -1060,9 +1060,7 @@ void MENU_ShowCurrentSetting(void) case MENU_AUTO_BACKLITE: g_sub_menu_selection = g_eeprom.config.setting.backlight_time; - - g_backlight_tick_500ms = 0; - GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight ON while in backlight menu + BACKLIGHT_turn_on(0); break; case MENU_AUTO_BACKLITE_ON_TX_RX: @@ -1603,10 +1601,7 @@ static void MENU_Key_EXIT(bool key_pressed, bool key_held) g_request_display_screen = DISPLAY_MAIN; if (g_eeprom.config.setting.backlight_time == 0) - { - g_backlight_tick_500ms = 0; - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF - } + BACKLIGHT_turn_off(); } else { @@ -1889,10 +1884,7 @@ static void MENU_Key_UP_DOWN(bool key_pressed, bool key_held, int8_t Direction) g_request_display_screen = DISPLAY_MENU; if (g_menu_cursor != MENU_AUTO_BACKLITE && g_eeprom.config.setting.backlight_time == 0) - { - g_backlight_tick_500ms = 0; - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF - } + BACKLIGHT_turn_off(); return; } diff --git a/driver/backlight.c b/driver/backlight.c index 5b78ab8..ba367f3 100644 --- a/driver/backlight.c +++ b/driver/backlight.c @@ -14,15 +14,32 @@ * limitations under the License. */ +#include "backlight.h" #include "bsp/dp32g030/gpio.h" -#include "driver/backlight.h" +#include "bsp/dp32g030/pwmplus.h" +#include "bsp/dp32g030/portcon.h" #include "driver/gpio.h" #include "settings.h" -// this is decremented once every 500ms -uint16_t g_backlight_tick_500ms = 0; +uint16_t g_backlight_tick_10ms; +bool g_backlight_on; -uint16_t backlight_ticks(void) +void BACKLIGHT_init(void) +{ + // 48MHz / 94 / 1024 ~ 500Hz + const uint32_t PWM_FREQUENCY_HZ = 1000; + PWM_PLUS0_CLKSRC |= ((48000000 / 1024 / PWM_FREQUENCY_HZ) << 16); + PWM_PLUS0_PERIOD = 1023; + + PORTCON_PORTB_SEL0 &= ~(PORTCON_PORTB_SEL0_B6_MASK); + PORTCON_PORTB_SEL0 |= PORTCON_PORTB_SEL0_B6_BITS_PWMP0_CH0; + + PWM_PLUS0_GEN = PWMPLUS_GEN_CH0_OE_BITS_ENABLE | PWMPLUS_GEN_CH0_OUTINV_BITS_ENABLE; + + PWM_PLUS0_CFG = PWMPLUS_CFG_CNT_REP_BITS_ENABLE | PWMPLUS_CFG_COUNTER_EN_BITS_ENABLE; +} + +uint16_t BACKLIGHT_ticks(void) { uint16_t ticks = 0; switch (g_eeprom.config.setting.backlight_time) @@ -34,21 +51,38 @@ uint16_t backlight_ticks(void) case 5: ticks = 60 * 2; break; // 2 min case 6: ticks = 60 * 4; break; // 4 min } - return ticks * 2; + return ticks * 100; } -void backlight_turn_on(const uint16_t min_ticks) +void BACKLIGHT_set_brightness(unsigned int brightness) +{ + brightness = (brightness > BACKLIGHT_MAX_BRIGHTNESS) ? BACKLIGHT_MAX_BRIGHTNESS : brightness; + + // non-linear + PWM_PLUS0_CH0_COMP = (1023ul * brightness * brightness) / (BACKLIGHT_MAX_BRIGHTNESS * BACKLIGHT_MAX_BRIGHTNESS); + //PWM_PLUS0_SWLOAD = 1; + + g_backlight_on = (brightness > 0) ? true : false; +} + +void BACKLIGHT_turn_on(const uint16_t min_ticks) { if (min_ticks > 0) { - if (g_backlight_tick_500ms < min_ticks) - g_backlight_tick_500ms = min_ticks; - GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); + if (g_backlight_tick_10ms < min_ticks) + g_backlight_tick_10ms = min_ticks; + BACKLIGHT_set_brightness(BACKLIGHT_MAX_BRIGHTNESS); } else if (g_eeprom.config.setting.backlight_time > 0) { - GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); - g_backlight_tick_500ms = backlight_ticks(); + BACKLIGHT_set_brightness(BACKLIGHT_MAX_BRIGHTNESS); + g_backlight_tick_10ms = BACKLIGHT_ticks(); } } + +void BACKLIGHT_turn_off(void) +{ + g_backlight_tick_10ms = 0; + BACKLIGHT_set_brightness(0); +} diff --git a/driver/backlight.h b/driver/backlight.h index fa35263..5fabd97 100644 --- a/driver/backlight.h +++ b/driver/backlight.h @@ -18,11 +18,18 @@ #define DRIVER_BACKLIGHT_H #include +#include -extern uint16_t g_backlight_tick_500ms; +#define BACKLIGHT_MAX_BRIGHTNESS 100 -uint16_t backlight_ticks(void); -void backlight_turn_on(const uint16_t min_ticks); +extern uint16_t g_backlight_tick_10ms; +extern bool g_backlight_on; + +void BACKLIGHT_init(void); +uint16_t BACKLIGHT_ticks(void); +void BACKLIGHT_set_brightness(unsigned int brightness); +void BACKLIGHT_turn_on(const uint16_t min_ticks); +void BACKLIGHT_turn_off(void); #endif diff --git a/firmware.bin b/firmware.bin index 03a92f5..6f5af8f 100644 Binary files a/firmware.bin and b/firmware.bin differ diff --git a/firmware.packed.bin b/firmware.packed.bin index f729af6..32aa431 100644 Binary files a/firmware.packed.bin and b/firmware.packed.bin differ diff --git a/functions.c b/functions.c index 1f03ed1..6573d6a 100644 --- a/functions.c +++ b/functions.c @@ -196,7 +196,7 @@ void FUNCTION_Select(function_type_t Function) } if (g_eeprom.config.setting.backlight_on_tx_rx == 1 || g_eeprom.config.setting.backlight_on_tx_rx == 3) - backlight_turn_on(backlight_tx_rx_time_500ms); + BACKLIGHT_turn_on(backlight_tx_rx_time_10ms); if (g_eeprom.config.setting.dual_watch != DUAL_WATCH_OFF) { // dual-RX is enabled diff --git a/helper/battery.c b/helper/battery.c index 41e687a..1c15517 100644 --- a/helper/battery.c +++ b/helper/battery.c @@ -125,7 +125,7 @@ void BATTERY_GetReadings(const bool bDisplayBatteryLevel) { g_update_status = true; g_update_display = true; - backlight_turn_on(0); + BACKLIGHT_turn_on(0); } g_charging_with_type_c = true; diff --git a/main.c b/main.c index e36f91a..67713d2 100644 --- a/main.c +++ b/main.c @@ -63,7 +63,7 @@ void MAIN_DisplayReleaseKeys(void) ST7565_BlitStatusLine(); // blank status line ST7565_BlitFullScreen(); - GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // backlight on + BACKLIGHT_turn_on(0); } void MAIN_DisplayPowerOn(void) @@ -146,7 +146,7 @@ void MAIN_DisplayPowerOn(void) } if (g_eeprom.config.setting.power_on_display_mode != PWR_ON_DISPLAY_MODE_NONE) - backlight_turn_on(0); // turn the back light on + BACKLIGHT_turn_on(0); // turn the back light on } void Main(void) @@ -163,7 +163,8 @@ void Main(void) | SYSCON_DEV_CLK_GATE_SPI0_BITS_ENABLE | SYSCON_DEV_CLK_GATE_SARADC_BITS_ENABLE | SYSCON_DEV_CLK_GATE_CRC_BITS_ENABLE - | SYSCON_DEV_CLK_GATE_AES_BITS_ENABLE; + | SYSCON_DEV_CLK_GATE_AES_BITS_ENABLE + | SYSCON_DEV_CLK_GATE_PWM_PLUS0_BITS_ENABLE; SYSTICK_Init(); @@ -178,6 +179,7 @@ void Main(void) #ifdef ENABLE_FMRADIO BK1080_Init(0, false); #endif + BACKLIGHT_init(); // *************************** @@ -271,15 +273,15 @@ void Main(void) FUNCTION_Select(FUNCTION_POWER_SAVE); if (g_eeprom.config.setting.backlight_time < (ARRAY_SIZE(g_sub_menu_backlight) - 1)) - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF + BACKLIGHT_turn_off(); else - backlight_turn_on(0); // turn the backlight ON + BACKLIGHT_turn_on(0); // turn the backlight ON g_reduced_service = true; } else { - backlight_turn_on(0); + BACKLIGHT_turn_on(0); MAIN_DisplayPowerOn(); diff --git a/misc.c b/misc.c index c805dac..005fdde 100644 --- a/misc.c +++ b/misc.c @@ -31,7 +31,7 @@ const uint16_t fm_play_noscan_10ms = 1200 / 10; // 1.2 s const uint8_t menu_timeout_500ms = 30000 / 500; // 30 seconds const uint16_t menu_timeout_long_500ms = 120000 / 500; // 2 minutes -const uint16_t backlight_tx_rx_time_500ms = 10000 / 500; // 10 seconds +const uint16_t backlight_tx_rx_time_10ms = 10000 / 10; // 10 seconds const uint8_t dtmf_rx_live_timeout_500ms = 6000 / 500; // 6 seconds live decoder on screen const uint8_t dtmf_rx_timeout_500ms = 10000 / 500; // 10 seconds till we wipe the DTMF receiver diff --git a/misc.h b/misc.h index 6dc9bb7..415a9b2 100644 --- a/misc.h +++ b/misc.h @@ -126,7 +126,7 @@ extern const uint16_t fm_play_noscan_10ms; extern const uint8_t menu_timeout_500ms; extern const uint16_t menu_timeout_long_500ms; -extern const uint16_t backlight_tx_rx_time_500ms; +extern const uint16_t backlight_tx_rx_time_10ms; extern const uint8_t dtmf_rx_live_timeout_500ms; extern const uint8_t dtmf_rx_timeout_500ms; diff --git a/ui/fmradio.c b/ui/fmradio.c index b88229b..a62647f 100644 --- a/ui/fmradio.c +++ b/ui/fmradio.c @@ -36,7 +36,7 @@ void UI_DisplayFM(void) #ifdef ENABLE_KEYLOCK if (g_eeprom.config.setting.key_lock && g_keypad_locked > 0) { // tell user how to unlock the keyboard - backlight_turn_on(0); + BACKLIGHT_turn_on(0); UI_PrintString("Long press #", 0, LCD_WIDTH - 1, 1, 8); UI_PrintString("to unlock", 0, LCD_WIDTH - 1, 3, 8); ST7565_BlitFullScreen(); diff --git a/ui/main.c b/ui/main.c index 933ac13..8fc9b4d 100644 --- a/ui/main.c +++ b/ui/main.c @@ -419,7 +419,7 @@ void UI_DisplayMain(void) if (g_serial_config_tick_500ms > 0) { - backlight_turn_on(10); // 5 seconds + BACKLIGHT_turn_on(100 * 5); // 5 seconds UI_PrintString("UART", 0, LCD_WIDTH, 1, 8); UI_PrintString("CONFIG COMMS", 0, LCD_WIDTH, 3, 8); ST7565_BlitFullScreen(); @@ -430,7 +430,7 @@ void UI_DisplayMain(void) #ifdef ENABLE_KEYLOCK if (g_eeprom.config.setting.key_lock && g_keypad_locked > 0) { // tell user how to unlock the keyboard - backlight_turn_on(10); // 5 seconds + BACKLIGHT_turn_on(100 * 5); // 5 seconds UI_PrintString("Long press #", 0, LCD_WIDTH, 1, 8); UI_PrintString("to unlock", 0, LCD_WIDTH, 3, 8); ST7565_BlitFullScreen(); @@ -860,7 +860,7 @@ void UI_DisplayMain(void) { // show the modulation mode switch (g_vfo_info[vfo_num].channel.mod_mode) { -// case MOD_MODE_FM: strcpy(str, "FM"); break; + //case MOD_MODE_FM: strcpy(str, "FM"); break; case MOD_MODE_AM: strcpy(str, "AM"); break; case MOD_MODE_DSB: strcpy(str, "DS"); break; default: strcpy(str, "??"); break;