15 #ifndef LIBSTATISTICS_COLLECTOR__TOPIC_STATISTICS_COLLECTOR__RECEIVED_MESSAGE_AGE_HPP_
16 #define LIBSTATISTICS_COLLECTOR__TOPIC_STATISTICS_COLLECTOR__RECEIVED_MESSAGE_AGE_HPP_
21 #include <type_traits>
24 #include "constants.hpp"
26 #include "libstatistics_collector/topic_statistics_collector/topic_statistics_collector.hpp"
29 #include "rcutils/logging_macros.h"
31 namespace libstatistics_collector
33 namespace topic_statistics_collector
40 template<
typename M,
typename =
void>
48 struct HasHeader<M, decltype((void) M::header)>: std::true_type {};
54 template<
typename M,
typename Enable =
void>
61 static std::pair<bool, int64_t>
value(
const M &)
63 return std::make_pair(
false, 0);
72 struct TimeStamp<M, typename std::enable_if<HasHeader<M>::value>::type>
77 static std::pair<bool, int64_t>
value(
const M & m)
79 const auto stamp = m.header.stamp;
80 const auto nanos = RCL_S_TO_NS(
static_cast<int64_t
>(stamp.sec)) + stamp.nanosec;
81 return std::make_pair(
true, nanos);
105 const T & received_message,
106 const rcl_time_point_value_t now_nanoseconds)
override
110 if (timestamp_from_header.first) {
112 if (timestamp_from_header.second && now_nanoseconds) {
113 const std::chrono::nanoseconds age_nanos{now_nanoseconds - timestamp_from_header.second};
114 const auto age_millis = std::chrono::duration<double, std::milli>(age_nanos);
128 return topic_statistics_constants::kMsgAgeStatName;
138 return topic_statistics_constants::kMillisecondUnitName;
156 #endif // LIBSTATISTICS_COLLECTOR__TOPIC_STATISTICS_COLLECTOR__RECEIVED_MESSAGE_AGE_HPP_