mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-09-03 15:50:01 +00:00
apps/btshell: Convert to parse_arg module
Mkae use of common argument parsing code.
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user