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

150 lines
4.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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