-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtf_fdcan.c
More file actions
60 lines (51 loc) · 1.83 KB
/
Copy pathtf_fdcan.c
File metadata and controls
60 lines (51 loc) · 1.83 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
// src/tf_fdcan.c
#include "tf_lidar.h"
#include <string.h>
/**
* @brief Initialize CAN FD transport.
* @see tf_lidar_init_fdcan in tf_lidar.h
*/
bool tf_lidar_init_fdcan(tf_lidar_t *lidar,
const tf_lidar_model_t *model,
FDCAN_HandleTypeDef *hfdcan)
{
FDCAN_FilterTypeDef filter = {0};
lidar->model = model;
lidar->transport = TF_TRANSPORT_FDCAN;
lidar->iface.hfdcan = hfdcan;
if (HAL_FDCAN_Init(hfdcan) != HAL_OK)
return false;
// Configure standard ID filter for TX ID
filter.IdType = FDCAN_STANDARD_ID;
filter.FilterIndex = 0;
filter.FilterType = FDCAN_FILTER_MASK;
filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
filter.FilterID1 = model->can_id_tx;
filter.FilterID2 = 0x7FF;
if (HAL_FDCAN_ConfigFilter(hfdcan, &filter) != HAL_OK)
return false;
HAL_FDCAN_Start(hfdcan);
HAL_FDCAN_ActivateNotification(hfdcan,
FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
return true;
}
/**
* @brief Read a measurement via CAN FD.
* @see tf_lidar_read in tf_lidar.h
*/
bool tf_lidar_read_fdcan(tf_lidar_t *lidar, float *distance_m, float *signal)
{
FDCAN_RxHeaderTypeDef hdr;
uint8_t data[64];
if (HAL_FDCAN_GetRxMessage(lidar->iface.hfdcan,
FDCAN_RX_FIFO0, &hdr, data) != HAL_OK)
return false;
// hdr.StdId is already filtered by hardware
uint16_t raw_d = ((uint16_t)data[lidar->model->offset_distance] << 8)
| data[lidar->model->offset_distance + 1];
uint16_t raw_s = ((uint16_t)data[lidar->model->offset_signal] << 8)
| data[lidar->model->offset_signal + 1];
*distance_m = raw_d * lidar->model->distance_scale;
*signal = raw_s * lidar->model->signal_scale;
return true;
}