From 726e25b8739fe6aae26f7a6d69aba3f88d484bbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danijel=20Tomi=C4=87?= Date: Mon, 30 Mar 2026 09:56:03 +0200 Subject: [PATCH 1/2] Fix: Status packets have no timestamp --- .../asam_cmp_capture_module/capture_fb.h | 1 + .../src/capture_fb.cpp | 25 +++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/modules/asam_cmp_capture_module/include/asam_cmp_capture_module/capture_fb.h b/modules/asam_cmp_capture_module/include/asam_cmp_capture_module/capture_fb.h index ab4d9ce..c8a7117 100644 --- a/modules/asam_cmp_capture_module/include/asam_cmp_capture_module/capture_fb.h +++ b/modules/asam_cmp_capture_module/include/asam_cmp_capture_module/capture_fb.h @@ -62,6 +62,7 @@ class CaptureFb final : public daq::asam_cmp_common_lib::CaptureCommonFb void startStatusLoop(); void stopStatusLoop(); ASAM::CMP::DataContext createEncoderDataContext() const; + static uint64_t GetCurrentSystemTime(); private: const bool allowJumboFrames; diff --git a/modules/asam_cmp_capture_module/src/capture_fb.cpp b/modules/asam_cmp_capture_module/src/capture_fb.cpp index 90f5e06..fdb3ae1 100644 --- a/modules/asam_cmp_capture_module/src/capture_fb.cpp +++ b/modules/asam_cmp_capture_module/src/capture_fb.cpp @@ -7,13 +7,14 @@ #include #include -BEGIN_NAMESPACE_ASAM_CMP_CAPTURE_MODULE +#include -CaptureFb::CaptureFb(const ModuleInfoPtr& moduleInfo, - const ContextPtr& ctx, - const ComponentPtr& parent, - const StringPtr& localId, - const CaptureFbInit& init) +BEGIN_NAMESPACE_ASAM_CMP_CAPTURE_MODULE + CaptureFb::CaptureFb(const ModuleInfoPtr& moduleInfo, + const ContextPtr& ctx, + const ComponentPtr& parent, + const StringPtr& localId, + const CaptureFbInit& init) : asam_cmp_common_lib::CaptureCommonFb(moduleInfo, ctx, parent, localId) , allowJumboFrames(false) , ethernetWrapper(init.ethernetWrapper) @@ -103,6 +104,11 @@ ASAM::CMP::DataContext CaptureFb::createEncoderDataContext() const return {64, 1500}; } +uint64_t CaptureFb::GetCurrentSystemTime() +{ + return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); +} + void CaptureFb::statusLoop() { auto encoderContext = createEncoderDataContext(); @@ -118,11 +124,16 @@ void CaptureFb::statusLoop() ethernetWrapper->sendPacket(e); }; + + captureStatus.getPacket().setTimestamp(GetCurrentSystemTime()); encodeAndSend(captureStatus.getPacket()); + for (SizeT i = 0; i < captureStatus.getInterfaceStatusCount(); ++i) { - encodeAndSend(captureStatus.getInterfaceStatus(i).getPacket()); + auto packet = captureStatus.getInterfaceStatus(i).getPacket(); + packet.setTimestamp(GetCurrentSystemTime()); + encodeAndSend(packet); } } } From 86188886961cfd06a2aacd056c3ff9846935b47f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danijel=20Tomi=C4=87?= Date: Mon, 30 Mar 2026 14:00:09 +0200 Subject: [PATCH 2/2] Use deviceDomain if available --- .../asam_cmp_capture_module/capture_fb.h | 7 +++- .../src/capture_fb.cpp | 34 ++++++++++++++----- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/modules/asam_cmp_capture_module/include/asam_cmp_capture_module/capture_fb.h b/modules/asam_cmp_capture_module/include/asam_cmp_capture_module/capture_fb.h index c8a7117..cd2dd3b 100644 --- a/modules/asam_cmp_capture_module/include/asam_cmp_capture_module/capture_fb.h +++ b/modules/asam_cmp_capture_module/include/asam_cmp_capture_module/capture_fb.h @@ -62,7 +62,11 @@ class CaptureFb final : public daq::asam_cmp_common_lib::CaptureCommonFb void startStatusLoop(); void stopStatusLoop(); ASAM::CMP::DataContext createEncoderDataContext() const; - static uint64_t GetCurrentSystemTime(); + uint64_t getCurrentSystemTime(); + static DevicePtr FindParentDevice(const ComponentPtr& parent); + +private: + static constexpr Int NanoTicksPerSec{1000000000}; private: const bool allowJumboFrames; @@ -77,6 +81,7 @@ class CaptureFb final : public daq::asam_cmp_common_lib::CaptureCommonFb bool stopStatusSending; std::shared_ptr ethernetWrapper; const StringPtr& selectedEthernetDeviceName; + DevicePtr parentDevice; }; END_NAMESPACE_ASAM_CMP_CAPTURE_MODULE diff --git a/modules/asam_cmp_capture_module/src/capture_fb.cpp b/modules/asam_cmp_capture_module/src/capture_fb.cpp index fdb3ae1..41e00b8 100644 --- a/modules/asam_cmp_capture_module/src/capture_fb.cpp +++ b/modules/asam_cmp_capture_module/src/capture_fb.cpp @@ -10,7 +10,8 @@ #include BEGIN_NAMESPACE_ASAM_CMP_CAPTURE_MODULE - CaptureFb::CaptureFb(const ModuleInfoPtr& moduleInfo, + +CaptureFb::CaptureFb(const ModuleInfoPtr& moduleInfo, const ContextPtr& ctx, const ComponentPtr& parent, const StringPtr& localId, @@ -19,6 +20,7 @@ BEGIN_NAMESPACE_ASAM_CMP_CAPTURE_MODULE , allowJumboFrames(false) , ethernetWrapper(init.ethernetWrapper) , selectedEthernetDeviceName(init.selectedDeviceName) + , parentDevice(FindParentDevice(parent)) { initProperties(); initEncoders(); @@ -104,9 +106,23 @@ ASAM::CMP::DataContext CaptureFb::createEncoderDataContext() const return {64, 1500}; } -uint64_t CaptureFb::GetCurrentSystemTime() +uint64_t CaptureFb::getCurrentSystemTime() +{ + if (!parentDevice.assigned()) + return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + + DeviceDomainPtr domain = parentDevice.getDomain(); + const auto domainResolution = domain.getTickResolution(); + return static_cast(parentDevice.getTicksSinceOrigin()) * (SimplifiedRatioPtr(domainResolution) * NanoTicksPerSec); +} + +DevicePtr CaptureFb::FindParentDevice(const ComponentPtr& parent) { - return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + auto parentDevice = parent; + while (parentDevice.assigned() && !parentDevice.asPtrOrNull().assigned()) + parentDevice = parentDevice.getParent(); + + return parentDevice; } void CaptureFb::statusLoop() @@ -118,22 +134,22 @@ void CaptureFb::statusLoop() cv.wait_for(lock, std::chrono::milliseconds(sendingSyncLoopTime)); if (!stopStatusSending) { - auto encodeAndSend = [&](const ASAM::CMP::Packet& packet) { + auto time = getCurrentSystemTime(); + auto encodeAndSend = [&](ASAM::CMP::Packet& packet, uint64_t time) { + packet.setTimestamp(time); auto encodedData = encoders.encode(1, packet, encoderContext); for (const auto& e : encodedData) ethernetWrapper->sendPacket(e); }; - - captureStatus.getPacket().setTimestamp(GetCurrentSystemTime()); - encodeAndSend(captureStatus.getPacket()); + + encodeAndSend(captureStatus.getPacket(), time); for (SizeT i = 0; i < captureStatus.getInterfaceStatusCount(); ++i) { auto packet = captureStatus.getInterfaceStatus(i).getPacket(); - packet.setTimestamp(GetCurrentSystemTime()); - encodeAndSend(packet); + encodeAndSend(packet, time); } } }