mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-08-27 20:30:03 +00:00
apps/bttester: Add support for discovering all primary services
This commit is contained in:
@@ -414,6 +414,16 @@ struct gatt_descriptor {
|
||||
|
||||
#define GATT_EXCHANGE_MTU 0x0a
|
||||
|
||||
#define GATT_DISC_ALL_PRIM_SVCS 0x0b
|
||||
struct gatt_disc_all_prim_svcs_cmd {
|
||||
u8_t address_type;
|
||||
u8_t address[6];
|
||||
} __packed;
|
||||
struct gatt_disc_all_prim_svcs_rp {
|
||||
u8_t services_count;
|
||||
struct gatt_service services[0];
|
||||
} __packed;
|
||||
|
||||
#define GATT_DISC_PRIM_UUID 0x0c
|
||||
struct gatt_disc_prim_uuid_cmd {
|
||||
u8_t address_type;
|
||||
|
||||
@@ -387,6 +387,7 @@ static void supported_commands(u8_t *data, u16_t len)
|
||||
tester_set_bit(cmds, GATT_START_SERVER);
|
||||
tester_set_bit(cmds, GATT_SET_ENC_KEY_SIZE);
|
||||
tester_set_bit(cmds, GATT_EXCHANGE_MTU);
|
||||
tester_set_bit(cmds, GATT_DISC_ALL_PRIM_SVCS);
|
||||
tester_set_bit(cmds, GATT_DISC_PRIM_UUID);
|
||||
tester_set_bit(cmds, GATT_FIND_INCLUDED);
|
||||
tester_set_bit(cmds, GATT_DISC_ALL_CHRC);
|
||||
@@ -900,11 +901,12 @@ static int disc_prim_uuid_cb(uint16_t conn_handle,
|
||||
struct gatt_service *service;
|
||||
const ble_uuid_any_t *uuid;
|
||||
u8_t uuid_length;
|
||||
u8_t opcode = (u8_t) (int) arg;
|
||||
|
||||
SYS_LOG_DBG("");
|
||||
|
||||
if (error->status != 0) {
|
||||
tester_send(BTP_SERVICE_ID_GATT, GATT_DISC_PRIM_UUID,
|
||||
tester_send(BTP_SERVICE_ID_GATT, opcode,
|
||||
CONTROLLER_INDEX, gatt_buf.buf, gatt_buf.len);
|
||||
discover_destroy();
|
||||
return 0;
|
||||
@@ -915,7 +917,7 @@ static int disc_prim_uuid_cb(uint16_t conn_handle,
|
||||
|
||||
service = gatt_buf_reserve(sizeof(*service) + uuid_length);
|
||||
if (!service) {
|
||||
tester_rsp(BTP_SERVICE_ID_GATT, GATT_DISC_PRIM_UUID,
|
||||
tester_rsp(BTP_SERVICE_ID_GATT, opcode,
|
||||
CONTROLLER_INDEX, BTP_STATUS_FAILED);
|
||||
discover_destroy();
|
||||
return BLE_HS_EDONE;
|
||||
@@ -939,6 +941,36 @@ static int disc_prim_uuid_cb(uint16_t conn_handle,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void disc_all_prim_svcs(u8_t *data, u16_t len)
|
||||
{
|
||||
struct ble_gap_conn_desc conn;
|
||||
int rc;
|
||||
|
||||
SYS_LOG_DBG("");
|
||||
|
||||
rc = ble_gap_conn_find_by_addr((ble_addr_t *)data, &conn);
|
||||
if (rc) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!gatt_buf_reserve(sizeof(struct gatt_disc_all_prim_svcs_rp))) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (ble_gattc_disc_all_svcs(conn.conn_handle,
|
||||
disc_prim_uuid_cb,
|
||||
(void *) GATT_DISC_ALL_PRIM_SVCS)) {
|
||||
discover_destroy();
|
||||
goto fail;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
fail:
|
||||
tester_rsp(BTP_SERVICE_ID_GATT, GATT_DISC_ALL_PRIM_SVCS,
|
||||
CONTROLLER_INDEX, BTP_STATUS_FAILED);
|
||||
}
|
||||
|
||||
static void disc_prim_uuid(u8_t *data, u16_t len)
|
||||
{
|
||||
const struct gatt_disc_prim_uuid_cmd *cmd = (void *) data;
|
||||
@@ -961,8 +993,9 @@ static void disc_prim_uuid(u8_t *data, u16_t len)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (ble_gattc_disc_svc_by_uuid(conn.conn_handle, &uuid.u,
|
||||
disc_prim_uuid_cb, NULL)) {
|
||||
if (ble_gattc_disc_svc_by_uuid(conn.conn_handle,
|
||||
&uuid.u, disc_prim_uuid_cb,
|
||||
(void *) GATT_DISC_PRIM_UUID)) {
|
||||
discover_destroy();
|
||||
goto fail;
|
||||
}
|
||||
@@ -2096,6 +2129,9 @@ void tester_handle_gatt(u8_t opcode, u8_t index, u8_t *data,
|
||||
case GATT_EXCHANGE_MTU:
|
||||
exchange_mtu(data, len);
|
||||
return;
|
||||
case GATT_DISC_ALL_PRIM_SVCS:
|
||||
disc_all_prim_svcs(data, len);
|
||||
return;
|
||||
case GATT_DISC_PRIM_UUID:
|
||||
disc_prim_uuid(data, len);
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user