240 lines
6.5 KiB
C
240 lines
6.5 KiB
C
|
|
#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
|