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

240 lines
6.5 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"
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