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

150 lines
4.4 KiB
C
Raw Normal View History

2026-02-24 13:00:08 +08:00
#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);
2026-02-24 13:00:08 +08:00
typedef enum{
BLE_INIT = 0,
BLE_FIRST_CONECT,
BLE_CONNECTED,
BLE_WAIT_CONNECT,
BLE_CFG_TRANS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
2026-02-24 13:00:08 +08:00
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, // ִ<><D6B4><EFBFBD>У<EFBFBD><D0A3><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
EXECUTOR_DONE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>гɹ<D0B3>
EXECUTOR_ERROR // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻָ<C9BB><D6B8><EFBFBD><EFBFBD>󣬴<EFBFBD><F3A3ACB4><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} ExecutorResult_t;
typedef enum {
RECOVERY_TARGET_NONE = 0,
RECOVERY_TARGET_RESTART_SEQ, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD> BLE_SET <20><>ִ<EFBFBD>У<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RECOVERY_TARGET_SW_RESET_MODULE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λģ<CEBB><C4A3>
RECOVERY_TARGET_FACTORY_RESET, // <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RECOVERY_TARGET_RECONFIG_UART, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>ڣ<EFBFBD>ֱ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BLE_SET<45><54>
RECOVERY_TARGET_HARD_RESET_MODULE,// Ӳ<><D3B2><EFBFBD><EFBFBD>λģ<CEBB>飨ֱ<E9A3A8>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>
RECOVERY_TARGET_SOFT_RESET_MCU, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ MCU
RECOVERY_TARGET_PANIC // <20><><EFBFBD>ɻָ<C9BB>
} RecoveryTarget_t;
typedef struct {
const char* cmd;
uint16_t timeout_ms;
uint8_t retry_max;
// <20>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
int (*prepare_cmd)(const char* cmd_template, char* cmd_buf, int buf_size);
// <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
int (*parse_resp)(const char* resp);
} BleAtCmd_t;
typedef struct {
const BleAtCmd_t* sequence; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ִ<EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t cmd_index; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t retry_cnt; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>
uint32_t start_tick; // <20><><EFBFBD><EFBFBD><EEB7A2>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
ExecState_t state; // ִ<><D6B4><EFBFBD><EFBFBD>״̬<D7B4><CCAC>IDLE, SENDING, WAITING, DONE, ERROR
uint8_t error_type; // ERR_TYPE_xxx
int error_code; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>루ģ<EBA3A8><EFBFBD><E9B7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>prepare<72><65><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
uint16_t error_cmd_index; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} CmdExecutor_t;
typedef struct {
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD> AT+LADDR
2026-02-24 13:00:08 +08:00
char mac_addr[13]; // <20><><EFBFBD><EFBFBD>MAC<41><43>ַ "A1B2C3D4E5F6"
uint8_t addr_type; // <20><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD> (0=public, 1=random)
// <20><EFBFBD><E3B2A5><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> AT+DIRADV <20><>)
uint8_t adv_param;
uint8_t adv_type;
char target_mac[13]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B2A5>Ŀ<EFBFBD><C4BF>MAC
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AT+WHITELIST <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
2026-02-24 13:00:08 +08:00
uint8_t whitelist_count;
char whitelist_macs[3][13]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ͨ<>Ų<EFBFBD><C5B2><EFBFBD>
uint32_t baud_rate; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t tx_power; // <20><><EFBFBD><EFBFBD><E4B9A6>
// UUID AT+UUID
uint16_t service_uuid; // <20><><EFBFBD><EFBFBD>UUID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0xFFE0
2026-02-24 13:00:08 +08:00
// NOTIopt AT+NOTI
uint8_t Noption; // 1<><31><EFBFBD><EFBFBD>0
// TRANSopt AT+TRANSPORT
uint8_t Toption; // 1<><31><EFBFBD><EFBFBD>0
2026-02-24 13:00:08 +08:00
// ... <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><D0BF><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>IJ<EFBFBD><C4B2><EFBFBD>
} BleGlobalConfig_t;
2026-02-24 13:00:08 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><E1B9B9>
typedef struct {
int code; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD> 101
const char* desc; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
RecoveryTarget_t recovery_target; //store the target
} BleErrorCodeInfo_t;
typedef enum {
ERR_TYPE_NONE = 0,
ERR_TYPE_PREPARE_FAILED, // prepare_cmd ʧ<><CAA7>
ERR_TYPE_TIMEOUT_EXCEEDED, // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>Ժľ<D4BA>
ERR_TYPE_PARSE_FAILED, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1<><31><EFBFBD><EFBFBD><EFBFBD>Ժľ<D4BA>
ERR_TYPE_MODULE_ERROR, // ģ<><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժľ<D4BA>
// <20><><EFBFBD>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} ErrorType_t;
typedef struct {
ErrorType_t type; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t main_state; // <20><>״ֵ̬<CCAC><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BLE_INIT<49><54>
uint16_t cmd_index; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>׶<EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int error_code; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7B5><EFBFBD>
uint32_t timestamp; // ʱ<><CAB1><EFBFBD><EFBFBD>
uint8_t origin_state; // ԭʼ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>ڻָ<DABB><D6B8>󷵻أ<F3B7B5BB>
2026-02-24 17:01:12 +08:00
RecoveryTarget_t recovery_target;// error fix target
2026-02-24 13:00:08 +08:00
} BleErrorInfo_t;
extern char ble_rx_buffer[256];
2026-02-24 13:00:08 +08:00
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);
2026-02-24 13:00:08 +08:00
#endif