pressure_sensor_system/Software/master/PressureSensorBoardMaster/BSP/BLE.c

1085 lines
30 KiB
C
Raw Normal View History

2026-02-24 13:00:08 +08:00
#include "BLE.h"
#include "flash.h"
#include "usart.h"
2026-02-24 13:00:08 +08:00
#include <string.h>
#include <stdint.h>
#define BLE_DBG_EN 0 // 1=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0=<3D>ر<EFBFBD>
2026-02-24 13:00:08 +08:00
#if (BLE_DBG_EN)
#define DEBUG(format, ...) printf("[BLE] " format, ##__VA_ARGS__)
#else
#define DEBUG(format, ...) // <20>ر<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>滻Ϊ<E6BBBB>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κδ<CEBA><CEB4><EFBFBD>
#endif
BLE_STATE curr_state;
static size_t current_cmd_index = 0;
static uint32_t cmd_start_time;
static uint8_t current_try_count = 0;
static CmdExecutor_t init_executor;
static CmdExecutor_t first_connect_executor;
static CmdExecutor_t connect_executor;
static CmdExecutor_t trans_cfg_executor; // <20><><EFBFBD><EFBFBD> AT+TRANSPORT <20><>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>
static CmdExecutor_t ready_executor;
2026-02-24 13:00:08 +08:00
static CmdExecutor_t set_executor;
2026-02-25 16:56:05 +08:00
static uint8_t recovery_level = 0; // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ͷ
static uint8_t FT_connect = 0; // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ͷ
static char host_mac[13];
char ble_rx_buffer[256]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
volatile uint8_t ble_cmd_rec_done;
2026-02-24 13:00:08 +08:00
const char* ble_state_names[] = {
"BLE_INIT",
"BLE_FIRST_CONECT",
"BLE_CONNECTED",
"BLE_READY",
"BLE_CFG_TRANS",
2026-02-24 13:00:08 +08:00
"BLE_ERROR",
"BLE_SET",
"BLE_WAITTING"
};
const char* ble_sub_state_names[] = {
"BLE_SUB_STATE_IDLE",
"BLE_SUB_STATE_SEND_WAIT",
"BLE_SUB_STATE_PROCESS_RESP"
};
const BleAtCmd_t ble_init_sequence[] = {
{"AT\\r\\n", 100, 3, NULL, parse_general_resp},
{"AT+LADDR\\r\\n", 100, 3, NULL, parse_laddr_resp},
{NULL, 0, 0, NULL, NULL} // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
const BleAtCmd_t ble_first_connect_sequence[] = {
{"AT+UUID<%d>\\r\\n", 100, 3, prepare_uuid_cmd, parse_general_resp},
{"AT+RESET\\r\\n", 100, 3, NULL, parse_general_resp},
{"AT+NOTI%d\\r\\n",100, 3, prepare_noti_cmd, parse_general_resp},
{NULL, 0, 0, NULL, NULL} // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
const BleAtCmd_t ble_connect_sequence[] = {
// {"AT+DIRADV\\r\\n", 100, 3, NULL, parse_diradv_cmd},
{"AT+DIRADV%d,%d,%s\\r\\n", 100, 3, prepare_diradv_cmd, parse_general_resp},
{NULL, 0, 0, NULL, NULL} // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
const BleAtCmd_t ble_trans_cfg_sequence[] = {
{"AT+TRANSPORT%d\\r\\n", 100, 3, prepare_transport_cmd, parse_general_resp},
{NULL, 0, 0, NULL, NULL} // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
//software reset
const BleAtCmd_t ble_reset_sequence[] = {
{"AT+RESET\r\n", 100, 3, NULL, parse_general_resp},
{NULL, 0, 0, NULL, NULL}
};
// reset to default
const BleAtCmd_t ble_default_sequence[] = {
{"AT+DEFAULT\r\n", 100, 3, NULL, parse_general_resp},
{NULL, 0, 0, NULL, NULL}
};
// total reset sequence
const BleAtCmd_t ble_full_set_sequence[] = {
{"AT+DISC\r\n", 100, 3, NULL, NULL},
{"AT+RESET\r\n", 100, 3, NULL, parse_general_resp},
{"AT+DEFAULT\r\n", 100, 3, NULL, parse_general_resp},
{NULL, 0, 0, NULL, NULL}
};
BleErrorInfo_t g_ble_error = {0};
BleGlobalConfig_t g_ble_config = {
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>
.mac_addr = "",
.addr_type = 0,
// <20><EFBFBD><E3B2A5><EFBFBD><EFBFBD>
.adv_param = 0, // <20><>Ϊ0
.adv_type = 0, // <20><>Ϊ0
.target_mac = "", // <20><>ʼ<EFBFBD><CABC>Ϊ<EFBFBD><CEAA><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// ͨ<>Ų<EFBFBD><C5B2><EFBFBD>
.baud_rate = 9600, // ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB1A3><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>ֵ
.tx_power = 0,
// UUID
.service_uuid = 0, // <20><>ʽд0<D0B4><30>Ҳ<EFBFBD><D2B2>ʡ<EFBFBD>ԣ<EFBFBD>
// NOTIѡ<49><D1A1>
.Noption = 1, // <20><>ʽд0
// TRANSѡ<53><D1A1>
.Toption = 1 // <20><>ʽд0
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD>
BleErrorCodeInfo_t g_ble_error_table[] = {
{101, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>", RECOVERY_TARGET_RESTART_SEQ}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>
{102, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", RECOVERY_TARGET_RESTART_SEQ}, // ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{103, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", RECOVERY_TARGET_RESTART_SEQ}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{104, "ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", RECOVERY_TARGET_SW_RESET_MODULE}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
2026-02-24 13:00:08 +08:00
void BLE_Init(void)
{
curr_state = BLE_INIT;
ble_cmd_rec_done = 0;
}
BLE_STATE BLE_GetState(void)
{
return curr_state;
}
void BLE_StateMachine_Handler(void)
{
switch(curr_state)
{
case BLE_INIT :
{
if(init_executor.sequence == NULL)
{
init_executor.sequence = ble_init_sequence;
init_executor.cmd_index = 0;
init_executor.retry_cnt = 0;
init_executor.state = EXEC_STATE_IDLE;
}
ExecutorResult_t res = CmdExecutor_Process(&init_executor);
if(res == EXECUTOR_DONE)
{
// <20><><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><DAB1>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>first connect
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>connected
if(Load_MAC_From_Flash(host_mac) == 0)
{
curr_state = BLE_CONNECTED;
}
else
{
curr_state = BLE_FIRST_CONECT;
}
2026-02-24 13:00:08 +08:00
2026-02-24 13:00:08 +08:00
memset(&init_executor, 0, sizeof(init_executor));
}
else if(res == EXECUTOR_ERROR)
{
g_ble_error.cmd_index = init_executor.cmd_index;
g_ble_error.error_code =init_executor.error_code;
g_ble_error.main_state = curr_state;
g_ble_error.timestamp = HAL_GetTick();
g_ble_error.origin_state = BLE_INIT;
curr_state = BLE_ERROR;
memset(&init_executor, 0, sizeof(init_executor));
}
}
break;
case BLE_FIRST_CONECT :
{
// <20><><EFBFBD>Գ<EFBFBD>ʼ<EFBFBD><CABC>
if (first_connect_executor.sequence == NULL)
{
first_connect_executor.sequence = ble_first_connect_sequence;
first_connect_executor.cmd_index = 0;
first_connect_executor.retry_cnt = 0;
first_connect_executor.state = EXEC_STATE_IDLE;
}
2026-02-24 13:00:08 +08:00
ExecutorResult_t res = CmdExecutor_Process(&first_connect_executor);
if(res == EXECUTOR_DONE)
{
FT_connect = 1;
curr_state = BLE_WAIT_CONNECT;
2026-02-24 13:00:08 +08:00
}
else if(res == EXECUTOR_ERROR)
{
g_ble_error.cmd_index = first_connect_executor.cmd_index;
g_ble_error.error_code =first_connect_executor.error_code;
2026-02-24 13:00:08 +08:00
g_ble_error.main_state = curr_state;
g_ble_error.timestamp = HAL_GetTick();
g_ble_error.origin_state = BLE_FIRST_CONECT;
curr_state = BLE_ERROR;
memset(&first_connect_executor, 0, sizeof(first_connect_executor));
2026-02-24 13:00:08 +08:00
}
}
break;
case BLE_CONNECTED :
{
if (connect_executor.sequence == NULL)
{
connect_executor.sequence = ble_connect_sequence;
connect_executor.cmd_index = 0;
connect_executor.retry_cnt = 0;
connect_executor.state = EXEC_STATE_IDLE;
}
2026-02-24 13:00:08 +08:00
ExecutorResult_t res = CmdExecutor_Process(&connect_executor);
if(res == EXECUTOR_DONE)
{
/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
curr_state = BLE_WAIT_CONNECT;
2026-02-24 13:00:08 +08:00
}
else if(res == EXECUTOR_ERROR)
{
g_ble_error.cmd_index = connect_executor.cmd_index;
g_ble_error.error_code =connect_executor.error_code;
2026-02-24 13:00:08 +08:00
g_ble_error.main_state = curr_state;
g_ble_error.timestamp = HAL_GetTick();
g_ble_error.origin_state = BLE_CONNECTED;
curr_state = BLE_ERROR;
memset(&init_executor, 0, sizeof(connect_executor));
}
}
break;
case BLE_WAIT_CONNECT:
2026-02-24 13:00:08 +08:00
{
if(ble_cmd_rec_done == 1)
{
parse_master_addr_resp(ble_rx_buffer);
if(FT_connect)
{
//д<><EFBFBD><EBB1BE>flash
Save_MAC_To_Flash(host_mac);
}
curr_state = BLE_CFG_TRANS;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>BLE_READY<44><59>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ble_cmd_rec_done = 0;
2026-02-24 13:00:08 +08:00
}
}
2026-02-24 13:00:08 +08:00
break;
case BLE_CFG_TRANS:
{
// <20><><EFBFBD>Գ<EFBFBD>ʼ<EFBFBD><CABC>
if (trans_cfg_executor.sequence == NULL)
{
trans_cfg_executor.sequence = ble_trans_cfg_sequence; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD> AT+TRANSPORT
trans_cfg_executor.cmd_index = 0;
trans_cfg_executor.retry_cnt = 0;
trans_cfg_executor.state = EXEC_STATE_IDLE;
}
ExecutorResult_t res = CmdExecutor_Process(&trans_cfg_executor);
if (res == EXECUTOR_DONE)
{
// ͸<><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BLE_READY
curr_state = BLE_READY;
memset(&trans_cfg_executor, 0, sizeof(trans_cfg_executor)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´ο<C2B4><CEBF>ܸ<EFBFBD><DCB8><EFBFBD>
}
else if (res == EXECUTOR_ERROR)
{
g_ble_error.cmd_index = trans_cfg_executor.cmd_index;
g_ble_error.error_code = trans_cfg_executor.error_code;
g_ble_error.main_state = curr_state;
g_ble_error.timestamp = HAL_GetTick();
g_ble_error.origin_state = BLE_CFG_TRANS;
curr_state = BLE_ERROR;
memset(&trans_cfg_executor, 0, sizeof(trans_cfg_executor));
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BUSY<53><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>
break;
}
case BLE_READY :
{
static uint32_t last_transmit_time = 0;
uint32_t now = HAL_GetTick();
if (now - last_transmit_time >= 300) // <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>
{
// <20><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ȡ<EFBFBD><C8A1>
uint8_t tx_data[] = "Hello BLE!\r\n";
HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data)-1, 100);
last_transmit_time = now;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻص<DABB><D8B5>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
}
break;
2026-02-24 13:00:08 +08:00
case BLE_ERROR :
2026-02-24 17:01:12 +08:00
{
2026-02-25 16:56:05 +08:00
const uint8_t MAX_RECOVERY_LEVEL = 3;
recovery_level++;
if (recovery_level > MAX_RECOVERY_LEVEL) {
DEBUG("<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ޣ<EFBFBD>%d<>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>", MAX_RECOVERY_LEVEL);
curr_state = BLE_WAITTING;
break;
}
2026-02-24 17:01:12 +08:00
2026-02-24 13:00:08 +08:00
switch(g_ble_error.type)
{
case ERR_TYPE_NONE:
2026-02-24 17:01:12 +08:00
curr_state = g_ble_error.origin_state;
2026-02-24 13:00:08 +08:00
break;
case ERR_TYPE_PREPARE_FAILED:
{
2026-02-24 17:01:12 +08:00
g_ble_error.recovery_target = RECOVERY_TARGET_RECONFIG_UART;
//curr_state = BLE_WAITTING;
2026-02-24 13:00:08 +08:00
}
break;
case ERR_TYPE_TIMEOUT_EXCEEDED:
2026-02-25 16:56:05 +08:00
2026-02-24 17:01:12 +08:00
g_ble_error.recovery_target = RECOVERY_TARGET_RESTART_SEQ;
2026-02-25 16:56:05 +08:00
2026-02-24 17:01:12 +08:00
//curr_state = BLE_SET;
2026-02-24 13:00:08 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>Ϣ
break;
case ERR_TYPE_PARSE_FAILED:
2026-02-25 16:56:05 +08:00
2026-02-24 17:01:12 +08:00
// DEBUG("error message ,main state:%s, sub state:%s, cmd_index:%d, timestamp:%d",
// ble_state_names[g_ble_error.main_state], ble_sub_state_names[g_ble_error.sub_state], g_ble_error.cmd_index, g_ble_error.timestamp);
g_ble_error.recovery_target = RECOVERY_TARGET_RESTART_SEQ;
2026-02-25 16:56:05 +08:00
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>Ϣ
2026-02-24 13:00:08 +08:00
break;
case ERR_TYPE_MODULE_ERROR:
2026-02-24 17:01:12 +08:00
{
uint8_t table_size = sizeof(g_ble_error_table) / sizeof(g_ble_error_table[0]);
uint8_t i;
for(i = 0; i < table_size; i++)
2026-02-24 13:00:08 +08:00
{
if(g_ble_error.error_code == g_ble_error_table[i].code)
{
2026-02-24 17:01:12 +08:00
g_ble_error.recovery_target = g_ble_error_table[i].recovery_target;
DEBUG("error message ,main state:%s, sub state:%s, cmd_index:%d, timestamp:%d",
ble_state_names[g_ble_error.main_state], ble_sub_state_names[g_ble_error.sub_state], g_ble_error.cmd_index, g_ble_error.timestamp);
2026-02-25 16:56:05 +08:00
//curr_state = BLE_SET;
break;
2026-02-24 17:01:12 +08:00
}
2026-02-25 16:56:05 +08:00
}
if(i == table_size)
{
2026-02-24 17:01:12 +08:00
g_ble_error.recovery_target = RECOVERY_TARGET_RESTART_SEQ;
2026-02-24 13:00:08 +08:00
}
2026-02-25 16:56:05 +08:00
break;
2026-02-24 13:00:08 +08:00
2026-02-25 16:56:05 +08:00
}
2026-02-24 13:00:08 +08:00
default:
2026-02-24 17:01:12 +08:00
g_ble_error.recovery_target = RECOVERY_TARGET_PANIC;
2026-02-24 13:00:08 +08:00
break;
2026-02-25 16:56:05 +08:00
}
2026-02-24 17:01:12 +08:00
// 3. ִ<>лָ<D0BB><D6B8><EFBFBD><EFBFBD><EFBFBD>
switch(g_ble_error.recovery_target)
{
case RECOVERY_TARGET_RESTART_SEQ:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>̽׶Σ<D7B6><CEA3><EFBFBD><EFBFBD><EFBFBD> origin_state <20><><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD><D3A6>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>
switch(g_ble_error.origin_state)
{
case BLE_INIT:
memset(&init_executor, 0, sizeof(init_executor));
break;
case BLE_FIRST_CONECT:
memset(&first_connect_executor, 0, sizeof(first_connect_executor));
break;
case BLE_CONNECTED:
memset(&connect_executor, 0, sizeof(connect_executor));
break;
default:
break;
}
// <20><><EFBFBD><EFBFBD>ԭ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD>ʼִ<CABC><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2026-02-25 16:56:05 +08:00
recovery_level = 0;
2026-02-24 17:01:12 +08:00
curr_state = g_ble_error.origin_state;
break;
case RECOVERY_TARGET_RECONFIG_UART:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MCU <20><><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4>ڳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>磺 MX_USART1_UART_Init();
// Ȼ<><C8BB><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧִ<D3A6><D6B4><EFBFBD><EFBFBD>
switch(g_ble_error.origin_state)
{
case BLE_INIT:
memset(&init_executor, 0, sizeof(init_executor));
break;
case BLE_FIRST_CONECT:
memset(&first_connect_executor, 0, sizeof(first_connect_executor));
break;
case BLE_CONNECTED:
memset(&connect_executor, 0, sizeof(connect_executor));
break;
default:
break;
}
2026-02-25 16:56:05 +08:00
recovery_level = 0;
2026-02-24 17:01:12 +08:00
curr_state = g_ble_error.origin_state;
break;
2026-02-25 16:56:05 +08:00
case RECOVERY_TARGET_SW_RESET_MODULE:
2026-02-24 17:01:12 +08:00
case RECOVERY_TARGET_FACTORY_RESET:
// <20><>Ҫͨ<D2AA><CDA8> AT <20><><EFBFBD><EFBFBD>ִ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD> BLE_SET ״̬
// ע<>⣺origin_state <20><><EFBFBD>ֲ<EFBFBD><D6B2>䣬BLE_SET ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B7B5><EFBFBD><EFBFBD>
curr_state = BLE_SET;
break;
case RECOVERY_TARGET_HARD_RESET_MODULE:
// Ӳ<><D3B2><EFBFBD><EFBFBD>λģ<CEBB><EFBFBD><E9A3BA><EFBFBD>͸<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BLE_RST_PIN <20><><EFBFBD><EFBFBD>
// HAL_GPIO_WritePin(BLE_RST_GPIO_Port, BLE_RST_Pin, GPIO_PIN_RESET);
// HAL_Delay(100);
// HAL_GPIO_WritePin(BLE_RST_GPIO_Port, BLE_RST_Pin, GPIO_PIN_SET);
// <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧִ<D3A6><D6B4><EFBFBD><EFBFBD>
switch(g_ble_error.origin_state)
{
case BLE_INIT:
memset(&init_executor, 0, sizeof(init_executor));
break;
case BLE_FIRST_CONECT:
memset(&first_connect_executor, 0, sizeof(first_connect_executor));
break;
case BLE_CONNECTED:
memset(&connect_executor, 0, sizeof(connect_executor));
break;
default:
break;
}
2026-02-25 16:56:05 +08:00
recovery_level = 0;
2026-02-24 17:01:12 +08:00
curr_state = g_ble_error.origin_state;
break;
case RECOVERY_TARGET_SOFT_RESET_MCU:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> MCU
//NVIC_SystemReset();
break;
case RECOVERY_TARGET_PANIC:
default:
// <20>޷<EFBFBD><DEB7>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>״̬
DEBUG("error message ,main state:%s, sub state:%s, cmd_index:%d, timestamp:%d",
ble_state_names[g_ble_error.main_state], ble_sub_state_names[g_ble_error.sub_state], g_ble_error.cmd_index, g_ble_error.timestamp);
curr_state = BLE_WAITTING;
break;
}
2026-02-25 16:56:05 +08:00
break;
2026-02-24 17:01:12 +08:00
}
2026-02-24 13:00:08 +08:00
case BLE_SET :
{
2026-02-24 17:01:12 +08:00
const BleAtCmd_t* target_seq = NULL;
switch(g_ble_error.recovery_target)
2026-02-24 13:00:08 +08:00
{
2026-02-24 17:01:12 +08:00
case RECOVERY_TARGET_SW_RESET_MODULE:
{
static const BleAtCmd_t sw_reset_sq[] = {
{"AT+RESET\r\n", 100, 3, NULL, NULL},
{NULL, 0, 0, NULL, NULL}
2026-02-24 17:01:12 +08:00
};
target_seq = sw_reset_sq;
}
break;
case RECOVERY_TARGET_FACTORY_RESET:
2026-02-25 16:56:05 +08:00
{ //<2F>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2026-02-24 17:01:12 +08:00
{
static const BleAtCmd_t factory_reset_seq[] = {
{"AT+DEFAULT\r\n", 100, 3, NULL, NULL},
{NULL, 0, 0, NULL, NULL}
2026-02-24 17:01:12 +08:00
};
target_seq = factory_reset_seq;
}
break;
2026-02-25 16:56:05 +08:00
}
2026-02-24 17:01:12 +08:00
default:
//û<><C3BB>ƥ<EFBFBD><C6A5>Ŀ<EFBFBD><C4BF><EFBFBD>򷵻<EFBFBD>ԭ״̬
curr_state = g_ble_error.origin_state;
break;
}
if(target_seq != NULL)
2026-02-25 16:56:05 +08:00
{
2026-02-24 17:01:12 +08:00
// <20><><EFBFBD><EFBFBD> set_executor <20><>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
if(set_executor.sequence == NULL)
2026-02-25 16:56:05 +08:00
{
set_executor.sequence = target_seq;
set_executor.cmd_index = 0;
set_executor.retry_cnt = 0;
set_executor.state = EXEC_STATE_IDLE;
}
ExecutorResult_t res = CmdExecutor_Process(&set_executor);
if(res == EXECUTOR_DONE)
{
// <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>гɹ<D0B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A3AC><EFBFBD><EFBFBD>ԭ״̬
// ע<><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD> recovery_level <20><><EFBFBD><EFBFBD> BLE_ERROR <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ľ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7>ʡ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BLE_ERROR <20>ж<EFBFBD><D0B6><EFBFBD>һ<EFBFBD><D2BB>ȫ<EFBFBD>ֻ<EFBFBD><D6BB>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ij<EFBFBD>ַ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>ݡ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD> BLE_ERROR <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> recovery_level<65><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BLE_ERROR <20><><EFBFBD>жϻָ<CFBB><D6B8>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD>񣬵<EFBFBD><F1A3ACB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7B5>ԭ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD> BLE_ERROR <20>´ν<C2B4><CEBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB> BLE_ERROR <20>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BLE_SET <20>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>ԭ״̬<D7B4><CCAC><EFBFBD><EFBFBD>ԭ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴγ<D9B4><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD> BLE_ERROR<4F><52><EFBFBD><EFBFBD>ʱ recovery_level <20><>Ȼ<EFBFBD><C8BB><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǻ<EFBFBD><C7BA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>Ϊ<EFBFBD>Ѿ<EFBFBD><D1BE>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC>𣿣<EFBFBD>
// ʵ<><CAB5><EFBFBD>ϣ<EFBFBD>һ<EFBFBD>λָ<CEBB><D6B8>ɹ<EFBFBD><C9B9><EFBFBD>ζ<EFBFBD><CEB6>ϵͳ<CFB5>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA> BLE_SET <20>ɹ<EFBFBD>ʱ֪ͨ BLE_ERROR <20><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> recovery_level <20><> BLE_ERROR <20>ڲ<EFBFBD><DAB2>ľ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>ֱ<EFBFBD>Ӵ<EFBFBD><D3B4>ⲿ<EFBFBD>޸ġ<DEB8><C4A1><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF>Խ<EFBFBD> recovery_level <20><><EFBFBD><EFBFBD>Ϊȫ<CEAA>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڡ<D3BF>
// <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD>˼򵥣<CBBC><F2B5A5A3><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD> recovery_level <20><>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5A3A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BLE_SET <20>ɹ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD> uint8_t g_recovery_level; <20><><EFBFBD><EFBFBD> BLE_ERROR <20>и<EFBFBD>Ϊʹ<CEAA><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD> recovery_level <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>static<69><63><EFBFBD><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD> BLE_SET <20>а<EFBFBD><D0B0><EFBFBD>һ<EFBFBD><D2BB> extern <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱע<CAB1>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>֡<EFBFBD>
recovery_level = 0;
memset(&set_executor, 0, sizeof(set_executor));
curr_state = g_ble_error.origin_state;
}
else if(res == EXECUTOR_ERROR)
{
// <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>Ҳʧ<D2B2>ܣ<EFBFBD><DCA3><EFBFBD> set_executor <20>еĴ<D0B5><C4B4><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>Ƶ<EFBFBD> g_ble_error<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD> origin_state<74><65>
g_ble_error.type = set_executor.error_type;
g_ble_error.error_code = set_executor.error_code;
g_ble_error.cmd_index = set_executor.error_cmd_index;
g_ble_error.timestamp = HAL_GetTick();
// ע<><EFBFBD><E2A3BA>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD> origin_state
memset(&set_executor, 0, sizeof(set_executor));
// <20>ٴν<D9B4><CEBD><EFBFBD> BLE_ERROR<4F><52><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
curr_state = BLE_ERROR;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BUSY<53><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4>л<EFBFBD>
}
break;
}
2026-02-24 13:00:08 +08:00
break;
case BLE_WAITTING:
{
static uint32_t last_time = 0;
uint32_t time = HAL_GetTick();
uint32_t rest = time - last_time;
if(rest >= 500)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
last_time = time;
}
}
break;
default:
break;
}
}
2026-02-25 16:56:05 +08:00
ExecutorResult_t CmdExecutor_Process(CmdExecutor_t* ex) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>
2026-02-24 13:00:08 +08:00
{
switch(ex->state)
{
case EXEC_STATE_IDLE:
{
ble_cmd_rec_done= 0;
if(ex->sequence[ex->cmd_index].cmd == NULL)
{
DEBUG("init success");
return EXECUTOR_DONE;
}
const BleAtCmd_t *current_cmd = &ex->sequence[ex->cmd_index];
char final_cmd[64];
int prepare_ok = 0; // <20><><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD>
if(current_cmd->prepare_cmd != NULL)
{
int prepare_result = current_cmd->prepare_cmd(current_cmd->cmd, final_cmd, sizeof(final_cmd));
if(prepare_result != 0)
{
DEBUG("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", prepare_result);
ex->error_type = ERR_TYPE_PREPARE_FAILED;
ex->error_code = prepare_result;
ex->error_cmd_index = ex->cmd_index;
ex->state = EXEC_STATE_ERROR;
return EXECUTOR_ERROR;
}
else
{
prepare_ok = 1;
}
2026-02-25 16:56:05 +08:00
2026-02-24 13:00:08 +08:00
}
else
{
strncpy(final_cmd, current_cmd->cmd, sizeof(final_cmd));
final_cmd[sizeof(final_cmd) - 1] = '\0';
prepare_ok = 1;
}
if(prepare_ok == 1)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʴ<EFBFBD><CAB4><EFBFBD>
ex->start_tick = HAL_GetTick();
ex->state = EXEC_STATE_SEND_WAIT;
ble_cmd_rec_done = 0;
return EXECUTOR_BUSY;
}
return EXECUTOR_BUSY;
}
case EXEC_STATE_SEND_WAIT:
{
const BleAtCmd_t *current_cmd = &ex->sequence[ex->cmd_index];
uint16_t out_time = current_cmd->timeout_ms;
uint8_t try_max = current_cmd->retry_max;
if(ble_cmd_rec_done == 1)
{
ex->retry_cnt = 0;
ex->state = EXEC_STATE_PROCESS_RESP;
return EXECUTOR_BUSY;
}
uint32_t time = HAL_GetTick();
if((time - ex->start_tick) > out_time)
{
ex->retry_cnt++;
if(ex->retry_cnt <= try_max)
{
ex->state = EXEC_STATE_IDLE;
ble_cmd_rec_done = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
return EXECUTOR_BUSY;
}
else
{
ex->error_type = ERR_TYPE_TIMEOUT_EXCEEDED;
ex->error_code = 0;
ex->error_cmd_index = ex->cmd_index;
ex->state = EXEC_STATE_ERROR;
return EXECUTOR_ERROR;
}
}
return EXECUTOR_BUSY;
}
2026-02-24 13:00:08 +08:00
case EXEC_STATE_PROCESS_RESP:
{
//<2F><><EFBFBD>ܴ<EFBFBD><DCB4>ڻش<DABB><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
//char process_data[] = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const BleAtCmd_t *current_cmd = &ex->sequence[ex->cmd_index];
int result;
if ((current_cmd->parse_resp) != NULL)
{
result = current_cmd->parse_resp(ble_rx_buffer);
}
else
{
result = parse_general_resp(ble_rx_buffer);
}
if(result == 0) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ
{
ex->cmd_index++;
ex->retry_cnt = 0;
ex->state = EXEC_STATE_IDLE;
ble_cmd_rec_done = 0;
return EXECUTOR_BUSY;
}
else if(result > 0) //ģ<><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD>
{
ex->retry_cnt++;
if(ex->retry_cnt <= current_cmd->retry_max)
{
ex->state = EXEC_STATE_IDLE;
ble_cmd_rec_done = 0;
return EXECUTOR_BUSY;
}
else
{
ex->error_type = ERR_TYPE_MODULE_ERROR;
ex->error_code = result;
ex->error_cmd_index = ex->cmd_index;
ex->state = EXEC_STATE_ERROR;
return EXECUTOR_ERROR;
}
}
else //result<0
{
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ex->retry_cnt++;
if(ex->retry_cnt <= current_cmd->retry_max)
{
ex->state = EXEC_STATE_IDLE;
ble_cmd_rec_done = 0;
return EXECUTOR_BUSY;
}
else
{
ex->error_type = ERR_TYPE_PARSE_FAILED;
ex->error_code = result;
ex->error_cmd_index = ex->cmd_index;
ex->state = EXEC_STATE_ERROR;
return EXECUTOR_ERROR;
}
}
}
break;
default:
break;
}
}
uint8_t BLE_UART_RxCallback(uint8_t *data, uint16_t len)
2026-02-24 13:00:08 +08:00
{
// <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽڸ<D6BD><DAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t copy_len = (len < sizeof(ble_rx_buffer)) ? len : (sizeof(ble_rx_buffer) - 1);
memcpy(ble_rx_buffer, data, copy_len);
ble_rx_buffer[copy_len] = '\0'; // <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
// <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־
ble_cmd_rec_done = 1;
return 0;
2026-02-24 13:00:08 +08:00
}
int parse_general_resp(const char* resp)
{
if(resp == NULL)
{
return -1;
}
const char *ok_result = strstr(resp, "OK");
if(ok_result != NULL)
{
return 0;
}
int err_code = 0;
int auth = sscanf(resp, "ERROR=<%d>", &err_code);
if(auth == 1)
{
uint8_t table_size = sizeof(g_ble_error_table)/sizeof(g_ble_error_table[0]);
for(uint8_t i = 0; i<table_size; i++)
{
if(err_code == g_ble_error_table[i].code)
{
DEBUG("%s", g_ble_error_table[i].desc);
return err_code;
}
}
DEBUG("δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%d", err_code);
return err_code;
}
DEBUG("<EFBFBD>޷<EFBFBD>ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ: %s", resp);
return -1; // <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>ֵ
}
2026-02-24 13:00:08 +08:00
int prepare_diradv_cmd(const char* cmd_template, char* cmd_buf, int buf_size)
{
if(cmd_buf == NULL || buf_size <= 0)
{
return -1;
}
uint8_t para = g_ble_config.adv_param; //ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t type = g_ble_config.addr_type; //ȡ<><C8A1><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
char* mac = g_ble_config.target_mac; //ȡ<><C8A1>mac<61><63>ַ
int needed_len = snprintf(cmd_buf, buf_size, cmd_template, para, type, mac);
if(needed_len < 0)
{
return -1;
}
else if(needed_len >= buf_size)
{
return -2;
}
else
{
return -3;
}
}
int parse_laddr_resp(const char* resp)
{
if (resp == NULL)
{
return -1; // <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
}
char mac[13]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E6B4A2>ȡ<EFBFBD><C8A1>MAC<41><43>ַ<EFBFBD><D6B7>12<31>ַ<EFBFBD> + '\0'<27><>
// ʹ<><CAB9>sscanf<6E><66>ȡ<EFBFBD>Ⱥź<C8BA><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>12<31><32><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>հ׷<D5B0><D7B7><EFBFBD>
if (sscanf(resp, "+LADDR=%12s", mac) == 1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ12<31><32><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD>ضϣ<D8B6>
if (strlen(mac) == 12)
{
// <20><>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD>Ƶ<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD>ýṹ<C3BD><E1B9B9><EFBFBD><EFBFBD>
strncpy(g_ble_config.mac_addr, mac, 12);
g_ble_config.mac_addr[12] = '\0'; // ȷ<><C8B7><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ֹ
return 0; // <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>ʽ<EFBFBD><CABD>ƥ<EFBFBD><C6A5><EFBFBD>򳤶Ȳ<F2B3A4B6><C8B2>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
return -1;
2026-02-24 13:00:08 +08:00
}
uint8_t parse_master_addr_resp(const char* resp)
{
char *res = strstr(ble_rx_buffer, "0x");
if (res != NULL)
{
char *num_start = res + 2; // <20><><EFBFBD><EFBFBD> "0x"
char mac_str[13]; // 12<31>ַ<EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int i = 0;
// <20><><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (*num_start != '\0')
{
char c = *num_start;
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
if ((c >= '0' && c <= '9') ||
(c >= 'A' && c <= 'F') ||
(c >= 'a' && c <= 'f'))
{
if (i < sizeof(mac_str) - 1)
{ // <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mac_str[i++] = c;
}
else
{
break; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ
}
}
else
{
break; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ֹͣ
}
num_start++;
}
mac_str[i] = '\0'; // <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʱ mac_str <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// <20><><EFBFBD><EFBFBD>浽ȫ<E6B5BD>ֱ<EFBFBD><D6B1><EFBFBD>
strncpy(host_mac, mac_str, 12);
host_mac[12] = '\0';
}
2026-02-24 13:00:08 +08:00
}
2026-02-24 13:00:08 +08:00
int prepare_uuid_cmd(const char* cmd_template, char* cmd_buf, int buf_size)
{
if (cmd_buf == NULL || buf_size <= 0)
{
return -1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
uint16_t uuid = g_ble_config.service_uuid; // <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1> UUID
int needed_len = snprintf(cmd_buf, buf_size, cmd_template, uuid);
if (needed_len < 0)
{
return -1; // <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else if (needed_len >= buf_size)
{
return -2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
return 0; // <20>ɹ<EFBFBD>
}
}
2026-02-24 13:00:08 +08:00
int prepare_noti_cmd(const char* cmd_template, char* cmd_buf, int buf_size)
{
if (cmd_buf == NULL || buf_size <= 0)
{
return -1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
uint8_t noti_opt = g_ble_config.Noption; // <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>֪ͨѡ<D6AA>0<EEA3A8><30>1<EFBFBD><31>
int needed_len = snprintf(cmd_buf, buf_size, cmd_template, noti_opt);
if (needed_len < 0)
{
return -1; // <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else if (needed_len >= buf_size)
{
return -2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
return 0; // <20>ɹ<EFBFBD>
}
}
2026-02-24 13:00:08 +08:00
int prepare_transport_cmd(const char* cmd_template, char* cmd_buf, int buf_size)
{
if (cmd_buf == NULL || buf_size <= 0)
{
return -1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
uint8_t transport_opt = g_ble_config.Toption; // <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>͸<EFBFBD><CDB8>ѡ<EFBFBD><D1A1>
int needed_len = snprintf(cmd_buf, buf_size, cmd_template, transport_opt);
if (needed_len < 0)
{
return -1; // <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else if (needed_len >= buf_size)
{
return -2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
return 0; // <20>ɹ<EFBFBD>
}
}
2026-02-24 13:00:08 +08:00