apps/btshell: Convert to parse_arg module

Mkae use of common argument parsing code.
This commit is contained in:
Szymon Janc
2023-09-25 11:08:37 +02:00
parent 57cdc5c1c2
commit a161f0abcd
6 changed files with 89 additions and 742 deletions
+1
View File
@@ -29,6 +29,7 @@ pkg.deps:
- "@apache-mynewt-core/sys/stats"
- "@apache-mynewt-core/sys/console"
- "@apache-mynewt-core/sys/shell"
- "@apache-mynewt-core/util/parse_arg"
- nimble/host
- nimble/host/services/gap
- nimble/host/services/gatt
+61 -61
View File
@@ -69,7 +69,7 @@ cmd_parse_conn_start_end(uint16_t *out_conn, uint16_t *out_start,
return 0;
}
static const struct kv_pair cmd_own_addr_types[] = {
static const struct parse_arg_kv_pair cmd_own_addr_types[] = {
{ "public", BLE_OWN_ADDR_PUBLIC },
{ "random", BLE_OWN_ADDR_RANDOM },
{ "rpa_pub", BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT },
@@ -77,7 +77,7 @@ static const struct kv_pair cmd_own_addr_types[] = {
{ NULL }
};
static const struct kv_pair cmd_peer_addr_types[] = {
static const struct parse_arg_kv_pair cmd_peer_addr_types[] = {
{ "public", BLE_ADDR_PUBLIC },
{ "random", BLE_ADDR_RANDOM },
{ "public_id", BLE_ADDR_PUBLIC_ID },
@@ -85,7 +85,7 @@ static const struct kv_pair cmd_peer_addr_types[] = {
{ NULL }
};
static const struct kv_pair cmd_addr_type[] = {
static const struct parse_arg_kv_pair cmd_addr_type[] = {
{ "public", BLE_ADDR_PUBLIC },
{ "random", BLE_ADDR_RANDOM },
{ NULL }
@@ -93,7 +93,7 @@ static const struct kv_pair cmd_addr_type[] = {
static int
parse_dev_addr(const char *prefix, const struct kv_pair *addr_types,
parse_dev_addr(const char *prefix, const struct parse_arg_kv_pair *addr_types,
ble_addr_t *addr)
{
char name[32];
@@ -115,7 +115,7 @@ parse_dev_addr(const char *prefix, const struct kv_pair *addr_types,
}
written += rc;
rc = parse_arg_addr(name, addr);
rc = parse_arg_ble_addr(name, addr);
if (rc == ENOENT) {
/* not found */
return rc;
@@ -153,7 +153,7 @@ parse_dev_addr(const char *prefix, const struct kv_pair *addr_types,
/*****************************************************************************
* $advertise *
*****************************************************************************/
static const struct kv_pair cmd_adv_filt_types[] = {
static const struct parse_arg_kv_pair cmd_adv_filt_types[] = {
{ "none", BLE_HCI_ADV_FILT_NONE },
{ "scan", BLE_HCI_ADV_FILT_SCAN },
{ "conn", BLE_HCI_ADV_FILT_CONN },
@@ -162,7 +162,7 @@ static const struct kv_pair cmd_adv_filt_types[] = {
};
#if MYNEWT_VAL(BLE_EXT_ADV)
static struct kv_pair cmd_ext_adv_phy_opts[] = {
static struct parse_arg_kv_pair cmd_ext_adv_phy_opts[] = {
{ "1M", 0x01 },
{ "2M", 0x02 },
{ "coded", 0x03 },
@@ -177,7 +177,7 @@ cmd_advertise_configure(int argc, char **argv)
uint8_t instance;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -338,7 +338,7 @@ cmd_advertise_set_addr(int argc, char **argv)
uint8_t instance;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -349,7 +349,7 @@ cmd_advertise_set_addr(int argc, char **argv)
return rc;
}
rc = parse_arg_mac("addr", addr.val);
rc = parse_arg_mac_addr("addr", addr.val);
if (rc != 0) {
console_printf("invalid 'addr' parameter\n");
return rc;
@@ -375,7 +375,7 @@ cmd_advertise_start(int argc, char **argv)
bool restart;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -419,7 +419,7 @@ cmd_advertise_stop(int argc, char **argv)
uint8_t instance;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -445,7 +445,7 @@ cmd_advertise_remove(int argc, char **argv)
uint8_t instance;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -546,14 +546,14 @@ static const struct shell_cmd_help advertise_remove_help = {
#endif
#else
static const struct kv_pair cmd_adv_conn_modes[] = {
static const struct parse_arg_kv_pair cmd_adv_conn_modes[] = {
{ "non", BLE_GAP_CONN_MODE_NON },
{ "und", BLE_GAP_CONN_MODE_UND },
{ "dir", BLE_GAP_CONN_MODE_DIR },
{ NULL }
};
static const struct kv_pair cmd_adv_disc_modes[] = {
static const struct parse_arg_kv_pair cmd_adv_disc_modes[] = {
{ "non", BLE_GAP_DISC_MODE_NON },
{ "ltd", BLE_GAP_DISC_MODE_LTD },
{ "gen", BLE_GAP_DISC_MODE_GEN },
@@ -571,7 +571,7 @@ cmd_advertise(int argc, char **argv)
bool restart;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -699,7 +699,7 @@ static const struct shell_cmd_help advertise_help = {
* $connect *
*****************************************************************************/
static struct kv_pair cmd_ext_conn_phy_opts[] = {
static struct parse_arg_kv_pair cmd_ext_conn_phy_opts[] = {
{ "none", 0x00 },
{ "1M", 0x01 },
{ "coded", 0x02 },
@@ -721,7 +721,7 @@ cmd_connect(int argc, char **argv)
int own_addr_type;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -1014,7 +1014,7 @@ cmd_disconnect(int argc, char **argv)
uint8_t reason;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -1117,7 +1117,7 @@ cmd_set_scan_opts(int argc, char **argv)
char *name_filter;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -1173,7 +1173,7 @@ static const struct shell_cmd_help set_scan_opts_help = {
* $scan *
*****************************************************************************/
static const struct kv_pair cmd_scan_filt_policies[] = {
static const struct parse_arg_kv_pair cmd_scan_filt_policies[] = {
{ "no_wl", BLE_HCI_SCAN_FILT_NO_WL },
{ "use_wl", BLE_HCI_SCAN_FILT_USE_WL },
{ "no_wl_inita", BLE_HCI_SCAN_FILT_NO_WL_INITA },
@@ -1181,7 +1181,7 @@ static const struct kv_pair cmd_scan_filt_policies[] = {
{ NULL }
};
static struct kv_pair cmd_scan_ext_types[] = {
static struct parse_arg_kv_pair cmd_scan_ext_types[] = {
{ "none", 0x00 },
{ "1M", 0x01 },
{ "coded", 0x02 },
@@ -1204,7 +1204,7 @@ cmd_scan(int argc, char **argv)
uint16_t period;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -1428,7 +1428,7 @@ cmd_set(int argc, char **argv)
int good = 0;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -1544,11 +1544,11 @@ cmd_set_adv_data_or_scan_rsp(int argc, char **argv, bool scan_rsp,
int8_t eddystone_measured_power = 0;
char eddystone_url_body[BLE_EDDYSTONE_URL_MAX_LEN];
char *eddystone_url_full;
int svc_data_uuid16_len;
int svc_data_uuid32_len;
int svc_data_uuid128_len;
int uri_len;
int mfg_data_len;
unsigned int svc_data_uuid16_len;
unsigned int svc_data_uuid32_len;
unsigned int svc_data_uuid128_len;
unsigned int uri_len;
unsigned int mfg_data_len;
int tmp;
int rc;
#if MYNEWT_VAL(BLE_EXT_ADV)
@@ -1566,7 +1566,7 @@ cmd_set_adv_data_or_scan_rsp(int argc, char **argv, bool scan_rsp,
memset(&adv_fields, 0, sizeof adv_fields);
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -1753,9 +1753,9 @@ cmd_set_adv_data_or_scan_rsp(int argc, char **argv, bool scan_rsp,
return rc;
}
rc = parse_arg_byte_stream("service_data_uuid128",
rc = parse_arg_byte_stream_custom("service_data_uuid128", ":-",
CMD_ADV_DATA_SVC_DATA_UUID128_MAX_LEN,
svc_data_uuid128, &svc_data_uuid128_len);
svc_data_uuid128, 0, &svc_data_uuid128_len);
if (rc == 0) {
adv_fields.svc_data_uuid128 = svc_data_uuid128;
adv_fields.svc_data_uuid128_len = svc_data_uuid128_len;
@@ -1932,7 +1932,7 @@ cmd_set_priv_mode(int argc, char **argv)
uint8_t priv_mode;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -1980,7 +1980,7 @@ cmd_white_list(int argc, char **argv)
int addrs_cnt;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -2036,7 +2036,7 @@ cmd_conn_rssi(int argc, char **argv)
int8_t rssi;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -2082,7 +2082,7 @@ cmd_conn_update_params(int argc, char **argv)
uint16_t conn_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -2176,7 +2176,7 @@ cmd_conn_datalen(int argc, char **argv)
uint16_t tx_time;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -2229,7 +2229,7 @@ static const struct shell_cmd_help conn_datalen_help = {
* keystore *
*****************************************************************************/
static const struct kv_pair cmd_keystore_entry_type[] = {
static const struct parse_arg_kv_pair cmd_keystore_entry_type[] = {
{ "msec", BLE_STORE_OBJ_TYPE_PEER_SEC },
{ "ssec", BLE_STORE_OBJ_TYPE_OUR_SEC },
{ "cccd", BLE_STORE_OBJ_TYPE_CCCD },
@@ -2327,7 +2327,7 @@ cmd_keystore_add(int argc, char **argv)
int obj_type;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -2391,7 +2391,7 @@ cmd_keystore_del(int argc, char **argv)
int obj_type;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -2480,7 +2480,7 @@ cmd_keystore_show(int argc, char **argv)
int type;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -2546,7 +2546,7 @@ cmd_auth_passkey(int argc, char **argv)
char *yesno;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -2666,7 +2666,7 @@ cmd_security_pair(int argc, char **argv)
uint16_t conn_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -2710,7 +2710,7 @@ cmd_security_unpair(int argc, char **argv)
int rc;
int oldest;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -2767,7 +2767,7 @@ cmd_security_start(int argc, char **argv)
uint16_t conn_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -2815,7 +2815,7 @@ cmd_security_encryption(int argc, char **argv)
int rc;
int auth;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -2896,7 +2896,7 @@ cmd_security_set_data(int argc, char **argv)
good = 0;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -3010,7 +3010,7 @@ cmd_test_tx(int argc, char **argv)
uint16_t num;
uint8_t stop;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -3087,7 +3087,7 @@ cmd_phy_set(int argc, char **argv)
uint16_t phy_opts;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -3147,7 +3147,7 @@ cmd_phy_set_default(int argc, char **argv)
uint8_t rx_phys_mask;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -3193,7 +3193,7 @@ cmd_phy_read(int argc, char **argv)
uint8_t rx_phy;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -3634,7 +3634,7 @@ cmd_periodic_configure(int argc, char **argv)
uint8_t instance;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -3690,7 +3690,7 @@ cmd_periodic_start(int argc, char **argv)
uint8_t instance;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -3716,7 +3716,7 @@ cmd_periodic_stop(int argc, char **argv)
uint8_t instance;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -3783,7 +3783,7 @@ cmd_sync_create(int argc, char **argv)
uint8_t sid;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -3868,7 +3868,7 @@ cmd_sync_transfer(int argc, char **argv)
uint16_t sync_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -3907,7 +3907,7 @@ cmd_sync_reporting(int argc, char **argv)
bool enable;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -3968,7 +3968,7 @@ cmd_sync_transfer_set_info(int argc, char **argv)
uint8_t instance;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -4023,7 +4023,7 @@ cmd_sync_transfer_receive(int argc, char **argv)
bool disable;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -4100,7 +4100,7 @@ cmd_sync_terminate(int argc, char **argv)
uint16_t sync_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -4138,7 +4138,7 @@ cmd_sync_stats(int argc, char **argv)
uint16_t sync_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
+5 -35
View File
@@ -22,44 +22,14 @@
#include <inttypes.h>
#include "host/ble_uuid.h"
#include <parse_arg/parse_arg.h>
struct kv_pair {
char *key;
int val;
};
uint32_t parse_arg_time_dflt(char *name, int step, uint32_t dflt, int *out_status);
const struct kv_pair *parse_kv_find(const struct kv_pair *kvs, char *name);
int parse_arg_find_idx(const char *key);
char *parse_arg_extract(const char *key);
long parse_arg_long_bounds(char *name, long min, long max, int *out_status);
long parse_arg_long_bounds_dflt(char *name, long min, long max,
long dflt, int *out_status);
uint64_t parse_arg_uint64_bounds(char *name, uint64_t min,
uint64_t max, int *out_status);
long parse_arg_long(char *name, int *staus);
uint8_t parse_arg_bool(char *name, int *status);
uint8_t parse_arg_bool_dflt(char *name, uint8_t dflt, int *out_status);
uint8_t parse_arg_uint8(char *name, int *status);
uint8_t parse_arg_uint8_dflt(char *name, uint8_t dflt, int *out_status);
uint16_t parse_arg_uint16(char *name, int *status);
uint16_t parse_arg_uint16_dflt(char *name, uint16_t dflt, int *out_status);
uint32_t parse_arg_uint32(char *name, int *out_status);
uint32_t parse_arg_uint32_dflt(char *name, uint32_t dflt, int *out_status);
uint64_t parse_arg_uint64(char *name, int *out_status);
int parse_arg_kv(char *name, const struct kv_pair *kvs, int *out_status);
int parse_arg_kv_dflt(char *name, const struct kv_pair *kvs, int def_val,
int *out_status);
int parse_arg_byte_stream(char *name, int max_len, uint8_t *dst, int *out_len);
int parse_arg_uint8_list_with_separator(char *name, char *separator, int max_len,
uint8_t *dst, int *out_len);
int parse_arg_byte_stream_exact_length(char *name, uint8_t *dst, int len);
int parse_arg_mac(char *name, uint8_t *dst);
int parse_arg_addr(char *name, ble_addr_t *addr);
int parse_arg_uuid(char *name, ble_uuid_any_t *uuid);
int parse_arg_all(int argc, char **argv);
//int parse_arg_mac(char *name, uint8_t *dst);
//int parse_arg_addr(char *name, ble_addr_t *addr);
//int parse_arg_uuid(char *name, ble_uuid_any_t *uuid);
int parse_eddystone_url(char *full_url, uint8_t *out_scheme, char *out_body,
uint8_t *out_body_len, uint8_t *out_suffix);
int cmd_parse_conn_start_end(uint16_t *out_conn, uint16_t *out_start,
uint16_t *out_end);
+15 -15
View File
@@ -45,7 +45,7 @@ cmd_gatt_discover_characteristic(int argc, char **argv)
ble_uuid_any_t uuid;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -56,7 +56,7 @@ cmd_gatt_discover_characteristic(int argc, char **argv)
return rc;
}
rc = parse_arg_uuid("uuid", &uuid);
rc = parse_arg_ble_uuid("uuid", &uuid);
if (rc == 0) {
rc = btshell_disc_chrs_by_uuid(conn_handle, start_handle, end_handle,
&uuid.u);
@@ -82,7 +82,7 @@ cmd_gatt_discover_descriptor(int argc, char **argv)
uint16_t end_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -109,7 +109,7 @@ cmd_gatt_discover_service(int argc, char **argv)
int conn_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -120,7 +120,7 @@ cmd_gatt_discover_service(int argc, char **argv)
return rc;
}
rc = parse_arg_uuid("uuid", &uuid);
rc = parse_arg_ble_uuid("uuid", &uuid);
if (rc == 0) {
rc = btshell_disc_svc_by_uuid(conn_handle, &uuid.u);
} else if (rc == ENOENT) {
@@ -144,7 +144,7 @@ cmd_gatt_discover_full(int argc, char **argv)
int conn_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -174,7 +174,7 @@ cmd_gatt_exchange_mtu(int argc, char **argv)
uint16_t conn_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -204,7 +204,7 @@ cmd_gatt_notify(int argc, char **argv)
uint16_t attr_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -241,7 +241,7 @@ cmd_gatt_read(int argc, char **argv)
bool is_var;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -279,7 +279,7 @@ cmd_gatt_read(int argc, char **argv)
}
}
rc = parse_arg_uuid("uuid", &uuid);
rc = parse_arg_ble_uuid("uuid", &uuid);
if (rc == ENOENT) {
is_uuid = 0;
} else if (rc == 0) {
@@ -351,7 +351,7 @@ cmd_gatt_service_changed(int argc, char **argv)
uint16_t end;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -384,7 +384,7 @@ cmd_gatt_service_visibility(int argc, char **argv)
bool vis;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -418,7 +418,7 @@ cmd_gatt_find_included_services(int argc, char **argv)
uint16_t end_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -482,13 +482,13 @@ cmd_gatt_write(int argc, char **argv)
uint16_t offset;
int total_attr_len;
int num_attrs;
int attr_len;
unsigned int attr_len;
int is_long;
int no_rsp;
int rc;
int i;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
+7 -7
View File
@@ -40,7 +40,7 @@ cmd_l2cap_update(int argc, char **argv)
uint16_t conn_handle;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -101,7 +101,7 @@ cmd_l2cap_create_server(int argc, char **argv)
int accept_response = 0;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -159,7 +159,7 @@ cmd_l2cap_connect(int argc, char **argv)
uint8_t num;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -202,7 +202,7 @@ cmd_l2cap_disconnect(int argc, char **argv)
uint16_t idx;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -234,7 +234,7 @@ cmd_l2cap_send(int argc, char **argv)
uint16_t bytes;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -294,7 +294,7 @@ cmd_l2cap_reconfig(int argc, char **argv)
int num;
int rc;
rc = parse_arg_all(argc - 1, argv + 1);
rc = parse_arg_init(argc - 1, argv + 1);
if (rc != 0) {
return rc;
}
@@ -311,7 +311,7 @@ cmd_l2cap_reconfig(int argc, char **argv)
return rc;
}
rc = parse_arg_uint8_list_with_separator("idxs", ",", 5, idxs, &num);
rc = parse_arg_byte_stream_custom("idxs", ",", 5, idxs, 0, &num);
if (rc != 0) {
console_printf("invalid 'idxs' parameter\n");
return rc;
-624
View File
@@ -19,633 +19,9 @@
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <stdarg.h>
#include <errno.h>
#include <assert.h>
#include <ctype.h>
#include "console/console.h"
#include "host/ble_hs.h"
#include "host/ble_uuid.h"
#include "host/ble_eddystone.h"
#include "cmd.h"
#include "btshell.h"
#define CMD_MAX_ARGS 16
static char *cmd_args[CMD_MAX_ARGS][2];
static int cmd_num_args;
int
parse_arg_find_idx(const char *key)
{
int i;
for (i = 0; i < cmd_num_args; i++) {
if (strcmp(cmd_args[i][0], key) == 0) {
return i;
}
}
return -1;
}
char *
parse_arg_peek(const char *key)
{
int i;
for (i = 0; i < cmd_num_args; i++) {
if (strcmp(cmd_args[i][0], key) == 0) {
return cmd_args[i][1];
}
}
return NULL;
}
char *
parse_arg_extract(const char *key)
{
int i;
for (i = 0; i < cmd_num_args; i++) {
if (strcmp(cmd_args[i][0], key) == 0) {
/* Erase parameter. */
cmd_args[i][0][0] = '\0';
return cmd_args[i][1];
}
}
return NULL;
}
/**
* Determines which number base to use when parsing the specified numeric
* string. This just avoids base '0' so that numbers don't get interpreted as
* octal.
*/
static int
parse_arg_long_base(char *sval)
{
if (sval[0] == '0' && sval[1] == 'x') {
return 0;
} else {
return 10;
}
}
long
parse_long_bounds(char *sval, long min, long max, int *out_status)
{
char *endptr;
long lval;
lval = strtol(sval, &endptr, parse_arg_long_base(sval));
if (sval[0] != '\0' && *endptr == '\0' &&
lval >= min && lval <= max) {
*out_status = 0;
return lval;
}
*out_status = EINVAL;
return 0;
}
long
parse_arg_long_bounds_peek(char *name, long min, long max, int *out_status)
{
char *sval;
sval = parse_arg_peek(name);
if (sval == NULL) {
*out_status = ENOENT;
return 0;
}
return parse_long_bounds(sval, min, max, out_status);
}
long
parse_arg_long_bounds(char *name, long min, long max, int *out_status)
{
char *sval;
sval = parse_arg_extract(name);
if (sval == NULL) {
*out_status = ENOENT;
return 0;
}
return parse_long_bounds(sval, min, max, out_status);
}
long
parse_arg_long_bounds_dflt(char *name, long min, long max,
long dflt, int *out_status)
{
long val;
int rc;
val = parse_arg_long_bounds(name, min, max, &rc);
if (rc == ENOENT) {
rc = 0;
val = dflt;
}
*out_status = rc;
return val;
}
uint64_t
parse_arg_uint64_bounds(char *name, uint64_t min, uint64_t max, int *out_status)
{
char *endptr;
char *sval;
uint64_t lval;
sval = parse_arg_extract(name);
if (sval == NULL) {
*out_status = ENOENT;
return 0;
}
lval = strtoull(sval, &endptr, parse_arg_long_base(sval));
if (sval[0] != '\0' && *endptr == '\0' &&
lval >= min && lval <= max) {
*out_status = 0;
return lval;
}
*out_status = EINVAL;
return 0;
}
long
parse_arg_long(char *name, int *out_status)
{
return parse_arg_long_bounds(name, LONG_MIN, LONG_MAX, out_status);
}
uint8_t
parse_arg_bool(char *name, int *out_status)
{
return parse_arg_long_bounds(name, 0, 1, out_status);
}
uint8_t
parse_arg_bool_dflt(char *name, uint8_t dflt, int *out_status)
{
return parse_arg_long_bounds_dflt(name, 0, 1, dflt, out_status);
}
uint8_t
parse_arg_uint8(char *name, int *out_status)
{
return parse_arg_long_bounds(name, 0, UINT8_MAX, out_status);
}
uint16_t
parse_arg_uint16(char *name, int *out_status)
{
return parse_arg_long_bounds(name, 0, UINT16_MAX, out_status);
}
uint16_t
parse_arg_uint16_peek(char *name, int *out_status)
{
return parse_arg_long_bounds_peek(name, 0, UINT16_MAX, out_status);
}
uint32_t
parse_arg_uint32(char *name, int *out_status)
{
return parse_arg_uint64_bounds(name, 0, UINT32_MAX, out_status);
}
uint64_t
parse_arg_uint64(char *name, int *out_status)
{
return parse_arg_uint64_bounds(name, 0, UINT64_MAX, out_status);
}
uint8_t
parse_arg_uint8_dflt(char *name, uint8_t dflt, int *out_status)
{
uint8_t val;
int rc;
val = parse_arg_uint8(name, &rc);
if (rc == ENOENT) {
val = dflt;
rc = 0;
}
*out_status = rc;
return val;
}
uint16_t
parse_arg_uint16_dflt(char *name, uint16_t dflt, int *out_status)
{
uint16_t val;
int rc;
val = parse_arg_uint16(name, &rc);
if (rc == ENOENT) {
val = dflt;
rc = 0;
}
*out_status = rc;
return val;
}
uint32_t
parse_arg_uint32_dflt(char *name, uint32_t dflt, int *out_status)
{
uint32_t val;
int rc;
val = parse_arg_uint32(name, &rc);
if (rc == ENOENT) {
val = dflt;
rc = 0;
}
*out_status = rc;
return val;
}
static uint32_t
parse_time_unit_mult(const char *str)
{
if (!strcasecmp(str, "us")) {
return 1;
} else if (!strcasecmp(str, "ms")) {
return 1000;
} else if (!strcasecmp(str, "s")) {
return 1000000;
}
return 0;
}
static uint32_t
parse_time_us(const char *str, int *out_status)
{
uint32_t val = 0;
uint32_t val_div = 1;
uint32_t val_mult = 1;
uint32_t val_us;
while (isdigit((unsigned char)*str)) {
val *= 10;
val += *str - '0';
str++;
}
if (*str == '.') {
str++;
while (isdigit((unsigned char)*str)) {
val *= 10;
val += *str - '0';
val_div *= 10;
str++;
}
}
val_mult = parse_time_unit_mult(str);
if (val_mult == 0) {
*out_status = EINVAL;
return 0;
}
if (val_mult > val_div) {
val_us = val * (val_mult / val_div);
} else {
val_us = val * (val_div / val_mult);
}
*out_status = 0;
return val_us;
}
uint32_t
parse_arg_time_dflt(char *name, int step_us, uint32_t dflt, int *out_status)
{
const char *arg;
uint32_t val;
int rc;
arg = parse_arg_peek(name);
if (!arg) {
*out_status = 0;
return dflt;
}
val = parse_time_us(arg, &rc);
if (rc) {
val = parse_arg_uint32(name, &rc);
if (rc == ENOENT) {
*out_status = 0;
return dflt;
}
} else {
val /= step_us;
parse_arg_extract(name);
}
*out_status = rc;
return val;
}
const struct kv_pair *
parse_kv_find(const struct kv_pair *kvs, char *name)
{
const struct kv_pair *kv;
int i;
for (i = 0; kvs[i].key != NULL; i++) {
kv = kvs + i;
if (strcmp(name, kv->key) == 0) {
return kv;
}
}
return NULL;
}
int
parse_arg_kv(char *name, const struct kv_pair *kvs, int *out_status)
{
const struct kv_pair *kv;
char *sval;
sval = parse_arg_extract(name);
if (sval == NULL) {
*out_status = ENOENT;
return -1;
}
kv = parse_kv_find(kvs, sval);
if (kv == NULL) {
*out_status = EINVAL;
return -1;
}
*out_status = 0;
return kv->val;
}
int
parse_arg_kv_dflt(char *name, const struct kv_pair *kvs, int def_val,
int *out_status)
{
int val;
int rc;
val = parse_arg_kv(name, kvs, &rc);
if (rc == ENOENT) {
rc = 0;
val = def_val;
}
*out_status = rc;
return val;
}
static int
parse_arg_byte_stream_delim(char *sval, char *delims, int max_len,
uint8_t *dst, int *out_len)
{
unsigned long ul;
char *endptr;
char *token;
int i;
char *tok_ptr;
i = 0;
for (token = strtok_r(sval, delims, &tok_ptr);
token != NULL;
token = strtok_r(NULL, delims, &tok_ptr)) {
if (i >= max_len) {
return EINVAL;
}
ul = strtoul(token, &endptr, 16);
if (sval[0] == '\0' || *endptr != '\0' || ul > UINT8_MAX) {
return -1;
}
dst[i] = ul;
i++;
}
*out_len = i;
return 0;
}
int
parse_arg_byte_stream(char *name, int max_len, uint8_t *dst, int *out_len)
{
char *sval;
sval = parse_arg_extract(name);
if (sval == NULL) {
return ENOENT;
}
return parse_arg_byte_stream_delim(sval, ":-", max_len, dst, out_len);
}
int
parse_arg_uint8_list_with_separator(char *name, char *separator, int max_len,
uint8_t *dst, int *out_len)
{
char *sval;
sval = parse_arg_extract(name);
if (sval == NULL) {
return ENOENT;
}
return parse_arg_byte_stream_delim(sval, separator, max_len, dst, out_len);
}
int
parse_arg_byte_stream_exact_length(char *name, uint8_t *dst, int len)
{
int actual_len;
int rc;
rc = parse_arg_byte_stream(name, len, dst, &actual_len);
if (rc != 0) {
return rc;
}
if (actual_len != len) {
return EINVAL;
}
return 0;
}
static void
parse_reverse_bytes(uint8_t *bytes, int len)
{
uint8_t tmp;
int i;
for (i = 0; i < len / 2; i++) {
tmp = bytes[i];
bytes[i] = bytes[len - i - 1];
bytes[len - i - 1] = tmp;
}
}
int
parse_arg_mac(char *name, uint8_t *dst)
{
int rc;
rc = parse_arg_byte_stream_exact_length(name, dst, 6);
if (rc != 0) {
return rc;
}
parse_reverse_bytes(dst, 6);
return 0;
}
int
parse_arg_addr(char *name, ble_addr_t *addr)
{
char *arg;
size_t len;
uint8_t addr_type;
bool addr_type_found;
int rc;
arg = parse_arg_peek(name);
if (!arg) {
return ENOENT;
}
len = strlen(arg);
if (len < 2) {
return EINVAL;
}
addr_type_found = false;
if ((arg[len - 2] == ':') || (arg[len - 2] == '-')) {
if (tolower(arg[len - 1]) == 'p') {
addr_type = BLE_ADDR_PUBLIC;
addr_type_found = true;
} else if (tolower(arg[len - 1]) == 'r') {
addr_type = BLE_ADDR_RANDOM;
addr_type_found = true;
}
if (addr_type_found) {
arg[len - 2] = '\0';
}
}
rc = parse_arg_mac(name, addr->val);
if (rc != 0) {
return rc;
}
if (addr_type_found) {
addr->type = addr_type;
} else {
rc = EAGAIN;
}
return rc;
}
int
parse_arg_uuid(char *str, ble_uuid_any_t *uuid)
{
uint16_t uuid16;
uint8_t val[16];
int len;
int rc;
uuid16 = parse_arg_uint16_peek(str, &rc);
switch (rc) {
case ENOENT:
parse_arg_extract(str);
return ENOENT;
case 0:
len = 2;
val[0] = uuid16;
val[1] = uuid16 >> 8;
parse_arg_extract(str);
break;
default:
len = 16;
rc = parse_arg_byte_stream_exact_length(str, val, 16);
if (rc != 0) {
return EINVAL;
}
parse_reverse_bytes(val, 16);
break;
}
rc = ble_uuid_init_from_buf(uuid, val, len);
if (rc != 0) {
return EINVAL;
} else {
return 0;
}
}
int
parse_arg_all(int argc, char **argv)
{
char *key;
char *val;
int i;
char *tok_ptr;
cmd_num_args = 0;
for (i = 0; i < argc; i++) {
key = strtok_r(argv[i], "=", &tok_ptr);
val = strtok_r(NULL, "=", &tok_ptr);
if (key != NULL && val != NULL) {
if (strlen(key) == 0) {
console_printf("Error: invalid argument: %s\n", argv[i]);
return -1;
}
if (cmd_num_args >= CMD_MAX_ARGS) {
console_printf("Error: too many arguments");
return -1;
}
cmd_args[cmd_num_args][0] = key;
cmd_args[cmd_num_args][1] = val;
cmd_num_args++;
}
}
return 0;
}
int
parse_eddystone_url(char *full_url, uint8_t *out_scheme, char *out_body,