mcu_hi3321_watch/tjd/ate/ble/ble_cmd_process.c
2025-05-26 20:15:20 +08:00

464 lines
12 KiB
C

#include "ble_cmd_process.h"
#include "ate_at_process.h"
#include "ate_cmd_manager.h"
// #include "aw88166_port.h"
#include "common_def.h"
#include "securec.h"
#include "soc_osal.h"
#include <rtc.h>
#include <soc_errno.h>
#include "ble_api.h"
#include "ble_protocol_ota_service.h"
#define TD_U4_BITS 4
#define TD_U8_MAX 0xFF
#define ENABLE_PRINT_INFO 1
#if ENABLE_PRINT_INFO
#define static_print_debug(...) sys_bt_log_d(__VA_ARGS__) // 一般信息打印宏控制
#define static_print_warn(...) sys_bt_log_w(__VA_ARGS__) // 警告信息打印一般常开
#define static_print_error(...) sys_bt_log_e(__VA_ARGS__) // 错误信息打印一般常开
#else
#define static_print_debug(...)
#define static_print_warn(...)
#define static_print_error(...)
#endif
#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
void ble_cmd_process_init(void)
{
return;
}
#define TEN 10
static uint8_t char_2_num(int8_t c)
{
if (c >= '0' && c <= '9') {
return (uint8_t)(c - '0');
} else if (c >= 'A' && c <= 'F') {
return (uint8_t)(c - 'A' + TEN);
} else if (c >= 'a' && c <= 'f') {
return (uint8_t)(c - 'a' + TEN);
} else {
return TD_U8_MAX;
}
}
/* 从字符串中解析十六进制数字,例: "7d05" -> [0x7d, 0x05] */
static uint32_t decode_hex_from_str(const char *str, uint8_t *nums)
{
uint32_t len = strlen(str);
static_print_debug("str_len: %u str: %s num:", len, str);
uint32_t cnt = 0;
for (uint32_t i = 0; i < len - 1; i += 2) { /* 2: 每个字节包含2个字符 */
nums[cnt] = (char_2_num(str[i]) << TD_U4_BITS) + char_2_num(str[i + 1]);
static_print_debug("%02x", nums[cnt]);
cnt++;
}
static_print_debug("\n");
return EXT_ERR_SUCCESS;
}
#define BD_ADDR_STR_LEN 12
#define TD_U8_MAX 0xFF
/* 从字符串中解析设备地址,示例: "c0a012345678" -> [0x78, 0x56, 0x34, 0x12, 0xa0, 0xc0] */
static uint32_t decode_bd_addr(const int8_t *str, uint8_t *device_addr, int32_t len)
{
int32_t str_len = (int32_t)strnlen((const char *)str, BD_ADDR_STR_LEN + 1);
if (str_len != BD_ADDR_STR_LEN || len != BD_ADDR_LEN) {
static_print_debug("len err! str_len = %d len = %d\n", str_len, len);
return EXT_ERR_FAILURE;
}
static_print_debug("str: %s bd_addr:", str);
int32_t cnt = 0;
for (int32_t i = BD_ADDR_STR_LEN - 1; i >= 0; i -= 2) { /* 2: 每个字节包含2个字符 */
uint8_t num1 = char_2_num(str[i - 1]);
uint8_t num2 = char_2_num(str[i]);
if (num1 == TD_U8_MAX || num2 == TD_U8_MAX) {
static_print_debug("invalid input %c%c\n", str[i - 1], str[i]);
return EXT_ERR_FAILURE;
}
device_addr[cnt] = ((num1 << TD_U4_BITS) | num2);
static_print_debug("%02x", device_addr[cnt]);
cnt++;
}
static_print_debug("\n");
return EXT_ERR_SUCCESS;
}
result_t ble_enable_start(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
ble_api_cmd_enable();
return result;
}
result_t ble_disable_start(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
ble_api_cmd_disable();
return result;
}
result_t ble_set_local_name_start(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
int32_t argc;
uint8_t *argv[AT_MAX_PARAM_CNT];
convert_at_param(para, para_len, &argc, argv);
if (argc != 2) {
static_print_debug("params_cnt error! need: name len\n");
return result;
}
ble_api_cmd_set_local_name(argv[0],atoi((const char *)argv[1]));
return result;
}
/* 获取本地设备名称 params: sample_mode length */
result_t ble_get_local_name_start(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
ble_api_cmd_get_local_name();
return result;
}
result_t ble_set_local_addr_start(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
bd_addr_t bd_addr;
result_t result = {0};
int32_t argc;
uint8_t *argv[AT_MAX_PARAM_CNT];
convert_at_param(para, para_len, &argc, argv);
if (decode_bd_addr((int8_t *)argv[0], bd_addr.addr, BD_ADDR_LEN) != EXT_ERR_SUCCESS) {
static_print_debug("decode addr error!\n");
return result;
}
ble_api_cmd_set_local_addr(&bd_addr);
return result;
}
result_t ble_get_local_addr_start(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
ble_api_cmd_get_local_addr();
return result;
}
result_t ble_get_bt_local_addr(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
ble_api_cmd_get_bt_local_addr();
return result;
}
result_t ble_set_adv_data_start(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
int32_t argc;
uint8_t *argv[AT_MAX_PARAM_CNT];
convert_at_param(para, para_len, &argc, argv);
if (argc != 4) {
static_print_debug("params_cnt error! need: sample_mode adv_id adv_data scan_rsp_data\n");
return result;
}
uint32_t sample_mode = (uint32_t)atoi((const char *)argv[0]);
uint8_t adv_id = argv[1];
char *adv_data = (char *)argv[2];
char *scan_rsp_data = (char *)argv[3];
gap_ble_config_adv_data_t cfg_adv_data = {0};
errcode_t ret;
if ((sample_mode & 0x1) != 0) {
ret = gap_ble_set_adv_data(adv_id, NULL);
} else {
cfg_adv_data.adv_length = (uint16_t)(strlen(adv_data)) / 2; /* 2个字符为1字节 */
cfg_adv_data.scan_rsp_length = (uint16_t)(strlen(scan_rsp_data)) / 2; /* 2个字符为1字节 */
cfg_adv_data.adv_data = (uint8_t *)(void *)malloc(cfg_adv_data.adv_length);
if (cfg_adv_data.adv_data == NULL) {
static_print_debug("malloc adv data error!\n");
return result;
}
cfg_adv_data.scan_rsp_data = (uint8_t *)(void *)malloc(cfg_adv_data.scan_rsp_length);
if (cfg_adv_data.scan_rsp_data == NULL) {
free(cfg_adv_data.adv_data);
static_print_debug("malloc scan data error!\n");
return result;
}
if (decode_hex_from_str(adv_data, cfg_adv_data.adv_data) != EXT_ERR_SUCCESS ||
decode_hex_from_str(scan_rsp_data, cfg_adv_data.scan_rsp_data) != EXT_ERR_SUCCESS) {
static_print_debug("decode adv data error!\n");
free(cfg_adv_data.adv_data);
free(cfg_adv_data.scan_rsp_data);
return result;
}
ret = ble_api_cmd_set_adv_data(adv_id,&cfg_adv_data);
free(cfg_adv_data.adv_data);
free(cfg_adv_data.scan_rsp_data);
}
return result;
}
result_t ble_start_adv(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
int32_t argc;
uint8_t *argv[AT_MAX_PARAM_CNT];
convert_at_param(para, para_len, &argc, argv);
if (argc != 1) {
static_print_debug("params_cnt error! need: adv_id\n");
return result;
}
ble_api_cmd_start_adv(argv[0]);
return result;
}
result_t ble_show_scan_list(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
ble_api_cmd_show_scan_list();
return result;
}
result_t ble_start_scan(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
ble_api_cmd_start_discovery();
return result;
}
result_t ble_open_start(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
tjd_ble_api_cmd_open();
return result;
}
result_t ble_close_start(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
ble_api_cmd_close();
return result;
}
result_t ble_send_message(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
int32_t argc;
uint8_t *argv[AT_MAX_PARAM_CNT];
convert_at_param(para, para_len, &argc, argv);
if (argc != 2) {
static_print_debug("params_cnt error! need: adv_id\n");
return result;
}
svr_bt_gatts_notify(argv[0],argv[1]);
return result;
}
result_t ble_spp_send_msg(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
int32_t argc;
uint8_t *argv[AT_MAX_PARAM_CNT];
convert_at_param(para, para_len, &argc, argv);
if (argc != 2) {
static_print_debug("params_cnt error! need: data data_len\n");
return result;
}
ble_spp_send_data(argv[0],atoi((const char *)argv[1]));
return result;
}
result_t ble_upload_file(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
int32_t argc;
uint8_t *argv[AT_MAX_PARAM_CNT];
convert_at_param(para, para_len, &argc, argv);
if (argc != 2) {
static_print_debug("params_cnt error! need: data data_len\n");
return result;
}
uint8_t file_type = atoi((const char *)argv[1]);
tjd_ble_upload_file((const char *)argv[0], file_type);
free_argv(argv, argc);
// tjd_ble_upload_file("/user/tjd_record/2000-8-4.mp3");
return result;
}
result_t ble_request_gps(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
tjd_ble_request_gps();
return result;
}
result_t br_get_scan_mode(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
int ret = gap_br_get_scan_mode();
printf("scan mode: %d\n",ret);
return result;
}
result_t ble_request_flover(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
tjd_ble_request_flover();
return result;
}
result_t ble_open_bt_only(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
tjd_open_bluetooth_only();
return result;
}
result_t ble_close_bt_only(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
tjd_close_bluetooth_only();
return result;
}
result_t ble_test_dial_config_json(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
// tjd_test_dial_config_json_file();
tjd_service_send_sport_record_data();
return result;
}
result_t ble_test_send_sport_record_json(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
tjd_service_send_sport_record_data();
return result;
}
result_t ble_delete_directory(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
int32_t argc;
uint8_t *argv[AT_MAX_PARAM_CNT];
convert_at_param(para, para_len, &argc, argv);
if (argc != 1) {
static_print_debug("params_cnt error! need: data data_len\n");
return result;
}
if(delete_directory((const char *)argv[0]) != 0){
static_print_debug("delete_directory failed!\n");
}else{
static_print_debug("delete_directory success!");
}
return result;
}
result_t ble_rename_file_name(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
int32_t argc;
uint8_t *argv[AT_MAX_PARAM_CNT];
convert_at_param(para, para_len, &argc, argv);
if (argc != 2) {
static_print_debug("params_cnt error! need: data data_len\n");
return result;
}
if(rename((const char *)argv[0],(const char *)argv[1]) != 0){
static_print_debug("rename file failed!\n");
}else{
static_print_debug("rename file success! old name : %s , new name : %s\n",argv[0],argv[1]);
}
return result;
}
result_t ble_ota_recovery_test(uint8_t *para, uint32_t para_len)
{
unused(para);
unused(para_len);
result_t result = {0};
int32_t argc;
uint8_t *argv[AT_MAX_PARAM_CNT];
convert_at_param(para, para_len, &argc, argv);
if (argc != 1) {
static_print_debug("params_cnt error! need: data data_len\n");
return result;
}
printf("ota recovery test start!,%s\n", argv[0]);
int file_size = atoi((const char *)argv[0]);
static_print_debug("tjd_ota_recovery_upgrade_operation file_size : %d",file_size);
tjd_ota_recovery_upgrade_operation(file_size);
free_argv(argv, argc);
// tjd_ble_upload_file("/user/tjd_record/2000-8-4.mp3");
return result;
}