19 FDCAN(FDCAN_HandleTypeDef *hfdcan,
size_t rx_queue_size = 64)
20 : hfdcan_{hfdcan}, rx_queue_{rx_queue_size} {
22 std::find(get_instances().begin(), get_instances().end(),
nullptr);
27 hfdcan_, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) == HAL_OK);
40 FDCAN_TxHeaderTypeDef tx_header{};
41 tx_header.Identifier = msg.
id;
44 tx_header.IdType = FDCAN_STANDARD_ID;
47 tx_header.IdType = FDCAN_EXTENDED_ID;
50 tx_header.TxFrameType = FDCAN_DATA_FRAME;
53 tx_header.DataLength = FDCAN_DLC_BYTES_0;
56 tx_header.DataLength = FDCAN_DLC_BYTES_1;
59 tx_header.DataLength = FDCAN_DLC_BYTES_2;
62 tx_header.DataLength = FDCAN_DLC_BYTES_3;
65 tx_header.DataLength = FDCAN_DLC_BYTES_4;
68 tx_header.DataLength = FDCAN_DLC_BYTES_5;
71 tx_header.DataLength = FDCAN_DLC_BYTES_6;
74 tx_header.DataLength = FDCAN_DLC_BYTES_7;
77 tx_header.DataLength = FDCAN_DLC_BYTES_8;
80 tx_header.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
81 tx_header.BitRateSwitch = FDCAN_BRS_OFF;
82 tx_header.FDFormat = FDCAN_CLASSIC_CAN;
83 tx_header.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
84 tx_header.MessageMarker = 0;
87 while (HAL_FDCAN_GetTxFifoFreeLevel(hfdcan_) == 0) {
89 if (elapsed >= timeout) {
94 return HAL_FDCAN_AddMessageToTxFifoQ(hfdcan_, &tx_header,
95 msg.
data.data()) == HAL_OK;