-
Notifications
You must be signed in to change notification settings - Fork 0
/
lrf_serial_comm.h
242 lines (158 loc) · 4.55 KB
/
lrf_serial_comm.h
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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
/***
* Noptel LRF rangefinder sampler for the Flipper Zero
* Version: 2.0
*
* LRF Serial communication app
***/
#pragma once
/*** Defines ***/
#define UART_RX_BUF_SIZE 256
#define DIAG_PROGRESS_UPDATE_EVERY 250 /*ms*/
/*** Types ***/
/** LRF command **/
typedef enum {
/* Trigger one SMM measurement */
smm = 0,
/* Start continuous measurement at 1 Hz */
cmm_1hz = 1,
/* Start continuous measurement at 4 Hz */
cmm_4hz = 2,
/* Start continuous measurement at 10 Hz */
cmm_10hz = 3,
/* Start continuous measurement at 20 Hz */
cmm_20hz = 4,
/* Start continuous measurement at 100 Hz */
cmm_100hz = 5,
/* Start continuous measurement at 200 Hz */
cmm_200hz = 6,
/* Stop continuous measurement */
cmm_break = 7,
/* Turn the pointer on */
pointer_on = 8,
/* Turn the pointer off */
pointer_off = 9,
/* Send identification frame */
send_ident = 10,
/* Send information frame */
send_info = 11,
/* Read diagnostic data */
read_diag = 12,
} LRFCommand;
/** LRF sample **/
typedef struct {
/* Distances */
float dist1;
float dist2;
float dist3;
/* Amplitudes */
uint16_t ampl1;
uint16_t ampl2;
uint16_t ampl3;
/* Reception timestamp */
uint32_t tstamp_ms;
} LRFSample;
/** LRF identification **/
typedef struct {
/* Device ID */
char id[16];
/* Additional information */
char addinfo[16];
/* Serial number */
char serial[16];
/* Firmware version */
char fwversion[16];
/* Whether the firmware is newer than x.4.x */
bool is_fw_newer_than_x4;
/* Electronics type */
char electronics[4];
/* Optics type */
char optics[4];
/* Build date */
char builddate[32];
} LRFIdent;
/** LRF information **/
typedef struct {
/* Transmission retries */
uint8_t txretries;
/* Laser pump time */
uint16_t txpumptime;
/* Number of pulses used for the last measurement */
uint16_t pulsesused;
/* Transmitter temperature */
uint8_t txtemp;
/* APD at first burst */
uint8_t apdatfirstburst;
/* Target distances */
uint16_t targetdist1;
uint16_t targetdist2;
uint16_t targetdist3;
/* Target magnitudes */
uint8_t targetmagnitude1;
uint8_t targetmagnitude2;
uint8_t targetmagnitude3;
/* Battery voltage */
float battvoltage;
/* I/O voltage */
float iovoltage;
/* Receiver voltage */
float rxvoltage;
/* Transmitter voltage */
float txvoltage;
/* Receiver temperature */
float rxtemp;
/* Status bytes */
uint8_t statusbyte1;
uint8_t statusbyte2;
uint8_t statusbyte3;
/* Pulse counter */
uint64_t pulsectr;
/* Serial error counter */
uint8_t rserrorctr;
} LRFInfo;
/** LRF diagnostic data **/
typedef struct {
/* Diagnostic data values */
uint16_t *vals;
/* Number of values currently read */
uint16_t nb_vals;
/* Total number of values */
uint16_t total_vals;
} LRFDiag;
/** App structure **/
struct _LRFSerialCommApp;
typedef struct _LRFSerialCommApp LRFSerialCommApp;
/*** Routines ***/
/** Set the callback to handle raw data received from the LRF **/
void set_lrf_raw_data_handler(LRFSerialCommApp *,
void (*)(uint8_t *, uint16_t, void *), void *);
/** Set the callback to handle one received LRF sample **/
void set_lrf_sample_handler(LRFSerialCommApp *, void (*)(LRFSample *, void *),
void *);
/** Set the callback to handle one received LRF identification frame **/
void set_lrf_ident_handler(LRFSerialCommApp *, void (*)(LRFIdent *, void *),
void *);
/** Set the callback to handle one received LRF information frame **/
void set_lrf_info_handler(LRFSerialCommApp *, void (*)(LRFInfo *, void *),
void *);
/** Set the callback to handle received diagnostic data **/
void set_diag_data_handler(LRFSerialCommApp *, void (*)(LRFDiag *, void *),
void *);
/** Enable or disable the use of the shared storage space as LRF frame decode
buffer **/
void enable_shared_storage_dec_buf(LRFSerialCommApp *, bool);
/** UART send function **/
void uart_tx(LRFSerialCommApp *, uint8_t *, uint16_t);
/** Send a command to the LRF **/
void send_lrf_command(LRFSerialCommApp *, LRFCommand);
/** Initialize the LRF serial communication app **/
LRFSerialCommApp *lrf_serial_comm_app_init(uint16_t, uint16_t,
uint8_t *, uint16_t);
/** Start the UART **/
void start_uart(LRFSerialCommApp *, uint32_t);
/** Stop the UART **/
void stop_uart(LRFSerialCommApp *);
/** Set the UART's baudrate **/
void set_uart_baudrate(LRFSerialCommApp *, uint32_t);
/** Stop the UART receive thread and free up the space allocated for the LRF
communication app **/
void lrf_serial_comm_app_free(LRFSerialCommApp *);