-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathys_parser.h
More file actions
193 lines (168 loc) · 4.87 KB
/
Copy pathys_parser.h
File metadata and controls
193 lines (168 loc) · 4.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/**
* Yesense 产品报文解析器
*
* @author github0null
* @version 1.0
* @see https://github.com/github0null/
*/
#ifndef H_YS_PARSER
#define H_YS_PARSER
#include "ys_def.h"
#ifdef __cplusplus
extern "C" {
#endif
//////////////////////////////////////////////////////
// Internal Type
//////////////////////////////////////////////////////
#define YS_BUFFER_SIZE 264
typedef struct
{
uint8_t buffer[YS_BUFFER_SIZE];
uint16_t count;
} ys_buffer;
typedef enum
{
ON_PARSE_HEADDER_1 = 0,
ON_PARSE_HEADDER_2,
ON_PARSE_TID_L,
ON_PARSE_TID_H,
ON_PARSE_LENGTH,
ON_PARSE_MESSAGE,
ON_PARSE_CK1,
ON_PARSE_CK2
} ys_parser_action;
typedef struct
{
uint16_t tid;
int16_t len;
uint8_t *msg;
uint8_t crc[2];
} ys_frame;
//////////////////////////////////////////////////////
// Type Define
//////////////////////////////////////////////////////
typedef enum
{
YS_ID_IMU_TEMP = (uint8_t)0x01,
YS_ID_SECOND_IMU_TEMP = (uint8_t)0x02,
YS_ID_FREE_ACCEL = (uint8_t)0x11,
YS_ID_SPEED_INCREMENT = (uint8_t)0x12,
YS_ID_SECOND_ACCEL = (uint8_t)0x18,
YS_ID_SECOND_ANGLE = (uint8_t)0x28,
YS_ID_QUATERNION_INCREMENT = (uint8_t)0x42,
YS_ID_ACCEL = (uint8_t)0x10,
YS_ID_ANGLE = (uint8_t)0x20,
YS_ID_MAGNETIC = (uint8_t)0x30,
YS_ID_RAW_MAGNETIC = (uint8_t)0x31,
YS_ID_EULER = (uint8_t)0x40,
YS_ID_QUATERNION = (uint8_t)0x41,
YS_ID_UTC = (uint8_t)0x50,
YS_ID_SAMPLE_TIMESTAMP = (uint8_t)0x51,
YS_ID_DATA_READY_TIMESTAMP = (uint8_t)0x52,
YS_ID_LOCATION = (uint8_t)0x60,
YS_ID_HIGH_PRECI_LOCATION = (uint8_t)0x68,
YS_ID_SPEED = (uint8_t)0x70,
} ys_data_id_t;
typedef struct
{
uint16_t tid;
ys_sensor_data_t *result;
void *user_data;
/* sensor data valid id list, refer 'ys_data_id_t' */
uint8_t field_li[64];
uint8_t field_cnt;
} ys_result_callback_params_t;
typedef void(*ys_result_callback_t)(ys_result_callback_params_t *params);
typedef enum
{
YS_STATUS_CHK_ERR = -1,
YS_STATUS_UNKNOWN_ERR = -2,
YS_STATUS_MSG_LEN_ERR = -3,
YS_STATUS_RUNNING = 0,
YS_STATUS_DONE = 1,
} ys_parser_status_t;
/* trace info */
typedef struct
{
int16_t status; /* current parser status */
uint16_t err_frame_cnt; /* crc error cnt */
uint16_t done_frame_cnt; /* valid frame cnt */
} ys_trace_info_t;
typedef struct
{
ys_buffer data_buf;
ys_parser_action cur_action;
ys_frame cur_frame;
int16_t msg_remain_len;
ys_result_callback_t callbk; /* data ready callbk */
ys_sensor_data_t sensor_data; /* sensor data */
ys_trace_info_t trace_inf; /* trace info */
void *user_data; /* user data */
} ys_parser_t;
//////////////////////////////////////////////////////
// YS Parser API
//////////////////////////////////////////////////////
/**
* 创建一个 YS 协议解析器。
*
* @param result_ready_callbk 回调函数,当成功解析完一帧数据包时,将调用该回调函数。
*
* @return YS 解析器对象
*/
ys_parser_t *ys_parser_create(ys_result_callback_t result_ready_callbk);
/**
* 初始化一个使用静态内存分配的 YS 协议解析器对象。
*
* @param parser YS 解析器对象
*
* @param result_ready_callbk 回调函数,当成功解析完一帧数据包时,将调用该回调函数。
*
* @return YS 解析器对象
*/
ys_parser_t *ys_parser_create_static(ys_parser_t *parser, ys_result_callback_t result_ready_callbk);
/**
* 释放一个 YS 协议解析器,回收其内存。
*
* @param parser YS 解析器对象
*/
void ys_parser_free(ys_parser_t *parser);
/**
* @brief set user data for parser
* @param user_data a pointer for your data
*/
void ys_parser_set_user_data(ys_parser_t *parser, void *user_data);
/**
* @brief get user data for parser
* @return a pointer for your data
*/
void *ys_parser_get_user_data(ys_parser_t *parser);
/**
* 向解析器输入一个字节的报文数据。
*
* 通过不断调用该函数,向解析器输入数据触发解析,当成功解析完一帧数据包时,将调用之前设置的回调函数。
*
* 注意:在提供的回调函数中不应该进行耗时操作,否则会阻塞该函数。
*
* @param parser YS 解析器对象
*
* @param byte 一个字节数据
*
* @param return 解析器状态
*/
ys_parser_status_t ys_parser_input(ys_parser_t *parser, uint8_t byte);
/**
* 使用解析器解析一个缓冲区内的所有内容。
*
* 该函数会调用 @ref ys_parser_input 在整个缓冲区中搜索并解析报文
*
* @param parser YS 解析器对象
*
* @param buffer 缓冲区
*
* @param len 缓冲区大小
*/
void ys_parse_buf(ys_parser_t *parser, uint8_t *buffer, uint32_t len);
#ifdef __cplusplus
}
#endif
#endif