继续修改蓝牙模块

This commit is contained in:
kkkjtr 2026-02-24 17:01:12 +08:00
parent f48ea0221c
commit dca184ea3d
3 changed files with 245 additions and 71 deletions

View File

@ -174,17 +174,20 @@ void BLE_StateMachine_Handler(void)
case BLE_ERROR :
{
static uint8_t recovery_level = 0;
const uint8_t MAX_RECOVERY_LEVEL = 3;
switch(g_ble_error.type)
{
case ERR_TYPE_NONE:
curr_state = g_ble_error.origin_state;
break;
case ERR_TYPE_PREPARE_FAILED:
{
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;
g_ble_error.recovery_target = RECOVERY_TARGET_RECONFIG_UART;
//curr_state = BLE_WAITTING;
}
@ -192,9 +195,11 @@ void BLE_StateMachine_Handler(void)
case ERR_TYPE_TIMEOUT_EXCEEDED:
{
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_SET;
g_ble_error.recovery_target = RECOVERY_TARGET_RESTART_SEQ;
//curr_state = BLE_SET;
//重新配置串口信息
}
@ -204,9 +209,10 @@ void BLE_StateMachine_Handler(void)
case ERR_TYPE_PARSE_FAILED:
{
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_SET;
// 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;
//重新配置串口信息
@ -217,19 +223,22 @@ void BLE_StateMachine_Handler(void)
case ERR_TYPE_MODULE_ERROR:
{
for(uint8_t i = 0; i < 4; i++)
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++)
{
if(g_ble_error.error_code == g_ble_error_table[i].code)
{
g_ble_error.
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);
//curr_state = BLE_SET;
}
if(i == table_size)
{
g_ble_error.recovery_target = RECOVERY_TARGET_RESTART_SEQ;
}
}
}
@ -237,36 +246,200 @@ void BLE_StateMachine_Handler(void)
break;
default:
g_ble_error.recovery_target = RECOVERY_TARGET_PANIC;
break;
}
if(g_ble_error.recovery_target >= RECOVERY_TARGET_SW_RESET_MODULE)
{
recovery_level++;
if(recovery_level > MAX_RECOVERY_LEVEL)
{
// 超过最大恢复级别,无法恢复,进入等待
DEBUG("恢复级别 %d 超过阈值,进入等待", recovery_level);
curr_state = BLE_WAITTING;
break; // 跳出 BLE_ERROR
}
}
// 3. 执行恢复动作
switch(g_ble_error.recovery_target)
{
case RECOVERY_TARGET_RESTART_SEQ:
// 重启当前流程阶段:根据 origin_state 重置对应的执行器
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;
}
// 返回原状态,重新开始执行序列
curr_state = g_ble_error.origin_state;
break;
case RECOVERY_TARGET_RECONFIG_UART:
// 重新配置 MCU 串口(调用你的串口初始化函数)
// 例如: MX_USART1_UART_Init();
// 然后重置对应执行器
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;
}
curr_state = g_ble_error.origin_state;
break;
// case RECOVERY_TARGET_SW_RESET_MODULE:
case RECOVERY_TARGET_FACTORY_RESET:
// 需要通过 AT 命令执行,进入 BLE_SET 状态
// 注意origin_state 保持不变BLE_SET 执行完后会返回它
curr_state = BLE_SET;
break;
case RECOVERY_TARGET_HARD_RESET_MODULE:
// 硬件复位模块:拉低复位引脚,延时,拉高
// 假设有 BLE_RST_PIN 控制
// 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);
// 复位后重置对应执行器
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;
}
curr_state = g_ble_error.origin_state;
break;
case RECOVERY_TARGET_SOFT_RESET_MCU:
// 软件复位整个 MCU
//NVIC_SystemReset();
break;
case RECOVERY_TARGET_PANIC:
default:
// 无法恢复,进入等待状态
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;
}
}
break;
case BLE_SET :
{
if() //重新配置串口信息
const BleAtCmd_t* target_seq = NULL;
switch(g_ble_error.recovery_target)
{
case RECOVERY_TARGET_SW_RESET_MODULE:
{
static const BleAtCmd_t sw_reset_sq[] = {
{"AT+RESET\r\n", "OK", 100, 3, NULL, NULL},
{NULL, NULL, 0, 0, NULL, NULL}
};
target_seq = sw_reset_sq;
}
else if() //重新启动设备
break;
case RECOVERY_TARGET_FACTORY_RESET:
//回复出厂设置
{
static const BleAtCmd_t factory_reset_seq[] = {
{"AT+DEFAULT\r\n", "OK", 100, 3, NULL, NULL},
{NULL, NULL, 0, 0, NULL, NULL}
};
target_seq = factory_reset_seq;
}
break;
default:
//没有匹配目标则返回原状态
curr_state = g_ble_error.origin_state;
break;
}
if(target_seq != NULL)
{
// 如果 set_executor 尚未启动,则初始化
if(set_executor.sequence == NULL)
{
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)
{
// 恢复命令执行成功,将恢复级别清零,返回原状态
// 注意:恢复级别 recovery_level 是在 BLE_ERROR 中定义的静态变量,这里无法直接访问。
// 解决方案:可以在 BLE_ERROR 中定义一个全局或外部变量,或者通过某种方式传递。
// 简单起见,我们可以在 BLE_ERROR 中重置 recovery_level但这里无法做到。
// 一个常见的做法是在 BLE_ERROR 中判断恢复成功与否,但由于这里返回原状态,我们可以在返回前设置一个标志,让 BLE_ERROR 下次进入时重置级别。
// 但考虑到恢复级别只在 BLE_ERROR 中管理,我们可以这样处理:当 BLE_SET 成功返回原状态后,原状态会继续执行,如果再次出错会重新进入 BLE_ERROR此时 recovery_level 仍然存在,但这是合理的(因为已经成功过,应该重置级别?)
// 实际上,一次恢复成功意味着系统已经正常,应该重置级别。所以我们需要在 BLE_SET 成功时通知 BLE_ERROR 重置级别。
// 由于 recovery_level 是 BLE_ERROR 内部的静态变量,无法直接从外部修改。我们可以将 recovery_level 定义为全局变量,或者通过函数接口。
// 这里为了简单,我们假设 recovery_level 是全局变量(例如在文件顶部定义),并在 BLE_SET 成功时清零。
// 请根据实际情况调整。下面假设有一个全局变量 uint8_t g_recovery_level; 并在 BLE_ERROR 中改为使用它。
// 如果没有,你可以将 recovery_level 定义在文件作用域static然后在 BLE_SET 中包含一个 extern 声明。
// 这里我们暂时注释掉,你需要根据你的设计实现。
// g_recovery_level = 0; // 如果使用全局变量
memset(&set_executor, 0, sizeof(set_executor));
curr_state = g_ble_error.origin_state;
}
else if(res == EXECUTOR_ERROR)
{
// 恢复命令也失败,将 set_executor 中的错误信息复制到 g_ble_error保留 origin_state
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();
// 注意:不要覆盖 origin_state
memset(&set_executor, 0, sizeof(set_executor));
// 再次进入 BLE_ERROR恢复级别将在那里递增
curr_state = BLE_ERROR;
}
// 若返回 BUSY则继续等待不做状态切换
}
}

View File

@ -197,6 +197,7 @@ typedef struct {
int error_code; // 错误码(内部错误码或模块返回码)
uint32_t timestamp; // 时间戳
uint8_t origin_state; // 原始状态(用于恢复后返回)
RecoveryTarget_t recovery_target;// error fix target
} BleErrorInfo_t;
BleErrorInfo_t g_ble_error = {0};

File diff suppressed because one or more lines are too long