From dd598d5a6e01194cf33de60fd3c281c97e871642 Mon Sep 17 00:00:00 2001 From: PonomarevDA Date: Fri, 10 Jan 2025 21:02:22 +0300 Subject: [PATCH 1/4] use non-blocking call in socketcan can driver --- platform_specific/socketcan/can_driver.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform_specific/socketcan/can_driver.c b/platform_specific/socketcan/can_driver.c index fcda60d..fe5ca2c 100644 --- a/platform_specific/socketcan/can_driver.c +++ b/platform_specific/socketcan/can_driver.c @@ -24,12 +24,12 @@ int16_t canDriverInit(uint32_t can_speed, uint8_t can_driver_idx) { int16_t canDriverReceive(CanardCANFrame* const rx_frame, uint8_t can_driver_idx) { (void)can_driver_idx; rx_frame->iface_id = 0; - return socketcanReceive(&socket_can_instance, rx_frame, 10); + return socketcanReceive(&socket_can_instance, rx_frame, 0); } int16_t canDriverTransmit(const CanardCANFrame* const tx_frame, uint8_t can_driver_idx) { (void)can_driver_idx; - return socketcanTransmit(&socket_can_instance, tx_frame, 10); + return socketcanTransmit(&socket_can_instance, tx_frame, 0); } uint64_t canDriverGetErrorCount() { From 94193b3f660b93f60dd42d47a96b2ef81a74318c Mon Sep 17 00:00:00 2001 From: PonomarevDA Date: Fri, 10 Jan 2025 21:02:48 +0300 Subject: [PATCH 2/4] rename ArmingStatus to SafetyArmingStatus to avoid naming conflicts --- include/serialization/subscriber.hpp | 3 +-- include/serialization/uavcan/equipment/safety/ArmingStatus.h | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/include/serialization/subscriber.hpp b/include/serialization/subscriber.hpp index 6707b2a..9b053fa 100644 --- a/include/serialization/subscriber.hpp +++ b/include/serialization/subscriber.hpp @@ -19,7 +19,6 @@ #include "uavcan/equipment/safety/ArmingStatus.h" #include "uavcan/equipment/hardpoint/Command.h" - template struct DronecanSubscriberTraits; @@ -46,7 +45,7 @@ DEFINE_SUBSCRIBER_TRAITS(BeepCommand_t, DEFINE_SUBSCRIBER_TRAITS(LightsCommand_t, uavcanSubscribeIndicationLightsCommand, dronecan_equipment_indication_lights_command_deserialize) -DEFINE_SUBSCRIBER_TRAITS(ArmingStatus, +DEFINE_SUBSCRIBER_TRAITS(SafetyArmingStatus, uavcanSubscribeArmingStatus, dronecan_equipment_safety_arming_status_deserialize) DEFINE_SUBSCRIBER_TRAITS(HardpointCommand, diff --git a/include/serialization/uavcan/equipment/safety/ArmingStatus.h b/include/serialization/uavcan/equipment/safety/ArmingStatus.h index c35ae2a..ae2110f 100644 --- a/include/serialization/uavcan/equipment/safety/ArmingStatus.h +++ b/include/serialization/uavcan/equipment/safety/ArmingStatus.h @@ -18,7 +18,7 @@ #define UAVCAN_EQUIPMENT_SAFETY_ARMING_STATUS_MESSAGE_SIZE 1 #define UAVCAN_EQUIPMENT_SAFETY_ARMING_STATUS UAVCAN_EXPAND(UAVCAN_EQUIPMENT_SAFETY_ARMING_STATUS) -enum class ArmingStatus: uint8_t { +enum class SafetyArmingStatus: uint8_t { STATUS_DISARMED = 0, STATUS_FULLY_ARMED = 255, }; @@ -29,7 +29,7 @@ extern "C" { static inline int8_t dronecan_equipment_safety_arming_status_deserialize( - const CanardRxTransfer* transfer, ArmingStatus* obj) + const CanardRxTransfer* transfer, SafetyArmingStatus* obj) { canardDecodeScalar(transfer, 0, 8, false, obj); From 7b4103cca18b55ac799d34e2018f04b830133892 Mon Sep 17 00:00:00 2001 From: PonomarevDA Date: Fri, 10 Jan 2025 21:03:04 +0300 Subject: [PATCH 3/4] increase max pub rate --- include/serialization/publisher.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/serialization/publisher.hpp b/include/serialization/publisher.hpp index c4962c6..0ce9afd 100644 --- a/include/serialization/publisher.hpp +++ b/include/serialization/publisher.hpp @@ -76,7 +76,7 @@ class DronecanPeriodicPublisher : public DronecanPublisher { public: DronecanPeriodicPublisher(float frequency) : DronecanPublisher(), - PUB_PERIOD_MS(static_cast(1000.0f / std::clamp(frequency, 0.001f, 100.0f))) {}; + PUB_PERIOD_MS(static_cast(1000.0f / std::clamp(frequency, 0.001f, 1000.0f))) {}; inline void spinOnce() { auto crnt_time_ms = platformSpecificGetTimeMs(); From e8ff6d6733f02bd90527fa87af1c6125d264f643 Mon Sep 17 00:00:00 2001 From: PonomarevDA Date: Fri, 10 Jan 2025 21:08:42 +0300 Subject: [PATCH 4/4] receive multiple frames during spin --- src/dronecan.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/dronecan.c b/src/dronecan.c index 52c5be0..ef978d1 100644 --- a/src/dronecan.c +++ b/src/dronecan.c @@ -314,12 +314,16 @@ static uint8_t uavcanProcessSending() { static bool uavcanProcessReceiving(uint32_t crnt_time_ms) { CanardCANFrame rx_frame; - int16_t res = canDriverReceive(&rx_frame, CAN_DRIVER_FIRST); - if (res) { - uint64_t crnt_time_us = crnt_time_ms * 1000; - canardHandleRxFrame(&g_canard, &rx_frame, crnt_time_us); - return true; + for (size_t idx = 0; idx < 10; idx++) { + int16_t res = canDriverReceive(&rx_frame, CAN_DRIVER_FIRST); + if (res) { + uint64_t crnt_time_us = crnt_time_ms * 1000; + canardHandleRxFrame(&g_canard, &rx_frame, crnt_time_us); + } else { + break; + } } + return false; }