31 #include <string_view>
42 template<auto Context>
53 return HAL_CAN_Start(Context) == HAL_OK;
69 return HAL_CAN_Start(Context) == HAL_OK;
76 return HAL_CAN_Stop(Context) == HAL_OK;
88 static void read(
u32 &
id,
u32 &extendedId,
u32 ×tamp, std::array<u8, 8> &data) {
89 CAN_RxHeaderTypeDef rxHeader = {0};
90 while (HAL_CAN_GetRxFifoFillLevel(Context, CAN_RX_FIFO0) == 0);
91 HAL_CAN_GetRxMessage(Context, CAN_RX_FIFO0, &rxHeader, data.data());
93 extendedId = rxHeader.ExtId;
94 timestamp = rxHeader.Timestamp;
106 CAN_TxHeaderTypeDef txHeader = {0};
107 constexpr
size_t Size =
sizeof(T);
109 std::array<u8, Size> data;
110 std::memcpy(data.data(), &packet.
data, Size);
111 txHeader.StdId = packet.
id;
113 txHeader.TransmitGlobalTime =
static_cast<FunctionalState
>(packet.
transmitGlobalTime);
116 if(packet.
extendedId > 0) txHeader.IDE = CAN_ID_EXT;
117 else txHeader.IDE = CAN_ID_STD;
120 HAL_CAN_AddTxMessage(Context, &txHeader,
const_cast<u8*
>(data.data()), &pTxMailbox);
121 while (HAL_CAN_GetTxMailboxesFreeLevel(Context) != 3);
134 if (bank > 28)
return false;
135 if (
id > 0x7FF)
return false;
136 if (mask > 0x7FF)
return false;
138 CAN_FilterTypeDef sFilterConfig;
139 sFilterConfig.FilterBank = bank;
140 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
141 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
142 sFilterConfig.FilterIdHigh = (
id << 5);
143 sFilterConfig.FilterIdLow = 0;
144 sFilterConfig.FilterMaskIdHigh = (mask << 5);
145 sFilterConfig.FilterMaskIdLow = 0;
146 sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
147 sFilterConfig.FilterActivation = ENABLE;
148 sFilterConfig.SlaveStartFilterBank = 0;
150 if (HAL_CAN_ConfigFilter(Context, &sFilterConfig) != HAL_OK)
return false;
166 if (bank > 28)
return false;
167 if (
id > 0x1FFFFFFF)
return false;
168 if (mask > 0x1FFFFFFF)
return false;
170 CAN_FilterTypeDef sFilterConfig;
171 sFilterConfig.FilterBank = bank;
172 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
173 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
174 sFilterConfig.FilterIdHigh = ((
id & 0x7FF) << 5) | ((
id >> 27) & 0xFFFF);
175 sFilterConfig.FilterIdLow = ((
id >> 11) << 3) & 0xFFFF;
176 sFilterConfig.FilterMaskIdHigh = ((mask & 0x7FF) << 5) | ((mask >> 27) & 0xFFFF);
177 sFilterConfig.FilterMaskIdLow = ((mask >> 11) << 3) & 0xFFFF;
178 sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
179 sFilterConfig.FilterActivation = ENABLE;
180 sFilterConfig.SlaveStartFilterBank = 0;
182 if (HAL_CAN_ConfigFilter(Context, &sFilterConfig) != HAL_OK)
195 if (bank > 28)
return false;
197 CAN_FilterTypeDef sFilterConfig;
198 sFilterConfig.FilterBank = bank;
199 sFilterConfig.FilterActivation = DISABLE;
201 if (HAL_CAN_ConfigFilter(Context, &sFilterConfig) != HAL_OK)
return false;