diff options
author | reparo_liu <reparo_liu@realsil.com.cn> | 2023-05-18 11:23:40 +0800 |
---|---|---|
committer | reparo_liu <reparo_liu@realsil.com.cn> | 2023-05-19 09:18:25 +0800 |
commit | 64889cda2e397915ee6c3800d4acafb1c34e2ef3 (patch) | |
tree | f9d61cfc074d3297dff0d97ff1443617bc330bd2 /src/sample/ble_central/user_cmd.c | |
parent | 151cf392d25c5de46a4cdaaa78dfc46448a1f8c3 (diff) | |
download | realtek-64889cda2e397915ee6c3800d4acafb1c34e2ef3.tar.gz |
upload project and readme file
BYPASS_INCLUSIVE_LANGUAGE_REASON=false positive
bug:
Change-Id: Ibc24ce136cb2c838214643d90017530996589b37
test: manual
Diffstat (limited to 'src/sample/ble_central/user_cmd.c')
-rw-r--r-- | src/sample/ble_central/user_cmd.c | 1066 |
1 files changed, 1066 insertions, 0 deletions
diff --git a/src/sample/ble_central/user_cmd.c b/src/sample/ble_central/user_cmd.c new file mode 100644 index 0000000..ca26481 --- /dev/null +++ b/src/sample/ble_central/user_cmd.c @@ -0,0 +1,1066 @@ +/** +***************************************************************************************** +* Copyright(c) 2017, Realtek Semiconductor Corporation. All rights reserved. +***************************************************************************************** + * @file user_cmd.c + * @brief User defined test commands. + * @details User command interfaces. + * @author jane + * @date 2017-06-06 + * @version v1.0 + ************************************************************************************** + * @attention + * <h2><center>© COPYRIGHT 2017 Realtek Semiconductor Corporation</center></h2> + ************************************************************************************** + */ +/*============================================================================* + * Header Files + *============================================================================*/ +#include <string.h> +#include <trace.h> +#include <profile_client.h> +#include <gap_bond_le.h> +#include <gap_scan.h> +#include <user_cmd.h> +#include <gap.h> +#include <gap_conn_le.h> +#include <link_mgr.h> +#include <simple_ble_client.h> +#include <gaps_client.h> +#include <bas_client.h> + + +/** @defgroup CENTRAL_CMD Central User Command + * @brief This file handles Central User Command. + * @{ + */ +/*============================================================================* + * Variables + *============================================================================*/ +/** @brief User command interface data, used to parse the commands from Data UART. */ +T_USER_CMD_IF user_cmd_if; + +/*============================================================================* + * Functions + *============================================================================*/ +/** + * @brief Show all devices connecting status + * + * <b>Command table define</b> + * \code{.c} + { + "showcon", + "showcon\n\r", + "Show all devices connecting status\n\r", + cmd_showcon + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_showcon(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t conn_id; + T_GAP_CONN_INFO conn_info; + for (conn_id = 0; conn_id < APP_MAX_LINKS; conn_id++) + { + if (le_get_conn_info(conn_id, &conn_info)) + { + data_uart_print("ShowCon conn_id %d state 0x%x role %d\r\n", conn_id, + conn_info.conn_state, conn_info.role); + data_uart_print("RemoteBd = [%02x:%02x:%02x:%02x:%02x:%02x] type = %d\r\n", + conn_info.remote_bd[5], conn_info.remote_bd[4], + conn_info.remote_bd[3], conn_info.remote_bd[2], + conn_info.remote_bd[1], conn_info.remote_bd[0], + conn_info.remote_bd_type); + } + } + data_uart_print("active link num %d, idle link num %d\r\n", + le_get_active_link_num(), le_get_idle_link_num()); + return (RESULT_SUCCESS); +} + +/** + * @brief LE connection param update request + * + * <b>Command table define</b> + * \code{.c} + { + "conupdreq", + "conupdreq [conn_id] [interval_min] [interval_max] [latency] [supervision_timeout]\n\r", + "LE connection param update request\r\n\ + sample: conupdreq 0 0x30 0x40 0 500\n\r", + cmd_conupdreq + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_conupdreq(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + T_GAP_CAUSE cause; + uint8_t conn_id = p_parse_value->dw_param[0]; + uint16_t conn_interval_min = p_parse_value->dw_param[1]; + uint16_t conn_interval_max = p_parse_value->dw_param[2]; + uint16_t conn_latency = p_parse_value->dw_param[3]; + uint16_t supervision_timeout = p_parse_value->dw_param[4]; + + + cause = le_update_conn_param(conn_id, + conn_interval_min, + conn_interval_max, + conn_latency, + supervision_timeout, + 2 * (conn_interval_min - 1), + 2 * (conn_interval_max - 1) + ); + return (T_USER_CMD_PARSE_RESULT)cause; +} + +/** + * @brief Disconnect to remote device + * + * <b>Command table define</b> + * \code{.c} + { + "disc", + "disc [conn_id]\n\r", + "Disconnect to remote device\n\r", + cmd_disc + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_disc(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t conn_id = p_parse_value->dw_param[0]; + T_GAP_CAUSE cause; + cause = le_disconnect(conn_id); + return (T_USER_CMD_PARSE_RESULT)cause; +} + +/** + * @brief Config authentication mode + * + * <b>Command table define</b> + * \code{.c} + { + "authmode", + "authmode [auth_flags] [io_cap] [sec_enable] [oob_enable]\n\r", + "Config authentication mode\r\n\ + [auth_flags]:authentication req bit field: bit0-(bonding), bit2-(MITM), bit3-(SC)\r\n\ + [io_cap]:set io Capabilities: 0-(display only), 1-(display yes/no), 2-(keyboard noly), 3-(no IO), 4-(keyboard display)\r\n\ + [sec_enable]:Start smp pairing procedure when connected: 0-(disable), 1-(enable)\r\n\ + [oob_enable]:Enable oob flag: 0-(disable), 1-(enable)\r\n\ + sample: authmode 0x5 2 1 0\n\r", + cmd_authmode + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_authmode(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + T_GAP_CAUSE cause; + uint8_t auth_pair_mode = GAP_PAIRING_MODE_PAIRABLE; + uint16_t auth_flags = GAP_AUTHEN_BIT_BONDING_FLAG; + uint8_t auth_io_cap = GAP_IO_CAP_NO_INPUT_NO_OUTPUT; + uint8_t oob_enable = false; + uint8_t auth_sec_req_enable = false; + uint16_t auth_sec_req_flags = GAP_AUTHEN_BIT_BONDING_FLAG; + + if (p_parse_value->param_count > 0) + { + auth_flags = p_parse_value->dw_param[0]; + auth_sec_req_flags = p_parse_value->dw_param[0]; + } + if (p_parse_value->param_count > 1) + { + auth_io_cap = p_parse_value->dw_param[1]; + } + if (p_parse_value->param_count > 2) + { + auth_sec_req_enable = p_parse_value->dw_param[2]; + } + if (p_parse_value->param_count > 3) + { + oob_enable = p_parse_value->dw_param[3]; + } + gap_set_param(GAP_PARAM_BOND_PAIRING_MODE, sizeof(auth_pair_mode), &auth_pair_mode); + gap_set_param(GAP_PARAM_BOND_AUTHEN_REQUIREMENTS_FLAGS, sizeof(auth_flags), &auth_flags); + gap_set_param(GAP_PARAM_BOND_IO_CAPABILITIES, sizeof(auth_io_cap), &auth_io_cap); + gap_set_param(GAP_PARAM_BOND_OOB_ENABLED, sizeof(uint8_t), &oob_enable); + le_bond_set_param(GAP_PARAM_BOND_SEC_REQ_ENABLE, sizeof(auth_sec_req_enable), &auth_sec_req_enable); + le_bond_set_param(GAP_PARAM_BOND_SEC_REQ_REQUIREMENT, sizeof(auth_sec_req_flags), + &auth_sec_req_flags); + cause = gap_set_pairable_mode(); + return (T_USER_CMD_PARSE_RESULT)cause; +} + +/** + * @brief Send authentication request + * + * <b>Command table define</b> + * \code{.c} + { + "sauth", + "sauth [conn_id]\n\r", + "Send authentication request\n\r", + cmd_sauth + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_sauth(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t conn_id = p_parse_value->dw_param[0]; + T_GAP_CAUSE cause; + cause = le_bond_pair(conn_id); + return (T_USER_CMD_PARSE_RESULT)cause; +} + +/** + * @brief Send user confirmation when show GAP_MSG_LE_BOND_USER_CONFIRMATION + * + * <b>Command table define</b> + * \code{.c} + { + "userconf", + "userconf [conn_id] [conf]\n\r", + "Send user confirmation when show GAP_MSG_LE_BOND_USER_CONFIRMATION\r\n\ + [conf]: 0-(Reject), 1-(Accept)\r\n\ + sample: userconf 0 1\n\r", + cmd_userconf + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_userconf(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t conn_id = p_parse_value->dw_param[0]; + T_GAP_CFM_CAUSE confirm = GAP_CFM_CAUSE_ACCEPT; + T_GAP_CAUSE cause; + if (p_parse_value->dw_param[1] == 0) + { + confirm = GAP_CFM_CAUSE_REJECT; + } + cause = le_bond_user_confirm(conn_id, confirm); + return (T_USER_CMD_PARSE_RESULT)cause; +} + +/** + * @brief Input passkey when show GAP_MSG_LE_BOND_PASSKEY_INPUT + * + * <b>Command table define</b> + * \code{.c} + { + "authkey", + "authkey [conn_id] [passkey]\n\r", + "Input passkey when show GAP_MSG_LE_BOND_PASSKEY_INPUT\r\n\ + [passkey]: 0 - 999999\r\n\ + sample: authkey 0 123456\n\r", + cmd_authkey + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_authkey(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t conn_id = p_parse_value->dw_param[0]; + uint32_t passcode = p_parse_value->dw_param[1]; + T_GAP_CAUSE cause; + T_GAP_CFM_CAUSE confirm = GAP_CFM_CAUSE_ACCEPT; + if (passcode > GAP_PASSCODE_MAX) + { + confirm = GAP_CFM_CAUSE_REJECT; + } + cause = le_bond_passkey_input_confirm(conn_id, passcode, + confirm); + return (T_USER_CMD_PARSE_RESULT)cause; +} + +/** + * @brief Clear all bonded devices information + * + * <b>Command table define</b> + * \code{.c} + { + "bondclear", + "bondclear\n\r", + "Clear all bonded devices information\n\r", + cmd_bondclear + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_bondclear(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + le_bond_clear_all_keys(); + return (RESULT_SUCCESS); +} + +/** + * @brief Get all Bonded devices information + * + * <b>Command table define</b> + * \code{.c} + { + "bondinfo", + "bondinfo\n\r", + "Get all Bonded devices information\n\r", + cmd_bondinfo + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_bondinfo(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t i; + T_LE_KEY_ENTRY *p_entry; + uint8_t bond_storage_num = le_get_max_le_paired_device_num(); + for (i = 0; i < bond_storage_num; i++) + { + p_entry = le_find_key_entry_by_idx(i); + if (p_entry != NULL) + { + data_uart_print("bond_dev[%d]: bd 0x%02x%02x%02x%02x%02x%02x, addr_type %d, flags 0x%x\r\n", + p_entry->idx, + p_entry->remote_bd.addr[5], + p_entry->remote_bd.addr[4], + p_entry->remote_bd.addr[3], + p_entry->remote_bd.addr[2], + p_entry->remote_bd.addr[1], + p_entry->remote_bd.addr[0], + p_entry->remote_bd.remote_bd_type, + p_entry->flags); + } + } + + return (RESULT_SUCCESS); +} +/************************** Central only *************************************/ +/** + * @brief Start scan + * + * <b>Command table define</b> + * \code{.c} + { + "scan", + "scan [filter_policy] [filter_duplicate]\n\r", + "Start scan\r\n\ + [filter_policy]: 0-(any), 1-(whitelist), 2-(any RPA), 3-(whitelist RPA) \r\n\ + [filter_duplicate]: 0-(disable), 1-(enable) \n\r", + cmd_scan + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_scan(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + T_GAP_CAUSE cause; + uint8_t scan_filter_policy = GAP_SCAN_FILTER_ANY; + uint8_t scan_filter_duplicate = GAP_SCAN_FILTER_DUPLICATE_ENABLE; + + if (p_parse_value->param_count > 0) + { + scan_filter_policy = p_parse_value->dw_param[0]; + } + if (p_parse_value->param_count > 1) + { + scan_filter_duplicate = p_parse_value->dw_param[1]; + } + + link_mgr_clear_device_list(); + le_scan_set_param(GAP_PARAM_SCAN_FILTER_POLICY, sizeof(scan_filter_policy), + &scan_filter_policy); + le_scan_set_param(GAP_PARAM_SCAN_FILTER_DUPLICATES, sizeof(scan_filter_duplicate), + &scan_filter_duplicate); + cause = le_scan_start(); + return (T_USER_CMD_PARSE_RESULT)cause; +} + +/** + * @brief Stop scan + * + * <b>Command table define</b> + * \code{.c} + { + "stopscan", + "stopscan\n\r", + "Stop scan\n\r", + cmd_stopscan + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_stopscan(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + T_GAP_CAUSE cause; + cause = le_scan_stop(); + return (T_USER_CMD_PARSE_RESULT)cause; +} + +/** + * @brief Show scan dev list: filter simple ble service + * + * <b>Command table define</b> + * \code{.c} + { + "showdev", + "showdev\n\r", + "Show scan dev list: filter simple ble service\n\r", + cmd_showdev + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_showdev(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t i; + data_uart_print("Advertising and Scan response: filter uuid = 0xA00A dev list\r\n"); + for (i = 0; i < dev_list_count; i++) + { + data_uart_print("RemoteBd[%d] = [%02x:%02x:%02x:%02x:%02x:%02x] type = %d\r\n", + i, + dev_list[i].bd_addr[5], dev_list[i].bd_addr[4], + dev_list[i].bd_addr[3], dev_list[i].bd_addr[2], + dev_list[i].bd_addr[1], dev_list[i].bd_addr[0], + dev_list[i].bd_type); + if (dev_list[i].bd_type == GAP_REMOTE_ADDR_LE_RANDOM) + { + uint8_t addr = dev_list[i].bd_addr[5] & RANDOM_ADDR_MASK; + if (addr == RANDOM_ADDR_MASK_STATIC) + { + data_uart_print("Static Random Addr\r\n"); + } + else if (addr == RANDOM_ADDR_MASK_RESOLVABLE) + { + data_uart_print("Resolv Random Addr\r\n"); + } + else if (addr == RANDOM_ADDR_MASK_NON_RESOLVABLE) + { + data_uart_print("Non-resolv Random Addr\r\n"); + } + else + { + data_uart_print("Unknown Random Addr\r\n"); + } + } + } + + return (RESULT_SUCCESS); +} + +/** + * @brief Connect to remote device: use address + * + * <b>Command table define</b> + * \code{.c} + { + "con", + "con [BD0] [BD1] [BD2] [BD3] [BD4] [BD5] [addr_type]\n\r", + "Connect to remote device: use address\r\n\ + [BD0] [BD1] [BD2] [BD3] [BD4] [BD5]: remote device address\r\n\ + [addr_type]: 0-(public), 1-(random)\r\n\ + sample: con x11 x22 x33 x44 x55 x66 0 \n\r", + cmd_con + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_con(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + T_GAP_CAUSE cause; + uint8_t addr[6] = {0}; + uint8_t addr_len; + uint8_t addr_type = GAP_REMOTE_ADDR_LE_PUBLIC; + T_GAP_LE_CONN_REQ_PARAM conn_req_param; + + conn_req_param.scan_interval = 0x10; + conn_req_param.scan_window = 0x10; + conn_req_param.conn_interval_min = 80; + conn_req_param.conn_interval_max = 80; + conn_req_param.conn_latency = 0; + conn_req_param.supv_tout = 1000; + conn_req_param.ce_len_min = 2 * (conn_req_param.conn_interval_min - 1); + conn_req_param.ce_len_max = 2 * (conn_req_param.conn_interval_max - 1); + le_set_conn_param(GAP_CONN_PARAM_1M, &conn_req_param); + + for (addr_len = 0; addr_len < GAP_BD_ADDR_LEN; addr_len++) + { + addr[addr_len] = p_parse_value->dw_param[GAP_BD_ADDR_LEN - addr_len - 1]; + } + if (p_parse_value->param_count >= 7) + { + addr_type = p_parse_value->dw_param[6]; + } + + cause = le_connect(GAP_PHYS_CONN_INIT_1M_BIT, addr, (T_GAP_REMOTE_ADDR_TYPE)addr_type, + GAP_LOCAL_ADDR_LE_PUBLIC, + 1000); + + return (T_USER_CMD_PARSE_RESULT)cause; +} + +/** + * @brief Connect to remote device: use showdev to show idx + * + * <b>Command table define</b> + * \code{.c} + { + "condev", + "condev [idx]\n\r", + "Connect to remote device: use showdev to show idx\r\n\ + [idx]: use cmd showdev to show idx before use this cmd\r\n\ + sample: condev 0\n\r", + cmd_condev + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_condev(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t dev_idx = p_parse_value->dw_param[0]; + if (dev_idx < dev_list_count) + { + T_GAP_CAUSE cause; + T_GAP_LE_CONN_REQ_PARAM conn_req_param; + + conn_req_param.scan_interval = 0x10; + conn_req_param.scan_window = 0x10; + conn_req_param.conn_interval_min = 80; + conn_req_param.conn_interval_max = 80; + conn_req_param.conn_latency = 0; + conn_req_param.supv_tout = 1000; + conn_req_param.ce_len_min = 2 * (conn_req_param.conn_interval_min - 1); + conn_req_param.ce_len_max = 2 * (conn_req_param.conn_interval_max - 1); + le_set_conn_param(GAP_CONN_PARAM_1M, &conn_req_param); + cause = le_connect(GAP_PHYS_CONN_INIT_1M_BIT, + dev_list[dev_idx].bd_addr, + (T_GAP_REMOTE_ADDR_TYPE)dev_list[dev_idx].bd_type, + GAP_LOCAL_ADDR_LE_PUBLIC, + 1000); + return (T_USER_CMD_PARSE_RESULT)cause; + } + else + { + return RESULT_ERR; + } +} +/************************** GATT client *************************************/ +/** + * @brief Read GAP service characteristic value + * + * <b>Command table define</b> + * \code{.c} + { + "gapread", + "gapread [conn_id] [type]\n\r", + "Read GAP service characteristic value\r\n\ + [type]: 0-(read device name), 1-(read appearance)\r\n\ + simple: gapread 0 0\n\r", + cmd_gapread + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_gapread(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t conn_id = p_parse_value->dw_param[0]; + T_GAPS_READ_TYPE read_type = (T_GAPS_READ_TYPE)p_parse_value->dw_param[1]; + bool ret = gaps_read(conn_id, read_type); + if (ret) + { + return (RESULT_SUCCESS); + } + else + { + return (RESULT_ERR); + } +} + +/** + * @brief List GAP service handle cache + * + * <b>Command table define</b> + * \code{.c} + { + "gaphdl", + "gaphdl [conn_id]\n\r", + "List GAP service handle cache\n\r", + cmd_gaphdl + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_gaphdl(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t conn_id = p_parse_value->dw_param[0]; + uint16_t hdl_cache[HDL_GAPS_CACHE_LEN]; + uint8_t hdl_idx; + bool ret = gaps_get_hdl_cache(conn_id, hdl_cache, + sizeof(uint16_t) * HDL_GAPS_CACHE_LEN); + + if (ret) + { + for (hdl_idx = HDL_GAPS_SRV_START; hdl_idx < HDL_GAPS_CACHE_LEN; hdl_idx++) + { + data_uart_print("-->Index %d -- Handle 0x%x\r\n", hdl_idx, hdl_cache[hdl_idx]); + } + return (RESULT_SUCCESS); + } + else + { + return (RESULT_ERR); + } +} + +/** + * @brief Read simple ble service characteristic and descriptor value + * + * <b>Command table define</b> + * \code{.c} + { + "simpread", + "simpread [conn_id] [type] [pattern]\n\r", + "Read simple ble service characteristic and descriptor value\r\n\ + [type]: 0-(read v1), 1-(v3 cccd), 2-(v4 cccd)\r\n\ + [pattern]: 0-(read by handle), 1-(read by uuid)\r\n\ + sample: simpread 0 1 0 \n\r", + cmd_simpread + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_simpread(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + /* Indicate which char to be read. */ + uint8_t conn_id = p_parse_value->dw_param[0]; + bool ret; + T_SIMP_READ_TYPE read_type = (T_SIMP_READ_TYPE)p_parse_value->dw_param[1]; + /* Read by handle or UUID, 1--by UUID, 0--by handle. */ + uint8_t read_pattern = (uint8_t)p_parse_value->dw_param[2]; + + if (read_pattern) + { + ret = simp_ble_client_read_by_uuid(conn_id, read_type); + } + else + { + ret = simp_ble_client_read_by_handle(conn_id, read_type); + } + + if (ret) + { + return (RESULT_SUCCESS); + } + else + { + return (RESULT_ERR); + } +} + +/** + * @brief Config simple ble service client characteristic configuration descriptor value + * + * <b>Command table define</b> + * \code{.c} + { + "simpcccd", + "simpcccd [conn_id] [type] [enable]\n\r", + "Config simple ble service client characteristic configuration descriptor value\r\n\ + [type]: 0-(v3 notify), 1-(v4 indication)\r\n\ + [enable]: 0-(disable), 1-(enable) \r\n\ + sample: simpcccd 0 1 1\n\r", + cmd_simpcccd + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_simpcccd(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + /* Indicate which char CCCD command. */ + bool ret = false; + uint8_t conn_id = p_parse_value->dw_param[0]; + uint8_t type = p_parse_value->dw_param[1]; + /* Enable or disable, 1--enable, 0--disable. */ + bool cccd_data = (bool)p_parse_value->dw_param[2]; + + switch (type) + { + case 0:/* V3 Notify char notif enable/disable. */ + ret = simp_ble_client_set_v3_notify(conn_id, cccd_data); + break; + case 1:/* V4 Indicate char indicate enable/disable. */ + ret = simp_ble_client_set_v4_ind(conn_id, cccd_data); + break; + default: + break; + } + + if (ret) + { + return (RESULT_SUCCESS); + } + else + { + return (RESULT_ERR); + } +} + +/** + * @brief Write simple ble service V2 characteristic value + * + * <b>Command table define</b> + * \code{.c} + { + "simpwritev2", + "simpwritev2 [conn_id] [type] [len]\n\r", + "Write simple ble service V2 characteristic value\r\n\ + [type]: 1-(write request), 2-(write command) \r\n\ + [len]: type=1 len range:0-270, type=2 len range: 0-(mtu-3)\r\n\ + sample: simpwritev2 0 1 10\n\r", + cmd_simpwritev2 + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_simpwritev2(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t conn_id = p_parse_value->dw_param[0]; + T_GATT_WRITE_TYPE write_type = (T_GATT_WRITE_TYPE)p_parse_value->dw_param[1]; + uint8_t data[270]; + uint16_t length = 270; + uint16_t i; + for (i = 0; i < 270; i++) + { + data[i] = i; + } + if (write_type > GATT_WRITE_TYPE_CMD) + { + return (RESULT_ERR); + } + if (p_parse_value->param_count > 2) + { + length = p_parse_value->dw_param[2]; + if (length > 270) + { + length = 270; + } + } + if (simp_ble_client_write_v2_char(conn_id, length, data, write_type)) + { + return (RESULT_SUCCESS); + } + else + { + return (RESULT_ERR); + } +} + +/** + * @brief List simple ble service handle cache + * + * <b>Command table define</b> + * \code{.c} + { + "simphdl", + "simphdl [conn_id]\n\r", + "List simple ble service handle cache\n\r", + cmd_simphdl + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_simphdl(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t conn_id = p_parse_value->dw_param[0]; + uint16_t hdl_cache[HDL_SIMBLE_CACHE_LEN]; + uint8_t hdl_idx; + bool ret = simp_ble_client_get_hdl_cache(conn_id, hdl_cache, + sizeof(uint16_t) * HDL_SIMBLE_CACHE_LEN); + + if (ret) + { + for (hdl_idx = HDL_SIMBLE_SRV_START; hdl_idx < HDL_SIMBLE_CACHE_LEN; hdl_idx++) + { + data_uart_print("-->Index %d -- Handle 0x%x\r\n", hdl_idx, hdl_cache[hdl_idx]); + } + return (RESULT_SUCCESS); + } + else + { + return (RESULT_ERR); + } +} + +/** + * @brief Read battery service characteristic and descriptor value + * + * <b>Command table define</b> + * \code{.c} + { + "basread", + "basread [conn_id] [type]\n\r", + "Read battery service characteristic and descriptor value\r\n\ + [type]: 0-(battery level value), 1-(battery cccd)\r\n\ + sample: basread 0 1 \n\r", + cmd_basread + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_basread(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t conn_id = p_parse_value->dw_param[0]; + bool ret = false; + if (p_parse_value->dw_param[1] == 0) + { + ret = bas_read_battery_level(conn_id); + } + else if (p_parse_value->dw_param[1] == 1) + { + ret = bas_read_notify(conn_id); + } + + if (ret) + { + return (RESULT_SUCCESS); + } + else + { + return (RESULT_ERR); + } +} + +/** + * @brief Config battery service client characteristic configuration descriptor value + * + * <b>Command table define</b> + * \code{.c} + { + "bascccd", + "bascccd [conn_id] [notify]\n\r", + "Config battery service client characteristic configuration descriptor value\r\n\ + [notify]: 0-(disable), 1-(enable)\n\r", + cmd_bascccd + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_bascccd(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t conn_id = p_parse_value->dw_param[0]; + bool notify = p_parse_value->dw_param[1]; + bool ret; + ret = bas_set_notify(conn_id, notify); + + if (ret) + { + return (RESULT_SUCCESS); + } + else + { + return (RESULT_ERR); + } +} + +/** + * @brief List battery service handle cache + * + * <b>Command table define</b> + * \code{.c} + { + "bashdl", + "bashdl [conn_id]\n\r", + "List battery service handle cache\n\r", + cmd_bashdl + }, + * \endcode + */ +static T_USER_CMD_PARSE_RESULT cmd_bashdl(T_USER_CMD_PARSED_VALUE *p_parse_value) +{ + uint8_t conn_id = p_parse_value->dw_param[0]; + uint16_t hdl_cache[HDL_BAS_CACHE_LEN]; + uint8_t hdl_idx; + bool ret = bas_get_hdl_cache(conn_id, hdl_cache, + sizeof(uint16_t) * HDL_BAS_CACHE_LEN); + + if (ret) + { + for (hdl_idx = HDL_BAS_SRV_START; hdl_idx < HDL_BAS_CACHE_LEN; hdl_idx++) + { + data_uart_print("-->Index %d -- Handle 0x%x\r\n", hdl_idx, hdl_cache[hdl_idx]); + } + return (RESULT_SUCCESS); + } + else + { + return (RESULT_ERR); + } +} + +/** @brief User command table */ +const T_USER_CMD_TABLE_ENTRY user_cmd_table[] = +{ + /************************** Common cmd *************************************/ + { + "conupdreq", + "conupdreq [conn_id] [interval_min] [interval_max] [latency] [supervision_timeout]\n\r", + "LE connection param update request\r\n\ + sample: conupdreq 0 0x30 0x40 0 500\n\r", + cmd_conupdreq + }, + { + "showcon", + "showcon\n\r", + "Show all devices connecting status\n\r", + cmd_showcon + }, + { + "disc", + "disc [conn_id]\n\r", + "Disconnect to remote device\n\r", + cmd_disc + }, + { + "authmode", + "authmode [auth_flags] [io_cap] [sec_enable] [oob_enable]\n\r", + "Config authentication mode\r\n\ + [auth_flags]:authentication req bit field: bit0-(bonding), bit2-(MITM), bit3-(SC)\r\n\ + [io_cap]:set io Capabilities: 0-(display only), 1-(display yes/no), 2-(keyboard noly), 3-(no IO), 4-(keyboard display)\r\n\ + [sec_enable]:Start smp pairing procedure when connected: 0-(disable), 1-(enable)\r\n\ + [oob_enable]:Enable oob flag: 0-(disable), 1-(enable)\r\n\ + sample: authmode 0x5 2 1 0\n\r", + cmd_authmode + }, + { + "sauth", + "sauth [conn_id]\n\r", + "Send authentication request\n\r", + cmd_sauth + }, + { + "userconf", + "userconf [conn_id] [conf]\n\r", + "Send user confirmation when show GAP_MSG_LE_BOND_USER_CONFIRMATION\r\n\ + [conf]: 0-(Reject), 1-(Accept)\r\n\ + sample: userconf 0 1\n\r", + cmd_userconf + }, + { + "authkey", + "authkey [conn_id] [passkey]\n\r", + "Input passkey when show GAP_MSG_LE_BOND_PASSKEY_INPUT\r\n\ + [passkey]: 0 - 999999\r\n\ + sample: authkey 0 123456\n\r", + cmd_authkey + }, + { + "bondinfo", + "bondinfo\n\r", + "Get all Bonded devices information\n\r", + cmd_bondinfo + }, + { + "bondclear", + "bondclear\n\r", + "Clear all bonded devices information\n\r", + cmd_bondclear + }, + /************************** Central only *************************************/ + { + "scan", + "scan [filter_policy] [filter_duplicate]\n\r", + "Start scan\r\n\ + [filter_policy]: 0-(any), 1-(whitelist), 2-(any RPA), 3-(whitelist RPA) \r\n\ + [filter_duplicate]: 0-(disable), 1-(enable) \n\r", + cmd_scan + }, + { + "stopscan", + "stopscan\n\r", + "Stop scan\n\r", + cmd_stopscan + }, + { + "showdev", + "showdev\n\r", + "Show scan dev list: filter simple ble service\n\r", + cmd_showdev + }, + { + "con", + "con [BD0] [BD1] [BD2] [BD3] [BD4] [BD5] [addr_type]\n\r", + "Connect to remote device: use address\r\n\ + [BD0] [BD1] [BD2] [BD3] [BD4] [BD5]: remote device address\r\n\ + [addr_type]: 0-(public), 1-(random)\r\n\ + sample: con x11 x22 x33 x44 x55 x66 0 \n\r", + cmd_con + }, + { + "condev", + "condev [idx]\n\r", + "Connect to remote device: use showdev to show idx\r\n\ + [idx]: use cmd showdev to show idx before use this cmd\r\n\ + sample: condev 0\n\r", + cmd_condev + }, + /************************** GATT client *************************************/ + /*GAPS client*/ + { + "gapread", + "gapread [conn_id] [type]\n\r", + "Read GAP service characteristic value\r\n\ + [type]: 0-(read device name), 1-(read appearance)\r\n\ + simple: gapread 0 0\n\r", + cmd_gapread + }, + { + "gaphdl", + "gaphdl [conn_id]\n\r", + "List GAP service handle cache\n\r", + cmd_gaphdl + }, + /*Simple ble client*/ + { + "simpread", + "simpread [conn_id] [type] [pattern]\n\r", + "Read simple ble service characteristic and descriptor value\r\n\ + [type]: 0-(read v1), 1-(v3 cccd), 2-(v4 cccd)\r\n\ + [pattern]: 0-(read by handle), 1-(read by uuid)\r\n\ + sample: simpread 0 1 0 \n\r", + cmd_simpread + }, + { + "simpcccd", + "simpcccd [conn_id] [type] [enable]\n\r", + "Config simple ble service client characteristic configuration descriptor value\r\n\ + [type]: 0-(v3 notify), 1-(v4 indication)\r\n\ + [enable]: 0-(disable), 1-(enable) \r\n\ + sample: simpcccd 0 1 1\n\r", + cmd_simpcccd + }, + { + "simpwritev2", + "simpwritev2 [conn_id] [type] [len]\n\r", + "Write simple ble service V2 characteristic value\r\n\ + [type]: 1-(write request), 2-(write command) \r\n\ + [len]: type=1 len range:0-270, type=2 len range: 0-(mtu-3)\r\n\ + sample: simpwritev2 0 1 10\n\r", + cmd_simpwritev2 + }, + { + "simphdl", + "simphdl [conn_id]\n\r", + "List simple ble service handle cache\n\r", + cmd_simphdl + }, + /*BAS client*/ + { + "basread", + "basread [conn_id] [type]\n\r", + "Read battery service characteristic and descriptor value\r\n\ + [type]: 0-(battery level value), 1-(battery cccd)\r\n\ + sample: basread 0 1 \n\r", + cmd_basread + }, + { + "bascccd", + "bascccd [conn_id] [notify]\n\r", + "Config battery service client characteristic configuration descriptor value\r\n\ + [notify]: 0-(disable), 1-(enable)\n\r", + cmd_bascccd + }, + { + "bashdl", + "bashdl [conn_id]\n\r", + "List battery service handle cache\n\r", + cmd_bashdl + }, + /* MUST be at the end: */ + { + 0, + 0, + 0, + 0 + } +}; +/** @} */ /* End of group CENTRAL_CMD */ + + |