/*************************************************************************** * * Copyright 2015-2019 BES. * All rights reserved. All unpublished rights reserved. * * No part of this work may be used or reproduced in any form or by any * means, or stored in a database or retrieval system, without prior written * permission of BES. * * Use of this work is governed by a license granted by BES. * This work contains confidential and proprietary information of * BES. which is protected by copyright, trade secret, * trademark and other intellectual property rights. * ****************************************************************************/ #include "stdio.h" #include "cmsis_os.h" #include "list.h" #include "string.h" #include "hal_timer.h" #include "hal_trace.h" #include "hal_bootmode.h" #include "hal_sleep.h" #include "pmu.h" #include "audioflinger.h" #include "apps.h" #include "app_thread.h" #include "app_key.h" #include "app_bt_media_manager.h" #include "app_pwl.h" #include "app_audio.h" #include "app_overlay.h" #include "app_battery.h" #include "app_utils.h" #include "app_status_ind.h" #include "bt_drv_interface.h" #include "besbt.h" #include "norflash_api.h" #include "nvrecord.h" #include "nvrecord_dev.h" #include "nvrecord_env.h" #include "crash_dump_section.h" #include "log_section.h" #include "factory_section.h" #include "a2dp_api.h" #include "me_api.h" #include "os_api.h" #include "btapp.h" #include "app_bt.h" #include "bt_if.h" #include "gapm_task.h" #include "app_ble_include.h" #include "app_bt_func.h" #include "tgt_hardware.h" #include "hal_i2c.h" #ifdef __AI_VOICE__ #include "app_ai_if.h" #include "app_ai_tws.h" #include "ai_manager.h" #include "app_ai_manager_api.h" #endif #include "app_tws_ibrt_cmd_handler.h" #include "audio_process.h" #ifdef __PC_CMD_UART__ #include "app_cmd.h" #endif #ifdef __FACTORY_MODE_SUPPORT__ #include "app_factory.h" #include "app_factory_bt.h" #endif #ifdef __INTERCONNECTION__ #include "app_interconnection.h" #include "app_interconnection_ble.h" #include "app_interconnection_logic_protocol.h" #include "app_ble_mode_switch.h" #endif #ifdef __INTERACTION__ #include "app_interaction.h" #endif #ifdef BISTO_ENABLED #include "app_ai_manager_api.h" #include "gsound_custom_reset.h" #include "nvrecord_gsound.h" #include "gsound_custom_actions.h" #include "gsound_custom_ota.h" #endif #ifdef IBRT_OTA #include "ota_bes.h" #endif #ifdef MEDIA_PLAYER_SUPPORT #include "resources.h" #include "app_media_player.h" #endif #ifdef VOICE_DATAPATH #include "app_voicepath.h" #endif #ifdef BT_USB_AUDIO_DUAL_MODE #include "btusb_audio.h" #include "usbaudio_thread.h" #endif #ifdef TILE_DATAPATH #include "tile_target_ble.h" #endif #if defined(IBRT) #include "app_ibrt_if.h" #include "app_ibrt_customif_ui.h" #include "app_ibrt_ui_test.h" #include "app_ibrt_voice_report.h" #include "app_tws_if.h" #include "app_ibrt_customif_cmd.h" #endif #ifdef GFPS_ENABLED #include "app_gfps.h" #endif #ifdef BTIF_BLE_APP_DATAPATH_SERVER #include "app_ble_cmd_handler.h" #endif #ifdef ANC_APP #include "app_anc.h" #endif #ifdef __THIRDPARTY #include "app_thirdparty.h" #endif #ifdef OTA_ENABLED #include "nvrecord_ota.h" #include "ota_common.h" #endif #ifdef WL_DET #include "app_mic_alg.h" #endif #ifdef AUDIO_DEBUG_V0_1_0 extern "C" int speech_tuning_init(void); #endif #if (defined(BTUSB_AUDIO_MODE) || defined(BT_USB_AUDIO_DUAL_MODE)) extern "C" bool app_usbaudio_mode_on(void) ; #endif #ifdef BES_OTA_BASIC extern "C" void ota_flash_init(void); #endif #define APP_BATTERY_LEVEL_LOWPOWERTHRESHOLD (1) #define POWERON_PRESSMAXTIME_THRESHOLD_MS (5000) #ifdef FPGA uint32_t __ota_upgrade_log_start[100]; #endif enum APP_POWERON_CASE_T { APP_POWERON_CASE_NORMAL = 0, APP_POWERON_CASE_DITHERING, APP_POWERON_CASE_REBOOT, APP_POWERON_CASE_ALARM, APP_POWERON_CASE_CALIB, APP_POWERON_CASE_BOTHSCAN, APP_POWERON_CASE_CHARGING, APP_POWERON_CASE_FACTORY, APP_POWERON_CASE_TEST, APP_POWERON_CASE_LINKLOSE_REBOOT, APP_POWERON_CASE_INVALID, APP_POWERON_CASE_NUM }; #ifdef RB_CODEC extern int rb_ctl_init(); extern bool rb_ctl_is_init_done(void); extern void app_rbplay_audio_reset_pause_status(void); #endif #ifdef __SUPPORT_ANC_SINGLE_MODE_WITHOUT_BT__ extern bool app_pwr_key_monitor_get_val(void); static bool anc_single_mode_on = false; extern "C" bool anc_single_mode_is_on(void) { return anc_single_mode_on; } #endif #ifdef __ANC_STICK_SWITCH_USE_GPIO__ extern bool app_anc_switch_get_val(void); #endif #ifdef GFPS_ENABLED extern "C" void app_fast_pairing_timeout_timehandler(void); #endif uint8_t app_poweroff_flag = 0; static enum APP_POWERON_CASE_T g_pwron_case = APP_POWERON_CASE_INVALID; #ifndef APP_TEST_MODE static uint8_t app_status_indication_init(void) { struct APP_PWL_CFG_T cfg; hal_iomux_init((struct HAL_IOMUX_PIN_FUNCTION_MAP *)cfg_hw_pinmux_pwl, sizeof(cfg_hw_pinmux_pwl)/sizeof(struct HAL_IOMUX_PIN_FUNCTION_MAP)); memset(&cfg, 0, sizeof(struct APP_PWL_CFG_T)); app_pwl_open(); app_pwl_setup(APP_PWL_ID_0, &cfg); app_pwl_setup(APP_PWL_ID_1, &cfg); return 0; } #endif #if defined(__BTIF_EARPHONE__) && defined(__BTIF_AUTOPOWEROFF__) void PairingTransferToConnectable(void); typedef void (*APP_10_SECOND_TIMER_CB_T)(void); void app_pair_timerout(void); void app_poweroff_timerout(void); void CloseEarphone(void); typedef struct { uint8_t timer_id; uint8_t timer_en; uint8_t timer_count; uint8_t timer_period; APP_10_SECOND_TIMER_CB_T cb; }APP_10_SECOND_TIMER_STRUCT; #define INIT_APP_TIMER(_id, _en, _count, _period, _cb) \ { \ .timer_id = _id, \ .timer_en = _en, \ .timer_count = _count, \ .timer_period = _period, \ .cb = _cb, \ } APP_10_SECOND_TIMER_STRUCT app_10_second_array[] = { INIT_APP_TIMER(APP_PAIR_TIMER_ID, 0, 0, 6, PairingTransferToConnectable), INIT_APP_TIMER(APP_POWEROFF_TIMER_ID, 0, 0, 90, CloseEarphone), #ifdef GFPS_ENABLED INIT_APP_TIMER(APP_FASTPAIR_LASTING_TIMER_ID, 0, 0, APP_FAST_PAIRING_TIMEOUT_IN_SECOND/10, app_fast_pairing_timeout_timehandler), #endif }; void app_stop_10_second_timer(uint8_t timer_id) { APP_10_SECOND_TIMER_STRUCT *timer = &app_10_second_array[timer_id]; timer->timer_en = 0; timer->timer_count = 0; } void app_start_10_second_timer(uint8_t timer_id) { APP_10_SECOND_TIMER_STRUCT *timer = &app_10_second_array[timer_id]; timer->timer_en = 0; timer->timer_count = 0; } void app_set_10_second_timer(uint8_t timer_id, uint8_t enable, uint8_t period) { APP_10_SECOND_TIMER_STRUCT *timer = &app_10_second_array[timer_id]; timer->timer_en = enable; timer->timer_count = period; } void app_10_second_timer_check(void) { APP_10_SECOND_TIMER_STRUCT *timer = app_10_second_array; unsigned int i; for(i = 0; i < ARRAY_SIZE(app_10_second_array); i++) { if (timer->timer_en) { timer->timer_count++; if (timer->timer_count >= timer->timer_period) { timer->timer_en = 0; if (timer->cb) timer->cb(); } } timer++; } } void CloseEarphone(void) { int activeCons; osapi_lock_stack(); activeCons = btif_me_get_activeCons(); osapi_unlock_stack(); #ifdef ANC_APP if(app_anc_work_status()) { app_set_10_second_timer(APP_POWEROFF_TIMER_ID, 1, 30); return; } #endif /* ANC_APP */ if(activeCons == 0) { TRACE(0,"!!!CloseEarphone\n"); app_shutdown(); } } #endif /* #if defined(__BTIF_EARPHONE__) && defined(__BTIF_AUTOPOWEROFF__) */ int signal_send_to_main_thread(uint32_t signals); uint8_t stack_ready_flag = 0; void app_notify_stack_ready(uint8_t ready_flag) { TRACE(2,"app_notify_stack_ready %d %d", stack_ready_flag, ready_flag); stack_ready_flag |= ready_flag; #ifdef __IAG_BLE_INCLUDE__ if(stack_ready_flag == (STACK_READY_BT|STACK_READY_BLE)) #endif { signal_send_to_main_thread(0x3); } } bool app_is_stack_ready(void) { bool ret = false; if (stack_ready_flag == (STACK_READY_BT #ifdef __IAG_BLE_INCLUDE__ | STACK_READY_BLE #endif )) { ret = true; } return ret; } static void app_stack_ready_cb(void) { TRACE(0,"stack init done"); #ifdef BLE_ENABLE app_ble_stub_user_init(); app_ble_start_connectable_adv(BLE_ADVERTISING_INTERVAL); #endif } //#if (HF_CUSTOM_FEATURE_SUPPORT & HF_CUSTOM_FEATURE_BATTERY_REPORT) || (HF_SDK_FEATURES & HF_FEATURE_HF_INDICATORS) #if defined(SUPPORT_BATTERY_REPORT) || defined(SUPPORT_HF_INDICATORS) extern void app_hfp_set_battery_level(uint8_t level); #endif int app_status_battery_report(uint8_t level) { #ifdef __SUPPORT_ANC_SINGLE_MODE_WITHOUT_BT__ if (anc_single_mode_on) //anc power on,anc only mode return 0; #endif #if defined(__BTIF_EARPHONE__) if (app_is_stack_ready()) { app_bt_state_checker(); } app_10_second_timer_check(); #endif if (level <= APP_BATTERY_LEVEL_LOWPOWERTHRESHOLD) { //add something } if (app_is_stack_ready()) { // #if (HF_CUSTOM_FEATURE_SUPPORT & HF_CUSTOM_FEATURE_BATTERY_REPORT) || (HF_SDK_FEATURES & HF_FEATURE_HF_INDICATORS) #if defined(SUPPORT_BATTERY_REPORT) || defined(SUPPORT_HF_INDICATORS) #if defined(IBRT) if (app_tws_ibrt_mobile_link_connected()) { app_hfp_set_battery_level(level); } #else app_hfp_set_battery_level(level); #endif #else TRACE(1,"[%s] Can not enable SUPPORT_BATTERY_REPORT", __func__); #endif osapi_notify_evm(); } return 0; } void stopAuto_Shutdowm_Timer(void); void app_bt_power_off_customize() { #if(TWS_Sync_Shutdowm) app_ibrt_poweroff_notify_force(); #endif app_shutdown(); } #ifdef MEDIA_PLAYER_SUPPORT void app_status_set_num(const char* p) { media_Set_IncomingNumber(p); } static u8 last_voice_waring = APP_STATUS_INDICATION_NUM; int app_voice_report_handler(APP_STATUS_INDICATION_T status, uint8_t device_id, uint8_t isMerging) { #if (defined(BTUSB_AUDIO_MODE) || defined(BT_USB_AUDIO_DUAL_MODE)) if(app_usbaudio_mode_on()) return 0; #endif TRACE(3,"%s %d",__func__, status); AUD_ID_ENUM id = MAX_RECORD_NUM; #ifdef __SUPPORT_ANC_SINGLE_MODE_WITHOUT_BT__ if(anc_single_mode_on) return 0; #endif if(((last_voice_waring == APP_STATUS_INDICATION_POWERON)&&(status == APP_STATUS_INDICATION_POWERON))|| ((last_voice_waring == APP_STATUS_INDICATION_BOTHSCAN)&&(status == APP_STATUS_INDICATION_BOTHSCAN))|| ((last_voice_waring == APP_STATUS_INDICATION_BOTHSCAN)&&(status == APP_STATUS_INDICATION_DISCONNECTED))){ last_voice_waring = status; return 0; } if (app_poweroff_flag == 1){ switch (status) { case APP_STATUS_INDICATION_POWEROFF: id = AUD_ID_POWER_OFF; break; default: return 0; break; } }else{ switch (status) { case APP_STATUS_INDICATION_POWERON: id = AUD_ID_POWER_ON; break; case APP_STATUS_INDICATION_POWEROFF: id = AUD_ID_POWER_OFF; break; case APP_STATUS_INDICATION_CONNECTED: id = AUD_ID_BT_CONNECTED; break; case APP_STATUS_INDICATION_DISCONNECTED: id = AUD_ID_BT_DIS_CONNECT; break; case APP_STATUS_INDICATION_CALLNUMBER: id = AUD_ID_BT_CALL_INCOMING_NUMBER; break; case APP_STATUS_INDICATION_CHARGENEED: id = AUD_ID_BT_CHARGE_PLEASE; break; case APP_STATUS_INDICATION_FULLCHARGE: id = AUD_ID_BT_CHARGE_FINISH; break; case APP_STATUS_INDICATION_PAIRSUCCEED: id = AUD_ID_BT_PAIRING_SUC; break; case APP_STATUS_INDICATION_PAIRFAIL: id = AUD_ID_BT_PAIRING_FAIL; break; case APP_STATUS_INDICATION_HANGUPCALL: id = AUD_ID_BT_CALL_HUNG_UP; break; case APP_STATUS_INDICATION_REFUSECALL: id = AUD_ID_BT_CALL_REFUSE; isMerging = false; break; case APP_STATUS_INDICATION_ANSWERCALL: id = AUD_ID_BT_CALL_ANSWER; break; case APP_STATUS_INDICATION_CLEARSUCCEED: id = AUD_ID_BT_CLEAR_SUCCESS; break; case APP_STATUS_INDICATION_CLEARFAIL: id = AUD_ID_BT_CLEAR_FAIL; break; case APP_STATUS_INDICATION_INCOMINGCALL: id = AUD_ID_BT_CALL_INCOMING_CALL; break; case APP_STATUS_INDICATION_BOTHSCAN: id = AUD_ID_BT_PAIR_ENABLE; break; case APP_STATUS_INDICATION_WARNING: id = AUD_ID_BT_WARNING; break; case APP_STATUS_INDICATION_ALEXA_START: id = AUDIO_ID_BT_ALEXA_START; break; case APP_STATUS_INDICATION_ALEXA_STOP: id = AUDIO_ID_BT_ALEXA_STOP; break; case APP_STATUS_INDICATION_GSOUND_MIC_OPEN: id = AUDIO_ID_BT_GSOUND_MIC_OPEN; break; case APP_STATUS_INDICATION_GSOUND_MIC_CLOSE: id = AUDIO_ID_BT_GSOUND_MIC_CLOSE; break; case APP_STATUS_INDICATION_GSOUND_NC: id = AUDIO_ID_BT_GSOUND_NC; break; #ifdef __BT_WARNING_TONE_MERGE_INTO_STREAM_SBC__ case APP_STATUS_RING_WARNING: id = AUD_ID_RING_WARNING; break; #endif case APP_STATUS_INDICATION_MUTE: id = AUDIO_ID_BT_MUTE; break; #ifdef __INTERACTION__ case APP_STATUS_INDICATION_FINDME: id = AUD_ID_BT_FINDME; break; #endif case APP_STATUS_INDICATION_FIND_MY_BUDS: id = AUDIO_ID_FIND_MY_BUDS; break; case APP_STATUS_INDICATION_TILE_FIND: id = AUDIO_ID_FIND_TILE; break; case APP_STATUS_INDICATION_DUDU: id = AUDIO_ID_BT_DUDU; break; case APP_STATUS_INDICATION_DU: id = AUDIO_ID_BT_DU; break; default: break; } } uint16_t aud_pram = 0; if (isMerging){ aud_pram |= PROMOT_ID_BIT_MASK_MERGING; } #ifdef BT_USB_AUDIO_DUAL_MODE if(!btusb_is_usb_mode()) { #if defined(IBRT) app_ibrt_if_voice_report_handler(id, aud_pram); #else trigger_media_play(id, device_id, aud_pram); #endif } #else #if defined(IBRT) aud_pram |= PROMOT_ID_BIT_MASK_CHNLSEl_ALL; app_ibrt_if_voice_report_handler(id, aud_pram); #else trigger_media_play(id, device_id, aud_pram); #endif #endif return 0; } extern "C" int app_voice_report(APP_STATUS_INDICATION_T status, uint8_t device_id) { return app_voice_report_handler(status, device_id, true); } extern "C" int app_voice_report_generic(APP_STATUS_INDICATION_T status, uint8_t device_id, uint8_t isMerging) { return app_voice_report_handler(status, device_id, isMerging); } extern "C" int app_voice_stop(APP_STATUS_INDICATION_T status, uint8_t device_id) { AUD_ID_ENUM id = MAX_RECORD_NUM; TRACE(2,"%s %d", __func__, status); if (status == APP_STATUS_INDICATION_FIND_MY_BUDS) id = AUDIO_ID_FIND_MY_BUDS; if (id != MAX_RECORD_NUM) trigger_media_stop(id, device_id); return 0; } #endif #if 1//!defined(BLE_ONLY_ENABLED) static void app_poweron_normal(APP_KEY_STATUS *status, void *param) { TRACE(3,"%s %d,%d",__func__, status->code, status->event); g_pwron_case = APP_POWERON_CASE_NORMAL; signal_send_to_main_thread(0x2); } static void app_poweron_scan(APP_KEY_STATUS *status, void *param) { TRACE(3,"%s %d,%d",__func__, status->code, status->event); g_pwron_case = APP_POWERON_CASE_BOTHSCAN; signal_send_to_main_thread(0x2); } #endif #if 0//def __ENGINEER_MODE_SUPPORT__ #if !defined(BLE_ONLY_ENABLED) static void app_poweron_factorymode(APP_KEY_STATUS *status, void *param) { TRACE(3,"%s %d,%d",__func__, status->code, status->event); hal_sw_bootmode_clear(HAL_SW_BOOTMODE_REBOOT); app_factorymode_enter(); } #endif #endif #ifndef __POWERKEY_CTRL_ONOFF_ONLY__ static bool g_pwron_finished = false; static void app_poweron_finished(APP_KEY_STATUS *status, void *param) { TRACE(3,"%s %d,%d",__func__, status->code, status->event); g_pwron_finished = true; signal_send_to_main_thread(0x2); } #endif void app_poweron_wait_finished(void) { #ifndef __POWERKEY_CTRL_ONOFF_ONLY__ if (!g_pwron_finished) #endif { osSignalWait(0x2, osWaitForever); } } #if defined(__POWERKEY_CTRL_ONOFF_ONLY__) void app_bt_key_shutdown(APP_KEY_STATUS *status, void *param); const APP_KEY_HANDLE pwron_key_handle_cfg[] = { {{APP_KEY_CODE_PWR,APP_KEY_EVENT_UP}, "power on: shutdown" , app_bt_key_shutdown, NULL}, }; #elif defined(__ENGINEER_MODE_SUPPORT__) const APP_KEY_HANDLE pwron_key_handle_cfg[] = { {{APP_KEY_CODE_PWR,APP_KEY_EVENT_INITUP}, "power on: normal" , app_poweron_normal, NULL}, #if !defined(BLE_ONLY_ENABLED) {{APP_KEY_CODE_PWR,APP_KEY_EVENT_INITLONGPRESS}, "power on: both scan" , app_poweron_scan , NULL}, // {{APP_KEY_CODE_PWR,APP_KEY_EVENT_INITLONGLONGPRESS},"power on: factory mode", app_poweron_factorymode , NULL}, #endif {{APP_KEY_CODE_PWR,APP_KEY_EVENT_INITFINISHED}, "power on: finished" , app_poweron_finished , NULL}, }; #else const APP_KEY_HANDLE pwron_key_handle_cfg[] = { {{APP_KEY_CODE_PWR,APP_KEY_EVENT_INITUP}, "power on: normal" , app_poweron_normal, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_INITLONGPRESS}, "power on: both scan" , app_poweron_scan , NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_INITFINISHED}, "power on: finished" , app_poweron_finished , NULL}, }; #endif #ifndef APP_TEST_MODE static void app_poweron_key_init(void) { uint8_t i = 0; TRACE(1,"%s",__func__); for (i=0; i<(sizeof(pwron_key_handle_cfg)/sizeof(APP_KEY_HANDLE)); i++){ app_key_handle_registration(&pwron_key_handle_cfg[i]); } } static uint8_t app_poweron_wait_case(void) { #ifdef __POWERKEY_CTRL_ONOFF_ONLY__ g_pwron_case = APP_POWERON_CASE_NORMAL; #else uint32_t stime = 0, etime = 0; TRACE(1,"poweron_wait_case enter:%d", g_pwron_case); if (g_pwron_case == APP_POWERON_CASE_INVALID){ stime = hal_sys_timer_get(); osSignalWait(0x2, POWERON_PRESSMAXTIME_THRESHOLD_MS); etime = hal_sys_timer_get(); } TRACE(2,"powon raw case:%d time:%d", g_pwron_case, TICKS_TO_MS(etime - stime)); #endif return g_pwron_case; } #endif static void app_wait_stack_ready(void) { uint32_t stime, etime; stime = hal_sys_timer_get(); osSignalWait(0x3, 1000); etime = hal_sys_timer_get(); TRACE(1,"app_wait_stack_ready: wait:%d ms", TICKS_TO_MS(etime - stime)); app_stack_ready_cb(); } extern "C" int system_shutdown(void); int app_shutdown(void) { system_shutdown(); return 0; } int system_reset(void); int app_reset(void) { system_reset(); return 0; } static void app_postponed_reset_timer_handler(void const *param); osTimerDef(APP_POSTPONED_RESET_TIMER, app_postponed_reset_timer_handler); static osTimerId app_postponed_reset_timer = NULL; #define APP_RESET_PONTPONED_TIME_IN_MS 2000 static void app_postponed_reset_timer_handler(void const *param) { // hal_cmu_sys_reboot(); app_reset(); } void app_start_postponed_reset(void) { if (NULL == app_postponed_reset_timer) { app_postponed_reset_timer = osTimerCreate(osTimer(APP_POSTPONED_RESET_TIMER), osTimerOnce, NULL); } hal_sw_bootmode_set(HAL_SW_BOOTMODE_ENTER_HIDE_BOOT); osTimerStart(app_postponed_reset_timer, APP_RESET_PONTPONED_TIME_IN_MS); } void app_bt_key_shutdown(APP_KEY_STATUS *status, void *param) { TRACE(3,"%s %d,%d",__func__, status->code, status->event); #ifdef __POWERKEY_CTRL_ONOFF_ONLY__ hal_sw_bootmode_clear(HAL_SW_BOOTMODE_REBOOT); app_reset(); #else app_shutdown(); #endif } void app_bt_key_enter_testmode(APP_KEY_STATUS *status, void *param) { TRACE(1,"%s\n",__FUNCTION__); if(app_status_indication_get() == APP_STATUS_INDICATION_BOTHSCAN){ #ifdef __FACTORY_MODE_SUPPORT__ app_factorymode_bt_signalingtest(status, param); #endif } } void app_bt_key_enter_nosignal_mode(APP_KEY_STATUS *status, void *param) { TRACE(1,"%s\n",__FUNCTION__); if(app_status_indication_get() == APP_STATUS_INDICATION_BOTHSCAN){ #ifdef __FACTORY_MODE_SUPPORT__ app_factorymode_bt_nosignalingtest(status, param); #endif } } extern "C" void OS_NotifyEvm(void); #define PRESS_KEY_TO_ENTER_OTA_INTERVEL (15000) // press key 15s enter to ota #define PRESS_KEY_TO_ENTER_OTA_REPEAT_CNT ((PRESS_KEY_TO_ENTER_OTA_INTERVEL - 2000) / 500) void app_otaMode_enter(APP_KEY_STATUS *status, void *param) { TRACE(1,"%s",__func__); hal_norflash_disable_protection(HAL_NORFLASH_ID_0); hal_sw_bootmode_set(HAL_SW_BOOTMODE_ENTER_HIDE_BOOT); #ifdef __KMATE106__ app_status_indication_set(APP_STATUS_INDICATION_OTA); app_voice_report(APP_STATUS_INDICATION_WARNING, 0); osDelay(1200); #endif hal_cmu_sys_reboot(); } #ifdef __USB_COMM__ void app_usb_cdc_comm_key_handler(APP_KEY_STATUS *status, void *param) { TRACE(3,"%s %d,%d", __func__, status->code, status->event); hal_sw_bootmode_clear(HAL_SW_BOOTMODE_REBOOT); hal_sw_bootmode_set(HAL_SW_BOOTMODE_CDC_COMM); pmu_usb_config(PMU_USB_CONFIG_TYPE_DEVICE); hal_cmu_reset_set(HAL_CMU_MOD_GLOBAL); } #endif #if 0 void app_dfu_key_handler(APP_KEY_STATUS *status, void *param) { TRACE(1,"%s ",__func__); hal_sw_bootmode_clear(HAL_SW_BOOTMODE_REBOOT); hal_sw_bootmode_set(HAL_SW_BOOTMODE_FORCE_USB_DLD); pmu_usb_config(PMU_USB_CONFIG_TYPE_DEVICE); hal_cmu_reset_set(HAL_CMU_MOD_GLOBAL); } #else void app_dfu_key_handler(APP_KEY_STATUS *status, void *param) { TRACE(1,"%s ",__func__); hal_sw_bootmode_clear(0xffffffff); hal_sw_bootmode_set(HAL_SW_BOOTMODE_FORCE_USB_DLD | HAL_SW_BOOTMODE_SKIP_FLASH_BOOT); pmu_usb_config(PMU_USB_CONFIG_TYPE_DEVICE); hal_cmu_reset_set(HAL_CMU_MOD_GLOBAL); } #endif void app_ota_key_handler(APP_KEY_STATUS *status, void *param) { static uint32_t time = hal_sys_timer_get(); static uint16_t cnt = 0; TRACE(3,"%s %d,%d",__func__, status->code, status->event); if (TICKS_TO_MS(hal_sys_timer_get() - time) > 600) // 600 = (repeat key intervel)500 + (margin)100 cnt = 0; else cnt++; if (cnt == PRESS_KEY_TO_ENTER_OTA_REPEAT_CNT) { app_otaMode_enter(NULL, NULL); } time = hal_sys_timer_get(); } extern "C" void app_bt_key(APP_KEY_STATUS *status, void *param) { TRACE(3,"%s %d,%d",__func__, status->code, status->event); #define DEBUG_CODE_USE 0 switch(status->event) { case APP_KEY_EVENT_CLICK: TRACE(0,"first blood!"); #if DEBUG_CODE_USE if (status->code == APP_KEY_CODE_PWR) { #ifdef __INTERCONNECTION__ // add favorite music // app_interconnection_handle_favorite_music_through_ccmp(1); // ask for ota update ota_update_request(); return; #else static int m = 0; if (m == 0) { m = 1; hal_iomux_set_analog_i2c(); } else { m = 0; hal_iomux_set_uart0(); } #endif } #endif break; case APP_KEY_EVENT_DOUBLECLICK: TRACE(0,"double kill"); #if DEBUG_CODE_USE if (status->code == APP_KEY_CODE_PWR) { #ifdef __INTERCONNECTION__ // play favorite music app_interconnection_handle_favorite_music_through_ccmp(2); #else app_otaMode_enter(NULL, NULL); #endif return; } #endif break; case APP_KEY_EVENT_TRIPLECLICK: TRACE(0,"triple kill"); if (status->code == APP_KEY_CODE_PWR) { #ifndef __BT_ONE_BRING_TWO__ if(btif_me_get_activeCons() < 1){ #else if(btif_me_get_activeCons() < 2){ #endif app_bt_accessmode_set(BTIF_BT_DEFAULT_ACCESS_MODE_PAIR); #ifdef __INTERCONNECTION__ app_interceonnection_start_discoverable_adv(INTERCONNECTION_BLE_FAST_ADVERTISING_INTERVAL, APP_INTERCONNECTION_FAST_ADV_TIMEOUT_IN_MS); return; #endif #ifdef GFPS_ENABLED app_enter_fastpairing_mode(); #endif app_voice_report(APP_STATUS_INDICATION_BOTHSCAN,0); } return; } break; case APP_KEY_EVENT_ULTRACLICK: TRACE(0,"ultra kill"); break; case APP_KEY_EVENT_RAMPAGECLICK: TRACE(0,"rampage kill!you are crazy!"); break; case APP_KEY_EVENT_UP: break; } #if 0//def __FACTORY_MODE_SUPPORT__ if (app_status_indication_get() == APP_STATUS_INDICATION_BOTHSCAN && (status->event == APP_KEY_EVENT_DOUBLECLICK)){ app_factorymode_languageswitch_proc(); }else #endif { #ifdef __SUPPORT_ANC_SINGLE_MODE_WITHOUT_BT__ if(!anc_single_mode_on) #endif bt_key_send(status); } } #ifdef RB_CODEC extern bool app_rbcodec_check_hfp_active(void ); void app_switch_player_key(APP_KEY_STATUS *status, void *param) { TRACE(3,"%s %d,%d",__func__, status->code, status->event); if(!rb_ctl_is_init_done()) { TRACE(0,"rb ctl not init done"); return ; } if( app_rbcodec_check_hfp_active() ) { app_bt_key(status,param); return; } app_rbplay_audio_reset_pause_status(); if(app_rbplay_mode_switch()) { app_voice_report(APP_STATUS_INDICATION_POWERON, 0); app_rbcodec_ctr_play_onoff(true); } else { app_rbcodec_ctr_play_onoff(false); app_voice_report(APP_STATUS_INDICATION_POWEROFF, 0); } return ; } #endif void app_voice_assistant_key(APP_KEY_STATUS *status, void *param) { TRACE(2,"%s event %d", __func__, status->event); #if defined(BISTO_ENABLED) || defined(__AI_VOICE__) if (app_ai_manager_is_in_multi_ai_mode()) { if (app_ai_manager_spec_get_status_is_in_invalid()) { TRACE(0,"AI feature has been diabled"); return; } #ifdef MAI_TYPE_REBOOT_WITHOUT_OEM_APP if (app_ai_manager_get_spec_update_flag()) { TRACE(0,"device reboot is ongoing..."); return; } #endif if (app_ai_manager_is_need_reboot()) { TRACE(1, "%s ai need to reboot", __func__); return; } if(app_ai_manager_voicekey_is_enable()) { if (AI_SPEC_GSOUND == app_ai_manager_get_current_spec()) { #ifdef BISTO_ENABLED gsound_custom_actions_handle_key(status, param); #endif } else if(AI_SPEC_INIT != app_ai_manager_get_current_spec()) { app_ai_key_event_handle(status, 0); } } } else { app_ai_key_event_handle(status, 0); #if defined(BISTO_ENABLED) gsound_custom_actions_handle_key(status, param); #endif } #endif } #ifdef IS_MULTI_AI_ENABLED void app_voice_gva_onoff_key(APP_KEY_STATUS *status, void *param) { uint8_t current_ai_spec = app_ai_manager_get_current_spec(); TRACE(2,"%s current_ai_spec %d", __func__, current_ai_spec); if (current_ai_spec == AI_SPEC_INIT) { app_ai_manager_enable(true, AI_SPEC_GSOUND); } else if(current_ai_spec == AI_SPEC_GSOUND) { app_ai_manager_enable(false, AI_SPEC_GSOUND); } else if(current_ai_spec == AI_SPEC_AMA) { app_ai_manager_switch_spec(AI_SPEC_GSOUND); } app_ble_refresh_adv_state(BLE_ADVERTISING_INTERVAL); } void app_voice_ama_onoff_key(APP_KEY_STATUS *status, void *param) { uint8_t current_ai_spec = app_ai_manager_get_current_spec(); TRACE(2,"%s current_ai_spec %d", __func__, current_ai_spec); if (current_ai_spec == AI_SPEC_INIT) { app_ai_manager_enable(true, AI_SPEC_AMA); } else if(current_ai_spec == AI_SPEC_AMA) { app_ai_manager_enable(false, AI_SPEC_AMA); } else if(current_ai_spec == AI_SPEC_GSOUND) { app_ai_manager_switch_spec(AI_SPEC_AMA); } app_ble_refresh_adv_state(BLE_ADVERTISING_INTERVAL); } #endif #if defined(BT_USB_AUDIO_DUAL_MODE_TEST) && defined(BT_USB_AUDIO_DUAL_MODE) extern "C" void test_btusb_switch(void); void app_btusb_audio_dual_mode_test(APP_KEY_STATUS *status, void *param) { TRACE(0,"test_btusb_switch"); test_btusb_switch(); } #endif extern void switch_dualmic_status(void); void app_switch_dualmic_key(APP_KEY_STATUS *status, void *param) { switch_dualmic_status(); } #ifdef POWERKEY_I2C_SWITCH extern void app_factorymode_i2c_switch(APP_KEY_STATUS *status, void *param); #endif #ifdef TILE_DATAPATH extern "C" void app_tile_key_handler(APP_KEY_STATUS *status, void *param); #endif #ifdef __POWERKEY_CTRL_ONOFF_ONLY__ #if defined(__APP_KEY_FN_STYLE_A__) const APP_KEY_HANDLE app_key_handle_cfg[] = { {{APP_KEY_CODE_PWR,APP_KEY_EVENT_UP},"bt function key",app_bt_key_shutdown, NULL}, {{APP_KEY_CODE_FN1,APP_KEY_EVENT_LONGPRESS},"bt function key",app_bt_key, NULL}, {{APP_KEY_CODE_FN1,APP_KEY_EVENT_UP},"bt function key",app_bt_key, NULL}, {{APP_KEY_CODE_FN1,APP_KEY_EVENT_DOUBLECLICK},"bt function key",app_bt_key, NULL}, {{APP_KEY_CODE_FN2,APP_KEY_EVENT_UP},"bt volume up key",app_bt_key, NULL}, {{APP_KEY_CODE_FN2,APP_KEY_EVENT_LONGPRESS},"bt play backward key",app_bt_key, NULL}, {{APP_KEY_CODE_FN3,APP_KEY_EVENT_UP},"bt volume down key",app_bt_key, NULL}, {{APP_KEY_CODE_FN3,APP_KEY_EVENT_LONGPRESS},"bt play forward key",app_bt_key, NULL}, #ifdef SUPPORT_SIRI {{APP_KEY_CODE_NONE ,APP_KEY_EVENT_NONE},"none function key",app_bt_key, NULL}, #endif }; #else //#elif defined(__APP_KEY_FN_STYLE_B__) const APP_KEY_HANDLE app_key_handle_cfg[] = { {{APP_KEY_CODE_PWR,APP_KEY_EVENT_UP},"bt function key",app_bt_key_shutdown, NULL}, {{APP_KEY_CODE_FN1,APP_KEY_EVENT_LONGPRESS},"bt function key",app_bt_key, NULL}, {{APP_KEY_CODE_FN1,APP_KEY_EVENT_UP},"bt function key",app_bt_key, NULL}, {{APP_KEY_CODE_FN1,APP_KEY_EVENT_DOUBLECLICK},"bt function key",app_bt_key, NULL}, {{APP_KEY_CODE_FN2,APP_KEY_EVENT_REPEAT},"bt volume up key",app_bt_key, NULL}, {{APP_KEY_CODE_FN2,APP_KEY_EVENT_UP},"bt play backward key",app_bt_key, NULL}, {{APP_KEY_CODE_FN3,APP_KEY_EVENT_REPEAT},"bt volume down key",app_bt_key, NULL}, {{APP_KEY_CODE_FN3,APP_KEY_EVENT_UP},"bt play forward key",app_bt_key, NULL}, #ifdef SUPPORT_SIRI {{APP_KEY_CODE_NONE ,APP_KEY_EVENT_NONE},"none function key",app_bt_key, NULL}, #endif }; #endif #else #if defined(__APP_KEY_FN_STYLE_A__) //-- const APP_KEY_HANDLE app_key_handle_cfg[] = { {{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGLONGPRESS},"bt function key",app_bt_key_shutdown, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGPRESS},"bt function key",app_bt_key, NULL}, #if defined(BT_USB_AUDIO_DUAL_MODE_TEST) && defined(BT_USB_AUDIO_DUAL_MODE) {{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"bt function key",app_bt_key, NULL}, #ifdef RB_CODEC {{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"bt function key",app_switch_player_key, NULL}, #else //{{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"btusb mode switch key.",app_btusb_audio_dual_mode_test, NULL}, #endif #endif {{APP_KEY_CODE_PWR,APP_KEY_EVENT_DOUBLECLICK},"bt function key",app_bt_key, NULL}, #ifdef TILE_DATAPATH {{APP_KEY_CODE_PWR,APP_KEY_EVENT_TRIPLECLICK},"bt function key",app_tile_key_handler, NULL}, #else {{APP_KEY_CODE_PWR,APP_KEY_EVENT_TRIPLECLICK},"bt function key",app_bt_key, NULL}, #endif #if RAMPAGECLICK_TEST_MODE {{APP_KEY_CODE_PWR,APP_KEY_EVENT_ULTRACLICK},"bt function key",app_bt_key_enter_nosignal_mode, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_RAMPAGECLICK},"bt function key",app_bt_key_enter_testmode, NULL}, #endif #ifdef POWERKEY_I2C_SWITCH {{APP_KEY_CODE_PWR,APP_KEY_EVENT_RAMPAGECLICK},"bt i2c key",app_factorymode_i2c_switch, NULL}, #endif //{{APP_KEY_CODE_FN1,APP_KEY_EVENT_UP},"bt volume up key",app_bt_key, NULL}, //{{APP_KEY_CODE_FN1,APP_KEY_EVENT_LONGPRESS},"bt play backward key",app_bt_key, NULL}, #if defined(APP_LINEIN_A2DP_SOURCE)||defined(APP_I2S_A2DP_SOURCE) {{APP_KEY_CODE_FN1,APP_KEY_EVENT_DOUBLECLICK},"bt mode src snk key",app_bt_key, NULL}, #endif //{{APP_KEY_CODE_FN2,APP_KEY_EVENT_UP},"bt volume down key",app_bt_key, NULL}, //{{APP_KEY_CODE_FN2,APP_KEY_EVENT_LONGPRESS},"bt play forward key",app_bt_key, NULL}, //{{APP_KEY_CODE_FN15,APP_KEY_EVENT_UP},"bt volume down key",app_bt_key, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"bt function key",app_bt_key, NULL}, #ifdef SUPPORT_SIRI {{APP_KEY_CODE_NONE ,APP_KEY_EVENT_NONE},"none function key",app_bt_key, NULL}, #endif #if defined( __BT_ANC_KEY__)&&defined(ANC_APP) #if defined(IBRT) {{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"bt anc key",app_anc_key, NULL}, #else {{APP_KEY_CODE_FN2,APP_KEY_EVENT_CLICK},"bt anc key",app_anc_key, NULL}, #endif #endif #ifdef TILE_DATAPATH {{APP_KEY_CODE_TILE, APP_KEY_EVENT_DOWN}, "tile function key", app_tile_key_handler, NULL}, {{APP_KEY_CODE_TILE, APP_KEY_EVENT_UP}, "tile function key", app_tile_key_handler, NULL}, #endif #if defined(VOICE_DATAPATH) || defined(__AI_VOICE__) {{APP_KEY_CODE_GOOGLE, APP_KEY_EVENT_FIRST_DOWN}, "google assistant key", app_voice_assistant_key, NULL}, #if defined(IS_GSOUND_BUTTION_HANDLER_WORKAROUND_ENABLED) || defined(PUSH_AND_HOLD_ENABLED) || defined(__TENCENT_VOICE__) {{APP_KEY_CODE_GOOGLE, APP_KEY_EVENT_UP}, "google assistant key", app_voice_assistant_key, NULL}, #endif {{APP_KEY_CODE_GOOGLE, APP_KEY_EVENT_UP_AFTER_LONGPRESS}, "google assistant key", app_voice_assistant_key, NULL}, {{APP_KEY_CODE_GOOGLE, APP_KEY_EVENT_LONGPRESS}, "google assistant key", app_voice_assistant_key, NULL}, {{APP_KEY_CODE_GOOGLE, APP_KEY_EVENT_CLICK}, "google assistant key", app_voice_assistant_key, NULL}, {{APP_KEY_CODE_GOOGLE, APP_KEY_EVENT_DOUBLECLICK}, "google assistant key", app_voice_assistant_key, NULL}, #endif #ifdef IS_MULTI_AI_ENABLED {{APP_KEY_CODE_FN13, APP_KEY_EVENT_CLICK}, "gva on-off key", app_voice_gva_onoff_key, NULL}, {{APP_KEY_CODE_FN14, APP_KEY_EVENT_CLICK}, "ama on-off key", app_voice_ama_onoff_key, NULL}, #endif #if defined(BT_USB_AUDIO_DUAL_MODE_TEST) && defined(BT_USB_AUDIO_DUAL_MODE) {{APP_KEY_CODE_FN15, APP_KEY_EVENT_CLICK}, "btusb mode switch key.", app_btusb_audio_dual_mode_test, NULL}, #endif }; #else //#elif defined(__APP_KEY_FN_STYLE_B__) const APP_KEY_HANDLE app_key_handle_cfg[] = { {{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGLONGPRESS},"bt function key",app_bt_key_shutdown, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGPRESS},"bt function key",app_bt_key, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"bt function key",app_bt_key, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_DOUBLECLICK},"bt function key",app_bt_key, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_TRIPLECLICK},"bt function key",app_bt_key, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_ULTRACLICK},"bt function key",app_bt_key_enter_nosignal_mode, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_RAMPAGECLICK},"bt function key",app_bt_key_enter_testmode, NULL}, {{APP_KEY_CODE_FN1,APP_KEY_EVENT_REPEAT},"bt volume up key",app_bt_key, NULL}, {{APP_KEY_CODE_FN1,APP_KEY_EVENT_UP},"bt play backward key",app_bt_key, NULL}, {{APP_KEY_CODE_FN2,APP_KEY_EVENT_REPEAT},"bt volume down key",app_bt_key, NULL}, {{APP_KEY_CODE_FN2,APP_KEY_EVENT_UP},"bt play forward key",app_bt_key, NULL}, #ifdef SUPPORT_SIRI {{APP_KEY_CODE_NONE ,APP_KEY_EVENT_NONE},"none function key",app_bt_key, NULL}, #endif {{APP_KEY_CODE_GOOGLE, APP_KEY_EVENT_FIRST_DOWN}, "google assistant key", app_voice_assistant_key, NULL}, #if defined(IS_GSOUND_BUTTION_HANDLER_WORKAROUND_ENABLED) || defined(PUSH_AND_HOLD_ENABLED) {{APP_KEY_CODE_GOOGLE, APP_KEY_EVENT_UP}, "google assistant key", app_voice_assistant_key, NULL}, #endif {{APP_KEY_CODE_GOOGLE, APP_KEY_EVENT_UP_AFTER_LONGPRESS}, "google assistant key", app_voice_assistant_key, NULL}, {{APP_KEY_CODE_GOOGLE, APP_KEY_EVENT_LONGPRESS}, "google assistant key", app_voice_assistant_key, NULL}, {{APP_KEY_CODE_GOOGLE, APP_KEY_EVENT_CLICK}, "google assistant key", app_voice_assistant_key, NULL}, {{APP_KEY_CODE_GOOGLE, APP_KEY_EVENT_DOUBLECLICK}, "google assistant key", app_voice_assistant_key, NULL}, }; #endif #endif extern struct BT_DEVICE_T app_bt_device; extern uint8_t avrcp_get_media_status(void); /******************************delay_report_tone_timer*********************************************************/ APP_STATUS_INDICATION_T delay_report_tone_num = APP_STATUS_INDICATION_NUM; osTimerId delay_report_toneid = NULL; void startdelay_report_tone(int ms,APP_STATUS_INDICATION_T status); void stopdelay_report_tone(void); static void delay_report_tonefun(const void *); osTimerDef(defdelay_report_tone,delay_report_tonefun); void delay_report_toneinit(void) { delay_report_toneid = osTimerCreate(osTimer(defdelay_report_tone),osTimerOnce,(void *)0); } static void delay_report_tonefun(const void *) { TRACE(3,"\n\n!!!!!!enter %s,delay_report_tone_num = %d \n\n",__func__,delay_report_tone_num); if(MobileLinkLose_reboot){ return; } //static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); //uint8_t default_mobileaddr[6] = {0x0,0x0,0x0,0x0,0x0,0x0}; //DUMP8("%02x ", p_ibrt_ctrl->mobile_addr.address, 6); //app_status_indication_set(APP_STATUS_INDICATION_TWS_CONNECTED); if(Curr_Is_Master()){ app_ibrt_sync_volume_info(); } if(delay_report_tone_num == APP_STATUS_INDICATION_DUDU){ if(Curr_Is_Master()&&(avrcp_get_media_status() != 1)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)){ app_voice_report(delay_report_tone_num,0); /*if((!memcmp(default_mobileaddr,p_ibrt_ctrl->mobile_addr.address,6))&&(p_ibrt_ctrl->access_mode == 0x3)){ TRACE(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); app_voice_report(APP_STATUS_INDICATION_BOTHSCAN,0); }*/ if((nv_record_get_paired_dev_count()==1)){ app_voice_report(APP_STATUS_INDICATION_BOTHSCAN,0); } } } delay_report_tone_num = APP_STATUS_INDICATION_NUM; } void startdelay_report_tone(int ms,APP_STATUS_INDICATION_T status) { TRACE(3,"\n\n !!!!!!!!!!start %s\n\n",__func__); delay_report_tone_num = status; osTimerStart(delay_report_toneid,ms); } /********************************delay_report_tone_timer*******************************************************/ /******************************low_latlatency_delay_switch_timer*********************************************************/ uint8_t latency_mode_is_open = false; osTimerId low_latlatency_delay_switchid = NULL; void startlow_latlatency_delay_switch(int ms); void stoplow_latlatency_delay_switch(void); static void low_latlatency_delay_switchfun(const void *); osTimerDef(deflow_latlatency_delay_switch,low_latlatency_delay_switchfun); void low_latlatency_delay_switchinit(void) { low_latlatency_delay_switchid = osTimerCreate(osTimer(deflow_latlatency_delay_switch),osTimerOnce,(void *)0); } void app_ibrt_ui_test_mtu_change_sync_notify(void) { extern volatile uint8_t avdtp_playback_delay_sbc_mtu; extern volatile uint8_t avdtp_playback_delay_aac_mtu; TRACE(3,"SWITC GAME MODE !!!latency_mode_is_open = %d###",latency_mode_is_open); if(!latency_mode_is_open) { avdtp_playback_delay_sbc_mtu = 32; avdtp_playback_delay_aac_mtu = 3; app_ibrt_if_force_audio_retrigger_slave_sync(); } else { avdtp_playback_delay_sbc_mtu = 50; avdtp_playback_delay_aac_mtu = 6; app_ibrt_if_force_audio_retrigger_slave_sync(); } latency_mode_is_open = !latency_mode_is_open; TRACE(3,"set SBC_MTU=%d AAC_MTU=%d\n", avdtp_playback_delay_sbc_mtu, avdtp_playback_delay_aac_mtu); } static void low_latlatency_delay_switchfun(const void *) { extern volatile uint8_t avdtp_playback_delay_sbc_mtu; extern volatile uint8_t avdtp_playback_delay_aac_mtu; latency_mode_is_open = !latency_mode_is_open; if(latency_mode_is_open){ avdtp_playback_delay_sbc_mtu = 32; avdtp_playback_delay_aac_mtu = 3; TRACE(3,"%s latency_mode_is_open!!",__func__); }else{ avdtp_playback_delay_sbc_mtu = 50; avdtp_playback_delay_aac_mtu = 6; TRACE(3,"%s latency_mode_is_close!!",__func__); } app_ibrt_if_force_audio_retrigger(); app_ibrt_customif_test3_cmd_send(&latency_mode_is_open,1); } void startlow_latlatency_delay_switch(int ms) { osTimerStart(low_latlatency_delay_switchid,ms); } void stoplow_latlatency_delay_switch(void) { osTimerStop(low_latlatency_delay_switchid); } /********************************low_latlatency_delay_switch_timer*******************************************************/ void app_latency_switch_key_handler(void) { if((btif_me_get_activeCons() > 0)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)) { if(latency_mode_is_open){ app_voice_report(APP_STATUS_INDICATION_ALEXA_STOP,0);//close latlatency mode }else{ app_voice_report(APP_STATUS_INDICATION_ALEXA_START,0);//close latlatency mode } startlow_latlatency_delay_switch(1500); } } /* * handling of touch events when the devices are turned on * Both pods active: * Right Ear: * Single tap : Play/Pause * Double tap : Next track * Hold : ANC on/off * Triple tap : Volume Up * * Left Ear: * Single tap : Play/Pause * Double tap : Previous track * Hold : ANC on/off * Triple tap : Volume Down * Single pod active: * Single tap : Play/Pause * Double tap : Next track * Hold : Previous track * Triple tap : Volume Up * Quad tap : Volume Down * We use app_ibrt_if_start_user_action for handling actions, as this will apply locally if we are link master * OR send it over the link to the other bud if we are not */ void send_vol_up(void){ uint8_t action[] = {IBRT_ACTION_AVRCP_VOLUP}; app_ibrt_if_start_user_action(action, sizeof(action)); } void send_play_pause(void){ if (app_bt_device.a2dp_play_pause_flag!=0) { uint8_t action[] = {IBRT_ACTION_PAUSE}; app_ibrt_if_start_user_action(action, sizeof(action)); }else { uint8_t action[] = {IBRT_ACTION_PLAY}; app_ibrt_if_start_user_action(action, sizeof(action)); } } void send_vol_down(void){ uint8_t action[] = {IBRT_ACTION_AVRCP_VOLDN}; app_ibrt_if_start_user_action(action, sizeof(action)); } void send_next_track(void){ uint8_t action[] = {IBRT_ACTION_FORWARD}; app_ibrt_if_start_user_action(action, sizeof(action)); } void send_prev_track(void){ uint8_t action[] = {IBRT_ACTION_BACKWARD}; app_ibrt_if_start_user_action(action, sizeof(action)); } void app_key_single_tap(APP_KEY_STATUS *status, void *param){ TRACE(2,"%s event %d", __func__, status->event); if (!app_tws_ibrt_tws_link_connected()){ //No other bud paired TRACE(0,"Handling %s in single bud mode",__func__); send_play_pause(); }else { //Bud's are working as a pair if (app_tws_is_left_side()){ TRACE(0,"Handling %s as left bud",__func__); //Lefty send_play_pause(); }else { TRACE(0,"Handling %s as right bud",__func__); //Righty send_play_pause(); } } } void app_key_double_tap(APP_KEY_STATUS *status, void *param){ TRACE(2,"%s event %d", __func__, status->event); if (!app_tws_ibrt_tws_link_connected()){ //No other bud paired TRACE(0,"Handling %s in single bud mode",__func__); send_next_track(); }else { //Bud's are working as a pair if (app_tws_is_left_side()){ TRACE(0,"Handling %s as left bud",__func__); //Lefty send_prev_track(); }else { TRACE(0,"Handling %s as right bud",__func__); //Righty send_next_track(); } } } void app_key_triple_tap(APP_KEY_STATUS *status, void *param){ TRACE(2,"%s event %d", __func__, status->event); if (!app_tws_ibrt_tws_link_connected()){ //No other bud paired TRACE(0,"Handling %s in single bud mode",__func__); send_vol_up(); }else { //Bud's are working as a pair if (app_tws_is_left_side()){ TRACE(0,"Handling %s as left bud",__func__); //Lefty send_vol_down(); }else { TRACE(0,"Handling %s as right bud",__func__); //Righty send_vol_up(); } } } void app_key_quad_tap(APP_KEY_STATUS *status, void *param){ TRACE(2,"%s event %d", __func__, status->event); if (!app_tws_ibrt_tws_link_connected()){ //No other bud paired TRACE(0,"Handling %s in single bud mode",__func__); send_vol_down(); }else { //Bud's are working as a pair if (app_tws_is_left_side()){ TRACE(0,"Handling %s as left bud",__func__); //Lefty }else { TRACE(0,"Handling %s as right bud",__func__); //Righty } } } void app_key_long_press_down(APP_KEY_STATUS *status, void *param) { TRACE(2,"%s event %d", __func__, status->event); if (!app_tws_ibrt_tws_link_connected()){ //No other bud paired TRACE(0,"Handling %s in single bud mode",__func__); send_prev_track(); }else { //Bud's are working as a pair app_anc_key(status,param); } } void app_key_reboot(APP_KEY_STATUS *status, void *param) { TRACE(1,"%s ",__func__); hal_cmu_sys_reboot(); } void app_key_init(void) { uint8_t i = 0; TRACE(1,"%s",__func__); const APP_KEY_HANDLE key_cfg[] = { {{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"",app_key_triple_tap, NULL}, /*{{APP_KEY_CODE_PWR,APP_KEY_EVENT_DOUBLECLICK},"",app_key_double_tap, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_TRIPLECLICK},"",app_key_triple_tap, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_ULTRACLICK},"",app_key_quad_tap, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGPRESS},"",app_key_long_press_down, NULL},*/ {{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGLONGPRESS},"",app_key_reboot, NULL}, }; app_key_handle_clear(); for (i=0; i<(sizeof(key_cfg)/sizeof(APP_KEY_HANDLE)); i++){ app_key_handle_registration(&key_cfg[i]); } } void app_key_init_on_charging(void) { uint8_t i = 0; const APP_KEY_HANDLE key_cfg[] = { {{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGLONGPRESS},"long press reboot",app_key_reboot, NULL}, // {{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"bt function key",app_dfu_key_handler, NULL}, #ifdef __USB_COMM__ {{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGPRESS},"usb cdc key",app_usb_cdc_comm_key_handler, NULL}, #endif }; TRACE(1,"%s",__func__); for (i=0; i<(sizeof(key_cfg)/sizeof(APP_KEY_HANDLE)); i++){ app_key_handle_registration(&key_cfg[i]); } } void stopAuto_Shutdowm_Timer(void); bool MobileLinkLose_reboot = false; bool IsMobileLinkLossing = FALSE; bool IsTwsLinkLossing = FALSE; bool enterpairing_flag = false; bool IsTwsLinkdiscon = false; bool reconnect_fail_fail_flag= false; static void app_enterpairing_timehandler(void const *param); osTimerDef (APP_ENTERPAIRING_TIMER, app_enterpairing_timehandler); static osTimerId enterpairing_timer = NULL; static void app_enterpairing_timehandler(void const *param) { static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); static app_ibrt_ui_t *p_ui_ctrl = app_ibrt_ui_get_ctx(); TRACE(3,"xqd log --%s\n", __func__); TRACE(3,"MyLog: is_tws_con = %d, nv_role = 0x%x", app_tws_ibrt_tws_link_connected(), p_ibrt_ctrl->nv_role); reconnect_fail_fail_flag = true; enterpairing_flag = false; if(IsMobileLinkLossing) { TRACE(3,"xqd---log:return evt 0!!!\n"); return; } if(p_ui_ctrl->box_state == IBRT_IN_BOX_CLOSED){ TRACE(3,"xqd---log:return evt 1!!!\n"); return; } if((app_battery_is_charging())||((app_device_bt_is_connected())&&(app_tws_ibrt_mobile_link_connected())&&(app_tws_ibrt_mobile_link_connected())))return; if (app_tws_ibrt_mobile_link_connected() || app_tws_ibrt_slave_ibrt_link_connected()) { TRACE(3,"xqd---log:return evt 2!!!\n"); return; } if (app_ibrt_ui_get_enter_pairing_mode()) { TRACE(3,"xqd---log:return evt 3!!!\n"); if((IBRT_UNKNOW != p_ibrt_ctrl->nv_role)&&(nv_record_get_paired_dev_count()>=2)){ app_voice_report(APP_STATUS_INDICATION_BOTHSCAN,0); } app_status_indication_set(APP_STATUS_INDICATION_BOTHSCAN); return; } if(app_tws_ibrt_tws_link_connected() && (p_ibrt_ctrl->current_role == IBRT_MASTER)) { TRACE(3,"xqd---log:return evt 4!!!\n"); //p_ui_ctrl->config.enter_pairing_on_reconnect_mobile_failed = true; //p_ui_ctrl->config.nv_slave_enter_pairing_on_mobile_disconnect = true; //app_ibrt_if_enter_freeman_pairing(); //app_ibrt_if_enter_pairing_after_tws_connected(); app_ibrt_ui_set_enter_pairing_mode(IBRT_CONNECT_MOBILE_FAILED); app_ibrt_ui_judge_scan_type(IBRT_CONNECTE_TRIGGER,MOBILE_LINK, 0); app_voice_report(APP_STATUS_INDICATION_BOTHSCAN,0); } else if ((!app_tws_ibrt_tws_link_connected()) && (p_ibrt_ctrl->nv_role == IBRT_MASTER)&&(p_ibrt_ctrl->access_mode != 0x3)) { TRACE(3,"xqd---log:return evt 5!!!\n"); app_ibrt_ui_set_enter_pairing_mode(IBRT_CONNECT_MOBILE_FAILED); app_ibrt_ui_judge_scan_type(IBRT_CONNECTE_TRIGGER,MOBILE_LINK, 0); app_voice_report(APP_STATUS_INDICATION_BOTHSCAN,0); } else if((!app_tws_ibrt_tws_link_connected()) && (p_ibrt_ctrl->nv_role == IBRT_SLAVE)) { app_ibrt_ui_set_enter_pairing_mode(IBRT_CONNECT_MOBILE_FAILED); app_ibrt_ui_judge_scan_type(IBRT_CONNECTE_TRIGGER, MOBILE_LINK, 0); app_voice_report(APP_STATUS_INDICATION_BOTHSCAN,0); } } void app_enterpairing_timer_start(void) { static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); TRACE(3,"xqd log --app_enterpairing_timer_start, enterpairing_flag = %d,nv_role = %d\n", enterpairing_flag,p_ibrt_ctrl->nv_role); if(p_ibrt_ctrl->nv_role == IBRT_UNKNOW)return; enterpairing_flag = true; osTimerStop(enterpairing_timer); osTimerStart(enterpairing_timer, 11000); } void app_enterpairing_timer_stop(void) { TRACE(3,"xqd log --app_enterpairing_timer_stop\n"); if(enterpairing_flag) osTimerStop(enterpairing_timer); } void app_enterpairing_timer_open(void) { if(NULL == enterpairing_timer) { enterpairing_timer = osTimerCreate (osTimer(APP_ENTERPAIRING_TIMER), osTimerOnce, (void *)0); } } extern bool IsMobileLinkLossing; extern bool IsTwsLinkLossing; bool LINKLOSE_REBOOT_ENABLE = false; osTimerId Auto_Shutdowm_Timerid = NULL; void startAuto_Shutdowm_Timer(int ms); static void Auto_Shutdowm_Timerfun(const void *); osTimerDef(defAuto_Shutdowm_Timer,Auto_Shutdowm_Timerfun); void Auto_Shutdowm_Timerinit(void) { Auto_Shutdowm_Timerid = osTimerCreate(osTimer(defAuto_Shutdowm_Timer),osTimerPeriodic,(void *)0); startAuto_Shutdowm_Timer(5000); } extern struct btdevice_volume *btdevice_volume_p; static void Auto_Shutdowm_Timerfun(const void *) { static uint32_t auto_shutdown_cnt = 0; static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); static app_ibrt_ui_t *p_ui_ctrl = app_ibrt_ui_get_ctx(); struct nvrecord_env_t *nvrecord_env; nv_record_env_get(&nvrecord_env); static uint8_t trace_cnt = 0; APP_BATTERY_MV_T currvolt =0; //static uint8_t charge_full_timeout_cnt = 0; trace_cnt ++; if(trace_cnt >= 2){ trace_cnt = 0; /* TRACE(0,"xqd---log:curr_role = %d,nv_role = %d,box_state = %d,access_mode = %d,channel = %d",p_ibrt_ctrl->current_role,p_ibrt_ctrl->nv_role,p_ui_ctrl->box_state,p_ibrt_ctrl->access_mode,tgt_tws_get_channel_is_right()); TRACE(0,"curr_avrcp_status = %d£¬localbat = %d,slave_bat = %d",avrcp_get_media_status(),p_ibrt_ctrl->local_battery_volt,p_ibrt_ctrl->peer_battery_volt); TRACE(0,"a2dp vol : %d", btdevice_volume_p->a2dp_vol); // TRACE(0,"hfp vol: %d", btdevice_volume_p->hfp_vol); TRACE(0,"qxw---nv_ibrt_mode addr:"); DUMP8("0x%x ", nvrecord_env->ibrt_mode.record.bdAddr.address, 6); TRACE(0,"qxw---peer addr:"); DUMP8("%02x ", p_ibrt_ctrl->peer_addr.address, 6); TRACE(0,"qxw---local addr:"); DUMP8("%02x ", p_ibrt_ctrl->local_addr.address, 6); TRACE(0,"qxw---nv_master addr:"); DUMP8("%02x ", nvrecord_env->master_bdaddr.address, 6); TRACE(0,"qxw---nv_slave addr:"); DUMP8("%02x ", nvrecord_env->slave_bdaddr.address, 6);*/ //TRACE(2,"charge_gpio statu:%d,chargefull_gpio statu:%d,curr_charge status = %d!",hal_gpio_pin_get_val((enum HAL_GPIO_PIN_T)cfg_hw_charge_indication_cfg.pin),hal_gpio_pin_get_val((enum HAL_GPIO_PIN_T)cfg_hw_charge_full_indication_cfg.pin),app_battery_is_charging()); } //TRACE(3,"GIOI25 = %d,charge sta = %d!!!!!",hal_gpio_pin_get_val((enum HAL_GPIO_PIN_T)app_battery_charger_full_indicator_cfg.pin),app_battery_is_charging()); if(app_battery_is_charging()){ if((p_ui_ctrl->box_state != IBRT_IN_BOX_CLOSED)){ app_ibrt_ui_event_entry(IBRT_CLOSE_BOX_EVENT); } } app_battery_get_info(&currvolt, NULL, NULL); if(p_ui_ctrl->box_state == IBRT_OUT_BOX){ if(app_device_bt_is_connected()) { IsMobileLinkLossing = FALSE; IsTwsLinkLossing = FALSE; MobileLinkLose_reboot = FALSE; } if((!app_device_bt_is_connected())&& p_ibrt_ctrl->current_role != BTIF_BCR_SLAVE) { auto_shutdown_cnt++; if(auto_shutdown_cnt == Auto_Shutdowm_TIME/5) { TRACE(0,"xqd---shutdown!!@@@@@@!!"); auto_shutdown_cnt = 0; app_bt_power_off_customize(); } } else { auto_shutdown_cnt = 0; } /*if((auto_shutdown_cnt % 4 == 0)&&(MobileLinkLose_reboot)&&(!app_qxw_bt_is_connected())&&(p_ibrt_ctrl->current_role != BTIF_BCR_SLAVE)){ app_ibrt_if_event_entry(IBRT_PHONE_CONNECT_EVENT); }*/ }else{ auto_shutdown_cnt = 0; } #if(QXW_TOUCH_INEAR_DET) last_tws_con_status = app_tws_ibrt_tws_link_connected(); #endif } void startAuto_Shutdowm_Timer(int ms) { osTimerStart(Auto_Shutdowm_Timerid,ms); } void stopAuto_Shutdowm_Timer(void) { TRACE(0,"%s",__func__); osTimerStop(Auto_Shutdowm_Timerid); } /********************************Auto_Shutdowm_Timer_timer*******************************************************/ extern void touch_reset(void); /*******************************once_delay_event_Timer__timer*********************************************************/ uint8_t once_event_case = 0; osTimerId once_delay_event_Timer_id = NULL; void startonce_delay_event_Timer_(int ms); void stoponce_delay_event_Timer_(void); static void once_delay_event_Timer_fun(const void *); osTimerDef(defonce_delay_event_Timer_,once_delay_event_Timer_fun); void once_delay_event_Timer_init(void) { TRACE(3,"%s",__func__); once_delay_event_Timer_id = osTimerCreate(osTimer(defonce_delay_event_Timer_),osTimerOnce,(void *)0); } static void once_delay_event_Timer_fun(const void *) { static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); if((p_ibrt_ctrl->current_role == IBRT_SLAVE)) { once_event_case = 0; TRACE(3,"delay_report_tonefun RETURN!!!"); return; } TRACE(3,"\n\n!!!!!!enter %s,mobile_link = %d,event = %d\n\n",__func__,app_tws_ibrt_mobile_link_connected(),once_event_case); switch(once_event_case) { case 1: if(/*(avrcp_get_media_status() != 1)&&*/(app_bt_device.a2dp_state[BT_DEVICE_ID_1] == 1)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == 0)&& (p_ibrt_ctrl->current_role == IBRT_MASTER)) app_voice_report(APP_STATUS_INDICATION_CONNECTED,0); break; case 2: if((IsMobileLinkLossing || app_device_bt_is_connected()))break; app_voice_report(APP_STATUS_INDICATION_DISCONNECTED,0); app_voice_report(APP_STATUS_INDICATION_BOTHSCAN,0); app_status_indication_set(APP_STATUS_INDICATION_BOTHSCAN); //once_event_case = 3; // startonce_delay_event_Timer_(2000); break; case 3: if(IsMobileLinkLossing) { return; } if((app_device_bt_is_connected()))return; app_status_indication_set(APP_STATUS_INDICATION_BOTHSCAN); app_voice_report(APP_STATUS_INDICATION_BOTHSCAN,0); if(p_ibrt_ctrl->nv_role == IBRT_MASTER) { app_ibrt_if_enter_pairing_after_tws_connected(); } else if(p_ibrt_ctrl->nv_role == IBRT_SLAVE) { app_ibrt_ui_set_enter_pairing_mode(IBRT_CONNECT_MOBILE_FAILED); app_ibrt_ui_judge_scan_type(IBRT_CONNECTE_TRIGGER,MOBILE_LINK, 0); } else if(p_ibrt_ctrl->nv_role == IBRT_UNKNOW) { app_ibrt_ui_judge_scan_type(IBRT_FREEMAN_PAIR_TRIGGER,NO_LINK_TYPE, IBRT_UI_NO_ERROR); app_ibrt_ui_set_freeman_enable(); } break; case 4: if(!app_device_bt_is_connected()){ app_voice_report_generic(APP_STATUS_INDICATION_DISCONNECTED, 0,0); } LINKLOSE_REBOOT_ENABLE = true; break; case 5: if(!app_device_bt_is_connected()&&!app_tws_ibrt_tws_link_connected()){ app_voice_report_generic(APP_STATUS_INDICATION_DISCONNECTED, 0,0); } LINKLOSE_REBOOT_ENABLE = true; break; case 8: app_ibrt_sync_volume_info(); break; case 9: break; default: break; } once_event_case = 0; } void startonce_delay_event_Timer_(int ms) { TRACE(3,"\n\n !!!!!!!!!!start %s\n\n",__func__); osTimerStart(once_delay_event_Timer_id,ms); } void stoponce_delay_event_Timer_(void) { TRACE(3,"\n\n!!!!!!!!!! stop %s\n\n",__func__); osTimerStop(once_delay_event_Timer_id); } /********************************once_delay_event_Timer__timer*******************************************************/ /***********************************************************************************************/ #include "hal_gpio.h" #include "tgt_hardware.h" extern struct BT_DEVICE_T app_bt_device; extern void hal_gpio_pin_set(enum HAL_GPIO_PIN_T pin); bool Curr_Is_Master(void) { static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); if(p_ibrt_ctrl->current_role == IBRT_MASTER) return 1; else return 0; } bool Curr_Is_Slave(void) { static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); if(p_ibrt_ctrl->current_role == IBRT_SLAVE) return 1; else return 0; } uint8_t get_curr_role(void) { static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); return p_ibrt_ctrl->current_role; } uint8_t get_nv_role(void) { static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); return p_ibrt_ctrl->nv_role; } extern bt_status_t LinkDisconnectDirectly(bool PowerOffFlag); void a2dp_suspend_music_force(void); bool app_is_power_off_in_progress(void) { return app_poweroff_flag?TRUE:FALSE; } #if GFPS_ENABLED #define APP_GFPS_BATTERY_TIMEROUT_VALUE (10000) static void app_gfps_battery_show_timeout_timer_cb(void const *n); osTimerDef (GFPS_BATTERY_SHOW_TIMEOUT_TIMER, app_gfps_battery_show_timeout_timer_cb); static osTimerId app_gfps_battery_show_timer_id = NULL; #include "app_gfps.h" static void app_gfps_battery_show_timeout_timer_cb(void const *n) { TRACE(1,"%s", __func__); app_gfps_set_battery_datatype(HIDE_UI_INDICATION); } void app_gfps_battery_show_timer_start() { if (app_gfps_battery_show_timer_id == NULL) app_gfps_battery_show_timer_id = osTimerCreate(osTimer(GFPS_BATTERY_SHOW_TIMEOUT_TIMER), osTimerOnce, NULL); osTimerStart(app_gfps_battery_show_timer_id, APP_GFPS_BATTERY_TIMEROUT_VALUE); } void app_gfps_battery_show_timer_stop() { if (app_gfps_battery_show_timer_id) osTimerStop(app_gfps_battery_show_timer_id); } #endif int app_deinit(int deinit_case) { int nRet = 0; TRACE(2,"%s case:%d",__func__, deinit_case); app_tws_if_trigger_role_switch(); osDelay(200); // This is a hack; a hackkitttyy hack. To wait for the tws exchange to occur #ifdef WL_DET app_mic_alg_audioloop(false,APP_SYSFREQ_78M); #endif #ifdef __PC_CMD_UART__ app_cmd_close(); #endif #if (defined(BTUSB_AUDIO_MODE) || defined(BT_USB_AUDIO_DUAL_MODE)) if(app_usbaudio_mode_on()) return 0; #endif if (!deinit_case){ app_poweroff_flag = 1; #if defined(APP_LINEIN_A2DP_SOURCE) app_audio_sendrequest(APP_A2DP_SOURCE_LINEIN_AUDIO, (uint8_t)APP_BT_SETTING_CLOSE,0); #endif #if defined(APP_I2S_A2DP_SOURCE) app_audio_sendrequest(APP_A2DP_SOURCE_I2S_AUDIO, (uint8_t)APP_BT_SETTING_CLOSE,0); #endif app_status_indication_filter_set(APP_STATUS_INDICATION_BOTHSCAN); app_audio_sendrequest(APP_BT_STREAM_INVALID, (uint8_t)APP_BT_SETTING_CLOSEALL, 0); osDelay(500); LinkDisconnectDirectly(true); osDelay(500); app_status_indication_set(APP_STATUS_INDICATION_POWEROFF); #ifdef MEDIA_PLAYER_SUPPORT app_voice_report(APP_STATUS_INDICATION_POWEROFF, 0); #endif #ifdef __THIRDPARTY app_thirdparty_specific_lib_event_handle(THIRDPARTY_FUNC_NO1,THIRDPARTY_DEINIT); #endif #if FPGA==0 nv_record_flash_flush(); norflash_api_flush_all(); #if defined(DUMP_LOG_ENABLE) log_dump_flush_all(); #endif #endif osDelay(1000); af_close(); } return nRet; } #ifdef APP_TEST_MODE extern void app_test_init(void); int app_init(void) { int nRet = 0; //uint8_t pwron_case = APP_POWERON_CASE_INVALID; TRACE(1,"%s",__func__); app_poweroff_flag = 0; app_sysfreq_req(APP_SYSFREQ_USER_APP_INIT, APP_SYSFREQ_52M); list_init(); af_open(); app_os_init(); app_pwl_open(); app_audio_open(); app_audio_manager_open(); app_overlay_open(); if (app_key_open(true)) { nRet = -1; goto exit; } app_test_init(); exit: app_sysfreq_req(APP_SYSFREQ_USER_APP_INIT, APP_SYSFREQ_32K); return nRet; } #else /* !defined(APP_TEST_MODE) */ int app_bt_connect2tester_init(void) { btif_device_record_t rec; bt_bdaddr_t tester_addr; uint8_t i; bool find_tester = false; struct nvrecord_env_t *nvrecord_env; btdevice_profile *btdevice_plf_p; nv_record_env_get(&nvrecord_env); if (nvrecord_env->factory_tester_status.status != NVRAM_ENV_FACTORY_TESTER_STATUS_DEFAULT) return 0; if (!nvrec_dev_get_dongleaddr(&tester_addr)){ nv_record_open(section_usrdata_ddbrecord); for (i = 0; nv_record_enum_dev_records(i, &rec) == BT_STS_SUCCESS; i++) { if (!memcmp(rec.bdAddr.address, tester_addr.address, BTIF_BD_ADDR_SIZE)){ find_tester = true; } } if(i==0 && !find_tester){ memset(&rec, 0, sizeof(btif_device_record_t)); memcpy(rec.bdAddr.address, tester_addr.address, BTIF_BD_ADDR_SIZE); nv_record_add(section_usrdata_ddbrecord, &rec); btdevice_plf_p = (btdevice_profile *)app_bt_profile_active_store_ptr_get(rec.bdAddr.address); nv_record_btdevicerecord_set_hfp_profile_active_state(btdevice_plf_p, true); nv_record_btdevicerecord_set_a2dp_profile_active_state(btdevice_plf_p, true); } if (find_tester && i>2){ nv_record_ddbrec_delete(&tester_addr); nvrecord_env->factory_tester_status.status = NVRAM_ENV_FACTORY_TESTER_STATUS_TEST_PASS; nv_record_env_set(nvrecord_env); } } return 0; } int app_nvrecord_rebuild(void) { struct nvrecord_env_t *nvrecord_env; nv_record_env_get(&nvrecord_env); nv_record_sector_clear(); nv_record_env_init(); nv_record_update_factory_tester_status(NVRAM_ENV_FACTORY_TESTER_STATUS_TEST_PASS); nv_record_env_set(nvrecord_env); nv_record_flash_flush(); return 0; } #if (defined(BTUSB_AUDIO_MODE) || defined(BT_USB_AUDIO_DUAL_MODE)) #include "app_audio.h" #include "usb_audio_frm_defs.h" #include "usb_audio_app.h" static bool app_usbaudio_mode = false; extern "C" void btusbaudio_entry(void); void app_usbaudio_entry(void) { btusbaudio_entry(); app_usbaudio_mode = true ; } bool app_usbaudio_mode_on(void) { return app_usbaudio_mode; } void app_usb_key(APP_KEY_STATUS *status, void *param) { TRACE(3,"%s %d,%d",__func__, status->code, status->event); } const APP_KEY_HANDLE app_usb_handle_cfg[] = { {{APP_KEY_CODE_FN1,APP_KEY_EVENT_UP},"USB HID FN1 UP key",app_usb_key, NULL}, {{APP_KEY_CODE_FN2,APP_KEY_EVENT_UP},"USB HID FN2 UP key",app_usb_key, NULL}, {{APP_KEY_CODE_PWR,APP_KEY_EVENT_UP},"USB HID PWR UP key",app_usb_key, NULL}, }; void app_usb_key_init(void) { uint8_t i = 0; TRACE(1,"%s",__func__); for (i=0; i<(sizeof(app_usb_handle_cfg)/sizeof(APP_KEY_HANDLE)); i++){ app_key_handle_registration(&app_usb_handle_cfg[i]); } } #endif /* (defined(BTUSB_AUDIO_MODE) || defined(BT_USB_AUDIO_DUAL_MODE)) */ //#define OS_HAS_CPU_STAT 1 #if OS_HAS_CPU_STAT extern "C" void rtx_show_all_threads_usage(void); #define _CPU_STATISTICS_PEROID_ 6000 #define CPU_USAGE_TIMER_TMO_VALUE (_CPU_STATISTICS_PEROID_/3) static void cpu_usage_timer_handler(void const *param); osTimerDef(cpu_usage_timer, cpu_usage_timer_handler); static osTimerId cpu_usage_timer_id = NULL; static void cpu_usage_timer_handler(void const *param) { rtx_show_all_threads_usage(); } #endif #ifdef USER_REBOOT_PLAY_MUSIC_AUTO bool a2dp_need_to_play = false; #endif extern void btif_me_write_bt_sleep_enable(uint8_t sleep_en); int btdrv_tportopen(void); void app_ibrt_init(void) { app_bt_global_handle_init(); #if defined(IBRT) ibrt_config_t config; app_tws_ibrt_init(); app_ibrt_ui_init(); app_ibrt_ui_test_init(); app_ibrt_if_config_load(&config); app_ibrt_customif_ui_start(); #ifdef IBRT_SEARCH_UI app_tws_ibrt_start(&config, true); app_ibrt_search_ui_init(false,IBRT_NONE_EVENT); #else app_tws_ibrt_start(&config, false); #endif #ifdef POWER_ON_ENTER_TWS_PAIRING_ENABLED app_ibrt_ui_event_entry(IBRT_TWS_PAIRING_EVENT); #endif #endif } #ifdef GFPS_ENABLED static void app_tell_battery_info_handler(uint8_t *batteryValueCount, uint8_t *batteryValue) { GFPS_BATTERY_STATUS_E status; if (app_battery_is_charging()) { status = BATTERY_CHARGING; } else { status = BATTERY_NOT_CHARGING; } // TODO: add the charger case's battery level #ifdef IBRT if (app_tws_ibrt_tws_link_connected()) { *batteryValueCount = 2; } else { *batteryValueCount = 1; } #else *batteryValueCount = 1; #endif TRACE(2,"%s,*batteryValueCount is %d",__func__,*batteryValueCount); if (1 == *batteryValueCount) { batteryValue[0] = ((app_battery_current_level()+1) * 10) | (status << 7); } else { batteryValue[0] = ((app_battery_current_level()+1) * 10) | (status << 7); batteryValue[1] = ((app_battery_current_level()+1) * 10) | (status << 7); } } #endif /* #define regaddr0 0x40 #define regaddr1 0x41 #define regaddr2 0x42 #define regaddr3 0x43 #define regaddr4 0xc8 #define decice_firstreg 0x00 */ void touch_evt_handler(enum HAL_GPIO_PIN_T pin) { TRACE(3,"SCL_TOUCH !!!!"); /* unsigned char keyEventBUff0 ; unsigned char keyEventBUff1 ; unsigned char keyEventBUff2 ; unsigned char keyEventBUff3 ; unsigned char temp = 0; //hal_gpio_i2c_simple_recv((unsigned char)0x60, 0x40, 1,&keyEventBUff,4); I2C_ReadByte(regaddr0,&keyEventBUff0); I2C_ReadByte(regaddr1,&keyEventBUff1); I2C_ReadByte(regaddr2,&keyEventBUff2); I2C_ReadByte(regaddr3,&keyEventBUff3); unsigned char firstaddr; I2C_ReadByte(decice_firstreg,&firstaddr); TRACE(3,"0X00 REG = 0x%x",firstaddr); unsigned char keyEventBUff4byte[4] ; I2C_Read4Byte(regaddr0,keyEventBUff4byte); I2C_ReadByte(0xC8,&temp); temp |= 0x01; I2C_WriteByte(0xC8,temp); TRACE(3,"REG0X40 = 0x%x, REG0X41 = 0x%x, REG0X42 = 0x%x, REG0X43 = 0x%x",keyEventBUff0,keyEventBUff1,keyEventBUff2,keyEventBUff3); TRACE(3,"keyEventBUff4BYTE :"); DUMP8("0x%02x ",keyEventBUff4byte,4); uint8_t keyEventBUff0[4]; uint8_t keyEventBUff4[1]; touch_key_i2c_read(regaddr0,&keyEventBUff0[0],1); touch_key_i2c_read(regaddr1,&keyEventBUff0[1],1); touch_key_i2c_read(regaddr2,&keyEventBUff0[2],1); touch_key_i2c_read(regaddr3,&keyEventBUff0[3],1); touch_key_i2c_read(regaddr4,keyEventBUff4,1); TRACE(3,"keyEventBUff0 :"); DUMP8("0x%02x ",keyEventBUff0,4); TRACE(3,"keyEventBUff1 :"); DUMP8("0x%02x ",keyEventBUff4,1); keyEventBUff4[0] |= 0x1; touch_key_i2c_write(0,regaddr4,1,keyEventBUff4); */ } /******************************LED_status_timer*********************************************************/ osTimerId LED_statusid = NULL; void startLED_status(int ms); void stopLED_status(void); static void LED_statusfun(const void *); osTimerDef(defLED_status,LED_statusfun); void LED_statusinit(void) { LED_statusid = osTimerCreate(osTimer(defLED_status),osTimerOnce,(void *)0); } static void LED_statusfun(const void *) { //TRACE("\n\n!!!!!!enter %s\n\n",__func__); if((Curr_Is_Slave()||app_device_bt_is_connected())&&(!app_battery_is_charging())){ app_status_indication_set(APP_STATUS_INDICATION_CONNECTED); }else if(!app_device_bt_is_connected()&&(!app_battery_is_charging())){ app_status_indication_set(APP_STATUS_INDICATION_BOTHSCAN); }else if(app_battery_is_charging()){ app_status_indication_set(APP_STATUS_INDICATION_CHARGING); } //unsigned char firstaddr; //I2C_ReadByte(decice_firstreg,&firstaddr); //TRACE(3,"0X00 REG = 0x%x",firstaddr); startLED_status(1000); } void startLED_status(int ms) { //TRACE("\n\n !!!!!!!!!!start %s\n\n",__func__); osTimerStart(LED_statusid,ms); } void stopLED_status(void) { //TRACE("\n\n!!!!!!!!!! stop %s\n\n",__func__); osTimerStop(LED_statusid); } /********************************LED_status_timer*******************************************************/ /********************************TOUCH_INT_TEST_timer*******************************************************/ void user_io_timer_init(void) { //app_mute_ctrl_init(); LED_statusinit(); //pwrkey_detinit(); Auto_Shutdowm_Timerinit(); delay_report_toneinit(); once_delay_event_Timer_init(); //app_i2c_demo_init(); //tou_io_init(); } extern uint32_t __coredump_section_start[]; extern uint32_t __ota_upgrade_log_start[]; extern uint32_t __log_dump_start[]; extern uint32_t __crash_dump_start[]; extern uint32_t __custom_parameter_start[]; extern uint32_t __lhdc_license_start[]; extern uint32_t __aud_start[]; extern uint32_t __userdata_start[]; extern uint32_t __factory_start[]; #if defined(A2DP_LHDC_ON) extern "C" { typedef struct bes_bt_local_info_t { uint8_t bt_addr[BTIF_BD_ADDR_SIZE]; const char *bt_name; uint8_t bt_len; uint8_t ble_addr[BTIF_BD_ADDR_SIZE]; const char *ble_name; uint8_t ble_len; } bes_bt_local_info; typedef int (*LHDC_GET_BT_INFO)(bes_bt_local_info *bt_info); extern bool lhdcSetLicenseKeyTable(uint8_t * licTable, LHDC_GET_BT_INFO pFunc); } extern int bes_bt_local_info_get(bes_bt_local_info *local_info); void lhdc_license_check() { uint8_t lhdc_license_key = 0; uint8_t *lhdc_license_data=(uint8_t * )__lhdc_license_start + 0x98; TRACE(5,"lhdc_license_data:%p, lhdc license %02x %02x %02x %02x",lhdc_license_data, lhdc_license_data[0],lhdc_license_data[1],lhdc_license_data[2],lhdc_license_data[3]); app_overlay_select(APP_OVERLAY_A2DP_LHDC); TRACE(1, "current_overlay = %d", app_get_current_overlay()); lhdc_license_key = lhdcSetLicenseKeyTable(lhdc_license_data, bes_bt_local_info_get); TRACE(0, "lhdc_license_key:%d", lhdc_license_key); if(lhdc_license_key) { TRACE(0, "LHDC OK"); } else { TRACE(0, "LHDC ERROR"); } } #endif int app_init(void) { int nRet = 0; struct nvrecord_env_t *nvrecord_env; #ifdef POWER_ON_ENTER_TWS_PAIRING_ENABLED bool need_check_key = false; #else bool need_check_key = false; #endif uint8_t pwron_case = APP_POWERON_CASE_INVALID; #ifdef BT_USB_AUDIO_DUAL_MODE uint8_t usb_plugin = 0; #endif #ifdef IBRT_SEARCH_UI bool is_charging_poweron=false; #endif TRACE(0,"please check all sections sizes and heads is correct ........"); TRACE(2,"__coredump_section_start: %p length: 0x%x", __coredump_section_start, CORE_DUMP_SECTION_SIZE); TRACE(2,"__ota_upgrade_log_start: %p length: 0x%x", __ota_upgrade_log_start, OTA_UPGRADE_LOG_SIZE); TRACE(2,"__log_dump_start: %p length: 0x%x", __log_dump_start, LOG_DUMP_SECTION_SIZE); TRACE(2,"__crash_dump_start: %p length: 0x%x", __crash_dump_start, CRASH_DUMP_SECTION_SIZE); TRACE(2,"__custom_parameter_start: %p length: 0x%x", __custom_parameter_start, CUSTOM_PARAMETER_SECTION_SIZE); TRACE(2,"__lhdc_license_start: %p length: 0x%x", __lhdc_license_start, LHDC_LICENSE_SECTION_SIZE); TRACE(2,"__userdata_start: %p length: 0x%x", __userdata_start, USERDATA_SECTION_SIZE*2); TRACE(2,"__aud_start: %p length: 0x%x", __aud_start, AUD_SECTION_SIZE); TRACE(2,"__factory_start: %p length: 0x%x", __factory_start, FACTORY_SECTION_SIZE); TRACE(0,"app_init\n"); app_tws_set_side_from_gpio(); #ifdef __RPC_ENABLE__ extern int rpc_service_setup(void); rpc_service_setup(); #endif #ifdef IBRT // init tws interface app_tws_if_init(); #endif // #ifdef IBRT nv_record_init(); factory_section_init(); #ifdef ANC_APP app_anc_ios_init(); #endif app_sysfreq_req(APP_SYSFREQ_USER_APP_INIT, APP_SYSFREQ_104M); #if defined(MCU_HIGH_PERFORMANCE_MODE) TRACE(1,"sys freq calc : %d\n", hal_sys_timer_calc_cpu_freq(5, 0)); #endif list_init(); nRet = app_os_init(); if (nRet) { goto exit; } #if OS_HAS_CPU_STAT cpu_usage_timer_id = osTimerCreate(osTimer(cpu_usage_timer), osTimerPeriodic, NULL); if (cpu_usage_timer_id != NULL) { osTimerStart(cpu_usage_timer_id, CPU_USAGE_TIMER_TMO_VALUE); } #endif //app_status_indication_init(); #ifdef BTADDR_FOR_DEBUG gen_bt_addr_for_debug(); #endif #ifdef FORCE_SIGNALINGMODE hal_sw_bootmode_clear(HAL_SW_BOOTMODE_TEST_NOSIGNALINGMODE); hal_sw_bootmode_set(HAL_SW_BOOTMODE_TEST_MODE | HAL_SW_BOOTMODE_TEST_SIGNALINGMODE); #elif defined FORCE_NOSIGNALINGMODE hal_sw_bootmode_clear(HAL_SW_BOOTMODE_TEST_SIGNALINGMODE); hal_sw_bootmode_set(HAL_SW_BOOTMODE_TEST_MODE | HAL_SW_BOOTMODE_TEST_NOSIGNALINGMODE); #endif if (hal_sw_bootmode_get() & HAL_SW_BOOTMODE_REBOOT_FROM_CRASH){ hal_sw_bootmode_clear(HAL_SW_BOOTMODE_REBOOT_FROM_CRASH); TRACE(0,"Crash happened!!!"); #ifdef VOICE_DATAPATH gsound_dump_set_flag(true); #endif } if (hal_sw_bootmode_get() & HAL_SW_BOOTMODE_REBOOT){ hal_sw_bootmode_clear(HAL_SW_BOOTMODE_REBOOT); pwron_case = APP_POWERON_CASE_REBOOT; need_check_key = false; TRACE(0,"Initiative REBOOT happens!!!"); #ifdef USER_REBOOT_PLAY_MUSIC_AUTO if(hal_sw_bootmode_get() & HAL_SW_BOOTMODE_LOCAL_PLAYER) { hal_sw_bootmode_clear(HAL_SW_BOOTMODE_LOCAL_PLAYER); a2dp_need_to_play = true; TRACE(0,"a2dp_need_to_play = true"); } #endif } if (hal_sw_bootmode_get() & HAL_SW_BOOTMODE_TEST_MODE){ hal_sw_bootmode_clear(HAL_SW_BOOTMODE_TEST_MODE); pwron_case = APP_POWERON_CASE_TEST; need_check_key = false; TRACE(0,"To enter test mode!!!"); } #ifdef BT_USB_AUDIO_DUAL_MODE usb_os_init(); #endif nRet = app_battery_open(); TRACE(1,"Yin BATTERY %d",nRet); if (pwron_case != APP_POWERON_CASE_TEST){ #ifdef USER_REBOOT_PLAY_MUSIC_AUTO TRACE(0,"hal_sw_bootmode_clear HAL_SW_BOOTMODE_LOCAL_PLAYER!!!!!!"); hal_sw_bootmode_clear(HAL_SW_BOOTMODE_LOCAL_PLAYER); #endif switch (nRet) { case APP_BATTERY_OPEN_MODE_NORMAL: nRet = 0; break; case APP_BATTERY_OPEN_MODE_CHARGING: app_status_indication_set(APP_STATUS_INDICATION_CHARGING); TRACE(0,"CHARGING!"); app_battery_start(); app_key_open(false); app_key_init_on_charging(); nRet = 0; #if defined(BT_USB_AUDIO_DUAL_MODE) usb_plugin = 1; #elif defined(BTUSB_AUDIO_MODE) goto exit; #endif goto exit; break; case APP_BATTERY_OPEN_MODE_CHARGING_PWRON: TRACE(0,"CHARGING PWRON!"); #ifdef IBRT_SEARCH_UI is_charging_poweron=true; #endif app_status_indication_set(APP_STATUS_INDICATION_CHARGING); need_check_key = false; nRet = 0; break; case APP_BATTERY_OPEN_MODE_INVALID: default: nRet = -1; goto exit; break; } } if (app_key_open(need_check_key)){ TRACE(0,"PWR KEY DITHER!"); nRet = -1; goto exit; } hal_sw_bootmode_set(HAL_SW_BOOTMODE_REBOOT); app_poweron_key_init(); #if defined(_AUTO_TEST_) AUTO_TEST_SEND("Power on."); #endif app_bt_init(); af_open(); app_audio_open(); app_audio_manager_open(); app_overlay_open(); nv_record_env_init(); nvrec_dev_data_open(); factory_section_open(); /*****************************************************************************/ // app_bt_connect2tester_init(); nv_record_env_get(&nvrecord_env); #ifdef AUDIO_LOOPBACK #ifdef WL_DET app_mic_alg_audioloop(true,APP_SYSFREQ_78M); #endif while(1); #endif #ifdef BISTO_ENABLED nv_record_gsound_rec_init(); #endif #ifdef BLE_ENABLE app_ble_mode_init(); app_ble_customif_init(); #ifdef IBRT app_ble_force_switch_adv(BLE_SWITCH_USER_IBRT, false); #endif // #ifdef IBRT #endif audio_process_init(); #ifdef __PC_CMD_UART__ app_cmd_open(); #endif #ifdef AUDIO_DEBUG_V0_1_0 speech_tuning_init(); #endif #ifdef ANC_APP app_anc_open_module(); #endif #ifdef MEDIA_PLAYER_SUPPORT app_play_audio_set_lang(nvrecord_env->media_language.language); #endif app_bt_stream_volume_ptr_update(NULL); #ifdef __THIRDPARTY app_thirdparty_init(); app_thirdparty_specific_lib_event_handle(THIRDPARTY_FUNC_NO2,THIRDPARTY_INIT); #endif // TODO: freddie->unify all of the OTA modules #if defined(IBRT_OTA) ota_flash_init(); #endif #ifdef OTA_ENABLED /// init OTA common module ota_common_init_handler(); #endif // OTA_ENABLED #ifdef IBRT // for TWS side decision, the last bit is 1:right, 0:left if (app_tws_is_unknown_side()) { //app_tws_set_side_from_addr(factory_section_get_bt_address()); app_tws_set_side_from_gpio(); } #endif btdrv_start_bt(); #if defined (__GMA_VOICE__) && defined(IBRT_SEARCH_UI) app_ibrt_reconfig_btAddr_from_nv(); #endif if (pwron_case != APP_POWERON_CASE_TEST) { BesbtInit(); app_wait_stack_ready(); bt_drv_extra_config_after_init(); bt_generate_ecdh_key_pair(); app_bt_start_custom_function_in_bt_thread((uint32_t)0, 0, (uint32_t)app_ibrt_init); } #if defined(BLE_ENABLE) && defined(IBRT) app_ble_force_switch_adv(BLE_SWITCH_USER_IBRT, true); #endif app_sysfreq_req(APP_SYSFREQ_USER_APP_INIT, APP_SYSFREQ_52M); TRACE(1,"\n\n\nbt_stack_init_done:%d\n\n\n", pwron_case); if (pwron_case == APP_POWERON_CASE_REBOOT){ app_status_indication_init(); user_io_timer_init(); app_status_indication_set(APP_STATUS_INDICATION_POWERON); #ifdef MEDIA_PLAYER_SUPPORT app_voice_report(APP_STATUS_INDICATION_POWERON, 0); #endif app_bt_start_custom_function_in_bt_thread((uint32_t)1, 0, (uint32_t)btif_me_write_bt_sleep_enable); btdrv_set_lpo_times(); #if defined(IBRT_OTA) bes_ota_init(); #endif //app_bt_accessmode_set(BTIF_BAM_NOT_ACCESSIBLE); #if defined(IBRT) #ifdef IBRT_SEARCH_UI if(is_charging_poweron==false) { if(IBRT_UNKNOW == nvrecord_env->ibrt_mode.mode) { TRACE(0,"ibrt_ui_log:power on unknow mode"); app_ibrt_enter_limited_mode(); //if(app_tws_is_right_side()) if(1) { TRACE(0,"app_start_tws_serching_direactly"); app_start_tws_serching_direactly(); } } else { TRACE(1,"ibrt_ui_log:power on %d fetch out", nvrecord_env->ibrt_mode.mode); app_ibrt_ui_event_entry(IBRT_FETCH_OUT_EVENT); } //startLED_status(1000); once_event_case = 9; startonce_delay_event_Timer_(1000); //startpwrkey_det(200); } #elif defined(IS_MULTI_AI_ENABLED) //when ama and bisto switch, earphone need reconnect with peer, master need reconnect with phone uint8_t box_action = app_ai_tws_reboot_get_box_action(); if (box_action != 0xFF) { TRACE(2, "%s box_actionstate %d", __func__, box_action); app_ibrt_ui_event_entry(box_action|IBRT_SKIP_FALSE_TRIGGER_MASK); } #endif #else app_bt_accessmode_set(BTIF_BAM_NOT_ACCESSIBLE); #endif app_key_init(); app_battery_start(); #if defined(__BTIF_EARPHONE__) && defined(__BTIF_AUTOPOWEROFF__) app_start_10_second_timer(APP_POWEROFF_TIMER_ID); #endif #if defined(__IAG_BLE_INCLUDE__) && defined(BTIF_BLE_APP_DATAPATH_SERVER) BLE_custom_command_init(); #endif #ifdef __THIRDPARTY app_thirdparty_specific_lib_event_handle(THIRDPARTY_FUNC_NO1,THIRDPARTY_INIT); app_thirdparty_specific_lib_event_handle(THIRDPARTY_FUNC_NO1,THIRDPARTY_START); app_thirdparty_specific_lib_event_handle(THIRDPARTY_FUNC_NO2,THIRDPARTY_BT_CONNECTABLE); app_thirdparty_specific_lib_event_handle(THIRDPARTY_FUNC_NO3,THIRDPARTY_START); #endif #if defined( __BTIF_EARPHONE__) && defined(__BTIF_BT_RECONNECT__) #if !defined(IBRT) app_bt_profile_connect_manager_opening_reconnect(); #endif #endif } #ifdef __ENGINEER_MODE_SUPPORT__ else if(pwron_case == APP_POWERON_CASE_TEST){ app_status_indication_init(); app_factorymode_set(true); app_status_indication_set(APP_STATUS_INDICATION_POWERON); #ifdef MEDIA_PLAYER_SUPPORT app_voice_report(APP_STATUS_INDICATION_POWERON, 0); #endif #ifdef __WATCHER_DOG_RESET__ app_wdt_close(); #endif TRACE(0,"!!!!!ENGINEER_MODE!!!!!\n"); nRet = 0; app_nvrecord_rebuild(); app_factorymode_key_init(); if (hal_sw_bootmode_get() & HAL_SW_BOOTMODE_TEST_SIGNALINGMODE){ hal_sw_bootmode_clear(HAL_SW_BOOTMODE_TEST_MASK); app_factorymode_bt_signalingtest(NULL, NULL); } if (hal_sw_bootmode_get() & HAL_SW_BOOTMODE_TEST_NOSIGNALINGMODE){ hal_sw_bootmode_clear(HAL_SW_BOOTMODE_TEST_MASK); app_factorymode_bt_nosignalingtest(NULL, NULL); } } #endif else{ user_io_timer_init(); app_status_indication_init(); app_status_indication_set(APP_STATUS_INDICATION_POWERON); #ifdef MEDIA_PLAYER_SUPPORT app_voice_report(APP_STATUS_INDICATION_POWERON, 0); #endif if (need_check_key){ pwron_case = app_poweron_wait_case(); } else { pwron_case = APP_POWERON_CASE_NORMAL; } if (need_check_key) { #ifndef __POWERKEY_CTRL_ONOFF_ONLY__ app_poweron_wait_finished(); #endif } if (pwron_case != APP_POWERON_CASE_INVALID && pwron_case != APP_POWERON_CASE_DITHERING){ TRACE(1,"power on case:%d\n", pwron_case); nRet = 0; #ifndef __POWERKEY_CTRL_ONOFF_ONLY__ //app_status_indication_set(APP_STATUS_INDICATION_INITIAL); #endif app_bt_start_custom_function_in_bt_thread((uint32_t)1, 0, (uint32_t)btif_me_write_bt_sleep_enable); btdrv_set_lpo_times(); #ifdef IBRT_OTA bes_ota_init(); #endif #ifdef __INTERCONNECTION__ app_interconnection_init(); #endif #ifdef __INTERACTION__ app_interaction_init(); #endif #if defined(__IAG_BLE_INCLUDE__) && defined(BTIF_BLE_APP_DATAPATH_SERVER) BLE_custom_command_init(); #endif #ifdef GFPS_ENABLED app_gfps_set_battery_info_acquire_handler(app_tell_battery_info_handler); app_gfps_set_battery_datatype(SHOW_UI_INDICATION); #endif osDelay(500); switch (pwron_case) { case APP_POWERON_CASE_CALIB: break; case APP_POWERON_CASE_BOTHSCAN: app_status_indication_set(APP_STATUS_INDICATION_BOTHSCAN); #ifdef MEDIA_PLAYER_SUPPORT app_voice_report(APP_STATUS_INDICATION_BOTHSCAN,0); #endif #if defined( __BTIF_EARPHONE__) #if defined(IBRT) #ifdef IBRT_SEARCH_UI if(false==is_charging_poweron) app_ibrt_enter_limited_mode(); #endif #else app_bt_accessmode_set(BTIF_BT_DEFAULT_ACCESS_MODE_PAIR); #endif #ifdef GFPS_ENABLED app_enter_fastpairing_mode(); #endif #if defined(__BTIF_AUTOPOWEROFF__) app_start_10_second_timer(APP_PAIR_TIMER_ID); #endif #endif #ifdef __THIRDPARTY app_thirdparty_specific_lib_event_handle(THIRDPARTY_FUNC_NO2,THIRDPARTY_BT_DISCOVERABLE); #endif break; case APP_POWERON_CASE_NORMAL: #if defined( __BTIF_EARPHONE__ ) && !defined(__EARPHONE_STAY_BOTH_SCAN__) #if defined(IBRT) #ifdef IBRT_SEARCH_UI app_status_indication_set(APP_STATUS_INDICATION_BOTHSCAN); if(is_charging_poweron==false) { startLED_status(1000); once_event_case = 9; startonce_delay_event_Timer_(1000); if(IBRT_UNKNOW == nvrecord_env->ibrt_mode.mode) { TRACE(0,"ibrt_ui_log:power on unknow mode"); app_ibrt_enter_limited_mode(); if(app_tws_is_right_side()){ app_start_tws_serching_direactly(); } } else { TRACE(1,"ibrt_ui_log:power on %d fetch out", nvrecord_env->ibrt_mode.mode); app_ibrt_ui_event_entry(IBRT_FETCH_OUT_EVENT); // app_status_indication_set(APP_STATUS_INDICATION_CHARGING); //break; } //startpwrkey_det(200); } #elif defined(IS_MULTI_AI_ENABLED) //when ama and bisto switch, earphone need reconnect with peer, master need reconnect with phone //app_ibrt_ui_event_entry(IBRT_OPEN_BOX_EVENT); //TRACE(1,"ibrt_ui_log:power on %d fetch out", nvrecord_env->ibrt_mode.mode); //app_ibrt_ui_event_entry(IBRT_FETCH_OUT_EVENT); #endif #else app_bt_accessmode_set(BTIF_BAM_NOT_ACCESSIBLE); #endif #endif case APP_POWERON_CASE_REBOOT: case APP_POWERON_CASE_ALARM: default: //app_status_indication_set(APP_STATUS_INDICATION_PAGESCAN); #if defined( __BTIF_EARPHONE__) && defined(__BTIF_BT_RECONNECT__) && !defined(IBRT) app_bt_profile_connect_manager_opening_reconnect(); #endif #ifdef __THIRDPARTY app_thirdparty_specific_lib_event_handle(THIRDPARTY_FUNC_NO2,THIRDPARTY_BT_CONNECTABLE); #endif break; } app_key_init(); app_battery_start(); #if defined(A2DP_LHDC_ON) lhdc_license_check(); #endif #if defined(__BTIF_EARPHONE__) && defined(__BTIF_AUTOPOWEROFF__) app_start_10_second_timer(APP_POWEROFF_TIMER_ID); #endif #ifdef __THIRDPARTY app_thirdparty_specific_lib_event_handle(THIRDPARTY_FUNC_NO1,THIRDPARTY_INIT); app_thirdparty_specific_lib_event_handle(THIRDPARTY_FUNC_NO1,THIRDPARTY_START); app_thirdparty_specific_lib_event_handle(THIRDPARTY_FUNC_NO3,THIRDPARTY_START); #endif #ifdef RB_CODEC rb_ctl_init(); #endif }else{ af_close(); app_key_close(); nRet = -1; } } exit: #ifdef IS_MULTI_AI_ENABLED app_ai_tws_clear_reboot_box_state(); #endif #ifdef __BT_DEBUG_TPORTS__ { extern void bt_enable_tports(void); bt_enable_tports(); //hal_iomux_tportopen(); } #endif #ifdef ANC_APP app_anc_set_init_done(); #endif #ifdef BT_USB_AUDIO_DUAL_MODE if(usb_plugin) { btusb_switch(BTUSB_MODE_USB); } else { btusb_switch(BTUSB_MODE_BT); } #else //BT_USB_AUDIO_DUAL_MODE #if defined(BTUSB_AUDIO_MODE) if(pwron_case == APP_POWERON_CASE_CHARGING) { #ifdef __WATCHER_DOG_RESET__ app_wdt_close(); #endif af_open(); app_key_handle_clear(); app_usb_key_init(); app_usbaudio_entry(); } #endif // BTUSB_AUDIO_MODE #endif // BT_USB_AUDIO_DUAL_MODE app_sysfreq_req(APP_SYSFREQ_USER_APP_INIT, APP_SYSFREQ_32K); return nRet; } #endif /* APP_TEST_MODE */