diff --git a/Makefile b/Makefile index 9f7ce8a..a8fef3d 100644 --- a/Makefile +++ b/Makefile @@ -43,7 +43,7 @@ ENABLE_BIG_FREQ := 0 ENABLE_DTMF_LIVE_DECODER := 0 ENABLE_DTMF_TIMING_SETTINGS := 0 ENABLE_SHOW_FREQ_IN_CHAN := 1 -# smaa bolf 580 B +# smaa bold 580 B ENABLE_SMALL_BOLD := 0 # smallest font 2 kB ENABLE_SMALLEST_FONT := 0 @@ -82,6 +82,7 @@ ENABLE_FASTER_CHANNEL_SCAN := 1 ENABLE_COPY_CHAN_TO_VFO_TO_CHAN := 1 # Tx Audio Bar 300 B ENABLE_TX_AUDIO_BAR := 0 +ENABLE_TX_AUDIO_BACKLIGHT := 0 # Side Button Menu 300 B ENABLE_SIDE_BUTT_MENU := 0 # Key Lock 400 B @@ -471,6 +472,9 @@ endif ifeq ($(ENABLE_TX_AUDIO_BAR),1) CFLAGS += -DENABLE_TX_AUDIO_BAR endif +ifeq ($(ENABLE_TX_AUDIO_BACKLIGHT),1) + CFLAGS += -DENABLE_TX_AUDIO_BACKLIGHT +endif ifeq ($(ENABLE_COPY_CHAN_TO_VFO_TO_CHAN),1) CFLAGS += -DENABLE_COPY_CHAN_TO_VFO_TO_CHAN endif diff --git a/README.md b/README.md index e506512..622cb65 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ ENABLE_SQ_OPEN_WITH_UP_DN_BUTTS := 1 open the squelch when holding down U ENABLE_FASTER_CHANNEL_SCAN := 1 increase the channel scan speed, but also make the squelch more twitchy ENABLE_COPY_CHAN_TO_VFO_TO_CHAN := 1 long press M, copy channel to VFO, or VFO to channel ENABLE_TX_AUDIO_BAR := 0 enable a menu option for showing a TX audio level bar +ENABLE_TX_AUDIO_BACKLIGHT := 0 backlight will follow TX audio level ENABLE_SIDE_BUTT_MENU := 0 enable menu option for configuring the programmable side buttons ENABLE_KEYLOCK := 0 enable keylock menu option + keylock code ENABLE_PANADAPTER := 1 centered on the selected VFO RX frequency, only shows if dual-watch is disabled diff --git a/app/action.c b/app/action.c index 75468c3..39fb968 100644 --- a/app/action.c +++ b/app/action.c @@ -117,12 +117,12 @@ void ACTION_Monitor(void) } // disable monitor - + g_monitor_enabled = false; if (!g_squelch_open) GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_SPEAKER); - + if (g_scan_state_dir != SCAN_STATE_DIR_OFF) g_scan_tick_10ms = g_eeprom.config.setting.scan_hold_time * 50; @@ -217,37 +217,37 @@ void ACTION_Scan(bool bRestart) RADIO_select_vfos(); GUI_SelectNextDisplay(DISPLAY_MAIN); - + if (g_scan_state_dir != SCAN_STATE_DIR_OFF) { // currently scanning - + if (g_scan_next_channel <= USER_CHANNEL_LAST) { // channel mode - + if (g_eeprom.config.setting.scan_list_default < 2) { // keep scanning but toggle between scan lists - + //g_eeprom.config.setting.scan_list_default = (g_eeprom.config.setting.scan_list_default + 1) % 3; g_eeprom.config.setting.scan_list_default++; - + // jump to the next channel APP_channel_next(true, g_scan_state_dir); - - g_scan_tick_10ms = 0; + + g_scan_tick_10ms = 0; g_scan_pause_time_mode = false; - + g_update_status = true; return; } - + g_eeprom.config.setting.scan_list_default = 0; // back to scan list 1 - the next time we start scanning } - + // ***************** // stop scanning - + APP_stop_scan(); - + g_request_display_screen = DISPLAY_MAIN; return; @@ -255,7 +255,7 @@ void ACTION_Scan(bool bRestart) // ********************** // start scanning - + { const uint32_t freq = g_tx_vfo->freq_config_rx.frequency; const frequency_band_t band = FREQUENCY_GetBand(freq); @@ -263,7 +263,7 @@ void ACTION_Scan(bool bRestart) g_scan_initial_lower = FREQ_BAND_TABLE[band].lower; g_scan_initial_step_size = g_tx_vfo->step_freq; } - + #ifdef ENABLE_SCAN_RANGES if (IS_FREQ_CHANNEL(g_tx_vfo->channel_save) && g_eeprom.config.setting.scan_ranges_enable) { @@ -272,36 +272,36 @@ void ACTION_Scan(bool bRestart) // freq = FREQUENCY_floor_to_step(freq, g_scan_initial_step_size, g_scan_initial_lower, g_scan_initial_upper); } } #endif - + 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_tick_10ms = 0; // go NOW g_scan_pause_time_mode = false; - + #ifdef ENABLE_VOICE AUDIO_SetVoiceID(0, VOICE_ID_SCANNING_BEGIN); AUDIO_PlaySingleVoice(true); #endif - + // clear the other vfo's rssi level (to hide the antenna symbol) g_vfo_rssi_bar_level[(g_rx_vfo_num + 1) & 1u] = 0; - + g_update_status = true; return; } // freq/ctcss/cdcss/search mode - - + + // TODO: fixme - - + + // if (!bRestart) if (!bRestart && g_scan_next_channel <= USER_CHANNEL_LAST) { // channel mode, keep scanning but toggle between scan lists @@ -342,12 +342,12 @@ void ACTION_Scan(bool bRestart) g_input_box_index = 0; (void)b1750; // stop compile warning - + #if defined(ENABLE_ALARM) && defined(ENABLE_TX1750) g_alarm_state = b1750 ? ALARM_STATE_TX1750 : ALARM_STATE_TXALARM; g_alarm_running_counter_10ms = 0; #elif defined(ENABLE_ALARM) - g_alarm_state = ALARM_STATE_TXALARM; + g_alarm_state = ALARM_STATE_TXALARM; g_alarm_running_counter_10ms = 0; #else g_alarm_state = ALARM_STATE_TX1750; @@ -368,14 +368,14 @@ void ACTION_Scan(bool bRestart) { if (g_fm_radio_mode) { // return normal service - + FM_turn_off(); g_input_box_index = 0; #ifdef ENABLE_VOX g_vox_resume_tick_10ms = 80; #endif - g_flag_reconfigure_vfos = true; + g_flag_reconfigure_vfos = true; g_request_display_screen = DISPLAY_MAIN; return; diff --git a/app/app.c b/app/app.c index b1395b7..5e9a843 100644 --- a/app/app.c +++ b/app/app.c @@ -205,7 +205,7 @@ static void APP_process_new_receive(void) { FUNCTION_Select(FUNCTION_FOREGROUND); g_update_display = true; -// g_update_status = true; + //g_update_status = true; } return; @@ -215,7 +215,7 @@ static void APP_process_new_receive(void) { case MOD_MODE_FM: case MOD_MODE_AM: - BK4819_set_AFC(2); + BK4819_set_AFC(3); break; default: case MOD_MODE_DSB: @@ -238,14 +238,17 @@ static void APP_process_new_receive(void) g_found_ctcss = false; flag = true; } - + if (g_cdcss_lost && g_cdcss_code_type == CDCSS_POSITIVE_CODE && (g_current_code_type == CODE_TYPE_DIGITAL || g_current_code_type == CODE_TYPE_REVERSE_DIGITAL)) { g_found_cdcss = false; } else - if (!flag) +// if (!flag) + if (!flag && !g_monitor_enabled) // 1of11 + { return; + } if (g_scan_state_dir == SCAN_STATE_DIR_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF) { // not scanning @@ -328,32 +331,23 @@ static void APP_process_rx(void) goto Skip; } - switch (g_current_code_type) + if (g_found_ctcss_tick_10ms == 0) { - default: - case CODE_TYPE_NONE: - break; + if (g_current_code_type == CODE_TYPE_CONTINUOUS_TONE && g_found_ctcss) + { + g_found_ctcss = false; + g_found_cdcss = false; + Mode = END_OF_RX_MODE_END; + goto Skip; + } - case CODE_TYPE_CONTINUOUS_TONE: - if (g_found_ctcss && g_found_ctcss_tick_10ms == 0) - { - g_found_ctcss = false; - g_found_cdcss = false; - Mode = END_OF_RX_MODE_END; - goto Skip; - } - break; - - case CODE_TYPE_DIGITAL: - case CODE_TYPE_REVERSE_DIGITAL: - if (g_found_cdcss && g_found_cdcss_tick_10ms == 0) - { - g_found_ctcss = false; - g_found_cdcss = false; - Mode = END_OF_RX_MODE_END; - goto Skip; - } - break; + if ((g_current_code_type == CODE_TYPE_DIGITAL || CODE_TYPE_REVERSE_DIGITAL) && g_found_cdcss) + { + g_found_ctcss = false; + g_found_cdcss = false; + Mode = END_OF_RX_MODE_END; + goto Skip; + } } if (g_squelch_open || g_monitor_enabled) @@ -516,7 +510,7 @@ bool APP_start_listening(void) { case MOD_MODE_FM: case MOD_MODE_AM: - BK4819_set_AFC(2); // enable a bit + BK4819_set_AFC(3); // enable a bit break; default: case MOD_MODE_DSB: @@ -981,6 +975,12 @@ void APP_process_radio_interrupts(void) } } +// #ifdef ENABLE_CTCSS_TAIL_PHASE_SHIFT +// if (((reg_c >> 12) & 3u) > 0) +// { // phase shift detected +// } +// #endif + if ((reg_c & (1u << 0)) == 0) break; // no interrupt flags @@ -1865,7 +1865,30 @@ void APP_process_functions(void) case FUNCTION_TRANSMIT: if (g_eeprom.config.setting.backlight_on_tx_rx == 1 || g_eeprom.config.setting.backlight_on_tx_rx == 3) - BACKLIGHT_turn_on(backlight_tx_rx_time_secs); + { + #ifdef ENABLE_TX_AUDIO_BACKLIGHT + static unsigned int hold_10ms = 0; + uint32_t level = BK4819_GetVoiceAmplitudeOut(); // 15:0 + level *= 128; + level = NUMBER_isqrt((level < 65535) ? level : 65535); + level = (level * BACKLIGHT_MAX_BRIGHTNESS) / 255; // 0 ~ BACKLIGHT_MAX_BRIGHTNESS + level = (BACKLIGHT_MAX_BRIGHTNESS / 4) + ((level * 3) / 4); // 25% ~ 100% + if (g_backlight_tick_10ms > BACKLIGHT_MAX_BRIGHTNESS || g_backlight_tick_10ms <= level) + { + g_backlight_tick_10ms = level; + hold_10ms = 20; + } + else + if (hold_10ms > 0) + hold_10ms--; + else + if (g_backlight_tick_10ms > 0) + g_backlight_tick_10ms--; + BACKLIGHT_set_brightness(g_backlight_tick_10ms); + #else + BACKLIGHT_turn_on(backlight_tx_rx_time_secs); + #endif + } break; case FUNCTION_NEW_RECEIVE: @@ -2387,6 +2410,8 @@ void APP_time_slice_10ms(void) if (g_backlight_tick_10ms > 0 && !g_ask_to_save && g_css_scan_mode == CSS_SCAN_MODE_OFF && + ((g_eeprom.config.setting.backlight_on_tx_rx != 1 && g_eeprom.config.setting.backlight_on_tx_rx != 3) || g_current_function != FUNCTION_TRANSMIT) && +// g_current_function != FUNCTION_TRANSMIT && g_current_display_screen != DISPLAY_AIRCOPY) { // don't turn off backlight if user is in backlight menu option if (g_current_display_screen != DISPLAY_MENU || g_menu_cursor != MENU_AUTO_BACKLITE) diff --git a/firmware.bin b/firmware.bin deleted file mode 100644 index 7bfbc44..0000000 Binary files a/firmware.bin and /dev/null differ diff --git a/firmware.packed.bin b/firmware.packed.bin deleted file mode 100644 index e2ac9a4..0000000 Binary files a/firmware.packed.bin and /dev/null differ diff --git a/helper/battery.c b/helper/battery.c index 1c15517..cb59776 100644 --- a/helper/battery.c +++ b/helper/battery.c @@ -83,26 +83,18 @@ void BATTERY_GetReadings(const bool bDisplayBatteryLevel) { const uint8_t PreviousBatteryLevel = g_battery_display_level; const uint16_t Voltage = (g_battery_voltages[0] + g_battery_voltages[1] + g_battery_voltages[2] + g_battery_voltages[3]) / 4; + unsigned int i; g_battery_display_level = 0; - if (g_eeprom.calib.battery[5] < Voltage) - g_battery_display_level = 6; - else - if (g_eeprom.calib.battery[4] < Voltage) - g_battery_display_level = 5; - else - if (g_eeprom.calib.battery[3] < Voltage) - g_battery_display_level = 4; - else - if (g_eeprom.calib.battery[2] < Voltage) - g_battery_display_level = 3; - else - if (g_eeprom.calib.battery[1] < Voltage) - g_battery_display_level = 2; - else - if (g_eeprom.calib.battery[0] < Voltage) - g_battery_display_level = 1; + for (i = ARRAY_SIZE(g_eeprom.calib.battery); i > 0; i--) + { + if (g_eeprom.calib.battery[i - 1] < Voltage) + { + g_battery_display_level = i; + break; + } + } g_battery_voltage_average = (Voltage * 760) / g_eeprom.calib.battery[3]; diff --git a/ui/menu.c b/ui/menu.c index 100d72c..86db280 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -127,8 +127,8 @@ const t_menu_item g_menu_list[] = #endif #ifdef ENABLE_DTMF_TIMING_SETTINGS {"D PRE", VOICE_ID_INVALID, MENU_DTMF_PRE }, - {"D1PERS", VOICE_ID_INVALID, MENU_DTMF_1ST_PERSIST }, - {"DHPERS", VOICE_ID_INVALID, MENU_DTMF_HASH_PERSIST }, + {"D 1PER", VOICE_ID_INVALID, MENU_DTMF_1ST_PERSIST }, + {"D HPER", VOICE_ID_INVALID, MENU_DTMF_HASH_PERSIST }, {"D PER", VOICE_ID_INVALID, MENU_DTMF_PERSIST }, {"D INT", VOICE_ID_INVALID, MENU_DTMF_INTERVAL }, #endif @@ -1089,10 +1089,10 @@ void UI_DisplayMenu(void) switch (g_menu_cursor) { case MENU_DTMF_PRE: - strcat(str, " PRE\n"); + strcat(str, "BOT\nDELAY\n"); break; case MENU_DTMF_1ST_PERSIST: - strcat(str, "1 CODE\nPERSIST\n"); + strcat(str, "1CODE\nPERSIST\n"); break; case MENU_DTMF_HASH_PERSIST: strcat(str, "#\nPERSIST\n");