333 lines
11 KiB
C
333 lines
11 KiB
C
#include "app_config.h"
|
||
#include "btcontroller_config.h"
|
||
#include "btctrler/btctrler_task.h"
|
||
#include "btstack/btstack_task.h"
|
||
#include "btstack/le/att.h"
|
||
#include "btstack/le/le_user.h"
|
||
#include "btstack/avctp_user.h"
|
||
#include "bt_common.h"
|
||
#include "le_common.h"
|
||
#include "le_net_central.h"
|
||
#include "event/bt_event.h"
|
||
#include "syscfg/syscfg_id.h"
|
||
#include "../multi_demo/le_multi_common.h"
|
||
|
||
/* const int config_update_mode = 0; */
|
||
void (*lmp_ch_update_resume_hdl)(void *priv) = NULL;
|
||
|
||
void bt_ble_module_init(void)
|
||
{
|
||
void lmp_set_sniff_disable(void);
|
||
lmp_set_sniff_disable();
|
||
|
||
bt_max_pwr_set(8, 6, 6, 6); //0-11
|
||
|
||
#if TCFG_USER_BLE_ENABLE
|
||
u8 tmp_ble_addr[6];
|
||
extern const u8 *bt_get_mac_addr(void);
|
||
extern void lib_make_ble_address(u8 * ble_address, u8 * edr_address);
|
||
extern int le_controller_set_mac(void *addr);
|
||
lib_make_ble_address(tmp_ble_addr, (u8 *)bt_get_mac_addr());
|
||
le_controller_set_mac((void *)tmp_ble_addr);
|
||
printf("\n-----edr + ble 's address-----");
|
||
put_buf((void *)bt_get_mac_addr(), 6);
|
||
put_buf((void *)tmp_ble_addr, 6);
|
||
#if BT_NET_CENTRAL_EN || TRANS_MULTI_BLE_MASTER_NUMS
|
||
extern void ble_client_config_init(void);
|
||
ble_client_config_init();
|
||
#endif
|
||
#endif
|
||
|
||
btstack_init();
|
||
}
|
||
|
||
static int bt_connction_status_event_handler(struct bt_event *bt)
|
||
{
|
||
switch (bt->event) {
|
||
case BT_STATUS_INIT_OK:
|
||
#if TRANS_MULTI_BLE_EN
|
||
bt_ble_init();
|
||
#else
|
||
|
||
#if BT_NET_CENTRAL_EN
|
||
extern void bt_master_ble_init(void);
|
||
bt_master_ble_init();
|
||
#endif
|
||
#if TRANS_DATA_EN
|
||
bt_ble_init();
|
||
#endif
|
||
#if BT_NET_HID_EN
|
||
extern void ble_module_enable(u8 en);
|
||
extern void ble_hid_set_config(void);
|
||
ble_hid_set_config();
|
||
bt_ble_init();
|
||
#endif
|
||
#if CONFIG_BLE_MESH_ENABLE
|
||
extern void bt_ble_mesh_init(void);
|
||
bt_ble_mesh_init();
|
||
#endif
|
||
|
||
#endif
|
||
break;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
int ble_demo_bt_event_handler(struct sys_event *event)
|
||
{
|
||
if (event->from == BT_EVENT_FROM_CON) {
|
||
return bt_connction_status_event_handler((struct bt_event *)event->payload);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
#if BT_NET_CENTRAL_EN || TRANS_MULTI_BLE_MASTER_NUMS
|
||
|
||
//用户需要填写以下过滤规则,填写错误会出现一直连接不上的情况
|
||
//指定搜索uuid
|
||
static const target_uuid_t search_uuid_table[] = {
|
||
|
||
// for uuid16
|
||
// PRIMARY_SERVICE, ae80
|
||
// CHARACTERISTIC, ae81, WRITE_WITHOUT_RESPONSE | DYNAMIC,
|
||
// CHARACTERISTIC, ae82, NOTIFY,
|
||
|
||
{
|
||
.services_uuid16 = 0xae80,
|
||
.characteristic_uuid16 = 0xae81,
|
||
.opt_type = ATT_PROPERTY_WRITE_WITHOUT_RESPONSE,
|
||
},
|
||
|
||
{
|
||
.services_uuid16 = 0xae80,
|
||
.characteristic_uuid16 = 0xae82,
|
||
.opt_type = ATT_PROPERTY_NOTIFY,
|
||
},
|
||
|
||
{
|
||
.services_uuid16 = 0xae00, // 6901A
|
||
.characteristic_uuid16 = 0xae01,
|
||
.opt_type = ATT_PROPERTY_WRITE_WITHOUT_RESPONSE,
|
||
},
|
||
|
||
{
|
||
.services_uuid16 = 0xae00, // 6901A
|
||
.characteristic_uuid16 = 0xae01,
|
||
.opt_type = ATT_PROPERTY_NOTIFY,
|
||
},
|
||
|
||
//for uuid128,sample
|
||
// PRIMARY_SERVICE, 0000F530-1212-EFDE-1523-785FEABCD123
|
||
// CHARACTERISTIC, 0000F531-1212-EFDE-1523-785FEABCD123, NOTIFY,
|
||
// CHARACTERISTIC, 0000F532-1212-EFDE-1523-785FEABCD123, WRITE_WITHOUT_RESPONSE | DYNAMIC,
|
||
/*
|
||
{
|
||
.services_uuid16 = 0,
|
||
.services_uuid128 = {0x00,0x00,0xF5,0x30 ,0x12,0x12 ,0xEF, 0xDE ,0x15,0x23 ,0x78,0x5F,0xEA ,0xBC,0xD1,0x23} ,
|
||
.characteristic_uuid16 = 0,
|
||
.characteristic_uuid128 = {0x00,0x00,0xF5,0x31 ,0x12,0x12 ,0xEF, 0xDE ,0x15,0x23 ,0x78,0x5F,0xEA ,0xBC,0xD1,0x23},
|
||
.opt_type = ATT_PROPERTY_NOTIFY,
|
||
},
|
||
|
||
{
|
||
.services_uuid16 = 0,
|
||
.services_uuid128 = {0x00,0x00,0xF5,0x30 ,0x12,0x12 ,0xEF, 0xDE ,0x15,0x23 ,0x78,0x5F,0xEA ,0xBC,0xD1,0x23} ,
|
||
.characteristic_uuid16 = 0,
|
||
.characteristic_uuid128 = {0x00,0x00,0xF5,0x32 ,0x12,0x12 ,0xEF, 0xDE ,0x15,0x23 ,0x78,0x5F,0xEA ,0xBC,0xD1,0x23},
|
||
.opt_type = ATT_PROPERTY_WRITE_WITHOUT_RESPONSE,
|
||
},
|
||
*/
|
||
};
|
||
|
||
static void ble_report_data_deal(att_data_report_t *report_data, const target_uuid_t *search_uuid)
|
||
{
|
||
log_i("report_data:%02x,%02x,%d,len(%d)", report_data->packet_type,
|
||
report_data->value_handle, report_data->value_offset, report_data->blob_length);
|
||
|
||
put_buf(report_data->blob, report_data->blob_length);
|
||
|
||
//处理接收数据
|
||
|
||
switch (report_data->packet_type) {
|
||
case GATT_EVENT_NOTIFICATION: //notify
|
||
break;
|
||
|
||
case GATT_EVENT_INDICATION://indicate
|
||
case GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT://read
|
||
break;
|
||
|
||
case GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT://read long
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
static const struct ble_client_operation_t *ble_client_api;
|
||
static const u8 test_remoter_name1[] = "JL-AC79XX-AF0B(BLE)";//
|
||
static const u8 test_remoter_name2[] = "6901toy211-ble";//
|
||
static u16 ble_client_write_handle;
|
||
|
||
static const client_match_cfg_t match_dev01 = {
|
||
.create_conn_mode = BIT(CLI_CREAT_BY_NAME),
|
||
.compare_data_len = sizeof(test_remoter_name1) - 1, //去结束符
|
||
.compare_data = test_remoter_name1,
|
||
.bonding_flag = 0,
|
||
};
|
||
|
||
static const client_match_cfg_t match_dev02 = {
|
||
.create_conn_mode = BIT(CLI_CREAT_BY_NAME),
|
||
.compare_data_len = sizeof(test_remoter_name2) - 1, //去结束符
|
||
.compare_data = test_remoter_name2,
|
||
.bonding_flag = 0,
|
||
};
|
||
|
||
static const unsigned char test_data[] = {
|
||
0x4A, 0x4C, 0x00, 0x21, 0x10, 0x01,
|
||
0x7B, 0x22, 0x73, 0x73, 0x69, 0x64, 0x22, 0x3A, 0x22, 0x49, 0x54,
|
||
0x22, 0x2C, 0x22, 0x70, 0x61, 0x73, 0x73, 0x22, 0x3A, 0x22, 0x31, 0x32, 0x33, 0x34,
|
||
0x35, 0x36, 0x37, 0x38, 0x22, 0x7D,
|
||
0x64, 0xCF, 0xFF
|
||
};
|
||
|
||
static void client_event_callback(le_client_event_e event, u8 *packet, int size)
|
||
{
|
||
switch (event) {
|
||
case CLI_EVENT_MATCH_DEV:
|
||
log_i("match_name:%s\n", ((client_match_cfg_t *)packet)->compare_data);
|
||
break;
|
||
|
||
case CLI_EVENT_MATCH_UUID:
|
||
;
|
||
opt_handle_t *opt_hdl = (opt_handle_t *)packet;
|
||
if (opt_hdl->search_uuid == &search_uuid_table[0]) {
|
||
ble_client_write_handle = opt_hdl->value_handle;
|
||
log_i("match_uuid\n");
|
||
}
|
||
break;
|
||
|
||
case CLI_EVENT_SEARCH_PROFILE_COMPLETE:
|
||
log_i("CLI_EVENT_SEARCH_PROFILE_COMPLETE\n");
|
||
//可以开始发送数据
|
||
#if TRANS_MULTI_BLE_MASTER_NUMS
|
||
for (int i = 0; i < TRANS_MULTI_BLE_MASTER_NUMS; i++) {
|
||
u16 tmp_handle = mul_dev_get_conn_handle(i, MULTI_ROLE_CLIENT);
|
||
if (tmp_handle) {
|
||
ble_client_api->opt_comm_send_ext(tmp_handle, ble_client_write_handle, (u8 *)test_data, sizeof(test_data), ATT_OP_WRITE_WITHOUT_RESPOND);
|
||
}
|
||
}
|
||
#else
|
||
//发送测试数据
|
||
if (ble_client_write_handle) {
|
||
ble_client_api->opt_comm_send(ble_client_write_handle, (u8 *)test_data, sizeof(test_data), ATT_OP_WRITE_WITHOUT_RESPOND);
|
||
}
|
||
#endif
|
||
break;
|
||
|
||
case CLI_EVENT_CONNECTED:
|
||
break;
|
||
|
||
case CLI_EVENT_DISCONNECT:
|
||
ble_client_write_handle = 0;
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
static const client_conn_cfg_t client_conn_config = {
|
||
.match_dev_cfg[0] = &match_dev01,
|
||
.match_dev_cfg[1] = &match_dev02,
|
||
.report_data_callback = ble_report_data_deal,
|
||
/* .search_uuid_cnt = 0, //配置不搜索profile,加快回连速度 */
|
||
.search_uuid_cnt = (sizeof(search_uuid_table) / sizeof(target_uuid_t)),
|
||
.search_uuid_table = search_uuid_table,
|
||
.security_en = 0,
|
||
.event_callback = client_event_callback,
|
||
};
|
||
|
||
void ble_client_config_init(void)
|
||
{
|
||
ble_client_api = ble_get_client_operation_table();
|
||
ble_client_api->init_config(0, (void *)&client_conn_config);
|
||
/* client_clear_bonding_info();//for test */
|
||
}
|
||
|
||
#endif
|
||
|
||
#if BT_NET_HID_EN
|
||
|
||
#include "standard_hid.h"
|
||
|
||
static const u8 hid_descriptor_keyboard_boot_mode[] = {
|
||
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
|
||
0x09, 0x06, // Usage (Keyboard)
|
||
0xA1, 0x01, // Collection (Application)
|
||
0x85, 0x01, // Report ID (1)
|
||
0x05, 0x07, // Usage Page (Kbrd/Keypad)
|
||
0x19, 0xE0, // Usage Minimum (0xE0)
|
||
0x29, 0xE7, // Usage Maximum (0xE7)
|
||
0x15, 0x00, // Logical Minimum (0)
|
||
0x25, 0x01, // Logical Maximum (1)
|
||
0x75, 0x01, // Report Size (1)
|
||
0x95, 0x08, // Report Count (8)
|
||
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
|
||
0x95, 0x01, // Report Count (1)
|
||
0x75, 0x08, // Report Size (8)
|
||
0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
|
||
0x95, 0x06, // Report Count (6)
|
||
0x75, 0x08, // Report Size (8)
|
||
0x15, 0x00, // Logical Minimum (0)
|
||
0x25, 0x65, // Logical Maximum (101)
|
||
0x05, 0x07, // Usage Page (Kbrd/Keypad)
|
||
0x19, 0x00, // Usage Minimum (0x00)
|
||
0x29, 0x65, // Usage Maximum (0x65)
|
||
0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
|
||
0x95, 0x05, // Report Count (5)
|
||
0x75, 0x01, // Report Size (1)
|
||
0x05, 0x08, // Usage Page (LEDs)
|
||
0x19, 0x01, // Usage Minimum (Num Lock)
|
||
0x29, 0x05, // Usage Maximum (Kana)
|
||
0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
|
||
0x95, 0x01, // Report Count (1)
|
||
0x75, 0x03, // Report Size (3)
|
||
0x91, 0x03, // Output (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
|
||
0xC0, // End Collection
|
||
};
|
||
|
||
//----------------------------------
|
||
#define KEYBOARD_REPORT_MAP \
|
||
USAGE_PAGE(CONSUMER_PAGE), \
|
||
USAGE(CONSUMER_CONTROL), \
|
||
COLLECTION(APPLICATION), \
|
||
REPORT_ID(1), \
|
||
USAGE(VOLUME_INC), \
|
||
USAGE(VOLUME_DEC), \
|
||
USAGE(PLAY_PAUSE), \
|
||
USAGE(MUTE), \
|
||
USAGE(SCAN_PREV_TRACK), \
|
||
USAGE(SCAN_NEXT_TRACK), \
|
||
USAGE(FAST_FORWARD), \
|
||
USAGE(REWIND), \
|
||
LOGICAL_MIN(0), \
|
||
LOGICAL_MAX(1), \
|
||
REPORT_SIZE(1), \
|
||
REPORT_COUNT(16), \
|
||
INPUT(0x02), \
|
||
END_COLLECTION, \
|
||
|
||
static const u8 hid_report_map[] = {KEYBOARD_REPORT_MAP};
|
||
|
||
void ble_hid_set_config(void)
|
||
{
|
||
le_hogp_set_icon(0x03c1);//ble keyboard demo
|
||
le_hogp_set_ReportMap(hid_descriptor_keyboard_boot_mode, sizeof(hid_descriptor_keyboard_boot_mode));
|
||
}
|
||
#endif
|
||
|
||
|