From e756574420b851f41ba830098653992938c9cf93 Mon Sep 17 00:00:00 2001 From: ttechnick Date: Mon, 26 Jan 2026 11:11:03 +0100 Subject: [PATCH] use generic name for can devices But still ensure backcompability of DeviceInformation (for now) --- msg/DeviceInformation.msg | 1 + src/drivers/uavcan/node_info.cpp | 8 +++++++- src/drivers/uavcan/node_info.hpp | 5 ++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/msg/DeviceInformation.msg b/msg/DeviceInformation.msg index c47804b6ed..98c6762662 100644 --- a/msg/DeviceInformation.msg +++ b/msg/DeviceInformation.msg @@ -24,6 +24,7 @@ uint8 DEVICE_TYPE_DIFFERENTIAL_PRESSURE = 13 # Differential pressure uint8 DEVICE_TYPE_BATTERY = 14 # Battery uint8 DEVICE_TYPE_HYGROMETER = 15 # Hygrometer +char[80] name # Name of node char[32] vendor_name # Name of the device vendor char[32] model_name # Name of the device model diff --git a/src/drivers/uavcan/node_info.cpp b/src/drivers/uavcan/node_info.cpp index 80c7c87691..78ada3beb5 100644 --- a/src/drivers/uavcan/node_info.cpp +++ b/src/drivers/uavcan/node_info.cpp @@ -206,6 +206,8 @@ void NodeInfoPublisher::publishSingleDeviceInformation(const DeviceInformation & static_assert(sizeof(msg.firmware_version) == sizeof(device_info.firmware_version), "Array size mismatch"); static_assert(sizeof(msg.hardware_version) == sizeof(device_info.hardware_version), "Array size mismatch"); static_assert(sizeof(msg.serial_number) == sizeof(device_info.serial_number), "Array size mismatch"); + // Copy strings using memcpy and ensure null termination + static_assert(sizeof(msg.name) == sizeof(device_info.name), "Array size mismatch"); memcpy(msg.model_name, device_info.model_name, sizeof(msg.model_name)); msg.model_name[sizeof(msg.model_name) - 1] = '\0'; @@ -213,6 +215,9 @@ void NodeInfoPublisher::publishSingleDeviceInformation(const DeviceInformation & memcpy(msg.vendor_name, device_info.vendor_name, sizeof(msg.vendor_name)); msg.vendor_name[sizeof(msg.vendor_name) - 1] = '\0'; + memcpy(msg.name, device_info.name, sizeof(msg.name)); + msg.name[sizeof(msg.name) - 1] = '\0'; + memcpy(msg.firmware_version, device_info.firmware_version, sizeof(msg.firmware_version)); msg.firmware_version[sizeof(msg.firmware_version) - 1] = '\0'; @@ -233,9 +238,10 @@ void NodeInfoPublisher::populateDeviceInfoFields(DeviceInformation &device_info, { device_info.has_node_info = true; - // Parse the node name to extract vendor and model information + // Remain backward compatible - for now. parseNodeName(info.name, device_info); + snprintf(device_info.name, sizeof(device_info.name), "%s", info.name); snprintf(device_info.firmware_version, sizeof(device_info.firmware_version), "%d.%d.%lu", info.sw_major, info.sw_minor, static_cast(info.vcs_commit)); snprintf(device_info.hardware_version, sizeof(device_info.hardware_version), diff --git a/src/drivers/uavcan/node_info.hpp b/src/drivers/uavcan/node_info.hpp index 6ac6738669..025df2ab94 100644 --- a/src/drivers/uavcan/node_info.hpp +++ b/src/drivers/uavcan/node_info.hpp @@ -102,6 +102,7 @@ private: DeviceCapability capability{DeviceCapability::NONE}; bool has_node_info{false}; + char name[80]; char vendor_name[32]; char model_name[32]; char firmware_version[24]; @@ -112,6 +113,7 @@ private: has_node_info(false) { // Initialize string fields + name[0] = '\0'; vendor_name[0] = '\0'; model_name[0] = '\0'; firmware_version[0] = '\0'; @@ -123,6 +125,7 @@ private: : node_id(nid), device_id(did), capability(cap), has_node_info(false) { // Initialize string fields + name[0] = '\0'; vendor_name[0] = '\0'; model_name[0] = '\0'; firmware_version[0] = '\0'; @@ -145,10 +148,10 @@ private: // Publishing methods void publishDeviceInformationPeriodic(); void publishSingleDeviceInformation(const DeviceInformation &device_info); + void parseNodeName(const char *name, DeviceInformation &device_info); // Helper functions void populateDeviceInfoFields(DeviceInformation &device_info, const NodeInfo &info); - void parseNodeName(const char *name, DeviceInformation &device_info); bool extendDeviceInformationsArray(); uavcan::NodeInfoRetriever &_node_info_retriever;