2906 lines
88 KiB
C++
2906 lines
88 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 "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 */
|