mcu_hi3321_watch/tjd/ble/data_link_layer/ble_protocol.h
2025-05-26 20:15:20 +08:00

297 lines
7.7 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 _USER_PROTOCOL_H_
#define _USER_PROTOCOL_H_
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#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