diff --git a/src/drivers/uavcan_v1/Actuators/EscClient.hpp b/src/drivers/uavcan_v1/Actuators/EscClient.hpp index 280588da8a..f4b2f31b48 100644 --- a/src/drivers/uavcan_v1/Actuators/EscClient.hpp +++ b/src/drivers/uavcan_v1/Actuators/EscClient.hpp @@ -102,7 +102,7 @@ public: CanardPortID arming_pid = static_cast(static_cast(_port_id) + 1); CanardTransfer transfer = { - .timestamp_usec = hrt_absolute_time() + CANARD_DEFAULT_TRANSFER_ID_TIMEOUT_USEC, + .timestamp_usec = hrt_absolute_time() + PUBLISHER_DEFAULT_TIMEOUT_USEC, .priority = CanardPriorityNominal, .transfer_kind = CanardTransferKindMessage, .port_id = arming_pid, // This is the subject-ID. @@ -145,7 +145,7 @@ public: uint8_t esc_sp_payload_buffer[reg_drone_service_actuator_common_sp_Vector31_0_1_SERIALIZATION_BUFFER_SIZE_BYTES_]; CanardTransfer transfer = { - .timestamp_usec = hrt_absolute_time() + CANARD_DEFAULT_TRANSFER_ID_TIMEOUT_USEC, + .timestamp_usec = hrt_absolute_time() + PUBLISHER_DEFAULT_TIMEOUT_USEC, .priority = CanardPriorityNominal, .transfer_kind = CanardTransferKindMessage, .port_id = _port_id, // This is the subject-ID. diff --git a/src/drivers/uavcan_v1/CMakeLists.txt b/src/drivers/uavcan_v1/CMakeLists.txt index 7a77e4b8f1..f46c6a645e 100644 --- a/src/drivers/uavcan_v1/CMakeLists.txt +++ b/src/drivers/uavcan_v1/CMakeLists.txt @@ -37,6 +37,7 @@ set(LEGACY_DSDL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/legacy_data_types) px4_add_git_submodule(TARGET git_libcanard PATH ${LIBCANARD_DIR}) px4_add_git_submodule(TARGET git_public_regulated_data_types PATH ${DSDL_DIR}) +px4_add_git_submodule(TARGET git_legacy_data_types PATH ${LEGACY_DSDL_DIR}) find_program(NNVG_PATH nnvg) if(NNVG_PATH) @@ -88,5 +89,6 @@ px4_add_module( DEPENDS git_libcanard git_public_regulated_data_types + git_legacy_data_types version ) diff --git a/src/drivers/uavcan_v1/NodeManager.cpp b/src/drivers/uavcan_v1/NodeManager.cpp index 3b90f75b89..1cb34d7ad3 100644 --- a/src/drivers/uavcan_v1/NodeManager.cpp +++ b/src/drivers/uavcan_v1/NodeManager.cpp @@ -70,7 +70,7 @@ bool NodeManager::HandleNodeIDRequest(uavcan_pnp_NodeIDAllocationData_1_0 &msg) uint8_t node_id_alloc_payload_buffer[uavcan_pnp_NodeIDAllocationData_1_0_SERIALIZATION_BUFFER_SIZE_BYTES_]; CanardTransfer transfer = { - .timestamp_usec = hrt_absolute_time() + CANARD_DEFAULT_TRANSFER_ID_TIMEOUT_USEC, + .timestamp_usec = hrt_absolute_time() + PUBLISHER_DEFAULT_TIMEOUT_USEC, .priority = CanardPriorityNominal, .transfer_kind = CanardTransferKindMessage, .port_id = uavcan_pnp_NodeIDAllocationData_1_0_FIXED_PORT_ID_, // This is the subject-ID. diff --git a/src/drivers/uavcan_v1/Publishers/Gnss.hpp b/src/drivers/uavcan_v1/Publishers/Gnss.hpp index aebaff808f..fe44f2ce34 100644 --- a/src/drivers/uavcan_v1/Publishers/Gnss.hpp +++ b/src/drivers/uavcan_v1/Publishers/Gnss.hpp @@ -72,7 +72,7 @@ public: uint8_t geo_payload_buffer[reg_drone_physics_kinematics_geodetic_Point_0_1_SERIALIZATION_BUFFER_SIZE_BYTES_]; CanardTransfer transfer = { - .timestamp_usec = hrt_absolute_time() + CANARD_DEFAULT_TRANSFER_ID_TIMEOUT_USEC, + .timestamp_usec = hrt_absolute_time() + PUBLISHER_DEFAULT_TIMEOUT_USEC, .priority = CanardPriorityNominal, .transfer_kind = CanardTransferKindMessage, .port_id = _port_id, // This is the subject-ID. @@ -107,7 +107,7 @@ public: CanardPortID _port_id_2 = static_cast((uint16_t)_port_id + 1U); CanardTransfer transfer2 = { - .timestamp_usec = hrt_absolute_time() + CANARD_DEFAULT_TRANSFER_ID_TIMEOUT_USEC, + .timestamp_usec = hrt_absolute_time() + PUBLISHER_DEFAULT_TIMEOUT_USEC, .priority = CanardPriorityNominal, .transfer_kind = CanardTransferKindMessage, .port_id = _port_id_2, // This is the subject-ID. diff --git a/src/drivers/uavcan_v1/Publishers/Publisher.hpp b/src/drivers/uavcan_v1/Publishers/Publisher.hpp index a33d51682a..48c9cb661d 100644 --- a/src/drivers/uavcan_v1/Publishers/Publisher.hpp +++ b/src/drivers/uavcan_v1/Publishers/Publisher.hpp @@ -50,6 +50,12 @@ #include "../CanardInterface.hpp" #include "../ParamManager.hpp" +/* This is a default baseline timeout for publishers + * Still it's recommended for implementers to check if their publisher + * has timing requirements and if it should drop messages that are too old in favour of newer messages + */ +#define PUBLISHER_DEFAULT_TIMEOUT_USEC 100000UL + class UavcanPublisher { public: diff --git a/src/drivers/uavcan_v1/Publishers/Readiness.hpp b/src/drivers/uavcan_v1/Publishers/Readiness.hpp index c3a72d7b17..11800d5eb6 100644 --- a/src/drivers/uavcan_v1/Publishers/Readiness.hpp +++ b/src/drivers/uavcan_v1/Publishers/Readiness.hpp @@ -76,7 +76,7 @@ public: uint8_t readiness_payload_buffer[reg_drone_service_common_Readiness_0_1_SERIALIZATION_BUFFER_SIZE_BYTES_]; CanardTransfer transfer = { - .timestamp_usec = hrt_absolute_time() + CANARD_DEFAULT_TRANSFER_ID_TIMEOUT_USEC, + .timestamp_usec = hrt_absolute_time() + PUBLISHER_DEFAULT_TIMEOUT_USEC, .priority = CanardPriorityNominal, .transfer_kind = CanardTransferKindMessage, .port_id = _port_id, // This is the subject-ID. diff --git a/src/drivers/uavcan_v1/ServiceClients/Access.hpp b/src/drivers/uavcan_v1/ServiceClients/Access.hpp index 069eb46dc9..a2505967c1 100644 --- a/src/drivers/uavcan_v1/ServiceClients/Access.hpp +++ b/src/drivers/uavcan_v1/ServiceClients/Access.hpp @@ -103,7 +103,7 @@ public: uint8_t response_payload_buffer[uavcan_register_Access_Response_1_0_SERIALIZATION_BUFFER_SIZE_BYTES_]; CanardTransfer transfer = { - .timestamp_usec = hrt_absolute_time() + CANARD_DEFAULT_TRANSFER_ID_TIMEOUT_USEC, + .timestamp_usec = hrt_absolute_time() + PUBLISHER_DEFAULT_TIMEOUT_USEC, .priority = CanardPriorityNominal, .transfer_kind = CanardTransferKindResponse, .port_id = uavcan_register_Access_1_0_FIXED_PORT_ID_, // This is the subject-ID. diff --git a/src/drivers/uavcan_v1/ServiceClients/GetInfo.hpp b/src/drivers/uavcan_v1/ServiceClients/GetInfo.hpp index b972d87562..ce2806dd2f 100644 --- a/src/drivers/uavcan_v1/ServiceClients/GetInfo.hpp +++ b/src/drivers/uavcan_v1/ServiceClients/GetInfo.hpp @@ -108,7 +108,7 @@ public: uint8_t response_payload_buffer[uavcan_node_GetInfo_Response_1_0_SERIALIZATION_BUFFER_SIZE_BYTES_]; CanardTransfer response = { - .timestamp_usec = hrt_absolute_time() + CANARD_DEFAULT_TRANSFER_ID_TIMEOUT_USEC, + .timestamp_usec = hrt_absolute_time() + PUBLISHER_DEFAULT_TIMEOUT_USEC, .priority = CanardPriorityNominal, .transfer_kind = CanardTransferKindResponse, .port_id = uavcan_node_GetInfo_1_0_FIXED_PORT_ID_, // This is the subject-ID. diff --git a/src/drivers/uavcan_v1/Services/AccessRequest.hpp b/src/drivers/uavcan_v1/Services/AccessRequest.hpp index 7c92522300..232e78bbc4 100644 --- a/src/drivers/uavcan_v1/Services/AccessRequest.hpp +++ b/src/drivers/uavcan_v1/Services/AccessRequest.hpp @@ -47,6 +47,8 @@ #include +#include "../Publishers/Publisher.hpp" + class UavcanAccessServiceRequest { public: @@ -68,7 +70,7 @@ public: uint8_t request_payload_buffer[uavcan_register_Access_Request_1_0_SERIALIZATION_BUFFER_SIZE_BYTES_]; CanardTransfer transfer = { - .timestamp_usec = hrt_absolute_time() + CANARD_DEFAULT_TRANSFER_ID_TIMEOUT_USEC, + .timestamp_usec = hrt_absolute_time() + PUBLISHER_DEFAULT_TIMEOUT_USEC, .priority = CanardPriorityNominal, .transfer_kind = CanardTransferKindRequest, .port_id = uavcan_register_Access_1_0_FIXED_PORT_ID_, // This is the subject-ID. diff --git a/src/drivers/uavcan_v1/Services/ListRequest.hpp b/src/drivers/uavcan_v1/Services/ListRequest.hpp index dc01d4a587..3cb3fe9a5e 100644 --- a/src/drivers/uavcan_v1/Services/ListRequest.hpp +++ b/src/drivers/uavcan_v1/Services/ListRequest.hpp @@ -47,6 +47,8 @@ #include +#include "../Publishers/Publisher.hpp" + class UavcanListServiceRequest { public: @@ -62,7 +64,7 @@ public: uint8_t request_payload_buffer[uavcan_register_List_Request_1_0_SERIALIZATION_BUFFER_SIZE_BYTES_]; CanardTransfer request = { - .timestamp_usec = hrt_absolute_time() + CANARD_DEFAULT_TRANSFER_ID_TIMEOUT_USEC, + .timestamp_usec = hrt_absolute_time() + PUBLISHER_DEFAULT_TIMEOUT_USEC, .priority = CanardPriorityNominal, .transfer_kind = CanardTransferKindRequest, .port_id = uavcan_register_List_1_0_FIXED_PORT_ID_, // This is the subject-ID. diff --git a/src/drivers/uavcan_v1/Subscribers/DynamicPortSubscriber.hpp b/src/drivers/uavcan_v1/Subscribers/DynamicPortSubscriber.hpp index e08a438216..dcd379f720 100644 --- a/src/drivers/uavcan_v1/Subscribers/DynamicPortSubscriber.hpp +++ b/src/drivers/uavcan_v1/Subscribers/DynamicPortSubscriber.hpp @@ -69,7 +69,7 @@ public: // Set _port_id from _uavcan_param uavcan_register_Value_1_0 value; _param_manager.GetParamByName(uavcan_param, value); - uint16_t new_id = value.natural16.value.elements[0]; + int32_t new_id = value.integer32.value.elements[0]; /* FIXME how about partial subscribing */ if (curSubj->_canard_sub._port_id != new_id) { diff --git a/src/drivers/uavcan_v1/Uavcan.cpp b/src/drivers/uavcan_v1/Uavcan.cpp index 4cb405fcce..058e5a8922 100644 --- a/src/drivers/uavcan_v1/Uavcan.cpp +++ b/src/drivers/uavcan_v1/Uavcan.cpp @@ -417,7 +417,7 @@ void UavcanNode::sendHeartbeat() CanardTransfer transfer = { - .timestamp_usec = hrt_absolute_time() + CANARD_DEFAULT_TRANSFER_ID_TIMEOUT_USEC, + .timestamp_usec = hrt_absolute_time() + PUBLISHER_DEFAULT_TIMEOUT_USEC, .priority = CanardPriorityNominal, .transfer_kind = CanardTransferKindMessage, .port_id = uavcan_node_Heartbeat_1_0_FIXED_PORT_ID_,