mcu_ab568x/app/platform/libs/api_btstack.h
2025-05-30 18:03:10 +08:00

782 lines
35 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _API_BTSTACK_H
#define _API_BTSTACK_H
//工作模式
#define MODE_NORMAL 0
#define MODE_CBT_TEST 1
#define MODE_FCC_TEST 2
#define MODE_BQB_RF 3
#define MODE_BQB_PROFILE 4
//蓝牙功能
#define PROF_A2DP 0x0007 //蓝牙音乐功能
#define PROF_HID 0x0018 //蓝牙键盘功能
#define PROF_HFP 0x0060 //蓝牙通话功能
#define PROF_SPP 0x0080 //蓝牙串口功能
#define PROF_PBAP 0x0100 //蓝牙电话本功能
#define PROF_HSP 0x0200
#define PROF_MAP 0x0400 //蓝牙短息功能
//蓝牙特性
#define HFP_BAT_REPORT 0x01 //是否支持手机电量显示
#define HFP_3WAY_CALL 0x02 //是否支持三通电话
#define HFP_INBAND_RING_RONE 0x04 //是否支持手机来电铃声
#define HFP_CALL_PRIVATE 0x08 //是否打开强制私密接听
#define HFP_SIRI_CMD 0x10 //是否打开siri控制命令
#define HFP_EC_AND_NR 0x20 //是否打开手机端回音和降噪
#define HFP_RING_NUMBER_EN 0x40 //是否支持来电报号
#define A2DP_VOL_CTRL 0x01 //是否支持手机音量控制同步
#define A2DP_IOS_PLAY_STATUS 0x02 //是否支持IOS手机播放状态同步注意打开后微信小视频会无声蓝牙后台建议打开
#define A2DP_ANDROID_PLAY_STATUS 0x04 //是否支持ANDROID手机播放状态同步
#define A2DP_RESTORE_PLAYING 0x08 //是否支持掉线回连后恢复播放
#define A2DP_AVDTP_DELAY_REPORT 0x10 //是否支持AVDTP delay report功能
//蓝牙编解码
#define CODEC_SBC 0x01
#define CODEC_AAC 0x02
#define CODEC_MSBC 0x04
#define CODEC_PLC 0x08
//蓝牙状态
enum {
BT_STA_OFF, //蓝牙模块已关闭
BT_STA_INITING, //初始化中
BT_STA_IDLE, //蓝牙模块打开,未连接
BT_STA_SCANNING, //扫描中
BT_STA_DISCONNECTING, //断开中
BT_STA_CONNECTING, //连接中
BT_STA_CONNECTED, //已连接
BT_STA_PLAYING, //播放
BT_STA_INCOMING, //来电响铃
BT_STA_OUTGOING, //正在呼出
BT_STA_INCALL, //通话中
BT_STA_OTA, //OTA升级中
};
//通话状态
enum {
BT_CALL_IDLE, //空闲
BT_CALL_INCOMING, //来电响铃
BT_CALL_OUTGOING, //正在呼出
BT_CALL_ACTIVE, //通话中
BT_CALL_3WAY_CALL, //三通电话或两部手机通话
};
//蓝牙通知
enum {
BT_NOTICE_INIT_FINISH, //蓝牙初始化完成
BT_NOTICE_CONNECT_START, //开始回连手机, param[0]=nouse, param[6:1]=bd_addr
BT_NOTICE_CONNECT_FAIL, //回连手机失败, param[0]=reason, param[6:1]=bd_addr
BT_NOTICE_DISCONNECT, //蓝牙断开, param[0]=feat, param[6:1]=bd_addr
BT_NOTICE_LOSTCONNECT, //蓝牙连接丢失, param[0]=nouse, param[6:1]=bd_addr
BT_NOTICE_CONNECTED, //蓝牙连接成功, param[0]=feat, param[6:1]=bd_addr
BT_NOTICE_SCO_SETUP,
BT_NOTICE_SCO_FAIL,
BT_NOTICE_SCO_KILL,
BT_NOTICE_RSSI_REPORT, //上报连接RSSI
BT_NOTICE_INCOMING, //来电
BT_NOTICE_RING, //来电响铃
BT_NOTICE_OUTGOING, //去电
BT_NOTICE_CALL_NUMBER, //来电/去电号码
BT_NOTICE_INCALL, //建立通话
BT_NOTICE_ENDCALL, //结束通话
BT_NOTICE_NETWORK_CALL, //网络通话
BT_NOTICE_PHONE_CALL, //手机通话
BT_NOTICE_SET_SPK_GAIN, //设置通话音量
BT_NOTICE_MUSIC_PLAY, //蓝牙音乐开始播放
BT_NOTICE_MUSIC_STOP, //蓝牙音乐停止播放
BT_NOTICE_MUSIC_CHANGE_VOL, //改变蓝牙音乐音量
BT_NOTICE_MUSIC_SET_VOL, //设置蓝牙音乐音量
BT_NOTICE_HID_CONN_EVT, //HID服务连接事件
BT_NOTICE_SET_XOSC_CAP, //推出测试盒校准成功消息
///PBAP相关消息
BT_NOTICE_PBAP_CONNECTED,
BT_NOTICE_PBAP_GET_PHONEBOOK_SIZE_COMPLETE, //获取电话薄数量完成
BT_NOTICE_PBAP_PULL_PHONEBOOK_COMPLETE, //获取电话薄完成
BT_NOTICE_PBAP_DISCONNECT,
BT_NOTICE_FAST_MUSIC_STATUS, //快速上报音乐播放暂停状态
};
//控制消息
enum {
BT_CTL_VOL_CHANGE = 0, //音量调整
BT_CTL_PLAY_PAUSE, //切换播放、暂停
BT_CTL_LOW_LATENCY_ENABLE, //打开低延迟
BT_CTL_LOW_LATENCY_DISABLE, //关闭低延迟
BT_CTL_MSC_RES0,
BT_CTL_MSC_RES1,
BT_CTL_MSC_RES2,
BT_CTL_MSC_RES3,
BT_CTL_CALL_REDIAL, //回拨电话(最后一次通话)
BT_CTL_CALL_REDIAL_NUMBER, //回拨电话从hfp_get_outgoing_number获取号码
BT_CTL_CALL_ANSWER_INCOM, //接听来电(三通时挂起当前通话)
BT_CTL_CALL_ANSWER_INCOM_REJ_OTHER, //接听来电(三通时挂断当前通话)
BT_CTL_CALL_TERMINATE, //挂断通话或来电
BT_CTL_CALL_SWAP, //切换三通电话
BT_CTL_CALL_PRIVATE_SWITCH, //切换私密通话
BT_CTL_HFP_REPORT_BAT, //报告电池电量
BT_CTL_HFP_SPK_GAIN, //设置通话扬声器音量
BT_CTL_HFP_MIC_GAIN, //设置通话麦克风音量
BT_CTL_HFP_AT_CMD, //发送AT命令从hfp_get_at_cmd获取命令
BT_CTL_HFP_SIRI_SW, //唤出/关闭siri
BT_CTL_HFP_REMOTE_PHONE_NUM,
BT_CTL_HFP_SWITCH_TO_PHONE,
BT_CTL_HFP_SWITCH_TO_WATCH,
BT_CTL_HFP_RES1,
BT_CTL_HFP_RES2,
BT_CTL_HFP_RES3,
BT_CTL_HID_CONNECT,
BT_CTL_HID_DISCONNECT,
BT_CTL_BLE_ADV_DISABLE, //关闭BLE 广播
BT_CTL_BLE_ADV_ENABLE, //打开BLE 广播
BT_CTL_RES0,
BT_CTL_RES1,
BT_CTL_SWITCH_PALY,
BT_CTL_GET_ID3_TAG,
BT_CTL_GET_PLAY_STATUS_INFO,
BT_CTL_A2DP_PROFILE_EN,
BT_CTL_A2DP_PROFILE_DIS,
BT_CTL_HFP_CONNECT,
BT_CTL_HFP_DISCONNECT,
BT_CTL_SEARCH_OS_CAPACITY,
BT_CTL_MAX,
BT_CTL_VOLUME_UP = 0xff0041, //音量加
BT_CTL_VOLUME_DOWN = 0xff0042, //音量减
BT_CTL_MUTE = 0xff0043, //MUTE
BT_CTL_PLAY = 0xff0044, //播放
BT_CTL_STOP = 0xff0045, //停止
BT_CTL_PAUSE = 0xff0046, //暂停
BT_CTL_RECORD = 0xff0047,
BT_CTL_REWIND = 0xff0048, //快退
BT_CTL_FAST_FORWARD = 0xff0049, //快进
BT_CTL_EJECT = 0xff004a,
BT_CTL_FORWARD = 0xff004b, //下一曲
BT_CTL_BACKWARD = 0xff004c, //上一曲
BT_CTL_REWIND_END = 0xff00c8, //结束快退
BT_CTL_FAST_FORWARD_END = 0xff00c9, //结束快进
BT_CTL_NO = 0xffffff,
};
enum bt_msg_comm_t {
COMM_BT_CTL0, //无传参的消息
COMM_BT_SET_SCAN, //设置可被发现/可被连接
COMM_BT_CONNECT, //连接蓝牙
COMM_BT_DISCONNECT, //断开蓝牙
COMM_BT_DISC_SCO_LINK, //断开SCO链路
COMM_BT_SET_SCAN_INTV, //设置PAGE SCAN PARAM
COMM_LE_AMS_REMOTE_CTRL, //LE AMS remote ctl
COMM_BT_ABORT_RECONNECT, //终止回连
};
enum bt_msg_hid_t {
HID_KEYBOARD,
HID_CONSUMER,
HID_TOUCH_SCREEN,
HID_SIMPLE_KEYBOARD,
};
enum bt_msg_pbap_t {
BT_PBAP_CTRL,
BT_PBAP_SELECT_PHONEBOOK,
BT_PBAP_GET_PHONEBOOK_SIZE,
BT_PBAP_PULL_PHONEBOOK,
};
//蓝牙消息
enum bt_msg_t {
BT_MSG_CTRL = 0, //蓝牙控制消息
BT_MSG_COMM,
BT_MSG_RES1,
BT_MSG_RES2,
BT_MSG_ADV0,
BT_MSG_A2DP, //A2DP消息
BT_MSG_HFP, //HFP消息
BT_MSG_HSP, //HSP消息
BT_MSG_HID, //HID消息KEYPAD按键/CONSUMER按键/触摸屏
BT_MSG_PBAP, //PBAP消息
BT_MSG_LECLT, //BLE CLIENT消息
BT_MSG_MAP, //MAP消息 获取时间
BT_MSG_MAX,
BT_MSG_RES = 0xf0, //0xf0~0xff保留给传参较多的api
};
enum sync_info_enum {
SYNC_INFO_SETTING, //VOL/LANG/EQ/BAT/...
SYNC_INFO_LEDCNT, //同步 led cnt
SYNC_INFO_EQPARAM,
};
//LE Addr Type, public or random(static or non resolvable or resolvable)
enum {
GAP_RANDOM_ADDRESS_TYPE_OFF = 0, //Public
GAP_RANDOM_ADDRESS_TYPE_STATIC,
GAP_RANDOM_ADDRESS_NON_RESOLVABLE,
GAP_RANDOM_ADDRESS_RESOLVABLE,
};
//LE状态
enum {
LE_STA_STANDBY,
LE_STA_ADVERTISING, //正在广播
LE_STA_CONNECTION, //已连接
};
//LE 通知
typedef enum{
LE_NOTICE_CONNECTED, //连接成功
LE_NOTICE_DISCONNECT, //断开成功
LE_NOTICE_CONN_PARAM_UPDATE, //连接参数更新
LE_NOTICE_DATA_LEN_CHANGE, //收发长度改变
LE_NOTICE_CLINET_CFG, //客户端配置特性
LE_NOTICE_ANCS_CONN_EVT, //ancs client连接事件
LE_NOTICE_AMS_CONN_EVT, //ams client连接事件
}ble_cb_enum;
//LE GATT 服务相关
/**
BLE GATTS ERR return
*/
#define BLE_GATTS_SUCCESS 0x00
#define BLE_GATTS_SRVC_TYPE_ERR 0x01
#define BLE_GATTS_SRVC_RULES_ERR 0x02
#define BLE_GATTS_SRVC_PROPS_ERR 0x03
#define BLE_GATTS_SRVC_ATT_FULL_ERR 0x04
#define BLE_GATTS_SRVC_PROFILE_FULL_ERR 0x05
/**
att property flag
*/
#define ATT_BROADCAST 0x01
#define ATT_READ 0x02
#define ATT_WRITE_WITHOUT_RESPONSE 0x04
#define ATT_WRITE 0x08
#define ATT_NOTIFY 0x10
#define ATT_INDICATE 0x20
#define ATT_AUTHENTICATED_SIGNED_WRITE 0x40
#define ATT_EXTENDED_PROPERTIES 0x80
#define ATT_DYNAMIC 0x100
#define ATT_UUID128 0x200
#define ATT_AUTHENTICATION_REQUIRED 0x400
#define ATT_AUTHORIZATION_REQUIRED 0x800
/**
define group GATT Server Service Types
*/
typedef enum {
BLE_GATTS_SRVC_TYPE_PRIMARY = 0x00, //Primary Service
BLE_GATTS_SRVC_TYPE_SEVONDARY= 0x01, //Secondary Service
BLE_GATTS_SRVC_TYPE_INCLUDE = 0x02, //include Type
} ble_gatts_service_type;
/**
define group GATT Server UUID Types
*/
typedef enum {
BLE_GATTS_UUID_TYPE_16BIT = 0x00, //UUID 16BIT
BLE_GATTS_UUID_TYPE_128BIT = 0x01, //UUID 128BIT
} ble_gatts_uuid_type;
/**
define GATT handler callback
con_handle: connect handle
handle : attribute handle
flag : call back flag
*/
#define ATT_CB_FALG_OFFSET (0xffff)
#define ATT_CB_FALG_DIR_WRITE (0x10000)
typedef int (*ble_gatt_callback_func)(uint16_t con_handle, uint16_t handle, uint32_t flag, uint8_t *ptr, uint16_t len);
/**
define GATT service base
*/
typedef struct gatts_service_base{
uint16_t handle;
} gatts_service_base_st;
/**
define GATT service uuid
*/
typedef struct gatts_uuid_base{
uint16_t props;
uint8_t type;
const uint8_t *uuid;
} gatts_uuid_base_st;
/**
define GATT service call back info
*/
typedef struct {
uint16_t client_config; // att config, 1:notify enable; 2:indicate enable;
uint16_t value_len;
ble_gatt_callback_func att_write_callback_func; // 特征值的写操作回调
ble_gatt_callback_func att_read_callback_func; // 特征值的读操作回调, 注意要设置value_len
uint8_t *value; // read return data, when att_read_callback_func is NULL
} ble_gatt_characteristic_cb_info_t;
#define GATT_CLIENT_CONFIG_NOTIFY 1
#define GATT_CLIENT_CONFIG_INDICATE 2
/**
define group GATT Server profile struct
*/
typedef struct gatts_profile_list{
void *item;
uint16_t profile_start_handle;
uint16_t profile_end_handle;
const uint8_t *profile_date;
uint16_t profile_date_size;
} ble_gatts_profile_list_st;
#define BD_ADDR_LENGTH 6
typedef uint8_t bd_addr_t[BD_ADDR_LENGTH];
extern uint8_t cfg_bt_work_mode;
extern uint8_t cfg_bt_max_acl_link;
extern bool cfg_bt_dual_mode;
extern bool cfg_bt_scan_ctrl_mode;
extern bool cfg_bt_simple_pair_mode;
extern bool cfg_bt_voip_reject_en;
extern uint16_t cfg_bt_support_profile;
extern uint16_t cfg_bt_support_codec;
extern uint8_t cfg_bt_hid_type;
extern uint16_t cfg_bt_def_connect_times;
extern uint16_t cfg_bt_sup_to_connect_times;
extern uint8_t cfg_bt_rf_def_txpwr;
extern uint8_t cfg_bt_page_inq_txpwr;
extern uint8_t cfg_bt_a2dp_feature;
extern uint8_t cfg_bt_hfp_feature;
extern uint8_t cfg_bt_sniff_clk_sel;
#define bt_a2dp_is_vol_ctrl() (cfg_bt_a2dp_feature & A2DP_VOL_CTRL)
#define bt_a2dp_is_ios_play_status() (cfg_bt_a2dp_feature & A2DP_IOS_PLAY_STATUS)
//control
void bt_fcc_init(void);
void bt_init(void); //初始化蓝牙变量
int bt_setup(void); //打开蓝牙模块
void bt_off(void); //关闭蓝牙模块
void bt_wakeup(void); //唤醒蓝牙模块
void bt_send_msg_do(uint msg); //蓝牙控制消息参数详见bt_msg_t
void bt_audio_bypass(void); //蓝牙SBC/SCO通路关闭
void bt_audio_enable(void); //蓝牙SBC/SCO通路使能
void bt_set_sco_far_delay(void *buf, uint size, uint delay);
void bt_set_scan(u8 iscan, u8 pscan); //打开/关闭可被发现和可被连接
void bt_set_scan_param(uint param); //pscan int = 0x100*((param >> 8)&0xff) + 1), iscan int = 0x100*((param&0xff) + 1)
uint8_t bt_get_scan(void); //获取设置的可被发现可被连接状态
void bt_connect(uint times); //蓝牙设备回连, times: 重试次数每次6s
void bt_disconnect(uint reason); //蓝牙设备断开, reason: 0=单独断开入仓1=断开并同步关机(按键/自动关机)
void bt_hid_connect(void); //蓝牙HID服务回连
void bt_hid_disconnect(void); //蓝牙HID服务断开
uint32_t bt_sleep_proc(void);
void bt_enter_sleep(void);
void bt_exit_sleep(void);
void updata_bt_name(char *bt_name);
//status
uint bt_get_disp_status(void); //获取蓝牙的当前显示状态
uint bt_get_status(void); //获取蓝牙的当前状态
uint bt_get_call_indicate(void); //获取通话的当前状态
uint bt_get_siri_status(void); //获取SIRI当前状态, 0=SIRI已退出, 1=SIRI已唤出
bool bt_is_calling(void); //判断是否正在通话
bool bt_is_playing(void); //判断是否正在播放
bool bt_is_ring(void); //判断是否正在响铃
bool bt_is_testmode(void); //判断当前蓝牙是否处于测试模式
bool bt_is_sleep(void); //判断蓝牙是否进入休眠状态
bool bt_is_connected(void); //判断蓝牙是否已连接
bool bt_is_ios_device(void); //判断当前播放的是否ios设备
bool sco_is_connected(void); //判断当前SCO链路是否连接
bool bt_sco_is_msbc(void); //判断当前通话是否是宽带通话
bool bt_a2dp_is_connected(void); //判断蓝牙A2DP是否已连接
bool bt_hfp_is_connected(void); //判断蓝牙HFP是否已连接
int bt_hid_is_connected(void); //判断蓝牙hid是否已连接
bool bt_hid_is_ready_to_discon(void);
bool sbc_is_bypass(void);
bool bt_sync_tick(void); //根据蓝牙时钟同步到50ms误差为5ms
void bt_reset_addr(void); //重置bt地址, 值通过bt_get_local_bd_addr设置;
void bt_read_conn_rssi(void); //获取当前连接RSSI
//info
bool bt_get_link_btname(uint8_t index, char *name, uint8_t max_size); //index: 0=link0, 1=link1, 0xff=auto(default link0)
bool bt_nor_get_link_info(uint8_t *bd_addr); //获取手机配对信息bd_addr=NULL时仅查询是否存在回连信息
bool bt_nor_get_link_info_addr(uint8_t *bd_addr, uint8_t order); //获取第n个手机配对信息bd_addr=NULL时仅查询是否存在回连信息
void bt_nor_delete_link_info(void); //删除手机配对信息
bool bt_nor_get_link_info_addr_ex(void);
#define bt_send_msg(ogf, ocf) bt_send_msg_do((ogf<<24) | (ocf))
#define bt_ctrl_msg(msg) bt_send_msg(BT_MSG_CTRL, msg)
#define bt_comm_msg(msg, param) bt_send_msg(BT_MSG_COMM, (msg<<16) | (u16)param)
#define bt_hid_msg(msg, param) bt_send_msg(BT_MSG_HID, (msg<<16) | (u16)param)
#define bt_pbap_msg(msg, param) bt_send_msg(BT_MSG_PBAP, (msg<<16) | (u16)param)
//蓝牙连接
#define bt_scan_enable() bt_set_scan(1, 1) //打开扫描
#define bt_scan_disable() bt_set_scan(0, 0) //关闭扫描
#define bt_search_os_capacity() bt_ctrl_msg(BT_CTL_SEARCH_OS_CAPACITY) //主动发起查询当前连接的设备是否IOS发起查询后调用判断bt_is_ios_device(),连接2个手机此函数无效
#define bt_abort_reconnect() bt_comm_msg(COMM_BT_ABORT_RECONNECT, 0xffff) //终止回接
//蓝牙音乐
#define bt_music_play() bt_ctrl_msg(BT_CTL_PLAY) //播放
#define bt_music_pause() bt_ctrl_msg(BT_CTL_PAUSE) //暂停
#define bt_music_play_pause() bt_ctrl_msg(BT_CTL_PLAY_PAUSE) //切换播放/暂停
#define bt_music_stop() bt_ctrl_msg(BT_CTL_STOP) //停止
#define bt_music_prev() bt_ctrl_msg(BT_CTL_BACKWARD) //上一曲
#define bt_music_next() bt_ctrl_msg(BT_CTL_FORWARD) //下一曲
#define bt_music_rewind() bt_ctrl_msg(BT_CTL_REWIND) //开始快退
#define bt_music_rewind_end() bt_ctrl_msg(BT_CTL_REWIND_END) //结束快退
#define bt_music_fast_forward() bt_ctrl_msg(BT_CTL_FAST_FORWARD) //开始快进
#define bt_music_fast_forward_end() bt_ctrl_msg(BT_CTL_FAST_FORWARD_END) //结束快进
#define bt_music_vol_change() bt_ctrl_msg(BT_CTL_VOL_CHANGE) //通知手机音量已调整
#define bt_2acl_switch_music_play() bt_ctrl_msg(BT_CTL_SWITCH_PALY);
#define bt_music_get_id3_tag() bt_ctrl_msg(BT_CTL_GET_ID3_TAG); //主动查询id3 tag信息
#define bt_music_paly_status_info() bt_ctrl_msg(BT_CTL_GET_PLAY_STATUS_INFO);//获取歌曲时长单位ms,当前播放位置,播放状态信息
//蓝牙通话
#define bt_call_redial_last_number() bt_ctrl_msg(BT_CTL_CALL_REDIAL) //电话回拨(最后一次通话)
#define bt_call_answer_incoming() bt_ctrl_msg(BT_CTL_CALL_ANSWER_INCOM) //接听电话,三通时挂起当前通话
#define bt_call_answer_incom_rej_other() bt_ctrl_msg(BT_CTL_CALL_ANSWER_INCOM_REJ_OTHER) //接听电话,三通时挂断当前通话
#define bt_call_terminate() bt_ctrl_msg(BT_CTL_CALL_TERMINATE) //挂断电话
#define bt_call_swap() bt_ctrl_msg(BT_CTL_CALL_SWAP) //切换三通电话
#define bt_call_private_switch() bt_ctrl_msg(BT_CTL_CALL_PRIVATE_SWITCH) //切换私密通话
#define bt_call_redial_number() bt_ctrl_msg(BT_CTL_CALL_REDIAL_NUMBER)
#define bt_call_get_remote_phone_number() bt_ctrl_msg(BT_CTL_HFP_REMOTE_PHONE_NUM) //获取远端号码
#define bt_hfp_siri_switch() bt_ctrl_msg(BT_CTL_HFP_SIRI_SW) //开关SIRI, android需要在语音助手中打开“蓝牙耳机按键启动”, ios需要打开siri功能
#define bt_hfp_report_bat() bt_ctrl_msg(BT_CTL_HFP_REPORT_BAT)
#define bt_hfp_set_spk_gain() bt_ctrl_msg(BT_CTL_HFP_SPK_GAIN)
#define bt_hfp_send_at_cmd() bt_ctrl_msg(BT_CTL_HFP_AT_CMD)
#define bt_hfp_switch_to_phone() bt_ctrl_msg(BT_CTL_HFP_SWITCH_TO_PHONE) //通话切到手机
#define bt_hfp_switch_to_watch() bt_ctrl_msg(BT_CTL_HFP_SWITCH_TO_WATCH) //通话切在手表
//服务控制
#define bt_a2dp_profile_en() bt_ctrl_msg(BT_CTL_A2DP_PROFILE_EN) //打开A2DP服务
#define bt_a2dp_profile_dis() bt_ctrl_msg(BT_CTL_A2DP_PROFILE_DIS) //关闭A2DP服务
#define bt_hfp_profile_en() bt_ctrl_msg(BT_CTL_HFP_CONNECT) //打开HFP服务
#define bt_hfp_profile_dis() bt_ctrl_msg(BT_CTL_HFP_DISCONNECT) //关闭HFP服务
//PBAP
#define bt_pbap_connect() bt_pbap_msg(BT_PBAP_CTRL, 1)
#define bt_pbap_disconnect() bt_pbap_msg(BT_PBAP_CTRL, 0)
#define bt_pbap_select_phonebook(book, sim) bt_pbap_msg(BT_PBAP_SELECT_PHONEBOOK, (sim<<8) | (u8)book)
// sim - 1:选择SIM卡0:本机
// book- 0:pb, 1:fav, 2-ich, 3:och, 4-mch, 5-cch, 6-spd
// 若不配置则选择默认值为本机pb
#define bt_pbap_get_phonebook_size() bt_pbap_msg(BT_PBAP_GET_PHONEBOOK_SIZE, 0)
#define bt_pbap_pull_phonebook_whole() bt_pbap_msg(BT_PBAP_PULL_PHONEBOOK, 0)
#define bt_pbap_pull_phonebook_single(idx) bt_pbap_msg(BT_PBAP_PULL_PHONEBOOK, idx)
// 按编号获取联系人信息
// idx不为零如果为零则直接获取整个电话本信息
void bt_pbap_lookup_number(char *phone_number);
//pkt
typedef void (*kick_func_t)(void);
struct txbuf_tag {
uint8_t *ptr;
uint16_t len;
uint16_t handle;
} __attribute__ ((packed)) ;
struct txpkt_tag
{
struct txbuf_tag *buf;
uint16_t buf_size;
uint8_t total;
volatile uint8_t cnt;
uint8_t rptr;
volatile uint8_t wptr;
kick_func_t send_kick;
};
extern struct txpkt_tag notify_tx;
uint32_t txpkt_init(struct txpkt_tag *txpkt, void *mem_pool, uint8_t total, uint16_t buf_size);
void spp_init(void);
void hfp_hf_init(void);
void a2dp_init(void);
void aap_init(void);
uint8_t sdp_add_service(void *item);
void sdp_rmv_service(uint32_t service_record_handle);
uint bt_get_hfp_feature(void);
int bt_spp_tx(uint8_t *packet, uint16_t len);
//hid
void hid_device_init(void);
bool bt_hid_send(void *buf, uint len, bool auto_release); //自定义HID数组
bool bt_hid_send_key(uint type, uint keycode); //标准HID按键
#define bt_hid_key(keycode) bt_hid_send_key(HID_KEYBOARD, keycode) //标准HID键, 如Enter
#define bt_hid_consumer(keycode) bt_hid_send_key(HID_CONSUMER, keycode) //自定义HID键, 如VOL+ VOL-
#define bt_hid_touch_screen(keycode) bt_hid_send_key(HID_TOUCH_SCREEN, keycode) //触屏
bool bt_hid_touch_screen_set_key(void *ts);
#define bt_hid_finger_select_ios() bt_hid_msg(HID_TOUCH_SCREEN, 1) //抖音视频选择IOS系统, 需要在bt连接前调用区分
#define bt_hid_finger_select_andriod() bt_hid_msg(HID_TOUCH_SCREEN, 2) //抖音视频选择andriod系统, 需要在bt连接前调用区分
/**
* @brief 模拟触点函数
注意:IOS 范围是-2047-2048 安卓是0-4096;
IOS设备x,y是相对位置比如10,10是相对当前位置移动10,10;
安卓设备xy是绝对位置10,10是在手机10,10的位置上;
* @param is_press 1按下0抬起
* @param x 模拟触点横坐标
* @param y 模拟触点纵坐标
**/
void bt_hid_point_pos(bool is_press, s16 x, s16 y);
//goep
void goep_client_init(void);
//pbap
void pbap_client_init(void);
//map
void map_client_init(void);
void bt_map_start(void); //MAP的获取
void bt_map_abort(void); //终止MAP的获取
//hsp
void hsp_hs_init(void);
void hsp_hs_init_var(void);
void bt_hsp_call_switch(void); //挂断/接听
void bt_hsp_sco_conn(void); //建立HSP SCO连接
void bt_hsp_sco_disconn(void); //断开HSP SCO连接
/*****************************************************************************
* SIMPLE KEYBOARD API
*****************************************************************************/
#define bt_hid_simple_keyboard(keycode) bt_hid_send_key(HID_SIMPLE_KEYBOARD, keycode) //简易键盘
#define SIMPLE_KEYBOARD_VOL_UP 0x01
#define SIMPLE_KEYBOARD_VOL_DOWN 0x02
#define SIMPLE_KEYBOARD_NEXT 0x10
#define SIMPLE_KEYBOARD_PREV 0x20
#define SIMPLE_KEYBOARD_PLAY 0x88
#define SIMPLE_KEYBOARD_PLAY_UP 0x66
#define SIMPLE_KEYBOARD_RELEASE 0x00
void btstack_hid_simple_keyboard(uint);
/*****************************************************************************
* BLE API
*****************************************************************************/
#define ble_adv_dis() bt_ctrl_msg(BT_CTL_BLE_ADV_DISABLE)
#define ble_adv_en() bt_ctrl_msg(BT_CTL_BLE_ADV_ENABLE)
void ble_send_sm_req(void);
void ble_set_gap_name(char *gap_name, u8 len);
u16 ble_get_conn_interval(void); //N*1.25ms
u16 ble_get_conn_latency(void);
u16 ble_get_conn_timeout(void); //N*10ms
u16 ble_get_adv_interval(void); //N*625us
//init gatt
//profile_table: profile cache buf
//cb_info_table_p: call back info cache
/*****************************************************************************
* BLE连接相关通道1与BLE无连接广播相互独立
*****************************************************************************/
void ble_send_kick(void);
/**
* @brief 主动请求mtu
* @return void
*
**/
void ble_exchange_mtu_request(void);
/**
* @brief 获取BLE的状态
* @return 3种状态的一种
LE_STA_STANDBY, //standby
LE_STA_ADVERTISING, //正在广播
LE_STA_CONNECTION, //已连接
*
**/
u8 ble_get_status(void);
/**
* @brief 判断BLE是否已经链接
* @return true表示已连接false断开
*
**/
bool ble_is_connect(void);
/**
* @brief 获取当前MTU值
* @return 返回MTU
*
**/
u16 ble_get_gatt_mtu(void);
/**
* @brief 设置广播间隔时间
* 注意单位是625us
* @param[in] interval 参数数据范围是32 到 16384
*
**/
void ble_set_adv_interval(u16 interval);
/**
* @brief 使能广播
*
*
**/
void ble_enable_adv(void);
/**
* @brief 关闭广播
*
*
**/
void ble_disable_adv(void);
/**
* @brief 断开BLE连接
*
*
**/
void ble_disconnect(void);
/**
* @brief 往手机(client)端发送数据
注: 发送的数据长度不能超过MTU设置可以通过ble_get_gatt_mtu函数获取。
* @param[in] index GATT初始化的时候返回的一个ID在ble_gatts_characteristic_add_do函数里有返回
* @param[in] buf 发送数据的buff
* @param[len] buf 发送数据的长度
* @return[int] 0: 成功
0x0C: APP没打开client_config或发送的数据大于MTU或BLE没连接
0x57: 内部缓存已满
0x56发送数据为空指针或发送数据大小超过init设置的(txpkt_init函数的buf_size参数)
*
**/
int ble_tx_notify(u8 index, u8* buf, u16 len);
/**
* @brief 更新连接间隔
注:
* @param[in] interval 连接间隔1.25ms为单位;最大和最小连接间隔设置为一样了
* @param[in] latency 潜伏时间 可跳过多少事件
* @param[len] timeout 超时时间 10ms为单位
*
**/
void ble_update_conn_param(u16 interval, u16 latency, u16 timeout);
/**
* @brief 主动设置广播数据
注: 意思可以在广播过程中,更改广播数据
* @param[in] adv_buf 广播数据buff
* @param[in] size 数据大小最大31字节
* return : ture 成功
**/
bool ble_set_adv_data(const u8 *adv_buf, u32 size);
/**
* @brief 主动设置扫描响应数据
注: 意思可以在广播过程中,更改扫描相应
* @param[in] scan_rsp_buf 数据buff
* @param[in] size 数据大小最大31字节
* return : ture 成功
**/
bool ble_set_scan_rsp_data(const u8 *scan_rsp_buf, u32 size);
/**
* @brief 添加服务初始化函数
客户一般不需要直接调用SDK默认引用好了
* @param[in] profile_table : 存储profile的buuff
* @param[in] profile_table_size : profile_table大小
* @param[in] cb_info_table_p回调结构体
* @param[in] gatt_max_attGATT数量的最多需求
**/
void ble_gatts_init(uint8_t *profile_table, uint16_t profile_table_size,
ble_gatt_characteristic_cb_info_t **cb_info_table_p,
uint16_t gatt_max_att);
/**
* @brief 添加服务函数
* @param[in] service_type BLE_GATTS_SRVC_TYPE_PRIMARY BLE_GATTS_SRVC_TYPE_SEVONDARY BLE_GATTS_SRVC_TYPE_INCLUDE一种
* @param[in] service_uuid UUID数据
* @param[in] uuid_type UUID类型指16bit还是128bit类型
* @param[in] service_handle 用这个位置去获取当前分配的handle
**/
int ble_gatts_service_add(ble_gatts_service_type service_type, const uint8_t *service_uuid, ble_gatts_uuid_type uuid_type, uint8_t *service_handle);
/**
* @brief 添加特征值函数
* @param[in] att_uuid GATT的UUID
* @param[in] uuid_type UUID类型指16bit还是128bit类型
* @param[in] props 读写权限
* @param[in] att_handle 用这个位置去获取当前分配的handle 可以填NULL
* @param[in] cb_info 回调信息,存放读写回调函数等
**/
int ble_gatts_characteristic_add( const uint8_t *att_uuid, ble_gatts_uuid_type uuid_type, uint16_t props,
uint16_t *att_handle, ble_gatt_characteristic_cb_info_t *cb_info);
/**
* @brief 检测BLE Notify的缓存是否满了
* @param[in] rsvd_num 这个参数的意思是这样的比如您设置1如果蓝牙底层可以用来缓存的数量小于或等于1就返回1表示满了。
* 这个作用的目的是方便客户预留固定数量的force数量举个栗子有两个GATT一个是Notify状态的一个是Notfiy 音频数据的,由于音频数据大
* 会有机会把协议栈填满导致没有buff给Notify状态使用了所以就引出这个函数用来给音频发送前使用设置为1则可以保证每次至少有1个buff给Notify那边
* 而不至于阻塞;
* return : 1表示设置数量满了0没满
**/
bool is_le_buff_full(uint rsvd_num);
/**
* @brief ams复位设备端控制手机端播放暂停等
* opcode: 0播放1暂停2播放暂停3下一曲4上一去5音量+6音量-详细参考AMS服务
*/
void ble_ams_remote_ctrl(uint8_t opcode);
/**
* @brief 发起ancs连接(不可与ble_bt_connect交叉使用)
*/
void ble_ancs_start(void);
/**
* @brief 断开ancs连接(不可与ble_bt_connect交叉使用)
*/
void ble_ancs_stop(void);
/**
* @brief ANCS Pefrom Notifction Action
* 控制手机端的操作,比如来电可以控制是否接听,拒接等
* uid: 通信连接ID可以通过ANCS回调获取用于保证是在同一个事件上
* opcode: 0 确认(接听) 1否定(拒接)
*/
void ble_ancs_remote_action(uint32_t uid, bool opcode);
// HFP相关接口
bool hfp_hf_is_company_apple(void); //判断当前连接设备是否为Apple
/*****************************************************************************
* BLE无连接广播相关通道0与BLE连接相互独立
*****************************************************************************/
#define BLE_ADV0_EN_BIT 0x01
#define BLE_ADV0_MS_VAR_BIT 0x02
#define BLE_ADV0_ADDR_PUBIC_BIT 0x04
uint8_t ble_adv0_get_adv_en(void);
void ble_adv0_set_ctrl(uint opcode); //0=关闭广播, 1=打开广播, 2=更新广播数据打开时直接广播关闭时仅更新buffer
#endif