From f3e347bc5affe845a78ea54871f0b529b7786b4e Mon Sep 17 00:00:00 2001 From: OneOfEleven Date: Sun, 29 Oct 2023 22:33:38 +0000 Subject: [PATCH] Lots n lots --- Makefile | 16 +- README.md | 1 + am_fix.c | 1 - app/action.c | 63 +++-- app/aircopy.c | 2 + app/app.c | 610 ++++++++++++++++++++++--------------------- app/app.h | 2 +- app/dtmf.c | 4 +- app/fm.c | 46 ++-- app/main.c | 123 ++++++--- app/menu.c | 8 +- app/search.c | 5 + app/spectrum.c | 4 +- audio.c | 69 +++-- audio.h | 2 +- driver/bk4819-regs.h | 30 +-- driver/bk4819.c | 291 +++++++++++++-------- driver/bk4819.h | 9 +- driver/keyboard.c | 7 +- driver/keyboard.h | 1 + firmware.bin | Bin 59876 -> 59884 bytes firmware.packed.bin | Bin 59894 -> 59902 bytes font.c | 3 + font.h | 5 +- functions.c | 63 ++--- functions.h | 2 +- helper/battery.c | 4 +- helper/battery.h | 4 +- main.c | 9 +- misc.c | 37 +-- misc.h | 25 +- radio.c | 149 +++++------ scheduler.c | 51 ++-- ui/fmradio.c | 14 +- ui/helper.c | 10 +- ui/helper.h | 5 +- ui/main.c | 36 ++- ui/status.c | 9 +- ui/ui.c | 1 + 39 files changed, 951 insertions(+), 770 deletions(-) diff --git a/Makefile b/Makefile index 3fde2cb..7cb958d 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ ENABLE_OVERLAY := 0 ENABLE_LTO := 1 # UART Programming 2.9 kB ENABLE_UART := 1 -ENABLE_UART_DEBUG := 1 +ENABLE_UART_DEBUG := 0 # AirCopy 2.5 kB ENABLE_AIRCOPY := 0 ENABLE_AIRCOPY_REMEMBER_FREQ := 1 @@ -32,13 +32,16 @@ ENABLE_VOX := 0 ENABLE_REDUCE_LOW_MID_TX_POWER := 1 # Tx Alarm 0.6 kB ENABLE_ALARM := 0 -ENABLE_TX1750 := 0 +ENABLE_TX1750 := 1 # MDC1200 2.8 kB ENABLE_MDC1200 := 1 ENABLE_PWRON_PASSWORD := 0 ENABLE_RESET_AES_KEY := 1 ENABLE_BIG_FREQ := 0 -ENABLE_SMALL_BOLD := 0 +# smaa bolf 580 B +ENABLE_SMALL_BOLD := 1 +# smallest font 2 kB +ENABLE_SMALLEST_FONT := 0 # trim trailing 0.044 kB ENABLE_TRIM_TRAILING_ZEROS := 1 ENABLE_KEEP_MEM_NAME := 1 @@ -51,6 +54,7 @@ ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1 ENABLE_CONTRAST := 0 ENABLE_BOOT_BEEPS := 0 ENABLE_DTMF_CALL_FLASH_LIGHT := 1 +ENABLE_FLASH_LIGHT_SOS_TONE := 1 ENABLE_SHOW_CHARGE_LEVEL := 0 ENABLE_REVERSE_BAT_SYMBOL := 1 ENABLE_FREQ_SEARCH_TIMEOUT := 0 @@ -322,6 +326,9 @@ endif ifeq ($(ENABLE_SMALL_BOLD),1) CFLAGS += -DENABLE_SMALL_BOLD endif +ifeq ($(ENABLE_SMALLEST_FONT),1) + CFLAGS += -DENABLE_SMALLEST_FONT +endif ifeq ($(ENABLE_TRIM_TRAILING_ZEROS),1) CFLAGS += -DENABLE_TRIM_TRAILING_ZEROS endif @@ -382,6 +389,9 @@ endif ifeq ($(ENABLE_DTMF_CALL_FLASH_LIGHT),1) CFLAGS += -DENABLE_DTMF_CALL_FLASH_LIGHT endif +ifeq ($(ENABLE_FLASH_LIGHT_SOS_TONE),1) + CFLAGS += -DENABLE_FLASH_LIGHT_SOS_TONE +endif ifeq ($(ENABLE_SHOW_CHARGE_LEVEL),1) CFLAGS += -DENABLE_SHOW_CHARGE_LEVEL endif diff --git a/README.md b/README.md index 65cf246..47190b9 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ ENABLE_CTCSS_TAIL_PHASE_SHIFT := 0 standard CTCSS tail phase shift rath ENABLE_CONTRAST := 0 add contrast menu ENABLE_BOOT_BEEPS := 0 gives user audio feedback on volume knob position at boot-up ENABLE_DTMF_CALL_FLASH_LIGHT := 1 flash the flash light LED when a DTMF call is received +ENABLE_FLASH_LIGHT_SOS_TONE := 1 also do SOS in morse ENABLE_SHOW_CHARGE_LEVEL := 0 show the charge level when the radio is on charge ENABLE_REVERSE_BAT_SYMBOL := 1 mirror the battery symbol on the status bar (+ pole on the right) ENABLE_FREQ_SEARCH_TIMEOUT := 0 timeout if FREQ not found when using F+4 search function diff --git a/am_fix.c b/am_fix.c index e76fa24..7c314d2 100644 --- a/am_fix.c +++ b/am_fix.c @@ -305,7 +305,6 @@ case FUNCTION_FOREGROUND: case FUNCTION_NEW_RECEIVE: case FUNCTION_RECEIVE: - case FUNCTION_MONITOR: break; } diff --git a/app/action.c b/app/action.c index cea4124..207d4c9 100644 --- a/app/action.c +++ b/app/action.c @@ -55,10 +55,17 @@ static void ACTION_FlashLight(void) case FLASHLIGHT_BLINK: g_flash_light_blink_tick_10ms = 0; GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); + g_flash_light_state = FLASHLIGHT_SOS; + + if (g_current_function == FUNCTION_POWER_SAVE) + FUNCTION_Select(FUNCTION_RECEIVE); break; case FLASHLIGHT_SOS: + #ifdef ENABLE_FLASH_LIGHT_SOS_TONE + BK4819_StopTones(g_current_function == FUNCTION_TRANSMIT); + #endif // Fallthrough @@ -89,29 +96,39 @@ void ACTION_Power(void) void ACTION_Monitor(void) { - if (g_current_function != FUNCTION_MONITOR) - { // enable the monitor - RADIO_select_vfos(); + if (!g_monitor_enabled) // (g_current_function != FUNCTION_MONITOR) + { // enable monitor mode + + g_beep_to_play = BEEP_NONE; + + g_monitor_enabled = true; +// g_squelch_open = true; + #ifdef ENABLE_NOAA - if (g_rx_vfo->channel_save >= NOAA_CHANNEL_FIRST && g_is_noaa_mode) +// if (g_rx_vfo->channel_save >= NOAA_CHANNEL_FIRST && g_is_noaa_mode) + if (IS_NOAA_CHANNEL(g_rx_vfo->channel_save) && g_is_noaa_mode) g_noaa_channel = g_rx_vfo->channel_save - NOAA_CHANNEL_FIRST; #endif - g_monitor_enabled = true; - RADIO_setup_registers(true); - APP_start_listening(FUNCTION_MONITOR); + + APP_start_listening(); return; } + // disable monitor + g_monitor_enabled = false; + + if (!g_speaker_enabled) + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); if (g_scan_state_dir != SCAN_STATE_DIR_OFF) - g_scan_pause_10ms = g_eeprom.scan_hold_time_500ms * 50; + g_scan_pause_tick_10ms = g_eeprom.scan_hold_time_500ms * 50; #ifdef g_power_save_expired if (g_eeprom.dual_watch == DUAL_WATCH_OFF && g_is_noaa_mode) { g_noaa_tick_10ms = noaa_tick_10ms; - g_schedule_noaa = false; + g_schedule_noaa = false; } #endif @@ -134,12 +151,12 @@ void ACTION_Scan(bool bRestart) if (g_fm_radio_mode) { if (g_current_function != FUNCTION_RECEIVE && - g_current_function != FUNCTION_MONITOR && - g_current_function != FUNCTION_TRANSMIT) + g_current_function != FUNCTION_TRANSMIT && + !g_monitor_enabled) { GUI_SelectNextDisplay(DISPLAY_FM); - g_monitor_enabled = false; +// g_monitor_enabled = false; if (g_fm_scan_state != FM_SCAN_OFF) { // already scanning @@ -186,6 +203,7 @@ void ACTION_Scan(bool bRestart) { // not in freq/ctcss/cdcss search mode g_monitor_enabled = false; + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); DTMF_clear_RX(); @@ -213,7 +231,7 @@ void ACTION_Scan(bool bRestart) // jump to the next channel APP_channel_next(true, g_scan_state_dir); - g_scan_pause_10ms = 0; + g_scan_pause_tick_10ms = 0; g_scan_pause_time_mode = false; g_update_status = true; @@ -233,13 +251,14 @@ void ACTION_Scan(bool bRestart) // start scanning - // disable monitor mode g_monitor_enabled = false; + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + RADIO_setup_registers(true); APP_channel_next(true, SCAN_STATE_DIR_FORWARD); - g_scan_pause_10ms = 0; // go NOW + g_scan_pause_tick_10ms = 0; // go NOW g_scan_pause_time_mode = false; #ifdef ENABLE_VOICE @@ -270,14 +289,13 @@ void ACTION_Scan(bool bRestart) // jump to the next channel APP_channel_next(true, g_scan_state_dir); - g_scan_pause_10ms = 0; + g_scan_pause_tick_10ms = 0; g_scan_pause_time_mode = false; g_update_status = true; } else { // stop scanning - g_monitor_enabled = false; APP_stop_scan(); g_request_display_screen = DISPLAY_MAIN; } @@ -324,7 +342,9 @@ void ACTION_Scan(bool bRestart) #ifdef ENABLE_FMRADIO void ACTION_FM(void) { - if (g_current_function != FUNCTION_TRANSMIT && g_current_function != FUNCTION_MONITOR) + if (g_current_function != FUNCTION_TRANSMIT && +// g_current_function != FUNCTION_MONITOR + !g_monitor_enabled) { if (g_fm_radio_mode) { @@ -332,7 +352,7 @@ void ACTION_Scan(bool bRestart) g_input_box_index = 0; #ifdef ENABLE_VOX - g_vox_resume_count_down = 80; + g_vox_resume_tick_10ms = 80; #endif g_flag_reconfigure_vfos = true; @@ -340,7 +360,7 @@ void ACTION_Scan(bool bRestart) return; } - g_monitor_enabled = false; +// g_monitor_enabled = false; RADIO_select_vfos(); RADIO_setup_registers(true); @@ -372,10 +392,7 @@ void ACTION_process(const key_code_t Key, const bool key_pressed, const bool key } if (!key_held && key_pressed) - { - g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; return; - } if (key_held || key_pressed) { diff --git a/app/aircopy.c b/app/aircopy.c index 8cf6530..bafe175 100644 --- a/app/aircopy.c +++ b/app/aircopy.c @@ -80,6 +80,8 @@ void AIRCOPY_init(void) // turn the backlight ON GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + RADIO_setup_registers(true); BK4819_SetupAircopy(AIRCOPY_DATA_PACKET_SIZE); diff --git a/app/app.c b/app/app.c index d1e06b9..b7654f4 100644 --- a/app/app.c +++ b/app/app.c @@ -100,7 +100,7 @@ static void APP_update_rssi(const int vfo) static void APP_check_for_new_receive(void) { - if (!g_squelch_open) + if (!g_squelch_open && !g_monitor_enabled) return; // squelch is open @@ -111,7 +111,7 @@ static void APP_check_for_new_receive(void) if (g_css_scan_mode != CSS_SCAN_MODE_OFF && g_rx_reception_mode == RX_MODE_NONE) { // CTCSS/DTS scanning - g_scan_pause_10ms = scan_pause_code_10ms; + g_scan_pause_tick_10ms = scan_pause_code_10ms; g_scan_pause_time_mode = false; g_rx_reception_mode = RX_MODE_DETECTED; } @@ -135,7 +135,7 @@ static void APP_check_for_new_receive(void) if (g_rx_reception_mode != RX_MODE_NONE) goto done; - g_dual_watch_delay_10ms = g_eeprom.scan_hold_time_500ms * 50; + g_dual_watch_tick_10ms = g_eeprom.scan_hold_time_500ms * 50; g_scan_pause_time_mode = false; g_update_status = true; @@ -145,7 +145,7 @@ static void APP_check_for_new_receive(void) if (g_rx_reception_mode != RX_MODE_NONE) goto done; - g_scan_pause_10ms = scan_pause_chan_10ms; + g_scan_pause_tick_10ms = scan_pause_chan_10ms; g_scan_pause_time_mode = false; } @@ -174,7 +174,7 @@ static void APP_process_new_receive(void) { bool flag; - if (!g_squelch_open) + if (!g_squelch_open && !g_monitor_enabled) { // squelch is closed if (g_dtmf_rx_index > 0) @@ -229,7 +229,7 @@ static void APP_process_new_receive(void) { if (g_rx_reception_mode == RX_MODE_DETECTED) { - g_dual_watch_delay_10ms = g_eeprom.scan_hold_time_500ms * 50; + g_dual_watch_tick_10ms = g_eeprom.scan_hold_time_500ms * 50; g_rx_reception_mode = RX_MODE_LISTENING; g_update_status = true; @@ -241,7 +241,7 @@ static void APP_process_new_receive(void) } } - APP_start_listening(g_monitor_enabled ? FUNCTION_MONITOR : FUNCTION_RECEIVE); + APP_start_listening(); } enum end_of_rx_mode_e { @@ -263,14 +263,14 @@ static void APP_process_rx(void) if (g_scan_state_dir != SCAN_STATE_DIR_OFF) // && IS_FREQ_CHANNEL(g_scan_next_channel)) { - if (g_squelch_open) + if (g_squelch_open || g_monitor_enabled) { switch (g_eeprom.scan_resume_mode) { case SCAN_RESUME_TIME: // stay only for a limited time break; case SCAN_RESUME_CARRIER: // stay untill the carrier goes away - g_scan_pause_10ms = g_eeprom.scan_hold_time_500ms * 50; + g_scan_pause_tick_10ms = g_eeprom.scan_hold_time_500ms * 50; g_scan_pause_time_mode = false; break; case SCAN_RESUME_STOP: // stop scan once we find any signal @@ -312,7 +312,7 @@ static void APP_process_rx(void) break; } - if (g_squelch_open) + if (g_squelch_open || g_monitor_enabled) { if (g_setting_backlight_on_tx_rx >= 2) backlight_turn_on(backlight_tx_rx_time_500ms); // keep the backlight on while we're receiving @@ -402,6 +402,9 @@ Skip: break; case END_OF_RX_MODE_END: + if (!g_monitor_enabled) + g_speaker_enabled = false; + RADIO_setup_registers(true); #ifdef ENABLE_NOAA @@ -410,19 +413,21 @@ Skip: #endif g_update_display = true; - break; case END_OF_RX_MODE_TTE: if (g_eeprom.tail_note_elimination) { - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + if (!g_monitor_enabled) + g_speaker_enabled = false; - g_tail_tone_elimination_tick_10ms = 20; - g_flag_tail_tone_elimination_complete = false; - g_end_of_rx_detected_maybe = true; - g_speaker_enabled = false; + if (!g_speaker_enabled && !g_monitor_enabled) + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + + g_tail_tone_elimination_tick_10ms = 20; // 200ms + g_flag_tail_tone_elimination_complete = false; + g_end_of_rx_detected_maybe = true; } break; @@ -436,7 +441,7 @@ Skip: case SCAN_RESUME_TIME: // stay only for a limited time break; case SCAN_RESUME_CARRIER: // stay untill the carrier goes away - g_scan_pause_10ms = g_eeprom.scan_hold_time_500ms * 50; + g_scan_pause_tick_10ms = g_eeprom.scan_hold_time_500ms * 50; g_scan_pause_time_mode = false; break; case SCAN_RESUME_STOP: // stop scan once we find any signal @@ -446,7 +451,7 @@ Skip: } } -bool APP_start_listening(function_type_t Function) +bool APP_start_listening(void) { const unsigned int chan = g_eeprom.rx_vfo; // const unsigned int chan = g_rx_vfo->channel_save; @@ -456,7 +461,8 @@ bool APP_start_listening(function_type_t Function) return false; #endif - BK4819_set_GPIO_pin(BK4819_GPIO6_PIN2_GREEN, true); // LED on + if (g_squelch_open) + BK4819_set_GPIO_pin(BK4819_GPIO6_PIN2_GREEN, true); // LED on if (g_setting_backlight_on_tx_rx >= 2) backlight_turn_on(backlight_tx_rx_time_500ms); @@ -473,9 +479,6 @@ bool APP_start_listening(function_type_t Function) // clear the other vfo's rssi level (to hide the antenna symbol) g_vfo_rssi_bar_level[(chan + 1) & 1u] = 0; - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - g_speaker_enabled = true; - if (g_scan_state_dir != SCAN_STATE_DIR_OFF) { // we're RF scanning @@ -484,16 +487,16 @@ bool APP_start_listening(function_type_t Function) case SCAN_RESUME_TIME: if (!g_scan_pause_time_mode) { - g_scan_pause_10ms = g_eeprom.scan_hold_time_500ms * 50; + g_scan_pause_tick_10ms = g_eeprom.scan_hold_time_500ms * 50; g_scan_pause_time_mode = true; } break; case SCAN_RESUME_CARRIER: - g_scan_pause_10ms = g_eeprom.scan_hold_time_500ms * 50; + g_scan_pause_tick_10ms = g_eeprom.scan_hold_time_500ms * 50; g_scan_pause_time_mode = false; break; case SCAN_RESUME_STOP: - g_scan_pause_10ms = 0; + g_scan_pause_tick_10ms = 0; g_scan_pause_time_mode = false; break; } @@ -519,7 +522,7 @@ bool APP_start_listening(function_type_t Function) g_eeprom.dual_watch != DUAL_WATCH_OFF) { // dual watch is active - g_dual_watch_delay_10ms = g_eeprom.scan_hold_time_500ms * 50; + g_dual_watch_tick_10ms = g_eeprom.scan_hold_time_500ms * 50; g_rx_vfo_is_active = true; g_update_status = true; @@ -528,17 +531,19 @@ bool APP_start_listening(function_type_t Function) // AF gain - original QS values if (g_rx_vfo->am_mode) { - BK4819_WriteRegister(0x48, 0xB3A8); + BK4819_WriteRegister(0x48, 0xB3A8); // 1011 0011 1010 1000 } else { BK4819_WriteRegister(0x48, - (11u << 12) | // ??? .. 0 to 15, doesn't seem to make any difference + (11u << 12) | // ??? .. 0 ~ 15, doesn't seem to make any difference ( 0u << 10) | // AF Rx Gain-1 (g_eeprom.volume_gain << 4) | // AF Rx Gain-2 (g_eeprom.dac_gain << 0)); // AF DAC Gain (after Gain-1 and Gain-2) } + FUNCTION_Select(FUNCTION_RECEIVE); + #ifdef ENABLE_VOICE #ifdef MUTE_AUDIO_FOR_VOICE if (g_voice_write_index == 0) @@ -550,21 +555,15 @@ bool APP_start_listening(function_type_t Function) BK4819_SetAF(g_rx_vfo->am_mode ? BK4819_AF_AM : BK4819_AF_FM); #endif - FUNCTION_Select(Function); + // enable the speaker + g_speaker_enabled = true; + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - #ifdef ENABLE_FMRADIO - if (Function == FUNCTION_MONITOR || g_fm_radio_mode) - #else - if (Function == FUNCTION_MONITOR) - #endif - { // monitor mode (open squelch) - if (g_current_display_screen != DISPLAY_MENU) // 1of11 .. don't close the menu - GUI_SelectNextDisplay(DISPLAY_MAIN); - } - else - g_update_display = true; + if (g_current_display_screen != DISPLAY_MENU) + GUI_SelectNextDisplay(DISPLAY_MAIN); g_update_status = true; + g_update_display = true; return true; } @@ -605,11 +604,10 @@ void APP_stop_scan(void) g_scan_state_dir = SCAN_STATE_DIR_OFF; - // 1of11 if (g_scan_pause_time_mode || - g_scan_pause_10ms > (200 / 10) || + g_scan_pause_tick_10ms > (200 / 10) || + g_monitor_enabled || g_current_function == FUNCTION_RECEIVE || - g_current_function == FUNCTION_MONITOR || g_current_function == FUNCTION_NEW_RECEIVE) { // stay where we are g_scan_restore_channel = 0xff; @@ -629,6 +627,7 @@ void APP_stop_scan(void) g_eeprom.screen_channel[g_eeprom.rx_vfo] = g_scan_restore_channel; RADIO_configure_channel(g_eeprom.rx_vfo, VFO_CONFIGURE_RELOAD); + RADIO_setup_registers(true); } } @@ -663,7 +662,7 @@ void APP_stop_scan(void) g_another_voice_id = VOICE_ID_SCANNING_STOP; #endif - g_scan_pause_10ms = 0; + g_scan_pause_tick_10ms = 0; g_scan_pause_time_mode = false; g_update_status = true; @@ -688,12 +687,13 @@ static void APP_next_freq(void) RADIO_ApplyOffset(g_rx_vfo, false); RADIO_ConfigureSquelchAndOutputPower(g_rx_vfo); + RADIO_setup_registers(true); #ifdef ENABLE_FASTER_CHANNEL_SCAN - g_scan_pause_10ms = 10; // 100ms + g_scan_pause_tick_10ms = 10; // 100ms #else - g_scan_pause_10ms = scan_pause_freq_10ms; + g_scan_pause_tick_10ms = scan_pause_freq_10ms; #endif } else @@ -703,9 +703,9 @@ static void APP_next_freq(void) BK4819_set_rf_filter_path(frequency); #ifdef ENABLE_FASTER_CHANNEL_SCAN - g_scan_pause_10ms = 10; // 100ms + g_scan_pause_tick_10ms = 10; // 100ms #else - g_scan_pause_10ms = scan_pause_freq_10ms; + g_scan_pause_tick_10ms = scan_pause_freq_10ms; #endif } @@ -803,15 +803,16 @@ static void APP_next_channel(void) g_eeprom.screen_channel[g_eeprom.rx_vfo] = g_scan_next_channel; RADIO_configure_channel(g_eeprom.rx_vfo, VFO_CONFIGURE_RELOAD); + RADIO_setup_registers(true); g_update_display = true; } #ifdef ENABLE_FASTER_CHANNEL_SCAN - g_scan_pause_10ms = 9; // 90ms .. <= ~60ms it misses signals (squelch response and/or PLL lock time) ? + g_scan_pause_tick_10ms = 9; // 90ms .. <= ~60ms it misses signals (squelch response and/or PLL lock time) ? #else - g_scan_pause_10ms = scan_pause_chan_10ms; + g_scan_pause_tick_10ms = scan_pause_chan_10ms; #endif g_scan_pause_time_mode = false; @@ -859,9 +860,9 @@ static void APP_toggle_dual_watch_vfo(void) RADIO_setup_registers(false); #ifdef ENABLE_NOAA - g_dual_watch_delay_10ms = g_is_noaa_mode ? dual_watch_delay_noaa_10ms : dual_watch_delay_toggle_10ms; + g_dual_watch_tick_10ms = g_is_noaa_mode ? dual_watch_delay_noaa_10ms : dual_watch_delay_toggle_10ms; #else - g_dual_watch_delay_10ms = dual_watch_delay_toggle_10ms; + g_dual_watch_tick_10ms = dual_watch_delay_toggle_10ms; #endif } @@ -947,20 +948,20 @@ void APP_process_radio_interrupts(void) if (interrupt_bits & BK4819_REG_02_VOX_LOST) { g_vox_lost = true; - g_vox_pause_count_down = 10; + g_vox_pause_tick_10ms = 10; if (g_eeprom.vox_switch) { if (g_current_function == FUNCTION_POWER_SAVE && !g_rx_idle_mode) { - g_power_save_10ms = power_save2_10ms; + g_power_save_tick_10ms = power_save2_10ms; g_power_save_expired = false; } if (g_eeprom.dual_watch != DUAL_WATCH_OFF && - (g_dual_watch_delay_10ms == 0 || g_dual_watch_delay_10ms < dual_watch_delay_after_vox_10ms)) + (g_dual_watch_tick_10ms == 0 || g_dual_watch_tick_10ms < dual_watch_delay_after_vox_10ms)) { - g_dual_watch_delay_10ms = dual_watch_delay_after_vox_10ms; + g_dual_watch_tick_10ms = dual_watch_delay_after_vox_10ms; g_update_status = true; } } @@ -968,14 +969,16 @@ void APP_process_radio_interrupts(void) if (interrupt_bits & BK4819_REG_02_VOX_FOUND) { - g_vox_lost = false; - g_vox_pause_count_down = 0; + g_vox_lost = false; + g_vox_pause_tick_10ms = 0; } #endif if (interrupt_bits & BK4819_REG_02_SQUELCH_CLOSED) { g_squelch_open = false; +// g_squelch_open = g_monitor_enabled; + BK4819_set_GPIO_pin(BK4819_GPIO6_PIN2_GREEN, false); // LED off #if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG) @@ -1018,6 +1021,11 @@ void APP_end_tx(void) } RADIO_setup_registers(false); + + if (!g_speaker_enabled && !g_monitor_enabled) + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + else + APP_start_listening(); } #ifdef ENABLE_VOX @@ -1028,15 +1036,15 @@ void APP_end_tx(void) return; #endif - if (g_vox_resume_count_down == 0) + if (g_vox_resume_tick_10ms == 0) { - if (g_vox_pause_count_down) + if (g_vox_pause_tick_10ms) return; } else { g_vox_lost = false; - g_vox_pause_count_down = 0; + g_vox_pause_tick_10ms = 0; } #ifdef ENABLE_FMRADIO @@ -1044,7 +1052,7 @@ void APP_end_tx(void) return; #endif - if (g_current_function == FUNCTION_RECEIVE || g_current_function == FUNCTION_MONITOR) + if (g_current_function == FUNCTION_RECEIVE || g_monitor_enabled) return; if (g_scan_state_dir != SCAN_STATE_DIR_OFF || g_css_scan_mode != CSS_SCAN_MODE_OFF) @@ -1053,9 +1061,9 @@ void APP_end_tx(void) if (g_vox_noise_detected) { if (g_vox_lost) - g_vox_stop_10ms = vox_stop_10ms; + g_vox_stop_tick_10ms = vox_stop_10ms; else - if (g_vox_stop_10ms == 0) + if (g_vox_stop_tick_10ms == 0) g_vox_noise_detected = false; if (g_current_function == FUNCTION_TRANSMIT && @@ -1134,7 +1142,7 @@ void APP_check_keys(void) if (++g_ptt_debounce >= 3) // 30ms { // start TX'ing - g_boot_counter_10ms = 0; // cancel the boot-up screen + g_boot_tick_10ms = 0; // cancel the boot-up screen g_ptt_is_pressed = true; g_ptt_was_released = false; g_ptt_debounce = 0; @@ -1178,7 +1186,7 @@ void APP_check_keys(void) // scan the hardware keys key = KEYBOARD_Poll(); - g_boot_counter_10ms = 0; // cancel boot screen/beeps + g_boot_tick_10ms = 0; // cancel boot screen/beeps if (g_serial_config_tick_500ms > 0) { // config upload/download in progress @@ -1216,7 +1224,7 @@ void APP_check_keys(void) g_key_debounce_repeat = 0; g_key_prev = KEY_INVALID; g_key_held = false; - g_boot_counter_10ms = 0; // cancel the boot-up screen + g_boot_tick_10ms = 0; // cancel the boot-up screen g_update_status = true; g_update_display = true; @@ -1334,7 +1342,7 @@ void APP_cancel_user_input_modes(void) #else g_request_display_screen = DISPLAY_MAIN; #endif - g_update_display = true; + g_update_display = true; } if (g_fkey_pressed || g_key_input_count_down > 0 || g_input_box_index > 0) @@ -1350,8 +1358,8 @@ void APP_cancel_user_input_modes(void) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) static void APP_alarm_off(void) { - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - g_speaker_enabled = false; + if (!g_speaker_enabled && !g_monitor_enabled) + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); if (g_eeprom.alarm_mode == ALARM_MODE_TONE) { @@ -1360,7 +1368,7 @@ void APP_cancel_user_input_modes(void) } #ifdef ENABLE_VOX - g_vox_resume_count_down = 80; + g_vox_resume_tick_10ms = 80; #endif g_alarm_state = ALARM_STATE_OFF; @@ -1369,6 +1377,11 @@ void APP_cancel_user_input_modes(void) RADIO_setup_registers(true); + if (!g_monitor_enabled && !g_speaker_enabled) + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + else + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + if (g_current_display_screen != DISPLAY_MENU) // 1of11 .. don't close the menu g_request_display_screen = DISPLAY_MAIN; } @@ -1410,23 +1423,21 @@ void APP_channel_next(const bool remember_current, const scan_state_dir_t scan_d return; } - g_scan_pause_10ms = scan_pause_css_10ms; + g_scan_pause_tick_10ms = scan_pause_css_10ms; g_scan_pause_time_mode = false; g_rx_reception_mode = RX_MODE_NONE; } -static const uint32_t sos = __extension__ 0b10101000111011101110001010100000; // SOS pattern +static const uint32_t sos = __extension__ 0b10101000111011101110001010100000; void APP_process_flash_light_10ms(void) { switch (g_flash_light_state) { case FLASHLIGHT_OFF: -// GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); break; case FLASHLIGHT_ON: -// GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); break; case FLASHLIGHT_BLINK: @@ -1441,9 +1452,27 @@ void APP_process_flash_light_10ms(void) const unsigned int num_bits = sizeof(sos) * 8; const unsigned int bit = (g_flash_light_blink_tick_10ms / 16) % (num_bits + 6); if (bit < num_bits && (sos & (1u << (num_bits - 1 - bit)))) - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); // ON + { + if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT)) + { // LED on + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); + #ifdef ENABLE_FLASH_LIGHT_SOS_TONE + if (!g_squelch_open && !g_monitor_enabled && !GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER)) + BK4819_StartTone1(880, 127, true); + #endif + } + } else - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); // OFF + { + if (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT)) + { // LED off + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); // OFF + #ifdef ENABLE_FLASH_LIGHT_SOS_TONE + if (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER)) + BK4819_StopTones(g_current_function == FUNCTION_TRANSMIT); + #endif + } + } } break; } @@ -1463,30 +1492,30 @@ void APP_process_scan(void) g_scan_state_dir != SCAN_STATE_DIR_OFF && !g_ptt_is_pressed) { // RF scanning - + if (g_current_code_type == CODE_TYPE_NONE && g_current_function == FUNCTION_NEW_RECEIVE) // && !g_scan_pause_time_mode) { - APP_start_listening(g_monitor_enabled ? FUNCTION_MONITOR : FUNCTION_RECEIVE); + APP_start_listening(); } else - if (g_scan_pause_10ms == 0) + if (g_scan_pause_tick_10ms == 0) { // switch to next channel g_scan_pause_time_mode = false; g_rx_reception_mode = RX_MODE_NONE; - + if (g_scan_next_channel <= USER_CHANNEL_LAST) APP_next_channel(); else if (IS_FREQ_CHANNEL(g_scan_next_channel)) APP_next_freq(); } -/* +/* if (g_scan_next_channel <= USER_CHANNEL_LAST) { // channel mode - + if (g_current_code_type == CODE_TYPE_NONE && g_current_function == FUNCTION_NEW_RECEIVE && !g_scan_pause_time_mode) { - APP_start_listening(g_monitor_enabled ? FUNCTION_MONITOR : FUNCTION_RECEIVE); + APP_start_listening(); } else { // switch to next channel @@ -1498,10 +1527,10 @@ void APP_process_scan(void) else if (IS_FREQ_CHANNEL(g_scan_next_channel)) { // frequency mode - + if (g_current_function == FUNCTION_NEW_RECEIVE && !g_scan_pause_time_mode) { - APP_start_listening(g_monitor_enabled ? FUNCTION_MONITOR : FUNCTION_RECEIVE); + APP_start_listening(); } else { // switch to next frequency @@ -1510,28 +1539,30 @@ void APP_process_scan(void) APP_next_freq(); } } -*/ - +*/ + } - - if (g_css_scan_mode == CSS_SCAN_MODE_SCANNING && g_scan_pause_10ms == 0) + + if (g_css_scan_mode == CSS_SCAN_MODE_SCANNING && g_scan_pause_tick_10ms == 0) MENU_SelectNextCode(); - + #ifdef ENABLE_NOAA if (g_eeprom.dual_watch == DUAL_WATCH_OFF && g_is_noaa_mode && g_schedule_noaa) { APP_next_noaa(); - + RADIO_setup_registers(false); - + g_noaa_tick_10ms = 7; // 70ms g_schedule_noaa = false; } #endif - + switch (g_flash_light_state) + case FLASHLIGHT_SOS: + // toggle between the VFO's if dual watch is enabled if (g_eeprom.dual_watch != DUAL_WATCH_OFF && - g_dual_watch_delay_10ms == 0 && + g_dual_watch_tick_10ms == 0 && !g_ptt_is_pressed && #ifdef ENABLE_FMRADIO !g_fm_radio_mode && @@ -1544,10 +1575,10 @@ void APP_process_scan(void) (g_current_function == FUNCTION_FOREGROUND || g_current_function == FUNCTION_POWER_SAVE)) { APP_toggle_dual_watch_vfo(); // toggle between the two VFO's - + if (g_rx_vfo_is_active && g_current_display_screen == DISPLAY_MAIN) GUI_SelectNextDisplay(DISPLAY_MAIN); - + g_rx_vfo_is_active = false; g_rx_reception_mode = RX_MODE_NONE; } @@ -1562,9 +1593,9 @@ void APP_process_search(void) if (g_current_display_screen != DISPLAY_SEARCH) return; - + g_search_freq_css_timer_10ms++; - + if (g_search_delay_10ms > 0) { if (--g_search_delay_10ms > 0) @@ -1573,30 +1604,30 @@ void APP_process_search(void) return; } } - + if (g_search_edit_state != SEARCH_EDIT_STATE_NONE) { // waiting for user input choice APP_check_keys(); return; } - + g_update_display = true; GUI_SelectNextDisplay(DISPLAY_SEARCH); - + switch (g_search_css_state) { case SEARCH_CSS_STATE_OFF: - + if (g_search_freq_css_timer_10ms >= scan_freq_css_timeout_10ms) { // FREQ/CTCSS/CDCSS search timeout - + if (!g_search_single_frequency) { // FREQ search timeout #ifdef ENABLE_FREQ_SEARCH_TIMEOUT BK4819_DisableFrequencyScan(); - + g_search_css_state = SEARCH_CSS_STATE_FREQ_FAILED; - + AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); g_update_status = true; g_update_display = true; @@ -1607,9 +1638,9 @@ void APP_process_search(void) { // CTCSS/CDCSS search timeout #ifdef ENABLE_CODE_SEARCH_TIMEOUT BK4819_DisableFrequencyScan(); - + g_search_css_state = SEARCH_CSS_STATE_FREQ_FAILED; - + AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); g_update_status = true; g_update_display = true; @@ -1617,18 +1648,18 @@ void APP_process_search(void) #endif } } - + if (!BK4819_GetFrequencyScanResult(&Result)) break; // still scanning - + // accept only within 1kHz Delta = Result - g_search_frequency; g_search_hit_count = (abs(Delta) < 100) ? g_search_hit_count + 1 : 0; - + BK4819_DisableFrequencyScan(); - + g_search_frequency = Result; - + if (g_search_hit_count < 3) { // keep scanning for an RF carrier BK4819_EnableFrequencyScan(); @@ -1637,46 +1668,46 @@ void APP_process_search(void) { // RF carrier found // // stop RF search and start CTCSS/CDCSS search - + BK4819_SetScanFrequency(g_search_frequency); - + g_search_css_result_type = CODE_TYPE_NONE; g_search_css_result_code = 0xff; g_search_hit_count = 0; g_search_use_css_result = false; g_search_freq_css_timer_10ms = 0; g_search_css_state = SEARCH_CSS_STATE_SCANNING; - + g_update_status = true; g_update_display = true; GUI_SelectNextDisplay(DISPLAY_SEARCH); } - + g_search_delay_10ms = scan_freq_css_delay_10ms; break; - + case SEARCH_CSS_STATE_SCANNING: - + if (g_search_freq_css_timer_10ms >= scan_freq_css_timeout_10ms) { // CTCSS/CDCSS search timeout - + #if defined(ENABLE_CODE_SEARCH_TIMEOUT) g_search_css_state = SEARCH_CSS_STATE_FAILED; - + BK4819_Disable(); - + AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); g_update_status = true; g_update_display = true; break; - + #else if (!g_search_single_frequency) { g_search_css_state = SEARCH_CSS_STATE_FAILED; - - BK4819_Disable(); - + + BK4819_Idle(); + AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); g_update_status = true; g_update_display = true; @@ -1684,13 +1715,13 @@ void APP_process_search(void) } #endif } - + ScanResult = BK4819_GetCxCSSScanResult(&Result, &CtcssFreq); if (ScanResult == BK4819_CSS_RESULT_NOT_FOUND) break; - - BK4819_Disable(); - + + BK4819_Idle(); + if (ScanResult == BK4819_CSS_RESULT_CDCSS) { // found a CDCSS code const uint8_t code = DCS_GetCdcssCode(Result); @@ -1701,7 +1732,7 @@ void APP_process_search(void) g_search_css_result_code = code; g_search_css_state = SEARCH_CSS_STATE_FOUND; g_search_use_css_result = true; - + AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); g_update_status = true; g_update_display = true; @@ -1727,7 +1758,7 @@ void APP_process_search(void) { g_search_css_state = SEARCH_CSS_STATE_FOUND; g_search_use_css_result = true; - + AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); g_update_status = true; g_update_display = true; @@ -1749,17 +1780,17 @@ void APP_process_search(void) g_search_use_css_result = false; } } - + if (g_search_css_state == SEARCH_CSS_STATE_OFF || g_search_css_state == SEARCH_CSS_STATE_SCANNING) { // re-start scan BK4819_SetScanFrequency(g_search_frequency); g_search_delay_10ms = scan_freq_css_delay_10ms; } - + GUI_SelectNextDisplay(DISPLAY_SEARCH); break; - + //case SEARCH_CSS_STATE_FOUND: //case SEARCH_CSS_STATE_FAILED: //case SEARCH_CSS_STATE_REPEAT: @@ -1769,18 +1800,18 @@ void APP_process_search(void) } void APP_process_transmit(void) -{ +{ if (g_current_function != FUNCTION_TRANSMIT) return; #ifdef ENABLE_ALARM if (g_alarm_state == ALARM_STATE_TXALARM || g_alarm_state == ALARM_STATE_ALARM) { // TX alarm tone - + uint16_t Tone; - + g_alarm_running_counter_10ms++; - + // loop alarm tone frequency 300Hz ~ 1500Hz ~ 300Hz Tone = 300 + (g_alarm_tone_counter_10ms++ * 50); if (Tone >= ((1500 * 2) - 300)) @@ -1788,44 +1819,44 @@ void APP_process_transmit(void) Tone = 300; g_alarm_tone_counter_10ms = 0; } - + BK4819_SetScrambleFrequencyControlWord((Tone <= 1500) ? Tone : (1500 * 2) - Tone); - + if (g_eeprom.alarm_mode == ALARM_MODE_TONE && g_alarm_running_counter_10ms == 512) { g_alarm_running_counter_10ms = 0; - + if (g_alarm_state == ALARM_STATE_TXALARM) { g_alarm_state = ALARM_STATE_ALARM; - + RADIO_EnableCxCSS(); BK4819_SetupPowerAmplifier(0, 0); BK4819_set_GPIO_pin(BK4819_GPIO1_PIN29_PA_ENABLE, false); // PA off BK4819_Enable_AfDac_DiscMode_TxDsp(); BK4819_set_GPIO_pin(BK4819_GPIO5_PIN1_RED, false); // LED off - + GUI_DisplayScreen(); } else { g_alarm_state = ALARM_STATE_TXALARM; - + GUI_DisplayScreen(); - + RADIO_enableTX(false); BK4819_TransmitTone(true, 500); SYSTEM_DelayMs(2); - - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + g_speaker_enabled = true; - + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + g_alarm_tone_counter_10ms = 0; } } } #endif - + // repeater tail tone elimination if (g_rtte_count_down > 0) { @@ -1853,10 +1884,8 @@ void APP_process_functions(void) case FUNCTION_NEW_RECEIVE: APP_process_new_receive(); - - case FUNCTION_MONITOR: break; - + case FUNCTION_RECEIVE: APP_process_rx(); break; @@ -1868,63 +1897,60 @@ void APP_process_functions(void) case FUNCTION_PANADAPTER: break; + + default: + break; } } void APP_process_power_save(void) { - if (g_schedule_power_save) - { - #ifdef ENABLE_NOAA - if ( - #ifdef ENABLE_FMRADIO - g_fm_radio_mode || - #endif - g_ptt_is_pressed || - g_key_held || - g_eeprom.battery_save == 0 || - g_scan_state_dir != SCAN_STATE_DIR_OFF || - g_css_scan_mode != CSS_SCAN_MODE_OFF || - g_current_display_screen != DISPLAY_MAIN || - g_dtmf_call_state != DTMF_CALL_STATE_NONE) - { - g_battery_save_tick_10ms = battery_save_count_10ms; - } - else - if ((IS_NOT_NOAA_CHANNEL(g_eeprom.screen_channel[0]) && - IS_NOT_NOAA_CHANNEL(g_eeprom.screen_channel[1])) || - !g_is_noaa_mode) - { - FUNCTION_Select(FUNCTION_POWER_SAVE); - } - else - { - g_battery_save_tick_10ms = battery_save_count_10ms; - } - #else - if ( - #ifdef ENABLE_FMRADIO - g_fm_radio_mode || - #endif - g_ptt_is_pressed || - g_key_held || - g_eeprom.battery_save == 0 || - g_scan_state_dir != SCAN_STATE_DIR_OFF || - g_css_scan_mode != CSS_SCAN_MODE_OFF || - g_current_display_screen != DISPLAY_MAIN || - g_dtmf_call_state != DTMF_CALL_STATE_NONE) - { - g_battery_save_tick_10ms = battery_save_count_10ms; - } - else - { - FUNCTION_Select(FUNCTION_POWER_SAVE); - } - #endif + bool power_save = true; - g_schedule_power_save = false; + if (g_monitor_enabled || + #ifdef ENABLE_FMRADIO + g_fm_radio_mode || + #endif + g_ptt_is_pressed || + g_fkey_pressed || + g_key_pressed != KEY_INVALID || + g_key_held || + g_eeprom.battery_save == 0 || + g_scan_state_dir != SCAN_STATE_DIR_OFF || + g_css_scan_mode != CSS_SCAN_MODE_OFF || + g_current_display_screen != DISPLAY_MAIN || + g_dtmf_call_state != DTMF_CALL_STATE_NONE || + g_flash_light_state == FLASHLIGHT_SOS) + { + power_save = false; } - + + #ifdef ENABLE_NOAA + if (IS_NOAA_CHANNEL(g_eeprom.screen_channel[0]) || + IS_NOAA_CHANNEL(g_eeprom.screen_channel[1]) || + g_is_noaa_mode) + { + power_save = false; + } + #endif + + if (!power_save) + { +// if (g_current_function == FUNCTION_POWER_SAVE && g_rx_idle_mode) +// BK4819_RX_TurnOn(); + if (g_current_function == FUNCTION_POWER_SAVE) + FUNCTION_Select(FUNCTION_RECEIVE); // come out of power save mode + + g_schedule_power_save_tick_10ms = battery_save_count_10ms; // stay out of power save mode + } + else + if (g_schedule_power_save) + { // enter power save + FUNCTION_Select(FUNCTION_POWER_SAVE); + } + + g_schedule_power_save = false; + #ifdef ENABLE_VOICE if (g_voice_write_index != 0) return; @@ -1932,22 +1958,22 @@ void APP_process_power_save(void) if (!g_power_save_expired || g_current_function != FUNCTION_POWER_SAVE) return; - + // wake up, enable RX then go back to sleep - + if (g_rx_idle_mode) { #if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG) //UART_SendText("ps wake up\r\n"); #endif - - BK4819_Conditional_RX_TurnOn_and_GPIO6_Enable(); - + + BK4819_Conditional_RX_TurnOn(); + #ifdef ENABLE_VOX if (g_eeprom.vox_switch) BK4819_EnableVox(g_eeprom.vox1_threshold, g_eeprom.vox0_threshold); #endif - + if (g_eeprom.dual_watch != DUAL_WATCH_OFF && g_scan_state_dir == SCAN_STATE_DIR_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF) @@ -1955,11 +1981,11 @@ void APP_process_power_save(void) APP_toggle_dual_watch_vfo(); g_update_rssi = false; } - + FUNCTION_Init(); - - g_power_save_10ms = power_save1_10ms; // come back here in a bit - g_rx_idle_mode = false; // RX is awake + + g_power_save_tick_10ms = power_save1_10ms; // come back here in a bit + g_rx_idle_mode = false; // RX is awake } else if (g_eeprom.dual_watch == DUAL_WATCH_OFF || @@ -1967,14 +1993,14 @@ void APP_process_power_save(void) g_css_scan_mode != CSS_SCAN_MODE_OFF || g_update_rssi) { // dual watch mode, go back to sleep - + APP_update_rssi(g_eeprom.rx_vfo); - + // go back to sleep - - g_power_save_10ms = g_eeprom.battery_save * 10; + + g_power_save_tick_10ms = g_eeprom.battery_save * 10; g_rx_idle_mode = true; - + BK4819_DisableVox(); BK4819_Sleep(); BK4819_set_GPIO_pin(BK4819_GPIO0_PIN28_RX_ENABLE, false); @@ -1983,11 +2009,11 @@ void APP_process_power_save(void) { // toggle between the two VFO's APP_toggle_dual_watch_vfo(); - + g_update_rssi = true; - g_power_save_10ms = power_save1_10ms; + g_power_save_tick_10ms = power_save1_10ms; } - + g_power_save_expired = false; } @@ -1996,8 +2022,6 @@ void APP_time_slice_500ms(void) { bool exit_menu = false; - // Skipped authentic device check - if (g_serial_config_tick_500ms > 0) { // config upload/download is running return; @@ -2051,23 +2075,20 @@ void APP_time_slice_500ms(void) } } - if (g_menu_count_down > 0) - if (--g_menu_count_down == 0) + if (g_menu_tick_10ms > 0) + if (--g_menu_tick_10ms == 0) exit_menu = (g_current_display_screen == DISPLAY_MENU); // exit menu mode if (g_dtmf_rx_timeout > 0) if (--g_dtmf_rx_timeout == 0) DTMF_clear_RX(); - // Skipped authentic device check - #ifdef ENABLE_FMRADIO if (g_fm_radio_tick_500ms > 0) - { g_fm_radio_tick_500ms--; - if (g_fm_radio_mode) // 1of11 - return; - } + + if (g_fm_radio_mode && g_current_display_screen == DISPLAY_FM && g_fm_scan_state != FM_SCAN_OFF) + g_update_display = true; // can't do this if not FM scanning, it causes audio clicks #endif if (g_backlight_count_down > 0 && @@ -2098,10 +2119,7 @@ void APP_time_slice_500ms(void) } g_battery_check_counter++; - - // Skipped authentic device check - - if ((g_battery_check_counter & 1) == 0) + if ((g_battery_check_counter & 1u) == 0) { BOARD_ADC_GetBatteryInfo(&g_battery_voltages[g_battery_voltage_index++], &g_usb_current); if (g_battery_voltage_index > 3) @@ -2109,11 +2127,12 @@ void APP_time_slice_500ms(void) BATTERY_GetReadings(true); } - // regular display updates (once every 2 sec) - if need be + // update every 2 sec if ((g_battery_check_counter & 3) == 0) { if (g_charging_with_type_c || g_setting_battery_text > 0) g_update_status = true; + #ifdef ENABLE_SHOW_CHARGE_LEVEL if (g_charging_with_type_c) g_update_display = true; @@ -2137,10 +2156,10 @@ void APP_time_slice_500ms(void) { #ifdef ENABLE_KEYLOCK - if (g_eeprom.auto_keypad_lock && + if (g_eeprom.auto_keypad_lock && g_key_lock_tick_500ms > 0 && - !g_dtmf_input_mode && - g_input_box_index == 0 && + !g_dtmf_input_mode && + g_input_box_index == 0 && g_current_display_screen != DISPLAY_MENU) { if (--g_key_lock_tick_500ms == 0) @@ -2153,7 +2172,7 @@ void APP_time_slice_500ms(void) if (exit_menu) { - g_menu_count_down = 0; + g_menu_tick_10ms = 0; if (g_eeprom.backlight == 0) { @@ -2191,8 +2210,8 @@ void APP_time_slice_500ms(void) #ifdef ENABLE_FMRADIO if (g_fm_radio_mode && g_current_function != FUNCTION_RECEIVE && - g_current_function != FUNCTION_MONITOR && - g_current_function != FUNCTION_TRANSMIT) + g_current_function != FUNCTION_TRANSMIT && + !g_monitor_enabled) { disp = DISPLAY_FM; } @@ -2217,42 +2236,23 @@ void APP_time_slice_500ms(void) if (g_current_function != FUNCTION_POWER_SAVE && g_current_function != FUNCTION_TRANSMIT) APP_update_rssi(g_eeprom.rx_vfo); - #ifdef ENABLE_FMRADIO - if (!g_ptt_is_pressed && g_fm_resume_tick_500ms > 0) - { - if (--g_fm_resume_tick_500ms == 0) - { - RADIO_Setg_vfo_state(VFO_STATE_NORMAL); - - if (g_current_function != FUNCTION_RECEIVE && - g_current_function != FUNCTION_TRANSMIT && - g_current_function != FUNCTION_MONITOR && - g_fm_radio_mode) - { // switch back to FM radio mode - FM_Start(); - GUI_SelectNextDisplay(DISPLAY_FM); - } - } - } - #endif - if (g_low_battery) { - g_low_battery_blink = ++g_low_batteryCountdown & 1; + g_low_battery_blink = ++g_low_battery_tick_10ms & 1; UI_DisplayBattery(0, g_low_battery_blink); if (g_current_function != FUNCTION_TRANSMIT) { // not transmitting - if (g_low_batteryCountdown < 30) + if (g_low_battery_tick_10ms < 30) { - if (g_low_batteryCountdown == 29 && !g_charging_with_type_c) + if (g_low_battery_tick_10ms == 29 && !g_charging_with_type_c) AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP); } else { - g_low_batteryCountdown = 0; + g_low_battery_tick_10ms = 0; if (!g_charging_with_type_c) { // not on charge @@ -2287,6 +2287,30 @@ void APP_time_slice_500ms(void) } } + #ifdef ENABLE_FMRADIO + if (g_current_function != FUNCTION_TRANSMIT) + { + if (g_fm_resume_tick_500ms > 0) + { + if (--g_fm_resume_tick_500ms == 0) + { + RADIO_Setg_vfo_state(VFO_STATE_NORMAL); + + if (g_current_function != FUNCTION_RECEIVE && + !g_monitor_enabled && + g_fm_radio_mode) + { // switch back to FM radio mode + FM_Start(); + GUI_SelectNextDisplay(DISPLAY_FM); + } + } + } + } + + if (g_fm_radio_mode && g_fm_radio_tick_500ms == 0) + return; + #endif + if (g_current_function != FUNCTION_TRANSMIT) { if (g_dtmf_decode_ring_tick_500ms > 0) @@ -2340,7 +2364,7 @@ void APP_time_slice_500ms(void) } #ifdef ENABLE_TX_TIMEOUT_BAR - if (g_current_function == FUNCTION_TRANSMIT && (g_tx_timer_tick_500ms & 1)) + if (g_current_function == FUNCTION_TRANSMIT && (g_tx_timer_tick_500ms & 1u)) UI_DisplayTXCountdown(true); #endif } @@ -2406,7 +2430,6 @@ void APP_time_slice_10ms(void) #endif #ifdef ENABLE_AM_FIX -// if (g_eeprom.vfo_info[g_eeprom.rx_vfo].am_mode && g_setting_am_fix) if (g_rx_vfo->am_mode && g_setting_am_fix) AM_fix_10ms(g_eeprom.rx_vfo); #endif @@ -2417,10 +2440,6 @@ void APP_time_slice_10ms(void) SETTINGS_save_fm(); g_flag_save_fm = false; } - - if (g_fm_radio_mode && g_current_display_screen == DISPLAY_FM) - if ((g_flash_light_blink_tick_10ms % (500 / 10)) == 0) // once every 500ms - g_update_display = true; #endif if (g_flag_save_vfo) @@ -2441,8 +2460,12 @@ void APP_time_slice_10ms(void) g_flag_save_channel = false; RADIO_configure_channel(g_eeprom.tx_vfo, VFO_CONFIGURE); + RADIO_setup_registers(true); + if (g_monitor_enabled) + APP_start_listening(); + GUI_SelectNextDisplay(DISPLAY_MAIN); } @@ -2462,6 +2485,11 @@ void APP_time_slice_10ms(void) // *************************************************** + #ifdef ENABLE_BOOT_BEEPS + if (g_boot_tick_10ms > 0 && (g_boot_tick_10ms % 25) == 0) + AUDIO_PlayBeep(BEEP_880HZ_40MS_OPTIONAL); + #endif + if (g_current_function != FUNCTION_POWER_SAVE || !g_rx_idle_mode) APP_process_radio_interrupts(); @@ -2475,11 +2503,6 @@ void APP_time_slice_10ms(void) #endif } - #ifdef ENABLE_BOOT_BEEPS - if (g_boot_counter_10ms > 0 && (g_boot_counter_10ms % 25) == 0) - AUDIO_PlayBeep(BEEP_880HZ_40MS_OPTIONAL); - #endif - #ifdef ENABLE_VOICE if (g_flag_play_queued_voice) { @@ -2502,11 +2525,11 @@ void APP_time_slice_10ms(void) #endif #ifdef ENABLE_VOX - if (g_vox_resume_count_down > 0) - g_vox_resume_count_down--; + if (g_vox_resume_tick_10ms > 0) + g_vox_resume_tick_10ms--; - if (g_vox_pause_count_down > 0) - g_vox_pause_count_down--; + if (g_vox_pause_tick_10ms > 0) + g_vox_pause_tick_10ms--; #endif #ifdef ENABLE_VOX @@ -2515,11 +2538,11 @@ void APP_time_slice_10ms(void) #endif APP_process_transmit(); - + #ifdef ENABLE_FMRADIO if (g_schedule_fm && g_fm_scan_state != FM_SCAN_OFF && - g_current_function != FUNCTION_MONITOR && + !g_monitor_enabled && g_current_function != FUNCTION_RECEIVE && g_current_function != FUNCTION_TRANSMIT) { // switch to FM radio mode @@ -2542,9 +2565,9 @@ void APP_time_slice_10ms(void) #endif APP_process_scan(); - + APP_process_search(); - + APP_check_keys(); } @@ -2582,7 +2605,7 @@ static void APP_process_key(const key_code_t Key, const bool key_pressed, const FUNCTION_Select(FUNCTION_FOREGROUND); // stay awake - for now - g_battery_save_tick_10ms = battery_save_count_10ms; + g_schedule_power_save_tick_10ms = battery_save_count_10ms; #ifdef ENABLE_KEYLOCK // keep the auto keylock at bay @@ -2665,7 +2688,7 @@ static void APP_process_key(const key_code_t Key, const bool key_pressed, const } if (key_pressed && g_current_display_screen == DISPLAY_MENU) - g_menu_count_down = menu_timeout_500ms; + g_menu_tick_10ms = menu_timeout_500ms; // cancel the ringing if (key_pressed && g_dtmf_decode_ring_tick_500ms > 0) @@ -2770,8 +2793,8 @@ static void APP_process_key(const key_code_t Key, const bool key_pressed, const { if (!key_pressed) { +// g_speaker_enabled = false; GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - g_speaker_enabled = false; BK4819_ExitDTMF_TX(false); @@ -2785,8 +2808,8 @@ static void APP_process_key(const key_code_t Key, const bool key_pressed, const { if (g_eeprom.dtmf_side_tone) { // user will here the DTMF tones in speaker +// g_speaker_enabled = true; GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - g_speaker_enabled = true; } BK4819_DisableScramble(); @@ -2878,7 +2901,7 @@ Skip: if (g_flag_accept_setting) { - g_menu_count_down = menu_timeout_500ms; + g_menu_tick_10ms = menu_timeout_500ms; MENU_AcceptSetting(); @@ -2986,16 +3009,16 @@ Skip: g_vfo_rssi_bar_level[0] = 0; g_vfo_rssi_bar_level[1] = 0; + if (g_speaker_enabled || g_monitor_enabled) + APP_start_listening(); + g_flag_reconfigure_vfos = false; - - if (g_monitor_enabled) - ACTION_Monitor(); // 1of11 } if (g_flag_refresh_menu) { g_flag_refresh_menu = false; - g_menu_count_down = menu_timeout_500ms; + g_menu_tick_10ms = menu_timeout_500ms; MENU_ShowCurrentSetting(); } @@ -3003,7 +3026,6 @@ Skip: if (g_search_flag_start_scan) { g_search_flag_start_scan = false; - g_monitor_enabled = false; #ifdef ENABLE_VOICE AUDIO_SetVoiceID(0, VOICE_ID_SCANNING_BEGIN); diff --git a/app/app.h b/app/app.h index 7167282..b8459c9 100644 --- a/app/app.h +++ b/app/app.h @@ -31,7 +31,7 @@ extern const uint8_t orig_pga; void APP_end_tx(void); void APP_stop_scan(void); void APP_channel_next(const bool remember_current, const scan_state_dir_t scan_direction); -bool APP_start_listening(function_type_t Function); +bool APP_start_listening(void); uint32_t APP_set_frequency_by_step(vfo_info_t *pInfo, int8_t Step); void APP_time_slice_10ms(void); void APP_time_slice_500ms(void); diff --git a/app/dtmf.c b/app/dtmf.c index d812422..c3b3a16 100644 --- a/app/dtmf.c +++ b/app/dtmf.c @@ -439,8 +439,8 @@ bool DTMF_Reply(void) if (g_eeprom.dtmf_side_tone) { // the user will also hear the transmitted tones - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); g_speaker_enabled = true; + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); } SYSTEM_DelayMs(Delay); @@ -455,8 +455,8 @@ bool DTMF_Reply(void) g_eeprom.dtmf_code_persist_time, g_eeprom.dtmf_code_interval_time); - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); g_speaker_enabled = false; + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); BK4819_ExitDTMF_TX(false); diff --git a/app/fm.c b/app/fm.c index 8b7dfbd..8f84f04 100644 --- a/app/fm.c +++ b/app/fm.c @@ -98,16 +98,19 @@ int FM_ConfigureChannelState(void) void FM_TurnOff(void) { - g_fm_radio_mode = false; - g_fm_scan_state = FM_SCAN_OFF; + g_fm_radio_mode = false; + g_fm_scan_state = FM_SCAN_OFF; g_fm_restore_tick_10ms = 0; - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - - g_speaker_enabled = false; + if (!g_monitor_enabled) + { + g_speaker_enabled = false; + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + } BK1080_Init(0, false); + g_update_display = true; g_update_status = true; } @@ -125,9 +128,8 @@ void FM_EraseChannels(void) void FM_Tune(uint16_t Frequency, int8_t Step, bool flag) { - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - g_speaker_enabled = false; + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); g_fm_play_tick_10ms = (g_fm_scan_state == FM_SCAN_OFF) ? fm_play_noscan_10ms : fm_play_scan_10ms; @@ -169,12 +171,13 @@ void FM_PlayAndUpdate(void) SETTINGS_save_fm(); g_fm_play_tick_10ms = 0; - g_schedule_fm = false; - g_ask_to_save = false; - - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + g_schedule_fm = false; + g_ask_to_save = false; g_speaker_enabled = true; + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + + g_update_display = true; } int FM_CheckFrequencyLock(uint16_t Frequency, uint16_t LowerLimit) @@ -402,9 +405,12 @@ static void FM_Key_STAR(bool key_pressed, bool key_held) static void FM_Key_EXIT(bool key_pressed, bool key_held) { + (void)key_held; + g_key_input_count_down = key_input_timeout_500ms; - if (key_held || key_pressed) +// if (key_held || key_pressed) + if (key_pressed) return; if (g_fm_scan_state == FM_SCAN_OFF) @@ -460,12 +466,15 @@ static void FM_Key_EXIT(bool key_pressed, bool key_held) static void FM_Key_MENU(bool key_pressed, bool key_held) { + (void)key_held; + unsigned int i; int channel = -1; g_key_input_count_down = key_input_timeout_500ms; - if (key_held || key_pressed) +// if (key_held || key_pressed) + if (key_pressed) return; // key still pressed // see if the frequency is already stored in a channel @@ -513,7 +522,7 @@ static void FM_Key_MENU(bool key_pressed, bool key_held) else g_ask_to_delete = true; } - + return; } @@ -666,8 +675,8 @@ void FM_Play(void) if (!g_eeprom.fm_channel_mode) g_eeprom.fm_selected_frequency = g_eeprom.fm_frequency_playing; - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); g_speaker_enabled = true; + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); GUI_SelectNextDisplay(DISPLAY_FM); return; @@ -694,14 +703,15 @@ void FM_Play(void) void FM_Start(void) { - g_fm_radio_mode = true; - g_fm_scan_state = FM_SCAN_OFF; + g_fm_radio_mode = true; + g_fm_scan_state = FM_SCAN_OFF; g_fm_restore_tick_10ms = 0; BK1080_Init(g_eeprom.fm_frequency_playing, true); + g_speaker_enabled = true; GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - g_speaker_enabled = true; + g_update_display = true; g_update_status = true; } diff --git a/app/main.c b/app/main.c index 39da944..fe01a27 100644 --- a/app/main.c +++ b/app/main.c @@ -41,13 +41,14 @@ #include "radio.h" #include "settings.h" #include "ui/inputbox.h" -#include "ui/ui.h" +#include "ui/main.h" #include "ui/menu.h" +#include "ui/ui.h" bool scanning_paused(void) { if ((g_scan_state_dir != SCAN_STATE_DIR_OFF || g_eeprom.dual_watch != DUAL_WATCH_OFF) && - g_scan_pause_10ms > 0 && g_scan_pause_10ms <= (200 / 10)) + g_scan_pause_tick_10ms > 0 && g_scan_pause_tick_10ms <= (200 / 10)) { // scanning isn't paused return false; } @@ -130,6 +131,7 @@ void toggle_chan_scanlist(void) RADIO_select_vfos(); RADIO_ApplyOffset(g_tx_vfo, false); RADIO_ConfigureSquelchAndOutputPower(g_tx_vfo); + RADIO_setup_registers(true); // find the first channel that contains this frequency @@ -427,7 +429,7 @@ void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) { // key held down if (key_pressed) - { // and pressed + { if (g_current_display_screen == DISPLAY_MAIN) { if (g_input_box_index > 0) @@ -473,7 +475,9 @@ void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) INPUTBOX_append(Key); - g_request_display_screen = DISPLAY_MAIN; + UI_DisplayMain(); + +// g_request_display_screen = DISPLAY_MAIN; if (IS_USER_CHANNEL(g_tx_vfo->channel_save)) { // user is entering channel number @@ -483,9 +487,8 @@ void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) if (g_input_box_index != 3) { #ifdef ENABLE_VOICE - g_another_voice_id = (voice_id_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif - g_request_display_screen = DISPLAY_MAIN; return; } @@ -500,7 +503,7 @@ void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) } #ifdef ENABLE_VOICE - g_another_voice_id = (voice_id_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif g_eeprom.user_channel[Vfo] = (uint8_t)Channel; @@ -508,6 +511,7 @@ void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) g_request_save_vfo = true; g_vfo_configure_mode = VFO_CONFIGURE_RELOAD; + g_update_display = true; return; } @@ -521,7 +525,6 @@ void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) #ifdef ENABLE_VOICE g_another_voice_id = (voice_id_t)Key; #endif - return; } @@ -578,6 +581,7 @@ void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) g_request_save_channel = 1; g_vfo_configure_mode = VFO_CONFIGURE; + g_update_display = true; return; } @@ -594,7 +598,7 @@ void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) #ifdef ENABLE_VOICE g_another_voice_id = (voice_id_t)Key; #endif - g_request_display_screen = DISPLAY_MAIN; +// g_request_display_screen = DISPLAY_MAIN; return; } @@ -611,13 +615,16 @@ void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) g_eeprom.screen_channel[Vfo] = Channel; g_request_save_vfo = true; g_vfo_configure_mode = VFO_CONFIGURE_RELOAD; + g_update_display = true; return; } } #endif - g_request_display_screen = DISPLAY_MAIN; - g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; + g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; + + g_update_display = true; +// g_request_display_screen = DISPLAY_MAIN; } void MAIN_Key_EXIT(bool key_pressed, bool key_held) @@ -671,18 +678,36 @@ void MAIN_Key_EXIT(bool key_pressed, bool key_held) return; } - if (key_held && key_pressed) - { // exit key held down - - if (g_input_box_index > 0 || g_dtmf_input_box_index > 0 || g_dtmf_input_mode) - { // cancel key input mode (channel/frequency entry) - g_dtmf_input_mode = false; - g_dtmf_input_box_index = 0; - memset(g_dtmf_string, 0, sizeof(g_dtmf_string)); - g_input_box_index = 0; - g_request_display_screen = DISPLAY_MAIN; - g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; + if (!key_held) + return; + + if (key_pressed) + return; + + #ifdef ENABLE_FMRADIO + if (g_fm_radio_mode) + { + ACTION_FM(); + return; } + #endif + + if (g_input_box_index > 0 || g_dtmf_input_box_index > 0 || g_dtmf_input_mode) + { // cancel key input mode (channel/frequency entry) + g_dtmf_input_mode = false; + g_dtmf_input_box_index = 0; + memset(g_dtmf_string, 0, sizeof(g_dtmf_string)); + g_input_box_index = 0; + g_request_display_screen = DISPLAY_MAIN; + g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; + return; + } + + if (g_flash_light_state != FLASHLIGHT_OFF && g_flash_light_state != FLASHLIGHT_SOS) + { // the the flash light off + g_flash_light_state = FLASHLIGHT_OFF; + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); + return; } } @@ -831,14 +856,17 @@ void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t Directio if (!key_pressed) { - if (g_scan_state_dir == SCAN_STATE_DIR_OFF && IS_FREQ_CHANNEL(Channel)) - { // key released in frequency mode + if (g_scan_state_dir == SCAN_STATE_DIR_OFF && + (Channel <= USER_CHANNEL_LAST || IS_FREQ_CHANNEL(Channel))) + { // key released #ifdef ENABLE_SQ_OPEN_WITH_UP_DN_BUTTS - if (key_held && !monitor_was_enabled && g_current_function == FUNCTION_MONITOR) + if (key_held && !monitor_was_enabled) { // re-enable the squelch - APP_start_listening(FUNCTION_RECEIVE); + g_monitor_enabled = false; + + APP_start_listening(); } #endif @@ -898,7 +926,7 @@ void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t Directio uint8_t Next; if (IS_FREQ_CHANNEL(Channel)) - { // step/down in frequency + { // frequency mode frequency_band_t new_band; const frequency_band_t old_band = FREQUENCY_GetBand(g_tx_vfo->freq_config_rx.frequency); @@ -947,7 +975,7 @@ void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t Directio if (key_held && key_pressed && !monitor_was_enabled) { // open the squelch if the user holds the key down g_monitor_enabled = true; - APP_start_listening(FUNCTION_MONITOR); + APP_start_listening(); } #endif @@ -958,9 +986,20 @@ void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t Directio return; } - // suppress audio click - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - g_speaker_enabled = false; + // channel mode + + g_tx_vfo->freq_in_channel = 0xff; + + #ifdef ENABLE_SQ_OPEN_WITH_UP_DN_BUTTS + if (!key_held && key_pressed) + monitor_was_enabled = g_monitor_enabled; + + if (key_held && key_pressed && !monitor_was_enabled) + { // open the squelch if the user holds the key down + g_monitor_enabled = true; + APP_start_listening(); + } + #endif Next = RADIO_FindNextChannel(Channel + Direction, Direction, false, 0); if (Next == 0xFF) @@ -989,20 +1028,23 @@ void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t Directio } #endif - g_request_save_vfo = true; + if (!key_held && key_pressed) // save when the user releases the button - save a LOT of eeprom wear + g_request_save_vfo = true; + g_vfo_configure_mode = VFO_CONFIGURE_RELOAD; return; } +// g_speaker_enabled = false; +// g_monitor_enabled = false; GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - g_speaker_enabled = false; // jump to the next channel APP_channel_next(false, Direction); // go NOW - g_scan_pause_10ms = 0; + g_scan_pause_tick_10ms = 0; g_scan_pause_time_mode = false; g_squelch_open = false; g_rx_reception_mode = RX_MODE_NONE; @@ -1020,9 +1062,12 @@ void MAIN_process_key(key_code_t key, bool key_pressed, bool key_held) #ifdef ENABLE_FMRADIO if (g_fm_radio_mode && key != KEY_PTT && key != KEY_EXIT) { - if (!key_held && key_pressed) - g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - return; + if (g_current_display_screen == DISPLAY_FM) + { + if (!key_held && key_pressed) + g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; + return; + } } #endif @@ -1061,10 +1106,10 @@ void MAIN_process_key(key_code_t key, bool key_pressed, bool key_held) MAIN_Key_MENU(key_pressed, key_held); break; case KEY_UP: - MAIN_Key_UP_DOWN(key_pressed, key_held, 1); + MAIN_Key_UP_DOWN(key_pressed, key_held, SCAN_STATE_DIR_FORWARD); break; case KEY_DOWN: - MAIN_Key_UP_DOWN(key_pressed, key_held, -1); + MAIN_Key_UP_DOWN(key_pressed, key_held, SCAN_STATE_DIR_REVERSE); break; case KEY_EXIT: MAIN_Key_EXIT(key_pressed, key_held); diff --git a/app/menu.c b/app/menu.c index be16ac4..a5da416 100644 --- a/app/menu.c +++ b/app/menu.c @@ -86,7 +86,7 @@ void MENU_start_css_scan(int8_t Direction) MENU_SelectNextCode(); - g_scan_pause_10ms = scan_pause_css_10ms; + g_scan_pause_tick_10ms = scan_pause_css_10ms; } void MENU_stop_css_scan(void) @@ -939,7 +939,7 @@ void MENU_SelectNextCode(void) RADIO_setup_registers(true); - g_scan_pause_10ms = (g_selected_code_type == CODE_TYPE_CONTINUOUS_TONE) ? scan_pause_ctcss_10ms : scan_pause_cdcss_10ms; + g_scan_pause_tick_10ms = (g_selected_code_type == CODE_TYPE_CONTINUOUS_TONE) ? scan_pause_ctcss_10ms : scan_pause_cdcss_10ms; g_update_display = true; } @@ -2014,11 +2014,11 @@ void MENU_process_key(key_code_t Key, bool key_pressed, bool key_held) #endif g_menu_cursor == MENU_BAT_CAL) { - g_menu_count_down = menu_timeout_long_500ms; + g_menu_tick_10ms = menu_timeout_long_500ms; } else { - g_menu_count_down = menu_timeout_500ms; + g_menu_tick_10ms = menu_timeout_500ms; } } } diff --git a/app/search.c b/app/search.c index f6a0a12..a12c9ef 100644 --- a/app/search.c +++ b/app/search.c @@ -19,7 +19,9 @@ #include "app/search.h" #include "audio.h" #include "board.h" +#include "bsp/dp32g030/gpio.h" #include "driver/bk4819.h" +#include "driver/gpio.h" #if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG) #include "driver/uart.h" #endif @@ -400,6 +402,9 @@ void SEARCH_Start(void) g_rx_vfo->step_setting = BackupStep; g_rx_vfo->step_freq = BackupStepFreq; + g_monitor_enabled = false; + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + RADIO_setup_registers(true); #ifdef ENABLE_NOAA diff --git a/app/spectrum.c b/app/spectrum.c index 0a9f943..c439c4a 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -345,9 +345,9 @@ uint32_t GetOffsetedF(uint32_t f) { bool IsTXAllowed() { return g_setting_ALL_TX != 2; } static void ToggleAudio(bool on) { - if (on) { + if (on) GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - } else { + else { GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); } } diff --git a/audio.c b/audio.c index 11e273c..4398d30 100644 --- a/audio.c +++ b/audio.c @@ -68,7 +68,7 @@ voice_id_t g_voice_id[8]; uint8_t g_voice_read_index; uint8_t g_voice_write_index; - volatile uint16_t g_tick_to_play_next_voice_10ms; + volatile uint16_t g_play_next_voice_tick_10ms; volatile bool g_flag_play_queued_voice; voice_id_t g_another_voice_id = VOICE_ID_INVALID; @@ -78,7 +78,8 @@ beep_type_t g_beep_to_play = BEEP_NONE; void AUDIO_PlayBeep(beep_type_t Beep) { - const uint16_t ToneConfig = BK4819_ReadRegister(0x71); + const uint16_t tone_val = BK4819_ReadRegister(0x71); +// const uint16_t af_val = BK4819_ReadRegister(0x47); uint16_t ToneFrequency; uint16_t Duration; @@ -94,14 +95,20 @@ void AUDIO_PlayBeep(beep_type_t Beep) } } + if (g_flash_light_state == FLASHLIGHT_SOS || + g_current_function == FUNCTION_RECEIVE || + g_monitor_enabled || + GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER)) + { + return; + } + #ifdef ENABLE_AIRCOPY // if (g_current_display_screen == DISPLAY_AIRCOPY || g_aircopy_state != AIRCOPY_READY) // return; #endif - if (g_current_function == FUNCTION_RECEIVE || g_current_function == FUNCTION_MONITOR) - return; // not while the speakers in use - - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + +// GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); if (g_current_function == FUNCTION_POWER_SAVE && g_rx_idle_mode) BK4819_RX_TurnOn(); @@ -150,7 +157,9 @@ void AUDIO_PlayBeep(beep_type_t Beep) break; } +// BK4819_PlayTone(ToneFrequency, true); BK4819_StartTone1(ToneFrequency, 96, true); + SYSTEM_DelayMs(2); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); @@ -200,29 +209,24 @@ void AUDIO_PlayBeep(beep_type_t Beep) } SYSTEM_DelayMs(Duration); - BK4819_EnterTxMute(); - -// SYSTEM_DelayMs(20); SYSTEM_DelayMs(2); - #ifdef ENABLE_VOX - g_vox_resume_count_down = 80; - #endif - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - -// SYSTEM_DelayMs(5); + + #ifdef ENABLE_VOX + g_vox_resume_tick_10ms = 80; // 800ms + #endif + SYSTEM_DelayMs(2); BK4819_TurnsOffTones_TurnsOnRX(); -// SYSTEM_DelayMs(5); SYSTEM_DelayMs(2); - // restore the register - BK4819_WriteRegister(0x71, ToneConfig); + BK4819_WriteRegister(0x71, tone_val); - if (g_speaker_enabled) - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); +// BK4819_SetAF(g_rx_vfo->am_mode ? BK4819_AF_AM : BK4819_AF_FM); +// BK4819_SetAF(BK4819_AF_MUTE); +// BK4819_WriteRegister(0x47, af_val); #ifdef ENABLE_FMRADIO if (g_fm_radio_mode) @@ -230,7 +234,14 @@ void AUDIO_PlayBeep(beep_type_t Beep) #endif if (g_current_function == FUNCTION_POWER_SAVE && g_rx_idle_mode) + { BK4819_Sleep(); + } + else + if (g_speaker_enabled || g_monitor_enabled) + { + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + } } #ifdef ENABLE_VOICE @@ -287,7 +298,7 @@ void AUDIO_PlayBeep(beep_type_t Beep) } #ifdef MUTE_AUDIO_FOR_VOICE - if (g_current_function == FUNCTION_RECEIVE || g_current_function == FUNCTION_MONITOR) + if (g_current_function == FUNCTION_RECEIVE) BK4819_SetAF(BK4819_AF_MUTE); #endif @@ -301,7 +312,7 @@ void AUDIO_PlayBeep(beep_type_t Beep) GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); #ifdef ENABLE_VOX - g_vox_resume_count_down = 2000; + g_vox_resume_tick_10ms = 2000; #endif SYSTEM_DelayMs(5); @@ -315,7 +326,7 @@ void AUDIO_PlayBeep(beep_type_t Beep) { SYSTEM_DelayMs(Delay * 10); - if (g_current_function == FUNCTION_RECEIVE || g_current_function == FUNCTION_MONITOR) + if (g_current_function == FUNCTION_RECEIVE) BK4819_SetAF(g_rx_vfo->am_mode ? BK4819_AF_AM : BK4819_AF_FM); #ifdef ENABLE_FMRADIO @@ -330,14 +341,14 @@ void AUDIO_PlayBeep(beep_type_t Beep) g_voice_read_index = 0; #ifdef ENABLE_VOX - g_vox_resume_count_down = 80; + g_vox_resume_tick_10ms = 80; #endif return; } g_voice_read_index = 1; - g_tick_to_play_next_voice_10ms = Delay; + g_play_next_voice_tick_10ms = Delay; g_flag_play_queued_voice = false; return; @@ -449,11 +460,11 @@ void AUDIO_PlayBeep(beep_type_t Beep) AUDIO_PlayVoice(VoiceID); - g_tick_to_play_next_voice_10ms = Delay; + g_play_next_voice_tick_10ms = Delay; g_flag_play_queued_voice = false; #ifdef ENABLE_VOX - g_vox_resume_count_down = 2000; + g_vox_resume_tick_10ms = 2000; #endif return; @@ -463,7 +474,7 @@ void AUDIO_PlayBeep(beep_type_t Beep) // *********************** // unmute the radios audio - if (g_current_function == FUNCTION_RECEIVE || g_current_function == FUNCTION_MONITOR) + if (g_current_function == FUNCTION_RECEIVE) BK4819_SetAF(g_rx_vfo->am_mode ? BK4819_AF_AM : BK4819_AF_FM); #ifdef ENABLE_FMRADIO @@ -477,7 +488,7 @@ void AUDIO_PlayBeep(beep_type_t Beep) // ********************** #ifdef ENABLE_VOX - g_vox_resume_count_down = 80; + g_vox_resume_tick_10ms = 80; #endif g_voice_write_index = 0; diff --git a/audio.h b/audio.h index c97ee20..cc4f6c5 100644 --- a/audio.h +++ b/audio.h @@ -129,7 +129,7 @@ typedef enum voice_id_e voice_id_t; extern voice_id_t g_voice_id[8]; extern uint8_t g_voice_read_index; extern uint8_t g_voice_write_index; - extern volatile uint16_t g_tick_to_play_next_voice_10ms; + extern volatile uint16_t g_play_next_voice_tick_10ms; extern volatile bool g_flag_play_queued_voice; extern voice_id_t g_another_voice_id; diff --git a/driver/bk4819-regs.h b/driver/bk4819-regs.h index 91fe5fb..7c33074 100644 --- a/driver/bk4819-regs.h +++ b/driver/bk4819-regs.h @@ -133,26 +133,16 @@ typedef enum bk4819_gpio_pin_e bk4819_gpio_pin_t; #define BK4819_REG_30_MASK_ENABLE_RX_DSP (0x1U << BK4819_REG_30_SHIFT_ENABLE_RX_DSP) enum { - BK4819_REG_30_ENABLE_VCO_CALIB = (0x1U << BK4819_REG_30_SHIFT_ENABLE_VCO_CALIB), - BK4819_REG_30_DISABLE_VCO_CALIB = (0x0U << BK4819_REG_30_SHIFT_ENABLE_VCO_CALIB), - BK4819_REG_30_ENABLE_UNKNOWN = (0x1U << BK4819_REG_30_SHIFT_ENABLE_UNKNOWN), - BK4819_REG_30_DISABLE_UNKNOWN = (0x0U << BK4819_REG_30_SHIFT_ENABLE_UNKNOWN), - BK4819_REG_30_ENABLE_RX_LINK = (0xFU << BK4819_REG_30_SHIFT_ENABLE_RX_LINK), - BK4819_REG_30_DISABLE_RX_LINK = (0x0U << BK4819_REG_30_SHIFT_ENABLE_RX_LINK), - BK4819_REG_30_ENABLE_AF_DAC = (0x1U << BK4819_REG_30_SHIFT_ENABLE_AF_DAC), - BK4819_REG_30_DISABLE_AF_DAC = (0x0U << BK4819_REG_30_SHIFT_ENABLE_AF_DAC), - BK4819_REG_30_ENABLE_DISC_MODE = (0x1U << BK4819_REG_30_SHIFT_ENABLE_DISC_MODE), - BK4819_REG_30_DISABLE_DISC_MODE = (0x0U << BK4819_REG_30_SHIFT_ENABLE_DISC_MODE), - BK4819_REG_30_ENABLE_PLL_VCO = (0xFU << BK4819_REG_30_SHIFT_ENABLE_PLL_VCO), - BK4819_REG_30_DISABLE_PLL_VCO = (0x0U << BK4819_REG_30_SHIFT_ENABLE_PLL_VCO), - BK4819_REG_30_ENABLE_PA_GAIN = (0x1U << BK4819_REG_30_SHIFT_ENABLE_PA_GAIN), - BK4819_REG_30_DISABLE_PA_GAIN = (0x0U << BK4819_REG_30_SHIFT_ENABLE_PA_GAIN), - BK4819_REG_30_ENABLE_MIC_ADC = (0x1U << BK4819_REG_30_SHIFT_ENABLE_MIC_ADC), - BK4819_REG_30_DISABLE_MIC_ADC = (0x0U << BK4819_REG_30_SHIFT_ENABLE_MIC_ADC), - BK4819_REG_30_ENABLE_TX_DSP = (0x1U << BK4819_REG_30_SHIFT_ENABLE_TX_DSP), - BK4819_REG_30_DISABLE_TX_DSP = (0x0U << BK4819_REG_30_SHIFT_ENABLE_TX_DSP), - BK4819_REG_30_ENABLE_RX_DSP = (0x1U << BK4819_REG_30_SHIFT_ENABLE_RX_DSP), - BK4819_REG_30_DISABLE_RX_DSP = (0x0U << BK4819_REG_30_SHIFT_ENABLE_RX_DSP), + BK4819_REG_30_ENABLE_VCO_CALIB = ( 1u << BK4819_REG_30_SHIFT_ENABLE_VCO_CALIB), + BK4819_REG_30_ENABLE_UNKNOWN = ( 1u << BK4819_REG_30_SHIFT_ENABLE_UNKNOWN), + BK4819_REG_30_ENABLE_RX_LINK = (15u << BK4819_REG_30_SHIFT_ENABLE_RX_LINK), + BK4819_REG_30_ENABLE_AF_DAC = ( 1u << BK4819_REG_30_SHIFT_ENABLE_AF_DAC), + BK4819_REG_30_ENABLE_DISC_MODE = ( 1u << BK4819_REG_30_SHIFT_ENABLE_DISC_MODE), + BK4819_REG_30_ENABLE_PLL_VCO = (15u << BK4819_REG_30_SHIFT_ENABLE_PLL_VCO), + BK4819_REG_30_ENABLE_PA_GAIN = ( 1u << BK4819_REG_30_SHIFT_ENABLE_PA_GAIN), + BK4819_REG_30_ENABLE_MIC_ADC = ( 1u << BK4819_REG_30_SHIFT_ENABLE_MIC_ADC), + BK4819_REG_30_ENABLE_TX_DSP = ( 1u << BK4819_REG_30_SHIFT_ENABLE_TX_DSP), + BK4819_REG_30_ENABLE_RX_DSP = ( 1u << BK4819_REG_30_SHIFT_ENABLE_RX_DSP) }; // REG 3F diff --git a/driver/bk4819.c b/driver/bk4819.c index 9ffb65a..d819f4d 100644 --- a/driver/bk4819.c +++ b/driver/bk4819.c @@ -19,6 +19,7 @@ #include "bk4819.h" #include "bsp/dp32g030/gpio.h" #include "bsp/dp32g030/portcon.h" +#include "functions.h" #include "driver/gpio.h" #include "driver/system.h" #include "driver/systick.h" @@ -556,6 +557,9 @@ void BK4819_SetTailDetection(const uint32_t freq_10Hz) // freq(Hz) * 20.97152 for XTAL 12.8M/19.2M/25.6M/38.4M // BK4819_WriteRegister(0x07, BK4819_REG_07_MODE_CTC2 | ((253910 + (freq_10Hz / 2)) / freq_10Hz)); // with rounding + +#ifdef ENABLE_CTCSS_TAIL_PHASE_SHIFT +#endif } void BK4819_EnableVox(uint16_t VoxEnableThreshold, uint16_t VoxDisableThreshold) @@ -776,8 +780,7 @@ void BK4819_set_rf_frequency(const uint32_t frequency, const bool trigger_update // trigger a PLL/VCO update // const uint16_t reg = BK4819_ReadRegister(0x30); -// BK4819_WriteRegister(0x30, reg & ~(1u << 15) & (15u << 4)); - BK4819_WriteRegister(0x30, 0x0200); + BK4819_WriteRegister(0x30, 0); BK4819_WriteRegister(0x30, reg); } } @@ -871,11 +874,9 @@ void BK4819_SetupSquelch( void BK4819_SetAF(BK4819_af_type_t AF) { - // AF Output Inverse Mode = Inverse - // Undocumented bits 0x2040 - // -// BK4819_WriteRegister(0x47, 0x6040 | (AF << 8)); - BK4819_WriteRegister(0x47, (6u << 12) | (AF << 8) | (1u << 6)); + BK4819_WriteRegister(0x47, 0); +// BK4819_WriteRegister(0x47, 0x6040 | (AF << 8)); // 0110 0000 0100 0000 + BK4819_WriteRegister(0x47, (1u << 14) | (1u << 13) | ((AF & 15u) << 8) | (1u << 6)); } void BK4819_RX_TurnOn(void) @@ -896,21 +897,19 @@ void BK4819_RX_TurnOn(void) // BK4819_WriteRegister(0x37, 0x1F0F); // 0001 1111 0000 1111 - // turn everything off BK4819_WriteRegister(0x30, 0); - - // and on again .. - // - // Enable VCO Calibration - // Enable RX Link - // Enable AF DAC - // Enable PLL/VCO - // Disable PA Gain - // Disable MIC ADC - // Disable TX DSP - // Enable RX DSP - // - BK4819_WriteRegister(0x30, 0xBFF1); // 1 0 1111 1 1 1111 0 0 0 1 + BK4819_WriteRegister(0x30, + BK4819_REG_30_ENABLE_VCO_CALIB | +// BK4819_REG_30_ENABLE_UNKNOWN | + BK4819_REG_30_ENABLE_RX_LINK | + BK4819_REG_30_ENABLE_AF_DAC | + BK4819_REG_30_ENABLE_DISC_MODE | + BK4819_REG_30_ENABLE_PLL_VCO | +// BK4819_REG_30_ENABLE_PA_GAIN | +// BK4819_REG_30_ENABLE_MIC_ADC | +// BK4819_REG_30_ENABLE_TX_DSP | + BK4819_REG_30_ENABLE_RX_DSP | + 0); } void BK4819_set_rf_filter_path(uint32_t Frequency) @@ -1055,8 +1054,12 @@ void BK4819_EnableDTMF(void) void BK4819_StartTone1(const uint16_t frequency, const unsigned int level, const bool set_dac) { + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + SYSTEM_DelayMs(2); + // BK4819_SetAF(BK4819_AF_MUTE); BK4819_SetAF(BK4819_AF_BEEP); +// BK4819_SetAF(BK4819_AF_TONE); BK4819_EnterTxMute(); @@ -1065,36 +1068,88 @@ void BK4819_StartTone1(const uint16_t frequency, const unsigned int level, const if (set_dac) { BK4819_WriteRegister(0x30, 0); - //BK4819_WriteRegister(0x30, BK4819_REG_30_ENABLE_AF_DAC | BK4819_REG_30_ENABLE_DISC_MODE | BK4819_REG_30_ENABLE_TX_DSP); - BK4819_EnableTXLink(); + BK4819_WriteRegister(0x30, // all of the following must be enable to get an audio beep ! ??? + BK4819_REG_30_ENABLE_VCO_CALIB | + BK4819_REG_30_ENABLE_UNKNOWN | +// BK4819_REG_30_ENABLE_RX_LINK | + BK4819_REG_30_ENABLE_AF_DAC | + BK4819_REG_30_ENABLE_DISC_MODE | + BK4819_REG_30_ENABLE_PLL_VCO | + BK4819_REG_30_ENABLE_PA_GAIN | +// BK4819_REG_30_ENABLE_MIC_ADC | + BK4819_REG_30_ENABLE_TX_DSP | +// BK4819_REG_30_ENABLE_RX_DSP | + 0); } - + BK4819_WriteRegister(0x71, scale_freq(frequency)); + BK4819_ExitTxMute(); -// SYSTEM_DelayMs(2); - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); // enable speaker + // enable speaker SYSTEM_DelayMs(2); + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); } -void BK4819_StopTones(void) +void BK4819_StopTones(const bool tx) { -// if (!g_speaker_enabled) - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + SYSTEM_DelayMs(2); + + BK4819_SetAF(BK4819_AF_MUTE); BK4819_EnterTxMute(); + BK4819_WriteRegister(0x70, 0); - BK4819_WriteRegister(0x30, 0xC1FE); // 1100 0001 1111 1110 + + BK4819_WriteRegister(0x30, 0); + if (tx) + { + BK4819_WriteRegister(0x30, + BK4819_REG_30_ENABLE_VCO_CALIB | + BK4819_REG_30_ENABLE_UNKNOWN | +// BK4819_REG_30_ENABLE_RX_LINK | + BK4819_REG_30_ENABLE_AF_DAC | + BK4819_REG_30_ENABLE_DISC_MODE | + BK4819_REG_30_ENABLE_PLL_VCO | + BK4819_REG_30_ENABLE_PA_GAIN | + BK4819_REG_30_ENABLE_MIC_ADC | + BK4819_REG_30_ENABLE_TX_DSP | +// BK4819_REG_30_ENABLE_RX_DSP | + 0); + } + else + { + BK4819_WriteRegister(0x30, + BK4819_REG_30_ENABLE_VCO_CALIB | + BK4819_REG_30_ENABLE_UNKNOWN | + BK4819_REG_30_ENABLE_RX_LINK | + BK4819_REG_30_ENABLE_AF_DAC | + BK4819_REG_30_ENABLE_DISC_MODE | + BK4819_REG_30_ENABLE_PLL_VCO | +// BK4819_REG_30_ENABLE_PA_GAIN | +// BK4819_REG_30_ENABLE_MIC_ADC | +// BK4819_REG_30_ENABLE_TX_DSP | + BK4819_REG_30_ENABLE_RX_DSP | + 0); + } + BK4819_ExitTxMute(); + +// if (g_speaker_enabled || g_monitor_enabled) +// { +// SYSTEM_DelayMs(2); +// GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); +// } } void BK4819_PlayTone(const unsigned int tone_Hz, const unsigned int delay, const unsigned int level) { - const uint16_t prev_af = BK4819_ReadRegister(0x47); +// const uint16_t prev_af = BK4819_ReadRegister(0x47); BK4819_StartTone1(tone_Hz, level, true); SYSTEM_DelayMs(delay - 2); - BK4819_StopTones(); - BK4819_WriteRegister(0x47, prev_af); + BK4819_StopTones(g_current_function == FUNCTION_TRANSMIT); +// BK4819_WriteRegister(0x47, prev_af); } void BK4819_PlayRoger(void) @@ -1108,15 +1163,15 @@ void BK4819_PlayRoger(void) const uint32_t tone2_Hz = 1310; #endif - const uint16_t prev_af = BK4819_ReadRegister(0x47); +// const uint16_t prev_af = BK4819_ReadRegister(0x47); BK4819_StartTone1(tone1_Hz, 96, true); SYSTEM_DelayMs(80 - 2); BK4819_StartTone1(tone2_Hz, 96, false); SYSTEM_DelayMs(80); - BK4819_StopTones(); + BK4819_StopTones(true); - BK4819_WriteRegister(0x47, prev_af); +// BK4819_WriteRegister(0x47, prev_af); } void BK4819_EnterTxMute(void) @@ -1126,13 +1181,13 @@ void BK4819_EnterTxMute(void) void BK4819_ExitTxMute(void) { - BK4819_WriteRegister(0x50, 0x3B20); + BK4819_WriteRegister(0x50, 0x3B20); // 0011 1011 0010 0000 } void BK4819_Sleep(void) { BK4819_WriteRegister(0x30, 0); - BK4819_WriteRegister(0x37, 0x1D00); + BK4819_WriteRegister(0x37, 0x1D00); // 0 0 0111 0 1 0000 0 0 0 0 } void BK4819_TurnsOffTones_TurnsOnRX(void) @@ -1145,11 +1200,16 @@ void BK4819_TurnsOffTones_TurnsOnRX(void) BK4819_WriteRegister(0x30, 0); BK4819_WriteRegister(0x30, BK4819_REG_30_ENABLE_VCO_CALIB | +// BK4819_REG_30_ENABLE_UNKNOWN | BK4819_REG_30_ENABLE_RX_LINK | BK4819_REG_30_ENABLE_AF_DAC | BK4819_REG_30_ENABLE_DISC_MODE | BK4819_REG_30_ENABLE_PLL_VCO | - BK4819_REG_30_ENABLE_RX_DSP); +// BK4819_REG_30_ENABLE_PA_GAIN | +// BK4819_REG_30_ENABLE_MIC_ADC | +// BK4819_REG_30_ENABLE_TX_DSP | + BK4819_REG_30_ENABLE_RX_DSP | + 0); } void BK4819_Idle(void) @@ -1203,11 +1263,27 @@ void BK4819_PrepareTransmit(void) void BK4819_TxOn_Beep(void) { - BK4819_WriteRegister(0x37, 0x1D0F); - BK4819_WriteRegister(0x52, 0x028F); + BK4819_WriteRegister(0x37, 0x1D0F); // 0001110100001111 + +#ifdef ENABLE_CTCSS_TAIL_PHASE_SHIFT + BK4819_WriteRegister(0x52, (1u << 15) | (2u << 13) | (0u << 12) | (10u << 6) | (15u << 0)); +#else + BK4819_WriteRegister(0x52, (0u << 15) | (0u << 13) | (0u << 12) | (10u << 6) | (15u << 0)); // 0x028F); // 0 00 0 001010 001111 +#endif BK4819_WriteRegister(0x30, 0); - BK4819_WriteRegister(0x30, 0xC1FE); + BK4819_WriteRegister(0x30, + BK4819_REG_30_ENABLE_VCO_CALIB | + BK4819_REG_30_ENABLE_UNKNOWN | +// BK4819_REG_30_ENABLE_RX_LINK | +// BK4819_REG_30_ENABLE_AF_DAC | + BK4819_REG_30_ENABLE_DISC_MODE | + BK4819_REG_30_ENABLE_PLL_VCO | + BK4819_REG_30_ENABLE_PA_GAIN | + BK4819_REG_30_ENABLE_MIC_ADC | + BK4819_REG_30_ENABLE_TX_DSP | +// BK4819_REG_30_ENABLE_RX_DSP | + 0); } void BK4819_ExitSubAu(void) @@ -1252,7 +1328,7 @@ void BK4819_ExitSubAu(void) BK4819_WriteRegister(0x51, 0); } -void BK4819_Conditional_RX_TurnOn_and_GPIO6_Enable(void) +void BK4819_Conditional_RX_TurnOn(void) { if (g_rx_idle_mode) { @@ -1282,57 +1358,42 @@ void BK4819_ExitDTMF_TX(bool bKeep) BK4819_SetAF(BK4819_AF_MUTE); BK4819_WriteRegister(0x70, 0); BK4819_DisableDTMF(); - BK4819_WriteRegister(0x30, 0xC1FE); + + BK4819_WriteRegister(0x30, + BK4819_REG_30_ENABLE_VCO_CALIB | + BK4819_REG_30_ENABLE_UNKNOWN | +// BK4819_REG_30_ENABLE_RX_LINK | +// BK4819_REG_30_ENABLE_AF_DAC | + BK4819_REG_30_ENABLE_DISC_MODE | + BK4819_REG_30_ENABLE_PLL_VCO | + BK4819_REG_30_ENABLE_PA_GAIN | + BK4819_REG_30_ENABLE_MIC_ADC | + BK4819_REG_30_ENABLE_TX_DSP | +// BK4819_REG_30_ENABLE_RX_DSP | + 0); + if (!bKeep) BK4819_ExitTxMute(); } void BK4819_EnableTXLink(void) { - BK4819_WriteRegister(0x30, + BK4819_WriteRegister(0x30, BK4819_REG_30_ENABLE_VCO_CALIB | BK4819_REG_30_ENABLE_UNKNOWN | - BK4819_REG_30_DISABLE_RX_LINK | +// BK4819_REG_30_ENABLE_RX_LINK | BK4819_REG_30_ENABLE_AF_DAC | BK4819_REG_30_ENABLE_DISC_MODE | BK4819_REG_30_ENABLE_PLL_VCO | BK4819_REG_30_ENABLE_PA_GAIN | - BK4819_REG_30_DISABLE_MIC_ADC | +// BK4819_REG_30_ENABLE_MIC_ADC | BK4819_REG_30_ENABLE_TX_DSP | - BK4819_REG_30_DISABLE_RX_DSP); +// BK4819_REG_30_ENABLE_RX_DSP | + 0); } void BK4819_PlayDTMF(char Code) { -/* - uint16_t tone1 = 0; - uint16_t tone2 = 0; - - switch (Code) - { - case '0': tone1 = 941; tone2 = 1336; break; - case '1': tone1 = 679; tone2 = 1209; break; - case '2': tone1 = 697; tone2 = 1336; break; - case '3': tone1 = 679; tone2 = 1477; break; - case '4': tone1 = 770; tone2 = 1209; break; - case '5': tone1 = 770; tone2 = 1336; break; - case '6': tone1 = 770; tone2 = 1477; break; - case '7': tone1 = 852; tone2 = 1209; break; - case '8': tone1 = 852; tone2 = 1336; break; - case '9': tone1 = 852; tone2 = 1477; break; - case 'A': tone1 = 679; tone2 = 1633; break; - case 'B': tone1 = 770; tone2 = 1633; break; - case 'C': tone1 = 852; tone2 = 1633; break; - case 'D': tone1 = 941; tone2 = 1633; break; - case '*': tone1 = 941; tone2 = 1209; break; - case '#': tone1 = 941; tone2 = 1477; break; - } - - if (tone1 > 0) - BK4819_WriteRegister(0x71, (((uint32_t)tone1 * 103244) + 5000) / 10000); // with rounding - if (tone2 > 0) - BK4819_WriteRegister(0x72, (((uint32_t)tone2 * 103244) + 5000) / 10000); // with rounding -*/ uint32_t index = ((Code >= 65) ? (Code - 55) : ((Code <= 35) ? 15 :((Code <= 42) ? 14 : (Code - '0')))); @@ -1762,15 +1823,10 @@ void BK4819_SetScanFrequency(uint32_t Frequency) BK4819_RX_TurnOn(); } -void BK4819_Disable(void) -{ - BK4819_WriteRegister(0x30, 0); -} - void BK4819_StopScan(void) { BK4819_DisableFrequencyScan(); - BK4819_Disable(); + BK4819_WriteRegister(0x30, 0); } uint8_t BK4819_GetDTMF_5TONE_Code(void) @@ -1811,7 +1867,7 @@ void BK4819_reset_fsk(void) BK4819_WriteRegister(0x3F, 0); // disable interrupts BK4819_WriteRegister(0x59, (1u << 15) | (1u << 14) | fsk_reg59); // clear FIFO's BK4819_WriteRegister(0x59, (0u << 15) | (0u << 14) | fsk_reg59); - BK4819_Idle(); + BK4819_WriteRegister(0x30, 0); } #ifdef ENABLE_AIRCOPY @@ -2201,10 +2257,10 @@ void BK4819_reset_fsk(void) // clear interrupt flags BK4819_WriteRegister(0x02, 0); - BK4819_RX_TurnOn(); +// BK4819_RX_TurnOn(); // enable interrupts - BK4819_WriteRegister(0x3F, BK4819_ReadRegister(0x3F) | BK4819_REG_3F_FSK_RX_SYNC | BK4819_REG_3F_FSK_RX_FINISHED | BK4819_REG_3F_FSK_FIFO_ALMOST_FULL); +// BK4819_WriteRegister(0x3F, BK4819_ReadRegister(0x3F) | BK4819_REG_3F_FSK_RX_SYNC | BK4819_REG_3F_FSK_RX_FINISHED | BK4819_REG_3F_FSK_FIFO_ALMOST_FULL); } else { @@ -2224,17 +2280,18 @@ void BK4819_reset_fsk(void) //BK4819_ExitTxMute(); BK4819_WriteRegister(0x50, 0x3B20); // 0011 1011 0010 0000 - BK4819_WriteRegister(0x30, - (1u << 15) | // enable VCO calibration - (1u << 14) | // enable something or other - (0u << 10) | // diable RX link - (1u << 9) | // enable AF DAC - (1u << 8) | // enable DISC mode, what's DISC mode ? - (15u << 4) | // enable PLL/VCO - (1u << 3) | // enable PA gain - (0u << 2) | // disable MIC ADC - (1u << 1) | // enable TX DSP - (0u << 0)); // disable RX DSP + BK4819_WriteRegister(0x30, + BK4819_REG_30_ENABLE_VCO_CALIB | + BK4819_REG_30_ENABLE_UNKNOWN | +// BK4819_REG_30_ENABLE_RX_LINK | + BK4819_REG_30_ENABLE_AF_DAC | + BK4819_REG_30_ENABLE_DISC_MODE | + BK4819_REG_30_ENABLE_PLL_VCO | + BK4819_REG_30_ENABLE_PA_GAIN | +// BK4819_REG_30_ENABLE_MIC_ADC | + BK4819_REG_30_ENABLE_TX_DSP | +// BK4819_REG_30_ENABLE_RX_DSP | + 0); #if 1 GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); @@ -2477,7 +2534,7 @@ void BK4819_reset_fsk(void) } } - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); // don't need the speaker enabled during TX + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); // disable FSK BK4819_WriteRegister(0x59, fsk_reg59); @@ -2499,19 +2556,20 @@ void BK4819_reset_fsk(void) BK4819_WriteRegister(0x50, 0xBB20); // 1011 1011 0010 0000 //BK4819_SetAF(BK4819_AF_MUTE); - BK4819_WriteRegister(0x47, (6u << 12) | (BK4819_AF_MUTE << 8) | (1u << 6) | (0u << 0)); + BK4819_WriteRegister(0x47, (1u << 14) | (1u << 13) | (BK4819_AF_MUTE << 8) | (1u << 6)); - BK4819_WriteRegister(0x30, - (1u << 15) | // enable VCO calibration - (1u << 14) | // enable something or other - (0u << 10) | // diable RX link - (0u << 9) | // disable AF DAC - (1u << 8) | // enable DISC mode, what's DISC mode ? - (15u << 4) | // enable PLL/VCO - (1u << 3) | // enable PA gain - (1u << 2) | // enable MIC ADC - (1u << 1) | // enable TX DSP - (0u << 0)); // disable RX DSP + BK4819_WriteRegister(0x30, + BK4819_REG_30_ENABLE_VCO_CALIB | + BK4819_REG_30_ENABLE_UNKNOWN | +// BK4819_REG_30_ENABLE_RX_LINK | +// BK4819_REG_30_ENABLE_AF_DAC | + BK4819_REG_30_ENABLE_DISC_MODE | + BK4819_REG_30_ENABLE_PLL_VCO | + BK4819_REG_30_ENABLE_PA_GAIN | + BK4819_REG_30_ENABLE_MIC_ADC | + BK4819_REG_30_ENABLE_TX_DSP | +// BK4819_REG_30_ENABLE_RX_DSP | + 0); //BK4819_ExitTxMute(); BK4819_WriteRegister(0x50, 0x3B20); // 0011 1011 0010 0000 @@ -2521,7 +2579,18 @@ void BK4819_reset_fsk(void) void BK4819_Enable_AfDac_DiscMode_TxDsp(void) { BK4819_WriteRegister(0x30, 0); - BK4819_WriteRegister(0x30, 0x0302); + BK4819_WriteRegister(0x30, +// BK4819_REG_30_ENABLE_VCO_CALIB | +// BK4819_REG_30_ENABLE_UNKNOWN | +// BK4819_REG_30_ENABLE_RX_LINK | + BK4819_REG_30_ENABLE_AF_DAC | + BK4819_REG_30_ENABLE_DISC_MODE | +// BK4819_REG_30_ENABLE_PLL_VCO | +// BK4819_REG_30_ENABLE_PA_GAIN | +// BK4819_REG_30_ENABLE_MIC_ADC | + BK4819_REG_30_ENABLE_TX_DSP | +// BK4819_REG_30_ENABLE_RX_DSP | + 0); } void BK4819_GetVoxAmp(uint16_t *pResult) diff --git a/driver/bk4819.h b/driver/bk4819.h index 7d2deb5..42743d7 100644 --- a/driver/bk4819.h +++ b/driver/bk4819.h @@ -26,7 +26,7 @@ enum BK4819_af_type_e { BK4819_AF_MUTE = 0u, // BK4819_AF_FM = 1u, // FM - BK4819_AF_ALAM = 2u, // + BK4819_AF_TONE = 2u, // BK4819_AF_BEEP = 3u, // BK4819_AF_BASEBAND1 = 4u, // SSB BK4819_AF_BASEBAND2 = 5u, // SSB @@ -104,7 +104,7 @@ void BK4819_DisableVox(void); void BK4819_DisableDTMF(void); void BK4819_EnableDTMF(void); void BK4819_StartTone1(const uint16_t frequency, const unsigned int level, const bool set_dac); -void BK4819_StopTones(void); +void BK4819_StopTones(const bool tx); void BK4819_PlayTone(const unsigned int tone_Hz, const unsigned int delay, const unsigned int level); void BK4819_EnterTxMute(void); void BK4819_ExitTxMute(void); @@ -118,12 +118,11 @@ void BK4819_TurnsOffTones_TurnsOnRX(void); void BK4819_reset_fsk(void); void BK4819_Idle(void); -//void BK4819_ExitBypass(void); void BK4819_PrepareTransmit(void); void BK4819_TxOn_Beep(void); void BK4819_ExitSubAu(void); -void BK4819_Conditional_RX_TurnOn_and_GPIO6_Enable(void); +void BK4819_Conditional_RX_TurnOn(void); void BK4819_EnterDTMF_TX(bool bLocalLoopback); void BK4819_ExitDTMF_TX(bool bKeep); @@ -150,8 +149,6 @@ void BK4819_DisableFrequencyScan(void); void BK4819_EnableFrequencyScan(void); void BK4819_SetScanFrequency(uint32_t Frequency); -void BK4819_Disable(void); - void BK4819_StopScan(void); uint8_t BK4819_GetDTMF_5TONE_Code(void); diff --git a/driver/keyboard.c b/driver/keyboard.c index 22cd9f8..be5521d 100644 --- a/driver/keyboard.c +++ b/driver/keyboard.c @@ -25,7 +25,8 @@ uint8_t g_ptt_debounce; uint8_t g_key_debounce_press; uint8_t g_key_debounce_repeat; -key_code_t g_key_prev = KEY_INVALID; +key_code_t g_key_prev = KEY_INVALID; +key_code_t g_key_pressed = KEY_INVALID; bool g_key_held; bool g_fkey_pressed; bool g_ptt_is_pressed; @@ -124,9 +125,7 @@ key_code_t KEYBOARD_Poll(void) for (i = 0, k = 0, reg = 0; i < 3 && k < 8; i++, k++) { uint16_t reg2; - SYSTICK_DelayUs(1); - reg2 = GPIOA->DATA; if (reg != reg2) { // noise @@ -159,5 +158,7 @@ key_code_t KEYBOARD_Poll(void) GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6); GPIO_SetBit( &GPIOA->DATA, GPIOA_PIN_KEYBOARD_7); + g_key_pressed = Key; + return Key; } diff --git a/driver/keyboard.h b/driver/keyboard.h index 5776e6f..a1bb51d 100644 --- a/driver/keyboard.h +++ b/driver/keyboard.h @@ -49,6 +49,7 @@ extern uint8_t g_ptt_debounce; extern uint8_t g_key_debounce_press; extern uint8_t g_key_debounce_repeat; extern key_code_t g_key_prev; +extern key_code_t g_key_pressed; extern bool g_key_held; extern bool g_fkey_pressed; extern bool g_ptt_is_pressed; diff --git a/firmware.bin b/firmware.bin index 338871a8ad1d61cad62d008ebccdfcc06223c214..d2ea2987fc2b92f71de69c1a8b7185abdb2f5048 100644 GIT binary patch delta 41294 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
  • WGMA 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 WPaGM0ko`KHd(>Jz=l{odBmW-{vd(}2 delta 41227 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

    4!~=pgCt@(;JB)SleU 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 z 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 diff --git a/firmware.packed.bin b/firmware.packed.bin index 1ec9458d80e9d9a22413f63720dced3f78b578c0..83819e15f20fffee0c8be0737d57c59000313add 100644 GIT binary patch delta 55739 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 z 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 O3d-M9EjR*wC;dOudjY!u delta 55697 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

    vx2k)}4cd(~;*l-#i#7EzmKq{E}5cVJF=zP)~U? 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, GPIOC_PIN_SPEAKER); + } + + g_power_save_tick_10ms = g_eeprom.battery_save * 10; + g_power_save_expired = false; g_rx_idle_mode = true; - g_monitor_enabled = false; - BK4819_DisableVox(); BK4819_Sleep(); BK4819_set_GPIO_pin(BK4819_GPIO0_PIN28_RX_ENABLE, false); - if (g_current_display_screen != DISPLAY_MENU) // 1of11 .. don't close the menu + if (g_current_display_screen != DISPLAY_MENU) GUI_SelectNextDisplay(DISPLAY_MAIN); return; @@ -189,9 +182,9 @@ void FUNCTION_Select(function_type_t Function) if (g_eeprom.dual_watch != DUAL_WATCH_OFF) { // dual-RX is enabled - g_dual_watch_delay_10ms = dual_watch_delay_after_tx_10ms; - if (g_dual_watch_delay_10ms < (g_eeprom.scan_hold_time_500ms * 50)) - g_dual_watch_delay_10ms = g_eeprom.scan_hold_time_500ms * 50; + g_dual_watch_tick_10ms = dual_watch_delay_after_tx_10ms; + if (g_dual_watch_tick_10ms < (g_eeprom.scan_hold_time_500ms * 50)) + g_dual_watch_tick_10ms = g_eeprom.scan_hold_time_500ms * 50; } #ifdef ENABLE_MDC1200 @@ -229,13 +222,12 @@ void FUNCTION_Select(function_type_t Function) GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - SYSTEM_DelayMs(20); + SYSTEM_DelayMs(2); BK4819_StartTone1(500, 28, true); SYSTEM_DelayMs(2); - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - g_speaker_enabled = true; + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); SYSTEM_DelayMs(60); BK4819_ExitTxMute(); @@ -264,8 +256,8 @@ void FUNCTION_Select(function_type_t Function) SYSTEM_DelayMs(2); - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); g_speaker_enabled = true; + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); #ifdef ENABLE_ALARM g_alarm_tone_counter_10ms = 0; @@ -326,11 +318,10 @@ void FUNCTION_Select(function_type_t Function) UART_SendText("func panadpter\r\n"); #endif - break; } - g_battery_save_tick_10ms = battery_save_count_10ms; + g_schedule_power_save_tick_10ms = battery_save_count_10ms; g_schedule_power_save = false; #ifdef ENABLE_FMRADIO diff --git a/functions.h b/functions.h index 919ac8e..31126a8 100644 --- a/functions.h +++ b/functions.h @@ -23,7 +23,7 @@ enum function_type_e { FUNCTION_FOREGROUND = 0, // idle, scanning FUNCTION_TRANSMIT, // transmitting - FUNCTION_MONITOR, // receiving with squelch forced open +// FUNCTION_MONITOR, // receiving with squelch forced open FUNCTION_NEW_RECEIVE, // signal just received FUNCTION_RECEIVE, // receive mode FUNCTION_POWER_SAVE, // sleeping diff --git a/helper/battery.c b/helper/battery.c index 5a16eb8..069ab5a 100644 --- a/helper/battery.c +++ b/helper/battery.c @@ -32,7 +32,7 @@ bool g_low_battery; bool g_low_battery_blink; uint16_t g_battery_check_counter; -volatile uint16_t g_power_save_10ms; +volatile uint16_t g_power_save_tick_10ms; /* Based on real measurement @@ -145,6 +145,6 @@ void BATTERY_GetReadings(const bool bDisplayBatteryLevel) UI_DisplayBattery(g_battery_display_level, g_low_battery_blink); } - g_low_batteryCountdown = 0; + g_low_battery_tick_10ms = 0; } } diff --git a/helper/battery.h b/helper/battery.h index bf5c13f..7adf07a 100644 --- a/helper/battery.h +++ b/helper/battery.h @@ -30,9 +30,9 @@ extern bool g_charging_with_type_c; extern bool g_low_battery; extern bool g_low_battery_blink; extern uint16_t g_battery_check_counter; -extern volatile uint16_t g_power_save_10ms; +extern volatile uint16_t g_power_save_tick_10ms; unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV); -void BATTERY_GetReadings(const bool bDisplayBatteryLevel); +void BATTERY_GetReadings(const bool bDisplayBatteryLevel); #endif diff --git a/main.c b/main.c index 13bcd30..ba02499 100644 --- a/main.c +++ b/main.c @@ -67,6 +67,9 @@ void Main(void) | SYSCON_DEV_CLK_GATE_CRC_BITS_ENABLE | SYSCON_DEV_CLK_GATE_AES_BITS_ENABLE; + g_monitor_enabled = false; + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + SYSTICK_Init(); #ifdef ENABLE_UART @@ -183,15 +186,15 @@ void Main(void) if (g_eeprom.pwr_on_display_mode != PWR_ON_DISPLAY_MODE_NONE) { // 3 second boot-up screen - while (g_boot_counter_10ms > 0) + while (g_boot_tick_10ms > 0) { if (KEYBOARD_Poll() != KEY_INVALID) { // halt boot beeps and cancel boot screen - g_boot_counter_10ms = 0; + g_boot_tick_10ms = 0; break; } #ifdef ENABLE_BOOT_BEEPS - if ((g_boot_counter_10ms % 25) == 0) + if ((g_boot_tick_10ms % 25) == 0) AUDIO_PlayBeep(BEEP_880HZ_40MS_OPTIONAL); #endif } diff --git a/misc.c b/misc.c index 930c6f2..1bbc363 100644 --- a/misc.c +++ b/misc.c @@ -41,7 +41,7 @@ const uint8_t dtmf_rx_timeout_500ms = 10000 / 500; // 10 se const uint8_t dtmf_decode_ring_500ms = 15000 / 500; // 15 seconds .. time we sound the ringing for const uint8_t dtmf_txstop_500ms = 3000 / 500; // 6 seconds -const uint8_t serial_config_tick_500ms = 3000 / 500; // 3 seconds +const uint8_t serial_config_tick_500ms = 3000 / 500; // 3 seconds const uint8_t key_input_timeout_500ms = 6000 / 500; // 6 seconds #ifdef ENABLE_KEYLOCK @@ -78,9 +78,9 @@ const uint16_t power_save2_10ms = 200 / 10; // 200ms const uint16_t vox_stop_10ms = 1000 / 10; // 1 second #endif -const uint16_t noaa_tick_10ms = 5000 / 10; // 5 seconds -const uint16_t noaa_tick_2_10ms = 500 / 10; // 500ms -const uint16_t noaa_tick_3_10ms = 200 / 10; // 200ms +const uint16_t noaa_tick_10ms = 5000 / 10; // 5 seconds +const uint16_t noaa_tick_2_10ms = 500 / 10; // 500ms +const uint16_t noaa_tick_3_10ms = 200 / 10; // 200ms // *********************************************** @@ -126,7 +126,7 @@ uint8_t g_setting_side1_long; uint8_t g_setting_side2_short; uint8_t g_setting_side2_long; -bool g_monitor_enabled = false; // true opens the squelch +bool g_monitor_enabled; uint32_t g_custom_aes_key[4]; bool g_has_custom_aes_key; @@ -139,12 +139,12 @@ uint16_t g_eeprom_rssi_calib[7][4]; uint8_t g_user_channel_attributes[FREQ_CHANNEL_LAST + 1]; -volatile uint16_t g_battery_save_tick_10ms = battery_save_count_10ms; - -volatile bool g_power_save_expired; +volatile uint16_t g_schedule_power_save_tick_10ms = battery_save_count_10ms; volatile bool g_schedule_power_save; -volatile uint16_t g_dual_watch_delay_10ms; +volatile bool g_power_save_expired; + +volatile uint16_t g_dual_watch_tick_10ms; volatile bool g_dual_watch_delay_down_expired = true; volatile uint8_t g_serial_config_tick_500ms; @@ -161,9 +161,9 @@ volatile uint16_t g_tail_tone_elimination_tick_10ms; #endif bool g_speaker_enabled; -uint8_t g_key_input_count_down; +uint8_t g_key_input_count_down; #ifdef ENABLE_KEYLOCK - uint8_t g_key_lock_tick_500ms; + uint8_t g_key_lock_tick_500ms; #endif uint8_t g_rtte_count_down; bool g_password_locked; @@ -182,7 +182,7 @@ bool g_update_rssi; #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) alarm_state_t g_alarm_state; #endif -uint16_t g_menu_count_down; +uint16_t g_menu_tick_10ms; bool g_flag_reconfigure_vfos; uint8_t g_vfo_configure_mode; bool g_flag_reset_vfos; @@ -210,16 +210,17 @@ bool g_cxcss_tail_found; #ifdef ENABLE_VOX bool g_vox_lost; bool g_vox_noise_detected; - uint16_t g_vox_resume_count_down; - uint16_t g_vox_pause_count_down; + uint16_t g_vox_resume_tick_10ms; + uint16_t g_vox_pause_tick_10ms; #endif + bool g_squelch_open; uint8_t g_flash_light_state; uint16_t g_flash_light_blink_tick_10ms; bool g_flag_end_tx; -uint16_t g_low_batteryCountdown; +uint16_t g_low_battery_tick_10ms; reception_mode_t g_rx_reception_mode; @@ -228,7 +229,7 @@ scan_next_chan_t g_scan_current_scan_list; uint8_t g_scan_restore_channel; uint32_t g_scan_restore_frequency; bool g_scan_pause_time_mode; // set if we stopped in SCAN_RESUME_TIME mode -volatile uint16_t g_scan_pause_10ms; +volatile uint16_t g_scan_pause_tick_10ms; scan_state_dir_t g_scan_state_dir; bool g_rx_vfo_is_active; @@ -252,7 +253,7 @@ volatile bool g_next_time_slice; volatile uint8_t g_found_cdcss_tick_10ms; volatile uint8_t g_found_ctcss_tick_10ms; #ifdef ENABLE_VOX - volatile uint16_t g_vox_stop_10ms; + volatile uint16_t g_vox_stop_tick_10ms; #endif volatile bool g_next_time_slice_40ms; #ifdef ENABLE_NOAA @@ -264,7 +265,7 @@ volatile bool g_flag_tail_tone_elimination_complete; volatile bool g_schedule_fm; #endif -volatile uint16_t g_boot_counter_10ms = 4000 / 10; // 4 seconds +volatile uint16_t g_boot_tick_10ms = 4000 / 10; // 4 seconds int16_t g_current_rssi[2] = {0, 0}; // now one per VFO diff --git a/misc.h b/misc.h index 85d9457..1aee449 100644 --- a/misc.h +++ b/misc.h @@ -225,12 +225,12 @@ extern uint16_t g_eeprom_rssi_calib[7][4]; extern uint8_t g_user_channel_attributes[207]; -extern volatile uint16_t g_battery_save_tick_10ms; - -extern volatile bool g_power_save_expired; +extern volatile uint16_t g_schedule_power_save_tick_10ms; extern volatile bool g_schedule_power_save; -extern volatile uint16_t g_dual_watch_delay_10ms; +extern volatile bool g_power_save_expired; + +extern volatile uint16_t g_dual_watch_tick_10ms; extern volatile bool g_dual_watch_delay_down_expired; extern volatile uint8_t g_serial_config_tick_500ms; @@ -252,7 +252,7 @@ extern bool g_speaker_enabled; extern uint8_t g_key_input_count_down; #ifdef ENABLE_KEYLOCK - extern uint8_t g_key_lock_tick_500ms; + extern uint8_t g_key_lock_tick_500ms; #endif extern uint8_t g_rtte_count_down; @@ -270,7 +270,7 @@ extern uint8_t g_battery_voltage_index; extern css_scan_mode_t g_css_scan_mode; extern bool g_update_rssi; extern alarm_state_t g_alarm_state; -extern uint16_t g_menu_count_down; +extern uint16_t g_menu_tick_10ms; extern bool g_flag_reconfigure_vfos; extern uint8_t g_vfo_configure_mode; extern bool g_flag_reset_vfos; @@ -298,16 +298,17 @@ extern bool g_cxcss_tail_found; #ifdef ENABLE_VOX extern bool g_vox_lost; extern bool g_vox_noise_detected; - extern uint16_t g_vox_resume_count_down; - extern uint16_t g_vox_pause_count_down; + extern uint16_t g_vox_resume_tick_10ms; + extern uint16_t g_vox_pause_tick_10ms; #endif + extern bool g_squelch_open; extern uint8_t g_flash_light_state; extern uint16_t g_flash_light_blink_tick_10ms; extern bool g_flag_end_tx; -extern uint16_t g_low_batteryCountdown; +extern uint16_t g_low_battery_tick_10ms; extern reception_mode_t g_rx_reception_mode; extern uint8_t g_scan_next_channel; // @@ -315,7 +316,7 @@ extern scan_next_chan_t g_scan_current_scan_list; // extern uint8_t g_scan_restore_channel; // the channel we were on before starting the RF scan extern uint32_t g_scan_restore_frequency; // the frequency we were on before starting the RF scan extern bool g_scan_pause_time_mode; // set if we stopped in SCAN_RESUME_TIME mode -extern volatile uint16_t g_scan_pause_10ms; // ticks till we move to next channel/frequency +extern volatile uint16_t g_scan_pause_tick_10ms; // ticks till we move to next channel/frequency extern scan_state_dir_t g_scan_state_dir; // the direction we're scanning in @@ -337,7 +338,7 @@ extern bool g_unhide_hidden; extern volatile uint8_t g_found_cdcss_tick_10ms; extern volatile uint8_t g_found_ctcss_tick_10ms; #ifdef ENABLE_VOX - extern volatile uint16_t g_vox_stop_10ms; + extern volatile uint16_t g_vox_stop_tick_10ms; #endif extern volatile bool g_next_time_slice_40ms; #ifdef ENABLE_NOAA @@ -349,7 +350,7 @@ extern volatile bool g_flag_tail_tone_elimination_complete; extern volatile bool g_schedule_fm; #endif extern int16_t g_current_rssi[2]; // now one per VFO -extern volatile uint16_t g_boot_counter_10ms; +extern volatile uint16_t g_boot_tick_10ms; unsigned int get_TX_VFO(void); unsigned int get_RX_VFO(void); diff --git a/radio.c b/radio.c index 05c71ef..d4d8820 100644 --- a/radio.c +++ b/radio.c @@ -384,31 +384,32 @@ void RADIO_configure_channel(const unsigned int VFO, const unsigned int configur RADIO_ConfigureSquelchAndOutputPower(p_vfo); -#ifdef ENABLE_AM_FIX - if (p_vfo->am_mode && g_setting_am_fix) - { - AM_fix_reset(VFO); - AM_fix_10ms(VFO); - } - else - { // don't do agc in FM mode - BK4819_DisableAGC(); - BK4819_WriteRegister(0x13, (orig_lnas << 8) | (orig_lna << 5) | (orig_mixer << 3) | (orig_pga << 0)); - } -#else - if (p_vfo->am_mode) - { - BK4819_EnableAGC(); - } - else - { // don't do agc in FM mode - BK4819_DisableAGC(); - BK4819_WriteRegister(0x13, (orig_lnas << 8) | (orig_lna << 5) | (orig_mixer << 3) | (orig_pga << 0)); - } -#endif + #ifdef ENABLE_AM_FIX + if (p_vfo->am_mode && g_setting_am_fix) + { + AM_fix_reset(VFO); + AM_fix_10ms(VFO); + } + else + { // don't do agc in FM mode + BK4819_DisableAGC(); + BK4819_WriteRegister(0x13, (orig_lnas << 8) | (orig_lna << 5) | (orig_mixer << 3) | (orig_pga << 0)); + } + #else + if (p_vfo->am_mode) + { + BK4819_EnableAGC(); + } + else + { // don't do agc in FM mode + BK4819_DisableAGC(); + BK4819_WriteRegister(0x13, (orig_lnas << 8) | (orig_lna << 5) | (orig_mixer << 3) | (orig_pga << 0)); + } + #endif +// if (configure == VFO_CONFIGURE_RELOAD || IS_FREQ_CHANNEL(Channel)) if (IS_FREQ_CHANNEL(Channel)) - p_vfo->freq_in_channel = BOARD_find_channel(Frequency); // remember if a channel has this frequency + p_vfo->freq_in_channel = BOARD_find_channel(Frequency); // find channel that has this frequency } void RADIO_ConfigureSquelchAndOutputPower(vfo_info_t *p_vfo) @@ -633,9 +634,10 @@ void RADIO_setup_registers(bool switch_to_function_foreground) uint16_t interrupt_mask; uint32_t Frequency; - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - g_speaker_enabled = false; + if (!g_speaker_enabled && !g_monitor_enabled) + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + // turn green LED off BK4819_set_GPIO_pin(BK4819_GPIO6_PIN2_GREEN, false); switch (Bandwidth) @@ -661,19 +663,18 @@ void RADIO_setup_registers(bool switch_to_function_foreground) BK4819_set_GPIO_pin(BK4819_GPIO1_PIN29_PA_ENABLE, false); // PA off while (1) - { // wait for the interrupt to clear ? - const uint16_t status_bits = BK4819_ReadRegister(0x0C); - if ((status_bits & (1u << 0)) == 0) + { // wait for interrupts to clear + const uint16_t int_bits = BK4819_ReadRegister(0x0C); + if ((int_bits & (1u << 0)) == 0) break; BK4819_WriteRegister(0x02, 0); // clear the interrupt bits SYSTEM_DelayMs(1); } - BK4819_WriteRegister(0x3F, 0); // disable interrupts // mic gain 0.5dB/step 0 to 31 BK4819_WriteRegister(0x7D, 0xE940 | (g_eeprom.mic_sensitivity_tuning & 0x1f)); -// BK4819_WriteRegister(0x19, 0x1041); // 0001 0000 0100 0001 <15> MIC AGC 1 = disable 0 = enable +// BK4819_WriteRegister(0x19, 0x1041); // 0001 0000 0100 0001 <15> MIC AGC 1 = disable 0 = enable .. doesn't work #ifdef ENABLE_NOAA if (IS_NOAA_CHANNEL(g_rx_vfo->channel_save) && g_is_noaa_mode) @@ -690,10 +691,23 @@ void RADIO_setup_registers(bool switch_to_function_foreground) g_rx_vfo->squelch_open_noise_thresh, g_rx_vfo->squelch_close_noise_thresh, g_rx_vfo->squelch_close_glitch_thresh, g_rx_vfo->squelch_open_glitch_thresh); + // enable the RX front end BK4819_set_GPIO_pin(BK4819_GPIO0_PIN28_RX_ENABLE, true); // AF RX Gain and DAC - BK4819_WriteRegister(0x48, 0xB3A8); // 1011 00 111010 1000 +// BK4819_WriteRegister(0x48, 0xB3A8); // 1011 00 111010 1000 + if (g_rx_vfo->am_mode) + { + BK4819_WriteRegister(0x48, 0xB3A8); // 1011 0011 1010 1000 + } + else + { + BK4819_WriteRegister(0x48, + (11u << 12) | // ??? .. 0 ~ 15, doesn't seem to make any difference + ( 0u << 10) | // AF Rx Gain-1 + (g_eeprom.volume_gain << 4) | // AF Rx Gain-2 + (g_eeprom.dac_gain << 0)); // AF DAC Gain (after Gain-1 and Gain-2) + } interrupt_mask = BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST; @@ -722,7 +736,7 @@ void RADIO_setup_registers(bool switch_to_function_foreground) // BK4819_SetTailDetection(670); // 67Hz //#endif - interrupt_mask = BK4819_REG_3F_CxCSS_TAIL | BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST; + interrupt_mask |= BK4819_REG_3F_CxCSS_TAIL; break; case CODE_TYPE_CONTINUOUS_TONE: @@ -734,24 +748,13 @@ void RADIO_setup_registers(bool switch_to_function_foreground) // BK4819_SetTailDetection(CTCSS_OPTIONS[Code]); //#endif - interrupt_mask = - BK4819_REG_3F_CxCSS_TAIL | - BK4819_REG_3F_CTCSS_FOUND | - BK4819_REG_3F_CTCSS_LOST | - BK4819_REG_3F_SQUELCH_FOUND | - BK4819_REG_3F_SQUELCH_LOST; - + interrupt_mask |= BK4819_REG_3F_CxCSS_TAIL | BK4819_REG_3F_CTCSS_FOUND | BK4819_REG_3F_CTCSS_LOST; break; case CODE_TYPE_DIGITAL: case CODE_TYPE_REVERSE_DIGITAL: BK4819_SetCDCSSCodeWord(DCS_GetGolayCodeWord(code_type, Code)); - interrupt_mask = - BK4819_REG_3F_CxCSS_TAIL | - BK4819_REG_3F_CDCSS_FOUND | - BK4819_REG_3F_CDCSS_LOST | - BK4819_REG_3F_SQUELCH_FOUND | - BK4819_REG_3F_SQUELCH_LOST; + interrupt_mask |= BK4819_REG_3F_CxCSS_TAIL | BK4819_REG_3F_CDCSS_FOUND | BK4819_REG_3F_CDCSS_LOST; break; } @@ -765,11 +768,7 @@ void RADIO_setup_registers(bool switch_to_function_foreground) else { BK4819_SetCTCSSFrequency(2625); - interrupt_mask = - BK4819_REG_3F_CTCSS_FOUND | - BK4819_REG_3F_CTCSS_LOST | - BK4819_REG_3F_SQUELCH_FOUND | - BK4819_REG_3F_SQUELCH_LOST; + interrupt_mask |= BK4819_REG_3F_CTCSS_FOUND | BK4819_REG_3F_CTCSS_LOST; } #endif @@ -792,50 +791,21 @@ void RADIO_setup_registers(bool switch_to_function_foreground) // RX expander BK4819_SetCompander((g_rx_vfo->am_mode == 0 && g_rx_vfo->compand >= 2) ? g_rx_vfo->compand : 0); - #if 0 - #ifdef ENABLE_KILL_REVIVE - if (!g_rx_vfo->dtmf_decoding_enable && !g_setting_radio_disabled) - #else - if (!g_rx_vfo->dtmf_decoding_enable) - #endif - { - BK4819_DisableDTMF(); - } - else - { - BK4819_EnableDTMF(); - interrupt_mask |= BK4819_REG_3F_DTMF_5TONE_FOUND; - } - #else - if (g_current_function != FUNCTION_TRANSMIT) - { - BK4819_DisableDTMF(); - BK4819_EnableDTMF(); - interrupt_mask |= BK4819_REG_3F_DTMF_5TONE_FOUND; - } - else - { - BK4819_DisableDTMF(); - } - #endif + BK4819_EnableDTMF(); + interrupt_mask |= BK4819_REG_3F_DTMF_5TONE_FOUND; #ifdef ENABLE_MDC1200 BK4819_enable_mdc1200_rx(true); - interrupt_mask |= BK4819_ReadRegister(0x3F) | BK4819_REG_3F_FSK_RX_SYNC | BK4819_REG_3F_FSK_RX_FINISHED | BK4819_REG_3F_FSK_FIFO_ALMOST_FULL; + interrupt_mask |= BK4819_REG_3F_FSK_RX_SYNC | BK4819_REG_3F_FSK_RX_FINISHED | BK4819_REG_3F_FSK_FIFO_ALMOST_FULL; #endif - // enable/disable BK4819 selected interrupts + // enable BK4819 interrupts BK4819_WriteRegister(0x3F, interrupt_mask); FUNCTION_Init(); if (switch_to_function_foreground) - { - if (g_monitor_enabled) - APP_start_listening(FUNCTION_MONITOR); - else - FUNCTION_Select(FUNCTION_FOREGROUND); - } + FUNCTION_Select(FUNCTION_FOREGROUND); } #ifdef ENABLE_NOAA @@ -887,9 +857,8 @@ void RADIO_enableTX(const bool fsk_tx) { BK4819_filter_bandwidth_t Bandwidth = g_current_vfo->channel_bandwidth; - // disable the speaker - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); g_speaker_enabled = false; + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); BK4819_set_GPIO_pin(BK4819_GPIO0_PIN28_RX_ENABLE, false); @@ -1119,6 +1088,8 @@ void RADIO_EnableCxCSS(void) void RADIO_PrepareCssTX(void) { + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + RADIO_PrepareTX(); SYSTEM_DelayMs(200); @@ -1142,10 +1113,12 @@ void RADIO_tx_eot(void) { // end-of-tx if (g_eeprom.dtmf_side_tone) { - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); g_speaker_enabled = true; + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); + SYSTEM_DelayMs(60); } + BK4819_EnterDTMF_TX(g_eeprom.dtmf_side_tone); BK4819_PlayDTMFString( g_eeprom.dtmf_key_down_code, @@ -1155,8 +1128,8 @@ void RADIO_tx_eot(void) g_eeprom.dtmf_code_persist_time, g_eeprom.dtmf_code_interval_time); - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); g_speaker_enabled = false; + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); } else if (g_eeprom.roger_mode == ROGER_MODE_ROGER) diff --git a/scheduler.c b/scheduler.c index e1f4ff8..b30e2bb 100644 --- a/scheduler.c +++ b/scheduler.c @@ -73,42 +73,55 @@ void SystickHandler(void) DECREMENT(g_found_ctcss_tick_10ms); if (g_current_function == FUNCTION_FOREGROUND) - DECREMENT_AND_TRIGGER(g_battery_save_tick_10ms, g_schedule_power_save); + DECREMENT_AND_TRIGGER(g_schedule_power_save_tick_10ms, g_schedule_power_save); if (g_current_function == FUNCTION_POWER_SAVE) - DECREMENT_AND_TRIGGER(g_power_save_10ms, g_power_save_expired); - - if (g_eeprom.dual_watch != DUAL_WATCH_OFF) - if (g_scan_state_dir == SCAN_STATE_DIR_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF) - if (g_current_function == FUNCTION_FOREGROUND || g_current_function == FUNCTION_POWER_SAVE) - DECREMENT(g_dual_watch_delay_10ms); + DECREMENT_AND_TRIGGER(g_power_save_tick_10ms, g_power_save_expired); + if (g_eeprom.dual_watch != DUAL_WATCH_OFF && + g_scan_state_dir == SCAN_STATE_DIR_OFF && + g_css_scan_mode == CSS_SCAN_MODE_OFF) + { + if (g_current_function == FUNCTION_FOREGROUND || g_current_function == FUNCTION_POWER_SAVE) + DECREMENT(g_dual_watch_tick_10ms); + } + #ifdef ENABLE_NOAA - if (g_scan_state_dir == SCAN_STATE_DIR_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF && g_eeprom.dual_watch == DUAL_WATCH_OFF) - if (g_is_noaa_mode && g_current_function != FUNCTION_MONITOR && g_current_function != FUNCTION_TRANSMIT) - if (g_current_function != FUNCTION_RECEIVE) - DECREMENT_AND_TRIGGER(g_noaa_tick_10ms, g_schedule_noaa); + if (g_scan_state_dir == SCAN_STATE_DIR_OFF && + g_css_scan_mode == CSS_SCAN_MODE_OFF && + g_eeprom.dual_watch == DUAL_WATCH_OFF && + g_is_noaa_mode && + !g_monitor_enabled && + g_current_function != FUNCTION_TRANSMIT) + { + if (g_current_function != FUNCTION_RECEIVE) + DECREMENT_AND_TRIGGER(g_noaa_tick_10ms, g_schedule_noaa); + } #endif if (g_scan_state_dir != SCAN_STATE_DIR_OFF || g_css_scan_mode == CSS_SCAN_MODE_SCANNING) - if (g_current_function != FUNCTION_MONITOR && g_current_function != FUNCTION_TRANSMIT) - DECREMENT(g_scan_pause_10ms); + if (!g_monitor_enabled && g_current_function != FUNCTION_TRANSMIT) + DECREMENT(g_scan_pause_tick_10ms); DECREMENT_AND_TRIGGER(g_tail_tone_elimination_tick_10ms, g_flag_tail_tone_elimination_complete); #ifdef ENABLE_VOICE - DECREMENT_AND_TRIGGER(g_tick_to_play_next_voice_10ms, g_flag_play_queued_voice); + DECREMENT_AND_TRIGGER(g_play_next_voice_tick_10ms, g_flag_play_queued_voice); #endif #ifdef ENABLE_FMRADIO - if (g_fm_scan_state != FM_SCAN_OFF && g_current_function != FUNCTION_MONITOR) - if (g_current_function != FUNCTION_TRANSMIT && g_current_function != FUNCTION_RECEIVE) - DECREMENT_AND_TRIGGER(g_fm_play_tick_10ms, g_schedule_fm); + if (g_fm_scan_state != FM_SCAN_OFF && + !g_monitor_enabled && + g_current_function != FUNCTION_TRANSMIT && + g_current_function != FUNCTION_RECEIVE) + { + DECREMENT_AND_TRIGGER(g_fm_play_tick_10ms, g_schedule_fm); + } #endif #ifdef ENABLE_VOX - DECREMENT(g_vox_stop_10ms); + DECREMENT(g_vox_stop_tick_10ms); #endif - DECREMENT(g_boot_counter_10ms); + DECREMENT(g_boot_tick_10ms); } diff --git a/ui/fmradio.c b/ui/fmradio.c index 8f815c7..e574b8c 100644 --- a/ui/fmradio.c +++ b/ui/fmradio.c @@ -121,11 +121,11 @@ void UI_DisplayFM(void) { // frequency mode const uint32_t freq = g_eeprom.fm_frequency_playing; NUMBER_ToDigits(freq * 10000, str); -#ifdef ENABLE_TRIM_TRAILING_ZEROS - UI_DisplayFrequency(str, 30, 4, false, true); -#else - UI_DisplayFrequency(str, 23, 4, false, true); -#endif + #ifdef ENABLE_TRIM_TRAILING_ZEROS + UI_DisplayFrequency(str, 30, 4, false, true); + #else + UI_DisplayFrequency(str, 23, 4, false, true); + #endif } else { // user is entering a frequency @@ -143,6 +143,8 @@ void UI_DisplayFM(void) // ************************************* + // can't do this during FM radio - audio clicks else + if (g_fm_scan_state != FM_SCAN_OFF) { const uint16_t val_07 = BK1080_ReadRegister(0x07); const uint16_t val_0A = BK1080_ReadRegister(0x0A); @@ -153,7 +155,7 @@ void UI_DisplayFM(void) (val_07 >> 0) & 0x000f); UI_PrintStringSmall(str, 0, LCD_WIDTH, 6); } - + // ************************************* ST7565_BlitFullScreen(); diff --git a/ui/helper.c b/ui/helper.c index b368d92..2877b49 100644 --- a/ui/helper.c +++ b/ui/helper.c @@ -136,12 +136,8 @@ void UI_PrintStringSmall(const char *str, const unsigned int start, const unsign UI_print_string(str, start, end, line, (const uint8_t *)g_font_small_bold, ARRAY_SIZE(g_font_small_bold), ARRAY_SIZE(g_font_small_bold[0])); } #endif -/* -void UI_PrintStringSmall4x5(const char *str, const unsigned int start, const unsigned int end, const unsigned int line) -{ - UI_print_string(str, start, end, line, (const uint8_t *)g_font_small_4x5, ARRAY_SIZE(g_font_small_4x5), ARRAY_SIZE(g_font_small_4x5[0])); -} -*/ + +#ifdef ENABLE_SMALLEST_FONT void PutPixel(const unsigned int x, const unsigned int y, const bool fill) { @@ -193,6 +189,8 @@ void UI_PrintStringSmallest(const void *pString, unsigned int x, const unsigned } } +#endif + void UI_PrintStringSmallBuffer(const char *pString, uint8_t *buffer) { const unsigned int char_width = ARRAY_SIZE(g_font_small[0]); diff --git a/ui/helper.h b/ui/helper.h index 5b1639f..ad9bba9 100644 --- a/ui/helper.h +++ b/ui/helper.h @@ -27,8 +27,9 @@ void UI_PrintStringSmall(const char *str, const unsigned int start, const unsign #ifdef ENABLE_SMALL_BOLD void UI_PrintStringSmallBold(const char *str, const unsigned int start, const unsigned int end, const unsigned int line); #endif -//void UI_PrintStringSmall4x5(const char *str, const unsigned int start, const unsigned int end, const unsigned int line); -void UI_PrintStringSmallest(const void *pString, unsigned int x, const unsigned int y, const bool statusbar, const bool fill); +#ifdef ENABLE_SMALLEST_FONT + void UI_PrintStringSmallest(const void *pString, unsigned int x, const unsigned int y, const bool statusbar, const bool fill); +#endif void UI_PrintStringSmallBuffer(const char *pString, uint8_t *buffer); void UI_DisplayFrequency(const char *pDigits, uint8_t X, uint8_t Y, bool bDisplayLeadingZero, bool flag); void UI_DisplayFrequencySmall(const char *pDigits, uint8_t X, uint8_t Y, bool bDisplayLeadingZero); diff --git a/ui/main.c b/ui/main.c index 2ab574e..f5adfbd 100644 --- a/ui/main.c +++ b/ui/main.c @@ -302,7 +302,7 @@ void UI_update_rssi(const int16_t rssi, const int vfo) #ifdef ENABLE_RX_SIGNAL_BAR if (g_center_line == CENTER_LINE_RSSI) { // optional larger RSSI dBm, S-point and bar level - if (g_current_function == FUNCTION_RECEIVE || g_current_function == FUNCTION_MONITOR) + if (g_current_function == FUNCTION_RECEIVE) { UI_DisplayRSSIBar(rssi, true); } @@ -355,9 +355,7 @@ void UI_update_rssi(const int16_t rssi, const int vfo) if (rssi >= level01) rssi_level = 2; else - if (rssi >= level0 || - g_current_function == FUNCTION_MONITOR || - g_current_function == FUNCTION_NEW_RECEIVE) + if (rssi >= level0 || g_current_function == FUNCTION_NEW_RECEIVE) { rssi_level = 1; } @@ -422,7 +420,7 @@ void big_freq(const uint32_t frequency, const unsigned int x, const unsigned int void UI_DisplayMain(void) { - #ifndef ENABLE_BIG_FREQ + #if !defined(ENABLE_BIG_FREQ) && defined(ENABLE_SMALLEST_FONT) const unsigned int smallest_char_spacing = ARRAY_SIZE(g_font3x5[0]) + 1; #endif const unsigned int line0 = 0; // text screen line @@ -589,9 +587,7 @@ void UI_DisplayMain(void) else { // receiving .. show the RX symbol mode = 2; - if ((g_current_function == FUNCTION_RECEIVE || - g_current_function == FUNCTION_MONITOR || - g_current_function == FUNCTION_NEW_RECEIVE) && + if ((g_current_function == FUNCTION_RECEIVE || g_current_function == FUNCTION_NEW_RECEIVE) && g_eeprom.rx_vfo == vfo_num) { #ifdef ENABLE_SMALL_BOLD @@ -776,7 +772,7 @@ void UI_DisplayMain(void) // no room for these symbols - #else + #elif defined(ENABLE_SMALLEST_FONT) { unsigned int x = LCD_WIDTH + LCD_WIDTH - 1 - (smallest_char_spacing * 1) - (smallest_char_spacing * 4); @@ -795,6 +791,24 @@ void UI_DisplayMain(void) UI_PrintStringSmallest("C", x, (line + 0) * 8, false, true); //x += smallest_char_spacing * 1; } + #else + { + strcpy(str, " "); + + if (IS_FREQ_CHANNEL(g_eeprom.screen_channel[vfo_num])) + { + //g_eeprom.vfo_info[vfo_num].freq_in_channel = BOARD_find_channel(frequency); + if (g_eeprom.vfo_info[vfo_num].freq_in_channel <= USER_CHANNEL_LAST) + { // the channel number that contains this VFO frequency + str[0] = 'F'; + } + } + + if (g_eeprom.vfo_info[vfo_num].compand) + str[1] = 'C'; + + UI_PrintStringSmall(str, LCD_WIDTH - 1 - (6 * 2), 0, line + 1); + } #endif } @@ -903,9 +917,7 @@ void UI_DisplayMain(void) g_dtmf_call_state == DTMF_CALL_STATE_NONE) { // we're free to use the middle line - const bool rx = (g_current_function == FUNCTION_RECEIVE || - g_current_function == FUNCTION_MONITOR || - g_current_function == FUNCTION_NEW_RECEIVE); + const bool rx = (g_current_function == FUNCTION_RECEIVE); #ifdef ENABLE_TX_TIMEOUT_BAR // show the TX timeout count down diff --git a/ui/status.c b/ui/status.c index 946e2ec..48ba06a 100644 --- a/ui/status.c +++ b/ui/status.c @@ -54,8 +54,8 @@ void UI_DisplayStatus(const bool test_display) } else if (g_current_function == FUNCTION_RECEIVE || - g_current_function == FUNCTION_MONITOR || - g_current_function == FUNCTION_NEW_RECEIVE) + g_current_function == FUNCTION_NEW_RECEIVE || + g_monitor_enabled) { memcpy(line + x, BITMAP_RX, sizeof(BITMAP_RX)); x1 = x + sizeof(BITMAP_RX); @@ -140,7 +140,7 @@ void UI_DisplayStatus(const bool test_display) // DUAL-WATCH indicator if (g_eeprom.dual_watch != DUAL_WATCH_OFF || test_display) { - if (g_dual_watch_delay_10ms > dual_watch_delay_toggle_10ms || + if (g_dual_watch_tick_10ms > dual_watch_delay_toggle_10ms || g_dtmf_call_state != DTMF_CALL_STATE_NONE || g_scan_state_dir != SCAN_STATE_DIR_OFF || g_css_scan_mode != CSS_SCAN_MODE_OFF || @@ -157,7 +157,8 @@ void UI_DisplayStatus(const bool test_display) } x += sizeof(BITMAP_TDR_RUNNING); - if (g_current_function == FUNCTION_MONITOR) + // monitor + if (g_monitor_enabled) { memcpy(line + x, BITMAP_MONITOR, sizeof(BITMAP_MONITOR)); x1 = x + sizeof(BITMAP_MONITOR); diff --git a/ui/ui.c b/ui/ui.c index 32272ea..e9b3fc0 100644 --- a/ui/ui.c +++ b/ui/ui.c @@ -91,6 +91,7 @@ void GUI_SelectNextDisplay(gui_display_type_t Display) g_scan_state_dir = SCAN_STATE_DIR_OFF; #ifdef ENABLE_FMRADIO g_fm_scan_state = FM_SCAN_OFF; + g_update_display = true; #endif g_ask_for_confirmation = 0; g_ask_to_save = false;