150 lines
4.4 KiB
C
150 lines
4.4 KiB
C
#ifndef BLE_H
|
||
#define BLE_H
|
||
#include "stm32f1xx_hal.h"
|
||
|
||
int parse_general_resp(const char* resp);
|
||
int parse_laddr_resp(const char* resp);
|
||
int prepare_diradv_cmd(const char* cmd_template, char* cmd_buf, int buf_size);
|
||
int prepare_uuid_cmd(const char* cmd_template, char* cmd_buf, int buf_size);
|
||
int prepare_noti_cmd(const char* cmd_template, char* cmd_buf, int buf_size);
|
||
int prepare_transport_cmd(const char* cmd_template, char* cmd_buf, int buf_size);
|
||
uint8_t parse_master_addr_resp(const char* resp);
|
||
|
||
typedef enum{
|
||
BLE_INIT = 0,
|
||
BLE_FIRST_CONECT,
|
||
BLE_CONNECTED,
|
||
BLE_WAIT_CONNECT,
|
||
BLE_CFG_TRANS, // 新增:配置透传模式
|
||
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;
|
||
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;
|
||
|
||
|
||
|
||
|
||
|
||
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 {
|
||
// 连接参数 AT+LADDR
|
||
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; // 发射功率
|
||
|
||
// UUID AT+UUID
|
||
uint16_t service_uuid; // 服务UUID,例如 0xFFE0
|
||
|
||
// NOTIopt AT+NOTI
|
||
uint8_t Noption; // 1或者0
|
||
|
||
// TRANSopt AT+TRANSPORT
|
||
uint8_t Toption; // 1或者0
|
||
|
||
// ... 其他所有可能用到的参数
|
||
} BleGlobalConfig_t;
|
||
|
||
|
||
|
||
// 错误码信息结构体
|
||
typedef struct {
|
||
int code; // 错误码数字,如 101
|
||
const char* desc; // 错误描述,如 "参数错误"
|
||
RecoveryTarget_t recovery_target; //store the target
|
||
} BleErrorCodeInfo_t;
|
||
|
||
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; // 原始状态(用于恢复后返回)
|
||
RecoveryTarget_t recovery_target;// error fix target
|
||
} BleErrorInfo_t;
|
||
|
||
|
||
extern char ble_rx_buffer[256];
|
||
|
||
|
||
uint8_t BLE_UART_RxCallback(uint8_t *data, uint16_t len);
|
||
ExecutorResult_t CmdExecutor_Process(CmdExecutor_t *ex);
|
||
extern void BLE_StateMachine_Handler(void);
|
||
extern void BLE_Init(void);
|
||
|
||
|
||
|
||
|
||
#endif |