#ifndef _USER_PROTOCOL_H_ #define _USER_PROTOCOL_H_ #include #include #include #include #include "wsf_types.h" #include "wsf_trace.h" //#include "sys_config.h" // 宏定义打开表示,用户蓝牙链路层使用到的空间由 PSRAM MALLOC 来得到 //#define BLE_USE_PSRAM #define random_value_size 18 //随机数长度 #define ERROR_TYPE 0xFF //错误类型代码 #define ERROR_LEN 4 #define DATA_REV_MAX_SIZE 4106 #define FRAM_MAX_SIZ 4300 //帧的最大长度 #define BLE_REV_MAX_SIZE (FRAM_MAX_SIZ*2) #define PACK_MAX_SIZE 32 #define PROTOCOL_FRAME_HEAD 0xFD #define PROTOCOL_MTU_HEAD 0xFE #define CRC_LEN 2 #define AES128_KEY_LEN 16 #define AES128_IV_LEN 16 #define SUBSET_TYPE 127 #define RX_SUB_LEN 0x80 #define BYTE_MAX_LEN 127 #define TEMP_NUM_MAX 25 //#define RUN_POSE_RAWDATA #ifdef RUN_POSE_RAWDATA #define BLE_NOTIF_LEN 410 #else #define BLE_NOTIF_LEN 244//20 #endif #define MAX_RING_BUF_SIZE 32//128 //这里的数值必须是2的N次方 enum { FRAME_HEARD_IDX=0, FRAME_MTU_TOTAL_IDX, FRAME_TYPE_IDX, FRAME_NUMBER_IDX, SERVER_IDX, COMMON_IDX, TYPE_IDX, }; enum { MTU_HEARD_IDX=0, MTU_MTU_NUMBER, MTU_FRAMRE_NUMBER }; enum { SINGLE_FRAME = 0, START_FRAME = 1, END_FRAME = 2, PROCESS_FRAME = 3 }; typedef union { uint8_t value; struct { uint8_t multi_frame_type :2; uint8_t with_ACK :1; uint8_t response_Flag :1; uint8_t reserved :4; } frame_type_b; } frame_type_t; typedef struct { uint8_t MTU_total; uint8_t MTU_avalid; frame_type_t Frame_Type; uint8_t Frame_number; int16_t avalid_rx_len; uint16_t status; #ifdef BLE_USE_PSRAM uint8_t *FrameBuffer; #else uint8_t FrameBuffer[FRAM_MAX_SIZ]; #endif } rev_info_t; /******************************** *接收数据状态 **********************************/ enum { rx_idle=0, rx_start, }; /******************************** *发送数据状态 **********************************/ enum { send_idle=0, send_busy, send_timeout, }; enum { RING_BUFF_SUCCESS=0, RING_BUFF_FULL_ERROR, RING_BUFF_REQ_MEMORY_ERROR, }; typedef struct { #ifdef BLE_USE_PSRAM uint8_t *buf; #else uint8_t buf[BLE_NOTIF_LEN]; #endif uint16_t len; uint16_t handle; // 发送的特征句柄 } ring_type_t; typedef struct { uint8_t status; uint8_t buf_max_size; //buf最大个数,这里是2的N次方-1 uint16_t write_idx; //写指针 uint16_t read_idx; //读指针 ring_type_t ring_buf[MAX_RING_BUF_SIZE]; //数据暂存的环形buf区 } send_info_t; /******************************** *协议解析buf **********************************/ typedef struct { uint8_t buf[DATA_REV_MAX_SIZE]; uint16_t len; uint8_t encrypt_flag; } protocol_buf_t; /******************************** *协议数据信息 **********************************/ typedef struct { uint8_t type; uint8_t *p_data; uint16_t len; uint32_t error; } protocol_data_info_t; /******************************** *接收函数指针 **********************************/ typedef struct { void (*func) (uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len); } p_func_t; /******************************** *协议加密 type **********************************/ enum { encrypt_flag_type=0x7c,// 加密标志位 type TLV encrypt_iv_type, //加密 iv encrypt_data, //加密数据 }; enum { FENDA_SUCCESS=0x00, //成功 UNKNOW_ERROR, //未知 error UNSUPPORT_SERVER_ERROR, // UNSUPPORT_COMMAND_ERROR, //不支持命令错误 UNAUTHORITY_ERROR, //不支持权限错误 SYSTEM_BUSY_ERROR, //系统忙错误 REQ_FORMAT_ERROR, //格式错误 PARAM_ERROR, //参数错误 REQ_MEMORY_ERROR, //请求内存错误 REQ_TIMEOUT_ERROR, //响应超时 UNENCRYPTION_ERROR, //此命令需要加密传输,明文下发拒绝处理 DECODE_FORMAT_ERROR, //解密格式错误 ENCRYPTION_IDX_ERROR, //加密数据包序列值非法 ENCRYPTION_DATA_ERROR, //加密数据损坏 解密失败 PACKET_LOSS_REQUIRE_RESEND, //数据丢包,要求重发 PARAM_NULL_ERROR, //输入参数为空 /非法数据 WRITE_FLASH_ERROR, //写FLASH 错误 GET_DTAT_ERROR, //获取数据失败 BLE_NO_LINK_ERROR, BLE_MTU_ERROR, FRAMRE_NUMBER_ERROR, MTU_NUMBER_ERROR, BLE_DATA_CACHE_FULL, }; /******************************** *协议所有服务 **********************************/ enum { DEVICE_MANAGEMENT_SERVER = 0x01, DEVICE_SETUP_SERVER = 0x02, PERSON_INFO_SERVER = 0x03, DAILY_HEALTH_SERVER = 0x04, HEART_RATE_SERVER = 0x05, SLEEP_SERVER = 0x06, STRESS_SERVER = 0x07, BLOOD_OXYGEN_SERVER = 0x08, EXERCISE_SERVER = 0x09, BLOOD_PRESSURE_SERVER = 0x0A, BLE_FILE_TRANS_SERVER = 0x11, OTA_SERVER = 0x12, TEST_SPECIAL_SERVER = 0x13, MUSIC_SERVER = 0x14, INCOMING_SERVER = 0x15, WEATHER_SERVER = 0x16, MESSAGE_SERVER = 0x17, GPS_SERVER = 0x18, NFC_SERVER = 0x19, DIAL_SERVER = 0x20, RESOURCE_SERVER = 0x21, NXP_SERVER = 0x22, BODY_TEMP_SERVER = 0x23, ALCOHOL_SERVER = 0x24, MULTI_LANGUAGE_SERVER = 0x25, COLLECT_DATA_SERVER = 0x26, FACTORY_COMMAND_SERVER = 0x27, MAX_SERVER, }; typedef struct __FrameInfo { frame_type_t frameType; uint8_t serviceId; uint8_t commandId; } FrameInfo_t; typedef struct { uint16_t len; uint8_t type; uint8_t *pValue; uint32_t value; } Ltv_t; extern send_info_t user_send_info; //联动使用 typedef struct { uint8_t workoutOperator; //运动状态 uint8_t workoutSport; //运动分类 uint8_t workoutType; //运动类型 uint8_t rev; //预留 } WorkoutSyncStatusSub; typedef union { WorkoutSyncStatusSub workoutSub; uint32_t workout; } WorkoutSyncStatus; #if defined(iar) extern int memcpy_s(void *_Restrict, size_t, const void *_Restrict, size_t); extern int memset_s(void *_Restrict, size_t, int ch, size_t); extern int strcpy_s(char *_Restrict, size_t, const char *_Restrict); extern int sprintf_s(char *_Restrict, size_t, const char *_Restrict, ...); #endif bool user_protocol_parse(uint8_t server_id, uint8_t common_id, uint8_t *data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len); extern uint8_t user_check_data_crc(uint8_t *data, uint16_t len); extern uint16_t user_analysis_server(uint8_t *data, uint16_t len, uint8_t* plyload); extern uint16_t user_set_protocol_error(uint8_t *data, uint8_t errorServiceID, uint8_t errorCode); extern void user_null_func(uint8_t *in_data, uint16_t in_len, uint8_t*out_data, uint16_t *out_len); extern void user_data_crc(uint8_t *data, uint16_t len); extern void user_get_data_info(protocol_data_info_t *data_info, uint8_t **in_data, uint16_t *in_len); #endif