240 lines
6.5 KiB
C
240 lines
6.5 KiB
C
#ifndef BLE_H
|
||
#define BLE_H
|
||
#include "stm32f1xx_hal.h"
|
||
|
||
|
||
typedef enum{
|
||
BLE_INIT = 0,
|
||
BLE_FIRST_CONECT,
|
||
BLE_CONNECTED,
|
||
BLE_READY,
|
||
BLE_ERROR,
|
||
BLE_SET,
|
||
BLE_WAITTING
|
||
|
||
}BLE_STATE;
|
||
|
||
extern const char* ble_state_names[];
|
||
|
||
typedef enum {
|
||
EXEC_STATE_IDLE = 0,
|
||
EXEC_STATE_SEND_WAIT,
|
||
EXEC_STATE_PROCESS_RESP,
|
||
EXEC_STATE_ERROR
|
||
} ExecState_t;
|
||
|
||
extern const char* ble_sub_state_names[];
|
||
|
||
typedef enum {
|
||
EXECUTOR_BUSY, // 执行中,尚未完成
|
||
EXECUTOR_DONE, // 整个序列执行成功
|
||
EXECUTOR_ERROR // 发生不可恢复错误,错误信息已保存在执行器中
|
||
} ExecutorResult_t;
|
||
|
||
typedef enum {
|
||
RECOVERY_TARGET_NONE = 0,
|
||
RECOVERY_TARGET_RESTART_SEQ, // 重启当前序列(不在 BLE_SET 中执行,直接重置执行器)
|
||
RECOVERY_TARGET_SW_RESET_MODULE, // 软件复位模块
|
||
RECOVERY_TARGET_FACTORY_RESET, // 恢复出厂设置
|
||
RECOVERY_TARGET_RECONFIG_UART, // 重新配置串口(直接操作硬件,不经过 BLE_SET)
|
||
RECOVERY_TARGET_HARD_RESET_MODULE,// 硬件复位模块(直接操作引脚)
|
||
RECOVERY_TARGET_SOFT_RESET_MCU, // 软件复位 MCU
|
||
RECOVERY_TARGET_PANIC // 不可恢复
|
||
} RecoveryTarget_t;
|
||
|
||
typedef struct {
|
||
const char* cmd;
|
||
const char* expected_resp;
|
||
uint16_t timeout_ms;
|
||
uint8_t retry_max;
|
||
// 关键升级:一个用于生成动态命令参数的回调函数
|
||
int (*prepare_cmd)(const char* cmd_template, char* cmd_buf, int buf_size);
|
||
// 可选升级:一个用于解析自定义响应的回调函数
|
||
int (*parse_resp)(const char* resp);
|
||
} BleAtCmd_t;
|
||
|
||
const BleAtCmd_t ble_init_sequence[] = {
|
||
{"AT\\r\\n", "OK", 100, 3, NULL, NULL},
|
||
{"AT+TRANSPORT\\r\\n", "OK", 100, 3, NULL, NULL},
|
||
{"AT+TRANSPORT<%d>\\r\\n", "OK", 100, 3, set_trans_cmd, parse_trans_resp},
|
||
{"AT+DISC\\r\\n", "OK", 100, 3, NULL, NULL},
|
||
{"AT+TYPE\\r\\n", "OK", 100, 3, NULL, NULL},
|
||
// {"AT+TYPE<%x>\\r\\n", "OK", 100, 3, set_type_cmd, parse_type_resp},
|
||
{"AT+RESET\\r\\n", "OK", 100, 3, NULL, NULL},
|
||
{"AT+DEFAULT\\r\\n", "OK", 100, 3, NULL, NULL},
|
||
{NULL, NULL, 0, 0, NULL, NULL} // 结束标记
|
||
|
||
|
||
};
|
||
|
||
const BleAtCmd_t ble_first_connect_sequence[] = {
|
||
{"AT\r\n", "OK", 100, 3, NULL, NULL},
|
||
{"AT+OPASS\\r\\n", "OK", 100, 3, NULL, parse_opass_resp},
|
||
{"AT+OPASS<%d>\\r\\n", "OK", 100, 3, set_opass_cmd, NULL},
|
||
{"AT+APASS\\r\\n", "OK", 100, 3, NULL, parse_apass_resp},
|
||
{"AT+APASS<%d>\\r\\n", "OK", 100, 3, set_apass_cmd, NULL},
|
||
{"AT+DIRADV\\r\\n", "OK", 100, 3, NULL, parse_diradv_cmd},
|
||
{"AT+DIRADV%d,%d,%s\\r\\n", "OK", 100, 3, prepare_diradv_cmd, NULL},
|
||
{NULL, NULL, 0, 0, NULL, NULL} // 结束标记
|
||
|
||
};
|
||
|
||
|
||
const BleAtCmd_t ble_connect_sequence[] = {
|
||
{"AT\r\n", "OK", 100, 3, NULL, NULL},
|
||
{"AT+OPASS\\r\\n", "OK", 100, 3, NULL, parse_opass_resp},
|
||
{"AT+OPASS<%d>\\r\\n", "OK", 100, 3, set_opass_cmd, NULL},
|
||
{"AT+APASS\\r\\n", "OK", 100, 3, NULL, parse_apass_resp},
|
||
{"AT+APASS<%d>\\r\\n", "OK", 100, 3, set_apass_cmd, NULL},
|
||
{"AT+DIRADV\\r\\n", "OK", 100, 3, NULL, parse_diradv_cmd},
|
||
{"AT+DIRADV%d,%d,%s\\r\\n", "OK", 100, 3, prepare_diradv_cmd, NULL},
|
||
{NULL, NULL, 0, 0, NULL, NULL} // 结束标记
|
||
|
||
};
|
||
|
||
//software reset
|
||
const BleAtCmd_t ble_reset_sequence[] = {
|
||
{"AT+RESET\r\n", "OK", 100, 3, NULL, NULL},
|
||
{NULL, NULL, 0, 0, NULL, NULL}
|
||
};
|
||
|
||
// reset to default
|
||
const BleAtCmd_t ble_default_sequence[] = {
|
||
{"AT+DEFAULT\r\n", "OK", 100, 3, NULL, NULL},
|
||
{NULL, NULL, 0, 0, NULL, NULL}
|
||
};
|
||
|
||
// total reset sequence
|
||
const BleAtCmd_t ble_full_set_sequence[] = {
|
||
{"AT+DISC\r\n", "OK", 100, 3, NULL, NULL},
|
||
{"AT+RESET\r\n", "OK", 100, 3, NULL, NULL},
|
||
{"AT+DEFAULT\r\n", "OK", 100, 3, NULL, NULL},
|
||
{"AT+WHITELIST\r\n", "OK", 100, 3, NULL, NULL},
|
||
{"AT+NOTI\r\n", "OK", 100, 3, NULL, NULL},
|
||
{NULL, NULL, 0, 0, NULL, NULL}
|
||
};
|
||
|
||
|
||
|
||
typedef struct {
|
||
const BleAtCmd_t* sequence; // 当前正在执行的命令序列
|
||
uint16_t cmd_index; // 当前命令索引
|
||
uint8_t retry_cnt; // 当前命令已重试次数
|
||
uint32_t start_tick; // 命令发送时的时间戳
|
||
ExecState_t state; // 执行器状态:IDLE, SENDING, WAITING, DONE, ERROR
|
||
uint8_t error_type; // ERR_TYPE_xxx
|
||
int error_code; // 具体错误码(模块返回码或prepare返回值)
|
||
uint16_t error_cmd_index; // 发生错误的命令索引
|
||
} CmdExecutor_t;
|
||
|
||
|
||
typedef struct {
|
||
// 连接参数
|
||
char mac_addr[13]; // 蓝牙MAC地址 "A1B2C3D4E5F6"
|
||
uint8_t addr_type; // 地址类型 (0=public, 1=random)
|
||
|
||
// 广播参数 (用于 AT+DIRADV 等)
|
||
uint8_t adv_param;
|
||
uint8_t adv_type;
|
||
char target_mac[13]; // 定向广播的目标MAC
|
||
|
||
// 白名单参数 (用于 AT+WHITELIST 等)
|
||
uint8_t whitelist_count;
|
||
char whitelist_macs[3][13]; // 假设最多3个白名单设备
|
||
|
||
// 通信参数
|
||
uint32_t baud_rate; // 波特率
|
||
uint8_t tx_power; // 发射功率
|
||
|
||
// 模块工作参数
|
||
uint8_t work_mode; // 透传模式等
|
||
char device_name[32]; // 设备名称
|
||
|
||
// ... 其他所有可能用到的参数
|
||
} BleGlobalConfig_t;
|
||
|
||
|
||
BleGlobalConfig_t g_ble_config = {
|
||
.mac_addr = "A1B2C3D4E5F6",
|
||
.addr_type = 0,
|
||
.adv_param = 0x10,
|
||
.adv_type = 1,
|
||
.target_mac = "FFFFFFFFFFFF",
|
||
.baud_rate = 9600,
|
||
.device_name = "MyBLEModule",
|
||
|
||
};
|
||
|
||
|
||
// 错误码信息结构体
|
||
typedef struct {
|
||
int code; // 错误码数字,如 101
|
||
const char* desc; // 错误描述,如 "参数错误"
|
||
RecoveryTarget_t recovery_target; //store the target
|
||
} BleErrorCodeInfo_t;
|
||
|
||
// 错误码表(根据你的模块手册填充)
|
||
BleErrorCodeInfo_t g_ble_error_table[] = {
|
||
{101, "参数长度错误", RECOVERY_TARGET_RESTART_SEQ}, // 参数错,重试没用
|
||
{102, "参数格式错误", RECOVERY_TARGET_RESTART_SEQ}, // 状态错,需检查流程
|
||
{103, "参数数据异常", RECOVERY_TARGET_RESTART_SEQ}, // 可重试
|
||
{104, "指令错误", RECOVERY_TARGET_SW_RESET_MODULE}, // 可重试
|
||
};
|
||
|
||
typedef enum {
|
||
ERR_TYPE_NONE = 0,
|
||
ERR_TYPE_PREPARE_FAILED, // prepare_cmd 失败
|
||
ERR_TYPE_TIMEOUT_EXCEEDED, // 超时且重试耗尽
|
||
ERR_TYPE_PARSE_FAILED, // 解析返回-1且重试耗尽
|
||
ERR_TYPE_MODULE_ERROR, // 模块返回错误码且重试耗尽
|
||
// 可以按需添加
|
||
} ErrorType_t;
|
||
|
||
typedef struct {
|
||
ErrorType_t type; // 错误类型
|
||
uint8_t main_state; // 主状态值(例如 BLE_INIT)
|
||
uint16_t cmd_index; // 发生错误的命令索引(仅当在初始化阶段有意义)
|
||
int error_code; // 错误码(内部错误码或模块返回码)
|
||
uint32_t timestamp; // 时间戳
|
||
uint8_t origin_state; // 原始状态(用于恢复后返回)
|
||
} BleErrorInfo_t;
|
||
|
||
BleErrorInfo_t g_ble_error = {0};
|
||
|
||
char ble_rx_buffer[256];
|
||
|
||
|
||
|
||
volatile uint8_t ble_cmd_rec_done;
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
#endif |