19 CAN(CAN_HandleTypeDef *hcan,
size_t rx_queue_size = 64)
20 : hcan_{hcan}, rx_queue_{rx_queue_size} {
22 std::find(get_instances().begin(), get_instances().end(),
nullptr);
26 CAN_FilterTypeDef filter{};
27 filter.FilterIdHigh = 0;
28 filter.FilterIdLow = 0;
29 filter.FilterMaskIdHigh = 0;
30 filter.FilterMaskIdLow = 0;
31 filter.FilterFIFOAssignment = CAN_FILTER_FIFO0;
32 filter.FilterBank = 0;
34 if (hcan_->Instance == CAN2) {
35 filter.FilterBank = 14;
38 filter.FilterMode = CAN_FILTERMODE_IDMASK;
39 filter.FilterScale = CAN_FILTERSCALE_32BIT;
40 filter.FilterActivation = ENABLE;
41 filter.SlaveStartFilterBank = 14;
45 hcan_, CAN_IT_RX_FIFO0_MSG_PENDING) == HAL_OK);
57 CAN_TxHeaderTypeDef tx_header{};
60 tx_header.StdId = msg.
id;
61 tx_header.IDE = CAN_ID_STD;
64 tx_header.ExtId = msg.
id;
65 tx_header.IDE = CAN_ID_EXT;
68 tx_header.RTR = CAN_RTR_DATA;
69 tx_header.DLC = msg.
dlc;
70 tx_header.TransmitGlobalTime = DISABLE;
75 while (HAL_CAN_GetTxMailboxesFreeLevel(hcan_) == 0) {
77 if (elapsed >= timeout) {
82 return HAL_CAN_AddTxMessage(hcan_, &tx_header, msg.
data.data(),
83 &tx_mailbox) == HAL_OK;