pinebuds/apps/main/apps.cpp

2453 lines
72 KiB
C++

/***************************************************************************
*
* 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 "apps.h"
#include "common_apps_imports.h"
#include "ibrt.h"
#include "key_handler.h"
#include "led_control.h"
#include "rb_codec.h"
#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)
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 __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);
}
}
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);
}
}
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*******************************************************/
/***********************************************************************************************/
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
nv_record_flash_flush();
norflash_api_flush_all();
#if defined(DUMP_LOG_ENABLE)
log_dump_flush_all();
#endif
osDelay(1000);
af_close();
}
return nRet;
}
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_app.h"
#include "usb_audio_frm_defs.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
}
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[];
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;
}