297 lines
7.7 KiB
C
297 lines
7.7 KiB
C
|
||
#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
|