Created
March 31, 2026 14:18
-
-
Save DanGdl/065671f14347959dbe155d302b66d7e2 to your computer and use it in GitHub Desktop.
Canard receive
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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