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

240 lines
6.5 KiB
C
Raw Normal View History

2026-02-24 13:00:08 +08:00
#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, // ִ<><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;
const char* expected_resp;
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;
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} // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
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} // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
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} // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
//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; // <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>
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> (<28><><EFBFBD><EFBFBD> AT+WHITELIST <20><>)
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>
// ģ<><EFBFBD><E9B9A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t work_mode; // ͸<><CDB8>ģʽ<C4A3><CABD>
char device_name[32]; // <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
// ... <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><D0BF><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>IJ<EFBFBD><C4B2><EFBFBD>
} 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",
};
// <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;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD>
BleErrorCodeInfo_t g_ble_error_table[] = {
{101, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>", RECOVERY_TARGET_RESTART_SEQ}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>
{102, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", RECOVERY_TARGET_RESTART_SEQ}, // ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{103, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", RECOVERY_TARGET_RESTART_SEQ}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{104, "ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", RECOVERY_TARGET_SW_RESET_MODULE}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
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>
} BleErrorInfo_t;
BleErrorInfo_t g_ble_error = {0};
char ble_rx_buffer[256];
volatile uint8_t ble_cmd_rec_done;
#endif