pinebuds/services/ibrt_ui/inc/app_ibrt_ui.h
2022-08-15 17:20:27 +08:00

779 lines
31 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.
*
****************************************************************************/
#ifndef __APP_TWS_IBRT_UI__
#define __APP_TWS_IBRT_UI__
#include "app_tws_ibrt.h"
#include "cmsis_os.h"
#include "bt_drv_reg_op.h"
#include "app_tws_ibrt_cmd_handler.h"
#define SNOOP_INFO_DATA_HEADER 0XE1D2C3B4
#define SNOOP_INFO_DATA_HEADER_LENGTH 4
#define SNOOP_INFO_DATA_LENGTH_MAX 512
#define SNOOP_SCAN_WINDOW_IN_MS 30
#define SNOOP_SCAN_INTERVAL_IN_MS 60
#define SNOOP_ADV_INTERVAL_IN_MS 20
#define IBRT_EVENT_Q_LENGTH (20)
#define MSS_RETRY_COUNTER_MAX (10)
#define IBRT_UI_STOP_IBRT 1
#define IBRT_UI_CONNECT_EVT(evt) ((evt == BTIF_BTEVENT_LINK_CONNECT_CNF)|| \
(evt == BTIF_BTEVENT_LINK_CONNECT_IND)|| \
(evt == BTIF_BTEVENT_ENCRYPTION_CHANGE))
#define IBRT_UI_DISCONNECT_EVT(evt) (evt == BTIF_STACK_LINK_DISCONNECT_COMPLETE)
#define IBRT_UI_INVALID_RSSI (100)
#define IBRT_UI_MIN_RSSI (-100)
#define IBRT_UI_BLE_ADV_THRESHOLD (60000)//ms
/*
* IBRT UI event
*/
typedef uint8_t ibrt_controller_error_type;
#define IBRT_PEER_SM_RUNNING_TIMEOUT (0)
#define IBRT_CONTROLLER_TWS_NO_03 (1)
#define IBRT_CONTROLLER_MOBILE_NO_03 (2)
#define IBRT_CONTROLLER_TWS_NO_05 (3)
#define IBRT_CONTROLLER_MOBILE_NO_05 (4)
#define IBRT_CONTROLLER_DEAD (5)
#define IBRT_CONTROLLER_RX_SEQ_ERROR (6)
#define IBRT_MOBILE_ENCRYP_ERROR (7)
#define IBRT_TWS_BESAUD_CONNECT_ERROR (8)
/*
* IBRT UI event
*/
#define IBRT_EVENT_TYPE_MASK (0X7F)
#define IBRT_SKIP_FALSE_TRIGGER_MASK (0x80)
typedef uint8_t ibrt_event_type;
#define IBRT_NONE_EVENT (0)
#define IBRT_OPEN_BOX_EVENT (1)
#define IBRT_FETCH_OUT_EVENT (2)
#define IBRT_PUT_IN_EVENT (3)
#define IBRT_CLOSE_BOX_EVENT (4)
#define IBRT_WEAR_UP_EVENT (5)
#define IBRT_WEAR_DOWN_EVENT (6)
#define IBRT_RECONNECT_EVENT (7)
#define IBRT_PHONE_CONNECT_EVENT (8)
#define IBRT_TRANSFER_EVENT (9)
#define IBRT_NEW_MOBILE_INCOMING_EVENT (10)
//transfer event type
#define IBRT_PEER_OPEN_BOX_EVENT (11)
#define IBRT_PEER_FETCH_OUT_EVENT (12)
#define IBRT_PEER_WEAR_UP_EVENT (13)
#define IBRT_PEER_RECONNECT_EVENT (14)
#define IBRT_TWS_SWITCH_EVENT (15)
#define IBRT_TWS_PAIRING_EVENT (16)
#define IBRT_FREEMAN_PAIRING_EVENT (17)
#define IBRT_CONNECT_SECOND_MOBILE_EVENT (18)
#define IBRT_DISCONNECT_MOBILE_TWS_EVENT (19)
#define IBRT_RX_SEQ_ERROR_RECOVER_EVENT (20)
#define IBRT_PROFILE_DATA_UPDATE_EVENT (21)
#define IBRT_TWS_CONNECT_SYNC_INFO_EVENT (22)
#define IBRT_CHOICE_MOIBLE_CONNECT_EVENT (23)
#define IBRT_IS_RECONNECT_EVENT(event) ((event == IBRT_RECONNECT_EVENT) || (event == IBRT_PEER_RECONNECT_EVENT))
#define IBRT_RECONNECT_EVENT_TYPE(event) ((event == IBRT_RECONNECT_EVENT) || (event == IBRT_PEER_RECONNECT_EVENT))
#define IBRT_CONNECT_MOBILE_EVENT(event) ((event == IBRT_OPEN_BOX_EVENT)||(event == IBRT_FETCH_OUT_EVENT)|| \
(event == IBRT_WEAR_UP_EVENT) ||(event == IBRT_PEER_OPEN_BOX_EVENT)|| \
(event == IBRT_PEER_FETCH_OUT_EVENT) || (event == IBRT_PEER_WEAR_UP_EVENT) || \
(event == IBRT_RECONNECT_EVENT))
#define IBRT_IS_TRANSFER_EVENT(event) ((event == IBRT_PEER_OPEN_BOX_EVENT) || (event == IBRT_PEER_FETCH_OUT_EVENT) || \
(event == IBRT_PEER_WEAR_UP_EVENT) || (event == IBRT_TRANSFER_EVENT))
#define IBRT_RECONNECT_EVENT_QUEUED() (app_ibrt_ui_event_has_been_queued(IBRT_RECONNECT_EVENT) || app_ibrt_ui_event_has_been_queued(IBRT_PEER_RECONNECT_EVENT))
#define IBRT_TRANSFER_EVENT_FILTER(event) (IBRT_IS_TRANSFER_EVENT(event) && app_ibrt_ui_event_has_been_queued(event))
#define IBRT_RECONNECT_EVENT_FILTER(event) (IBRT_RECONNECT_EVENT_TYPE(event) && IBRT_RECONNECT_EVENT_QUEUED())
#define IBRT_UI_RADICAL_SAN_INTERVAL_BY_NV_ROLE ((app_tws_ibrt_get_bt_ctrl_ctx()->nv_role) ? \
app_ibrt_ui_get_ctx()->config.radical_scan_interval_nv_slave : \
app_ibrt_ui_get_ctx()->config.radical_scan_interval_nv_master)
#define IBRT_BOTH_HEADSET_WEARED(p_ibrt_ui) ((p_ibrt_ui->box_state == IBRT_OUT_BOX_WEARED) && \
(p_ibrt_ui->peer_tws_info.box_state == IBRT_OUT_BOX_WEARED) && \
p_ibrt_ui->config.wear_updown_detect_supported)
typedef uint8_t ibrt_box_state;
/*
* BOX state
*/
#define IBRT_BOX_UNKNOWN (0)
#define IBRT_IN_BOX_CLOSED (1)
#define IBRT_IN_BOX_OPEN (2)
#define IBRT_OUT_BOX (3)
#define IBRT_OUT_BOX_WEARED (4)
/*
* BOX connect state
*/
#define IBRT_BOX_CONNECT_IDLE (0)
#define IBRT_BOX_CONNECT_MASTER (1<<0)
#define IBRT_BOX_CONNECT_SLAVE (1<<1)
//HCI opcode
#define IBRT_HCI_CREATE_CON_CMD_OPCODE 0x0405
#define IBRT_HCI_EXIT_SNIFF_MODE_CMD_OPCODE 0x0804
#define IBRT_HCI_SWITCH_ROLE_CMD_OPCODE 0x080B
#define IBRT_HCI_STOP_IBRT_OPCODE 0xFCA8
#define IBRT_HCI_START_IBRT_OPCODE 0xFCA3
#define IBRT_HCI_RESET_OPCODE 0x0C03
#define IBRT_HCI_DSIC_CON_CMD_OPCODE 0x0406
#define IBRT_HCI_SET_ENV_CMD_OPCODE 0xFC8E
typedef enum
{
START_IBRT_TRIGGER_EXIT,
TWS_SWITCH_TRIGGER_EXIT,
} ibrt_ui_exit_sniff_trigger_e;
typedef enum
{
TWS_INIT_TRIGGER,
MOBILE_INIT_TRIGGER,
START_IBRT_TRIGGER,
EXCHANGE_PROFILE_TRIGGER,
SCO_CONNECTED_TRIGGER,
SCO_DISCONNECT_TRIGGER,
MOBILE_MSS_TRIGGER,
OTA_START_TRIGGER,
OTA_STOP_TRIGGER,
START_DUAL_MIC_RECORDING_TRIGGER,
STOP_DUAL_MIC_RECORDING_TRIGGER,
} ibrt_ui_trigger_link_policy_e;
typedef enum
{
IBRT_CONNECTE_TRIGGER,
IBRT_DISCONNECT_TRIGGER,
IBRT_RECONNECT_TWS_TRIGGER,
IBRT_RECONNECT_MOBILE_TRIGGER,
IBRT_CLOSE_SCAN_TIMER_TRIGGER,
IBRT_SEARCH_SLAVE_TRIGGER,
IBRT_MASTER_CON_SLAVE_TRIGGER,
IBRT_NV_SLAVE_CLOSE_PSCAN_TRIGGER,
IBRT_NV_SLAVE_REOPEN_PSCAN_TRIGGER,
IBRT_FREEMAN_PAIR_TRIGGER,
IBRT_CLOSE_BOX_TRIGGER,
IBRT_OPEN_BOX_TRIGGER,
IBRT_ENTER_PAIRING_MODE_TRIGGER,
IBRT_ROLE_CHANGE_TRIGGER,
IBRT_A2DP_PLAYING_TRIGGER,
IBRT_A2DP_SUSPEND_TRIGGER,
IBRT_SCO_PLAYING_TRIGGER,
IBRT_SCO_SUSPEND_TRIGGER,
IBRT_FASTPAIR_TRIGGER,
IBRT_CLOSE_ALL_SCAN,
IBRT_RESTORE_SCAN,
IBRT_TRIGGER_NUM,
} ibrt_ui_trigger_scan_e;
typedef enum
{
IBRT_PAIR_IDLE,
IBRT_PAIR_W4_TWS_DISCONNECTED,
IBRT_PAIR_W4_MOBILE_DISCONNECTED,
IBRT_PAIR_W4_TWS_CONNECTED,
IBRT_PAIR_W4_TWS_INFO_EXCHANGED,
} ibrt_pairing_state_e;
typedef enum
{
IBRT_PAIR_ACTION_IDLE,
IBRT_PAIR_ACTION_TWS_DISCONNECTED,
IBRT_PAIR_ACTION_MOBILE_DISCONNECTED,
IBRT_PAIR_ACTION_TWS_CONNECTED,
IBRT_PAIR_ACTION_TWS_INFO_EXCHANGED,
} ibrt_pairing_action_e;
typedef enum
{
IBRT_UI_IDLE,
IBRT_UI_IDLE_WAIT,
IBRT_UI_W4_TWS_CONNECTION,
IBRT_UI_W4_TWS_INFO_EXCHANGE_COMPLETE,
IBRT_UI_W4_MOBILE_CONNECTION,
IBRT_UI_W4_MOBILE_MSS_COMPLETE,
IBRT_UI_W4_SET_ENV_COMPLETE,
IBRT_UI_W4_MOBILE_ENTER_ACTIVE_MODE,
IBRT_UI_W4_START_IBRT_COMPLETE,
IBRT_UI_W4_IBRT_DATA_EXCHANGE_COMPLETE,
IBRT_UI_W4_TWS_SWITCH_COMPLETE,
IBRT_UI_W4_TWS_STOP_IBRT_COMPLETE,
IBRT_UI_W4_TWS_BT_MSS_COMPLETE,
IBRT_UI_W4_TWS_DISCONNECTED,
IBRT_UI_W4_MOBILE_DISCONNECTED,
IBRT_UI_W4_TWS_DISCONNECT_TO_IDLE,
IBRT_UI_W4_MOBILE_CONNECTION_TO_IDLE,
IBRT_UI_W4_NEW_MOBILE_INCOMING_RSP,
IBRT_UI_W4_BLE_CONNECTION,
IBRT_UI_W4_SNOOP_INFO_COMPLETE,
IBRT_UI_W4_PHONE_CONNECT_FAILED,
IBRT_UI_W4_TWS_SWITCH_PREPARE_COMPLETE,
IBRT_UI_W4_BOTH_ACTIVE,
//Add new state
IBRT_UI_W4_SM_STOP,
IBRT_UI_W4_END,
IBRT_UI_W4_UNKNOWN,
} ibrt_ui_state_e;
//Mapping to ibrt ui state
typedef enum
{
IBRT_ACTION_IDLE,
IBRT_ACTION_IDLE_WAIT,
IBRT_ACTION_TWS_CONNECT,
IBRT_ACTION_INFO_EXCHANGE,
IBRT_ACTION_MOBILE_CONNECT,
IBRT_ACTION_MOBILE_MSS_COMPLETE,
IBRT_ACTION_SET_ENV_COMPLETE,
IBRT_ACTION_MOBILE_ENTER_ACTIVE_MODE,
IBRT_ACTION_START_IBRT,
IBRT_ACTION_DATA_EXCHANGE,
IBRT_ACTION_TWS_SWITCH,
IBRT_ACTION_STOP_IBRT,
IBRT_ACTION_TWS_BT_MSS_COMPLETE,
IBRT_ACTION_TWS_DISCONNECT,
IBRT_ACTION_MOBILE_DISCONNECT, //14
IBRT_ACTION_TWS_DISCONNECT_TO_IDLE,
IBRT_ACTION_MOBILE_CONNECTION_TO_IDLE,
IBRT_ACTION_NEW_MOBILE_INCOMING_RSP,
IBRT_ACTION_BLE_CONNECTION,
IBRT_ACTION_SNOOP_INFO_COMPLETE,
IBRT_ACTION_PHONE_CONNECT_FAILED,
IBRT_ACTION_TWS_SWITCH_PREPARE_COMPLETE,
IBRT_ACTION_BOTH_ACTIVE,
//Add new action
IBRT_ACTION_SM_STOP,
IBRT_ACTION_END,
} ibrt_action_e;
typedef struct
{
uint8_t num_hci_cmd_packets;
uint16_t cmd_opcode;
uint8_t param[1];
} __attribute__ ((packed)) ibrt_cmd_comp_t;
typedef struct
{
bool w4_set_env_complete;
bool w4_exit_sniff_complete;
bool w4_start_ibrt;
} ibrt_start_ctrl_t;
typedef struct
{
ibrt_action_e action;
ibrt_ui_state_e state;
} ibrt_act_state_t;
typedef enum
{
IBRT_UI_NO_ERROR,
IBRT_UI_RSP_TIMEOUT,
IBRT_UI_NOT_ACCEPT,
IBRT_UI_CONNECT_FAILED,
IBRT_UI_STATUS_ERROR,
IBRT_UI_CONNECTION_TIMEOUT=0x08,
IBRT_UI_ACL_ALREADY_EXIST=0x0B,
IBRT_UI_CMD_DISALLOWED=0X0C,
IBRT_UI_LIMITED_RESOURCE =0x0D,
IBRT_UI_HOST_ACCEPT_TIMEOUT=0x10,
IBRT_UI_CONN_TERM_USER_REQ=0x13,
IBRT_UI_CONN_TERM_LOW_RESOURCES=0x14,
IBRT_UI_MOBILE_CONN_DISCONNECTED=0X2A,
IBRT_UI_TWS_CONN_DISCONNECTED=0X2B,
IBRT_UI_SNOOP_DISCONNECTED=0X2C,
IBRT_UI_CONNECTION_INCOMING=0x99,
IBRT_UI_EVT_STATUS_ERROR=0x9A,
IBRT_UI_TWS_CMD_SEND_FAILED=0X9B,
IBRT_UI_MOBILE_PAIR_CANCLED=0X9C,
} ibrt_ui_error_e;
typedef enum
{
IBRT_CONNECT_MOBILE_FAILED,
IBRT_MOBILE_DISCONNECTED,
IBRT_MOBILE_NV_EMPTY,
IBRT_TWS_PAIR_MODE_ENTER,
IBRT_FREEMAN_PAIR_MODE_ENTER,
IBRT_SCAN_TIMEOUT,
IBRT_MOBILE_CONNECTED,
IBRT_SNOOP_CONNECTED,
IBRT_CLOSE_BOX,
IBRT_USE_PEER_PAIRING_MODE,
} trigger_pairing_mode_type_e;
typedef struct
{
uint16_t battery_volt;
uint16_t mobile_conhandle;
uint16_t tws_conhandle;
rssi_t raw_rssi;
int32_t mobile_diff_us;
int32_t tws_diff_us;
int8_t cur_buf_size;
} app_ui_rssi_battery_info_t;
typedef struct
{
bt_bdaddr_t mobile_addr;
bt_bdaddr_t nv_mobile_addr;
ibrt_box_state box_state;
ibrt_role_e ibrt_role;
uint8_t running_event;
uint8_t sco_acitve;
uint8_t mobile_connected:1;//ibrt master should set this variable
uint8_t ibrt_connected:1;//ibrt slave should set this variable
uint8_t ibrt_sm_running:1;
uint8_t connecting_mobile:1;
uint32_t constate;
uint8_t pairing_mode;
bool need_peer_connect_mobile;
} __attribute__((packed)) app_tws_info_t;
typedef struct
{
ibrt_event_type ibrt_event_q[IBRT_EVENT_Q_LENGTH];
uint8_t front;
uint8_t rear;
} ibrt_event_manager_t;
typedef struct
{
bool freeman_enable;
bool freeman_dont_role_switch;
bool tws_use_same_addr;
bool wear_updown_tws_switch_enable;
bool slave_reconnect_enable;
bool enter_pairing_mode;
bool freeman_accept_mobile_new_pairing;
bool enter_pairing_on_empty_mobile_addr;
bool enter_pairing_on_reconnect_mobile_failed;
bool enter_pairing_on_reconnect_mobile_failed_once;
bool enter_pairing_on_mobile_disconnect;
bool check_plugin_excute_closedbox_event;
bool nv_slave_enter_pairing_on_mobile_disconnect;
bool nv_slave_enter_pairing_on_empty_mobile_addr;
bool disc_tws_before_reconnect_mobile;
bool snoop_via_ble_enable;
bool tws_switch_according_to_rssi_value;
bool disable_tws_switch;
bool disable_stop_ibrt;
bool lowlayer_monitor_enable;
bool delay_exit_sniff;
bool share_tws_info_done;
uint32_t delay_ms_exit_sniff;
bool mobile_incoming_filter_unpaired;
uint8_t rssi_threshold;
uint8_t role_switch_timer_threshold;
uint16_t close_box_event_wait_response_timeout;
uint16_t reconnect_wait_ready_timeout;
uint16_t reconnect_mobile_wait_ready_timeout;
uint16_t reconnect_tws_wait_ready_timeout;
uint16_t reconnect_mobile_wait_response_timeout;
uint16_t reconnect_ibrt_wait_response_timeout;
uint16_t nv_master_reconnect_tws_wait_response_timeout;
uint16_t nv_slave_reconnect_tws_wait_response_timeout;
uint32_t disable_bt_scan_timeout;
uint16_t open_reconnect_mobile_max_times;
uint16_t open_reconnect_tws_max_times;
uint16_t reconnect_mobile_max_times;
uint16_t reconnect_tws_max_times;
uint16_t reconnect_ibrt_max_times;
uint8_t tws_reconnect_cycle;
uint8_t mobile_reconnect_cycle;
uint16_t long_private_poll_interval ;
uint16_t default_private_poll_interval;
uint16_t short_private_poll_interval;
uint16_t default_private_poll_interval_in_sco;
uint16_t short_private_poll_interval_in_sco;
uint16_t default_bt_tpoll;
uint16_t tws_page_timeout_on_last_success;
uint16_t tws_page_timeout_on_last_failed;
uint16_t tws_page_timeout_on_reconnect_mobile_success;
uint16_t tws_page_timeout_on_reconnect_mobile_failed;
uint16_t mobile_page_timeout;
uint16_t tws_connection_timeout;
uint8_t profile_concurrency_supported;
uint8_t connect_new_mobile_enable;
uint16_t wait_time_before_disc_tws;
bt_bdaddr_t new_mobile_address;
uint32_t rx_seq_error_timeout;
uint32_t rx_seq_error_threshold;
uint32_t rx_seq_recover_wait_timeout;
uint32_t rssi_monitor_timeout;
bool wear_updown_detect_supported;
uint32_t stop_ibrt_timeout;
uint16_t radical_scan_interval_nv_slave;
uint16_t radical_scan_interval_nv_master;
uint32_t event_hung_timeout;
uint16_t rssi_tws_switch_threshold;
uint32_t stop_ibrt_wait_time_after_tws_switch;
uint32_t tws_conn_failed_wait_time;
uint32_t sm_running_timeout;
uint32_t peer_sm_running_timeout;
uint32_t connect_no_03_timeout;
uint32_t disconnect_no_05_timeout;
uint32_t reconnect_peer_sm_running_timeout;
bool tws_switch_tx_data_protect;
uint32_t tws_cmd_send_timeout;
uint32_t tws_cmd_send_counter_threshold;
uint32_t tws_switch_stable_timeout;
bool invoke_event_when_box_closed;
bool tws_stay_when_close_box;
uint32_t free_tws_timeout;
bool filter_duplicate_event;
uint8_t audio_sync_mismatch_resume_version;
} ibrt_ui_config_t;
typedef struct
{
uint8_t connection_index;
bool connected;
bool disconnect_enable;
bool master_notify_enable;
bool slave_scaning;
bt_bdaddr_t box_ble_addr;
uint8_t box_connect_state;
uint32_t snoop_info_data_length;
uint8_t data[SNOOP_INFO_DATA_LENGTH_MAX];
} ibrt_ui_box_info_t;
typedef struct
{
ibrt_pairing_state_e tws_pair_state;
ibrt_pairing_state_e freeman_pair_state;
bool tws_pairing;
bool freeman_pairing;
} ibrt_pair_ctrl_t;
typedef struct
{
ibrt_ui_state_e super_state;
ibrt_ui_state_e wait_state;
ibrt_ui_state_e sub_state;
ibrt_ui_state_e next_state;
ibrt_event_manager_t event_q_manager;
ibrt_event_type active_event;
ibrt_box_state box_state;
ibrt_box_state box_state_future;
uint8_t ibrt_sm_running;
app_tws_info_t peer_tws_info;
uint32_t sm_start_timestamp_ms;
bool profile_exchanged;
bool tws_connect_success;
uint8_t reconnect_mobile_counter;
uint8_t reconnect_tws_counter;
uint8_t reconnect_ibrt_counter;
ibrt_pair_ctrl_t pairing_ctrl;
/*custom page scan parameters*/
uint16_t pscan_cust_interval;
uint16_t pscan_cust_window;
uint8_t pscan_cust_type;
/*search ui restore inqscan parameter when tws connected*/
bool restore_iscan_para;
bool audio_mute_enable;
bool bonding_success;
bool tws_pscan_enhanced_enable;
bool encrypt_error_happened;
bool silent_mode;
bool need_peer_connect_mobile;
bool refresh_pairing_enable;
bool new_mobile_scan_enable;
/*for customer config*/
ibrt_ui_config_t config;
/*for box information*/
ibrt_ui_box_info_t ibrt_ui_box;
} app_ibrt_ui_t;
typedef struct
{
bt_bdaddr_t master_bdaddr;
bt_bdaddr_t slave_bdaddr;
} ibrt_pairing_info_t;
typedef struct
{
int32_t a2dp_volume;
int32_t hfp_volume;
} ibrt_volume_info_t;
typedef struct
{
bt_bdaddr_t mobile_addr;
uint8_t mobile_connected;
uint8_t sco_status;
} __attribute__((packed)) app_tws_start_ibrt_info_t;
typedef bool (*APP_IBRT_UI_TWS_SWITCH_HANDLER_IND)(void);
typedef void (*APP_IBRT_UI_RSSI_BATTERY_HANDLER_IND)(void);
typedef bool (*APP_IBRT_UI_CONNECT_MOBILE_HANDLER_IND)(void);
typedef void (*APP_IBRT_UI_CMD_COMPLETE_HANDLER_IND)(ibrt_cmd_comp_t *);
typedef void (*APP_IBRT_UI_PAIRING_MODE_HANDLER_IND)(trigger_pairing_mode_type_e trigger_type);
typedef void (*APP_IBRT_UI_VENDER_EVENT_HANDLER_IND)(uint8_t, uint8_t *, uint8_t);
typedef void (*APP_IBRT_UI_GLOBAL_HANDLER_IND)(ibrt_link_type_e, uint8_t, uint8_t);
typedef void (*APP_IBRT_UI_GLOBAL_EVENT_UPDATE_IND)(ibrt_event_type, \
ibrt_ui_state_e, \
ibrt_ui_state_e, \
ibrt_action_e, \
ibrt_ui_error_e);
typedef void (*APP_IBRT_UI_CONNECTED_HANDLER_IND)(bt_bdaddr_t *);
typedef void (*APP_IBRT_UI_PROFILE_STATE_CHANGE_IND)(uint32_t, uint8_t);
#ifdef __cplusplus
extern "C" {
#endif
/*
* function declare
*/
void app_ibrt_ui_init(void);
app_ibrt_ui_t* app_ibrt_ui_get_ctx(void);
void app_ibrt_ui_prepare_local_tws_info(app_tws_info_t *local_tws_info);
int app_ibrt_ui_event_entry(ibrt_event_type event);
bool app_ibrt_ui_execute_pending_event(void);
void app_ibrt_ui_global_handler(ibrt_link_type_e link_type, uint8_t evt_type, uint8_t status);
bool app_ibrt_ui_tws_switch_needed(bool ibrt_connected_now);
bool app_ibrt_ui_ibrt_start_needed(void);
bool app_ibrt_ui_ibrt_stop_needed(void);
bool app_ibrt_ui_connect_mobile_needed(void);
bool app_ibrt_ui_ibrt_connected(void);
void app_ibrt_ui_reset_peer_tws_info(void);
void app_ibrt_ui_vender_event_handler(uint8_t evt_type, uint8_t *buffer, uint8_t length);
void app_ibrt_ui_cmd_status_callback(const void *para);
void app_ibrt_ui_cmd_complete_callback(const void *para);
void app_ibrt_ui_judge_ibrt_role(void);
void app_ibrt_ui_reset_local_tws_info(void);
void app_ibrt_ui_event_handler(ibrt_action_e action,ibrt_ui_error_e status);
void app_ibrt_ui_subevent_handler(ibrt_ui_state_e action_state, ibrt_ui_error_e status);
void app_ibrt_ui_fetch_out_event_handler(ibrt_action_e action,ibrt_ui_error_e status);
void app_ibrt_ui_wear_up_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_wear_down_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_tws_switch_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_tws_connect_sync_info_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_new_mobile_incoming_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
uint16_t app_ibrt_ui_get_tws_page_timeout_value();
void app_ibrt_ui_open_box_event_handler(ibrt_action_e action,ibrt_ui_error_e status);
void app_ibrt_ui_put_in_box_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_close_box_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_free_link_handler(ibrt_action_e action, ibrt_ui_error_e status, bool force_free);
bool app_ibrt_ui_peer_tws_sm_running(void);
ibrt_ui_state_e app_ibrt_ui_get_state_mapping_action(ibrt_action_e action);
void app_ibrt_ui_event_response_timer_cb(void const *n);
void app_ibrt_ui_dbg_state_timer_cb(void const *n);
void app_ibrt_ui_event_error_handling_timer_cb(void const *current_evt);
void app_ibrt_ui_disable_scan_timer_cb(void const *trigger_type);
void app_ibrt_ui_peer_sm_running_error_handler_cb(void const *trigger_type);
void app_ibrt_ui_disable_ble_timer_cb(void const *trigger_type);
void app_ibrt_ui_check_rssi_battery_timer_cb(void const *current_evt);
void app_ibrt_ui_common_sm(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_reconnect_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_connect_second_mobile_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_choice_mobile_connect_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_disconnect_mobile_tws_event_handler(ibrt_action_e action,ibrt_ui_error_e status);
void app_ibrt_ui_profile_data_update_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_choice_connect_second_mobile(void);
void app_ibrt_ui_choice_mobile_connect(uint8_t index);
void app_ibrt_ui_perform_received_action(uint8_t *p_buff, uint16_t length);
bool app_ibrt_ui_pagescan_enable_needed(ibrt_ui_trigger_scan_e trigger_type);
bool app_ibrt_ui_inqscan_enable_needed(void);
void app_ibrt_ui_judge_scan_type(ibrt_ui_trigger_scan_e trigger_type, ibrt_link_type_e link_type, uint8_t status);
void app_ibrt_ui_judge_link_policy(ibrt_ui_trigger_link_policy_e trigger_type, btif_link_policy_t policy);
void app_ibrt_ui_restart_event_handler(void);
void app_ibrt_ui_tws_switch_callback(void);
bool app_ibrt_ui_detect_sm_running_collision(void);
bool app_ibrt_ui_set_env_needed(void);
bool app_ibrt_ui_tws_bt_mss_needed(void);
bool app_ibrt_ui_transfer_sm_needed(void);
void app_ibrt_ui_profile_data_exchange(void);
void app_ibrt_ui_tws_transfer_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_phone_connect_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
bool app_ibrt_ui_none_event_happen(void);
bool app_ibrt_ui_none_event_happen(void);
void app_ibrt_ui_none_event_handler(ibrt_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_pairing_callback(const btif_event_t *event);
bool app_ibrt_ui_delay_start_ibrt_needed(void);
void app_ibrt_ui_action_state_mismatch_handler(ibrt_action_e action, ibrt_ui_error_e status);
bool app_ibrt_ui_is_profile_exchanged(void);
void app_ibrt_ui_set_profile_exchanged(void);
void app_ibrt_ui_clear_profile_exchanged(void);
bool app_ibrt_ui_get_freeman_enable(void);
bool app_ibrt_ui_is_role_switch_allowed(void);
bool app_ibrt_ui_get_nv_salve_enter_pairing_on_mobile_disconnect(void);
bool app_ibrt_ui_get_nv_salve_enter_pairing_on_empty_mobile_addr(void);
void app_ibrt_ui_set_tws_use_same_addr_enable(void);
bool app_ibrt_ui_get_tws_use_same_addr_enable(void);
void app_ibrt_ui_clear_tws_use_same_addr_enable(void);
void app_ibrt_ui_set_freeman_enable(void);
void app_ibrt_ui_clear_freeman_enable(void);
bool app_ibrt_ui_can_tws_switch(void);
bool app_ibrt_ui_tws_switch(void);
bool app_ibrt_ui_get_share_tws_info_done(void);
void app_ibrt_ui_set_share_tws_info_done(void);
void app_ibrt_ui_clear_share_tws_info_done(void);
bool app_ibrt_ui_get_slave_reconnect_enable(void);
void app_ibrt_ui_set_slave_reconnect_enable(void);
void app_ibrt_ui_clear_slave_reconnect_enable(void);
void app_ibrt_ui_set_wear_updown_tws_switch_enable(void);
void app_ibrt_ui_clear_wear_updown_tws_switch_enable(void);
bool app_ibrt_ui_get_wear_updown_tws_switch_enable(void);
void app_ibrt_ui_set_enter_pairing_mode(trigger_pairing_mode_type_e trigger_type);
void app_ibrt_ui_recover_rx_seq_error_timer_cb(void const *n);
bool app_ibrt_ui_get_enter_pairing_mode(void);
void app_ibrt_ui_clear_enter_pairing_mode(trigger_pairing_mode_type_e trigger_type);
void app_ibrt_ui_set_mobile_incoming_filter_unpaired(void);
void app_ibrt_ui_clear_mobile_incoming_filter_unpaired(void);
bool app_ibrt_ui_get_mobile_incoming_filter_unpaired(void);
void app_ibrt_ui_customer_set_bdaddr(uint8_t *nv_master_addr, uint8_t *nv_slave_addr);
bool app_ibrt_ui_is_tws_connecting(void);
bool app_ibrt_ui_is_mobile_connecting(void);
bool app_ibrt_ui_is_data_exchange_waiting(void);
bool app_ibrt_ui_is_tws_switching(void);
void app_ibrt_ui_register_connect_mobile_needed_ind(APP_IBRT_UI_CONNECT_MOBILE_HANDLER_IND handler);
void app_ibrt_ui_register_global_handler_ind(APP_IBRT_UI_GLOBAL_HANDLER_IND handler);
void app_ibrt_ui_register_global_event_update_ind(APP_IBRT_UI_GLOBAL_EVENT_UPDATE_IND handler);
void app_ibrt_ui_register_pairing_mode_ind(APP_IBRT_UI_PAIRING_MODE_HANDLER_IND set_pairing_callback, APP_IBRT_UI_PAIRING_MODE_HANDLER_IND clear_pairing_callback);
void app_ibrt_ui_register_cmd_complete_ind(APP_IBRT_UI_CMD_COMPLETE_HANDLER_IND cmd_complete_ind);
void app_ibrt_ui_register_vender_event_update_ind(APP_IBRT_UI_VENDER_EVENT_HANDLER_IND handler);
void app_ibrt_ui_register_profile_state_change_ind(APP_IBRT_UI_PROFILE_STATE_CHANGE_IND handler);
void app_ibrt_ui_profile_state_change_ind(uint32_t profile,uint8_t connected);
ibrt_ui_error_e app_ibrt_ui_event_queue_insert(ibrt_event_type event);
bool app_ibrt_ui_event_has_been_queued(ibrt_event_type event);
ibrt_ui_error_e app_ibrt_ui_event_queue_delete(ibrt_event_type *p_event);
bool app_ibrt_ui_event_queue_empty(void);
ibrt_ui_error_e app_ibrt_ui_event_queue_get_front(ibrt_event_type *p_event);
ibrt_ui_error_e app_ibrt_ui_event_queue_get_rear(ibrt_event_type *p_event);
void app_ibrt_ui_event_queue_init(void);
bool app_ibrt_ui_enter_idle_wait_needed(ibrt_event_type event, ibrt_event_type peer_event);
void app_ibrt_ui_event_update_entry(ibrt_event_type evt_type, \
ibrt_ui_state_e old_state, \
ibrt_ui_state_e new_state, \
ibrt_action_e action, \
ibrt_ui_error_e status);
uint8_t app_ibrt_ui_get_reconnect_tws_max_times(void);
uint8_t app_ibrt_ui_get_reconnect_mobile_max_times(void);
bool app_ibrt_ui_tws_switch_according_rssi_needed(void);
void app_ibrt_ui_update_feature_box_state(ibrt_event_type event);
void app_ibrt_ui_start_ble_adv_broadcasting(uint8_t pairing_status);
void app_ibrt_ui_stop_ble_adv_broadcasting(void);
uint8_t is_sco_mode (void);
void app_ibrt_ui_link_control_while_calling(void);
bool btdrv_get_accept_new_mobile_enable(void);
void app_ibrt_ui_reset_link_control_while_profile_exchanged(void);
bool app_ibrt_ui_tws_reconnect_one_cycle_ended(uint8_t reconnect_counter);
bool app_ibrt_ui_mobile_reconnect_one_cycle_ended(uint8_t reconnect_counter);
bool app_ibrt_ui_wait_ibrt_connected(void);
bool app_ibrt_ui_connect_mobile_event_pending(void);
uint16_t app_ibrt_ui_get_reconnect_mobile_wait_time(void);
void app_ibrt_ui_box_init(bt_bdaddr_t *box_ble_addr);
bool app_ibrt_ui_get_snoop_via_ble_enable(void);
void app_ibrt_ui_set_snoop_via_ble_enable(void);
void app_ibrt_ui_clear_snoop_via_ble_enable(void);
void app_ibrt_ui_set_ble_connect_index(uint8_t index);
void app_ibrt_ui_set_box_ble_addr(bt_bdaddr_t *addr);
bt_bdaddr_t *app_ibrt_ui_get_box_ble_addr(void);
void app_ibrt_ui_set_master_notify_flag(bool notify_enable);
void app_ibrt_ui_set_slave_scaning(bool scan_enable);
bool app_ibrt_ui_is_slave_scaning(void);
void app_ibrt_ui_set_box_connect_state(uint8_t box_connect_state, bool force_set);
uint8_t app_ibrt_ui_clear_box_connect_state(uint8_t box_connect_state, bool force_clear);
void app_ibrt_ui_set_disconnect_enable(bool disconnect_enable);
uint8_t app_ibrt_ui_snoop_info_send_enable(void);
void app_ibrt_ui_connect_box();
void app_ibrt_ui_disconnect_box(void);
uint32_t app_ibrt_ui_snoop_info_transport(uint8_t *buf, uint32_t len);
void app_ibrt_ui_snoop_info_handler(uint8_t *buf, uint32_t len);
void app_ibrt_ui_freeman_pairing_handler(ibrt_pairing_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_tws_pairing_handler(ibrt_pairing_action_e action, ibrt_ui_error_e status);
void app_ibrt_ui_clear_refresh_pairing_enable(void);
bool app_ibrt_ui_get_refresh_pairing_enable(void);
void app_ibrt_ui_set_refresh_pairing_enable(void);
bool app_ibrt_ui_re_enter_pairing_mode_enable(void);
void app_ibrt_ui_clear_peer_sm_running(void);
void app_ibrt_ui_set_peer_sm_running(void);
bool app_ibrt_ui_duplicate_event_can_filtered(ibrt_event_type t_event);
bool app_ibrt_ui_is_box_closed(void);
ibrt_box_state app_ibrt_ui_get_box_state(void);
void app_ibrt_ui_mobile_link_disconnect_error_handler(void);
void app_ibrt_ui_tws_link_disconnect_error_handler(void);
void app_ibrt_ui_start_reconnect_event(void);
bool app_ibrt_ui_start_reconnect_event_needed(ibrt_action_e action, ibrt_ui_error_e status);
bool app_ibrt_ui_get_audio_mute_enable(void);
void app_ibrt_ui_set_audio_mute_enable(void);
void app_ibrt_ui_clear_audio_mute_enable(void);
void app_ibrt_ui_controller_error_handling(ibrt_controller_error_type error_type, bool reset_controler);
void app_ibrt_ui_set_tws_connect_success_last(void);
void app_ibrt_ui_host_error_handling(ibrt_controller_error_type error_type);
void app_ibrt_ui_clear_tws_connect_success_last(void);
bool app_ibrt_ui_get_tws_connect_success_last(void);
void app_ibrt_ui_start_dbg_state_timer(void);
void app_ibrt_ui_stop_dbg_state_timer(void);
void app_ibrt_ui_controller_dbg_state_checker(void);
void app_ibrt_ui_tws_cmd_send_fail_error_handler(app_tws_cmd_code_e cmd_code);
void app_ibrt_ui_set_local_volume_info(uint8_t * p_buffer);
void app_ibrt_ui_stop_ibrt_condition_checker(void);
void app_ibrt_ui_stop_ibrt_timer_cb(void const *n);
bool app_ibrt_ui_stop_ibrt_timer_condition_fullfilled(void);
bool app_ibrt_if_is_audio_active(void);
void app_ibrt_ui_mobile_link_connected_callback(bt_bdaddr_t * addr);
void app_ibrt_ui_ibrt_link_connected_callback(bt_bdaddr_t * addr);
void app_ibrt_ui_tws_link_connected_callback(bt_bdaddr_t * addr);
void app_ibrt_ui_register_link_connected_ind(APP_IBRT_UI_CONNECTED_HANDLER_IND mobile_connected_ind,
APP_IBRT_UI_CONNECTED_HANDLER_IND ibrt_connected_ind,
APP_IBRT_UI_CONNECTED_HANDLER_IND tws_connected_ind);
void app_ibrt_ui_send_user_action(uint8_t *p_buff, uint16_t length);
void app_ibrt_ui_reboot_sdk(void);
void app_ibrt_ui_tws_switch_stable_timer_cb(void const *n);
void app_ibrt_ui_tws_switch_prepare_timer_cb(void const *n);
void app_ibrt_ui_disconnect_ble(void);
void app_ibrt_ui_register_tws_switch_needed_ind(APP_IBRT_UI_TWS_SWITCH_HANDLER_IND handler);
void app_hci_vender_ibrt_disconnected_callback(bool stop_for_seq_error,uint8_t disc_reason);
bool app_ibrt_ui_exit_mobile_sniff_mode_needed(ibrt_ui_exit_sniff_trigger_e exit_sniff_triiger);
bool app_ibrt_ui_exit_tws_sniff_mode_needed(ibrt_ui_exit_sniff_trigger_e exit_sniff_triiger);
void app_ibrt_ui_disconnect_tws_timer_cb(void const *n);
void app_ibrt_ui_exit_sniff(ibrt_ui_exit_sniff_trigger_e exit_sniff_trigger);
#ifdef __cplusplus
}
#endif
#endif