Skip to content

Instantly share code, notes, and snippets.

@DanGdl
Created March 31, 2026 14:18
Show Gist options
  • Select an option

  • Save DanGdl/065671f14347959dbe155d302b66d7e2 to your computer and use it in GitHub Desktop.

Select an option

Save DanGdl/065671f14347959dbe155d302b66d7e2 to your computer and use it in GitHub Desktop.
Canard receive
static bool should_accept_transfer(
const CanardInstance* ins,
uint64_t* out_data_type_signature,
uint16_t data_type_id,
CanardTransferType transfer_type,
uint8_t source_node_id
) {
switch (source_node_id) {
case CAN_REMOTE_NODE_ID:
switch (data_type_id) {
case UAVCAN_PROTOCOL_NODESTATUS_ID:
*out_data_type_signature = UAVCAN_PROTOCOL_NODESTATUS_SIGNATURE;
return true;
case DANTECH_BMS_METEO_BMSCOMMAND_ID:
*out_data_type_signature = DANTECH_BMS_METEO_BMSCOMMAND_SIGNATURE;
return true;
default:
break;
}
default:
break;
}
return false;
}
CanRxMsg_t canrx_cmd = { 0 };
struct dantech_bms_meteo_BmsCommand canard_cmd = { 0 };
static void on_transfer_received(CanardInstance* ins, CanardRxTransfer* transfer) {
UNUSED(ins);
switch (transfer->data_type_id) {
case UAVCAN_PROTOCOL_NODESTATUS_ID:
// parse to heartbeat
canrx_cmd.heartbeat_timestamp = getCurrentMicros();
if (CanRxRing_write(&can_msg_ring, &canrx_cmd, 1) != 1) {
cnts.uavcan_msg_store_fail++;
}
break;
case DANTECH_BMS_METEO_BMSCOMMAND_ID:
if (dantech_bms_meteo_BmsCommand_decode(transfer, &canard_cmd)) {
cnts.uavcan_msg_parse_fail++;
}
else {
canrx_cmd.heartbeat_timestamp = 0;
canrx_cmd.cmd = canard_cmd.cmd;
canrx_cmd.fet_mask = canard_cmd.fet_mask;
canrx_cmd.fet_state = canard_cmd.fet_state;
canrx_cmd.device_addr = canard_cmd.device_addr;
canrx_cmd.register_addr = canard_cmd.register_addr;
canrx_cmd.register_data_size = canard_cmd.register_data_size;
if (CanRxRing_write(&can_msg_ring, &canrx_cmd, 1) != 1) {
cnts.uavcan_msg_store_fail++;
}
}
break;
}
}
void uavcan_process_rx(MainTaskCommand_t* const cmd) {
canardHandleRxFrame(&canard, &cmd->frame, getCurrentMicros());
}
// IRQ!
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
MainTaskCommand_t cmd = { .type = MTCT_CAN_MSG, .frame = { 0 } };
CAN_RxHeaderTypeDef header = { 0 };
if (HAL_OK != HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &header, cmd.frame.data)) {
cnts.uavcan_rx_fail++;
return;
}
switch (header.IDE) {
case CAN_ID_EXT:
cmd.frame.id = header.ExtId | CANARD_CAN_FRAME_EFF;
break;
default:
cmd.frame.id = header.StdId;
}
cmd.frame.data_len = header.DLC;
if (osOK != osMessageQueuePut(CanRxQueueHandle, &cmd, 0, 0)) {
cnts.uavcan_rx_store_fail++;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment