This is an automated email from the ASF dual-hosted git repository. kopyscinski pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
commit d5f1d55222724250c06ad55b78e5cf071fb4e283 Author: Ćukasz Rymanowski <[email protected]> AuthorDate: Thu Mar 12 13:23:49 2020 +0100 btshell: Add support for read multi variable --- apps/btshell/src/btshell.h | 10 +++++----- apps/btshell/src/cmd.c | 1 + apps/btshell/src/cmd_gatt.c | 9 ++++++++- apps/btshell/src/main.c | 43 ++++++++++++++++++++++++++++++++++++++----- 4 files changed, 52 insertions(+), 11 deletions(-) diff --git a/apps/btshell/src/btshell.h b/apps/btshell/src/btshell.h index 134eb016..021f54c8 100644 --- a/apps/btshell/src/btshell.h +++ b/apps/btshell/src/btshell.h @@ -100,22 +100,22 @@ int btshell_exchange_mtu(uint16_t conn_handle); int btshell_disc_svcs(uint16_t conn_handle); int btshell_disc_svc_by_uuid(uint16_t conn_handle, const ble_uuid_t *uuid); int btshell_disc_all_chrs(uint16_t conn_handle, uint16_t start_handle, - uint16_t end_handle); + uint16_t end_handle); int btshell_disc_all_chrs_in_svc(uint16_t conn_handle, struct btshell_svc *svc); int btshell_disc_chrs_by_uuid(uint16_t conn_handle, uint16_t start_handle, - uint16_t end_handle, const ble_uuid_t *uuid); + uint16_t end_handle, const ble_uuid_t *uuid); int btshell_disc_all_dscs(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle); int btshell_disc_full(uint16_t conn_handle); int btshell_find_inc_svcs(uint16_t conn_handle, uint16_t start_handle, - uint16_t end_handle); + uint16_t end_handle); int btshell_read(uint16_t conn_handle, uint16_t attr_handle); int btshell_read_long(uint16_t conn_handle, uint16_t attr_handle, uint16_t offset); int btshell_read_by_uuid(uint16_t conn_handle, uint16_t start_handle, - uint16_t end_handle, const ble_uuid_t *uuid); + uint16_t end_handle, const ble_uuid_t *uuid); int btshell_read_mult(uint16_t conn_handle, uint16_t *attr_handles, - int num_attr_handles); + int num_attr_handles, bool variable); int btshell_write(uint16_t conn_handle, uint16_t attr_handle, struct os_mbuf *om); int btshell_write_no_rsp(uint16_t conn_handle, uint16_t attr_handle, diff --git a/apps/btshell/src/cmd.c b/apps/btshell/src/cmd.c index 4148b8e8..22819219 100644 --- a/apps/btshell/src/cmd.c +++ b/apps/btshell/src/cmd.c @@ -3404,6 +3404,7 @@ static const struct shell_param gatt_read_params[] = { {"uuid", "read by uuid, usage: =[UUID]"}, {"start", "start handle, usage: =<UINT16>"}, {"end", "end handle, usage: =<UINT16>"}, + {"variable", "used in case of multi read, usage: =[0-1], default=0"}, {NULL, NULL} }; diff --git a/apps/btshell/src/cmd_gatt.c b/apps/btshell/src/cmd_gatt.c index ba3799e5..4c57b42d 100644 --- a/apps/btshell/src/cmd_gatt.c +++ b/apps/btshell/src/cmd_gatt.c @@ -238,6 +238,7 @@ cmd_gatt_read(int argc, char **argv) uint8_t num_attr_handles; int is_uuid; int is_long; + bool is_var; int rc; rc = parse_arg_all(argc - 1, argv + 1); @@ -259,6 +260,12 @@ cmd_gatt_read(int argc, char **argv) return rc; } + is_var = parse_arg_bool_dflt("variable", 0, &rc); + if (rc != 0) { + console_printf("invalid 'variable' parameter\n"); + return rc; + } + for (num_attr_handles = 0; num_attr_handles < CMD_READ_MAX_ATTRS; num_attr_handles++) { @@ -313,7 +320,7 @@ cmd_gatt_read(int argc, char **argv) rc = btshell_read(conn_handle, attr_handles[0]); } } else if (num_attr_handles > 1) { - rc = btshell_read_mult(conn_handle, attr_handles, num_attr_handles); + rc = btshell_read_mult(conn_handle, attr_handles, num_attr_handles, is_var); } else if (is_uuid) { if (start == 0 || end == 0) { rc = EINVAL; diff --git a/apps/btshell/src/main.c b/apps/btshell/src/main.c index 2df37191..4c4a6bb7 100644 --- a/apps/btshell/src/main.c +++ b/apps/btshell/src/main.c @@ -869,6 +869,35 @@ btshell_on_disc_d(uint16_t conn_handle, const struct ble_gatt_error *error, return 0; } +static int +btshell_on_read_var(uint16_t conn_handle, const struct ble_gatt_error *error, + struct ble_gatt_attr *attr, uint8_t num_attrs, void *arg) +{ + int i; + + switch (error->status) { + case 0: + console_printf("characteristic read; conn_handle=%d , number of attributes=%d\n", conn_handle, num_attrs); + + for (i = 0; i < num_attrs; i++) { + console_printf("\t attr_handle=%d, len=%d value=", + attr[i].handle, OS_MBUF_PKTLEN(attr[i].om)); + print_mbuf(attr[i].om); + console_printf("\n"); + } + break; + + case BLE_HS_EDONE: + console_printf("characteristic read complete\n"); + break; + + default: + btshell_print_error(NULL, conn_handle, error); + break; + } + + return 0; +} static int btshell_on_read(uint16_t conn_handle, const struct ble_gatt_error *error, @@ -1670,13 +1699,17 @@ btshell_read_by_uuid(uint16_t conn_handle, uint16_t start_handle, int btshell_read_mult(uint16_t conn_handle, uint16_t *attr_handles, - int num_attr_handles) + int num_attr_handles, bool variable) { - int rc; + if (variable) { + return ble_gattc_read_mult_var(conn_handle, attr_handles, num_attr_handles, + btshell_on_read_var, NULL); + } + + return ble_gattc_read_mult(conn_handle, attr_handles, + num_attr_handles, + btshell_on_read, NULL); - rc = ble_gattc_read_mult(conn_handle, attr_handles, num_attr_handles, - btshell_on_read, NULL); - return rc; } int
