James Kuszmaul | 80d6c42 | 2023-01-06 14:16:04 -0800 | [diff] [blame] | 1 | #include "aos/util/clock_publisher.h" |
| 2 | |
| 3 | namespace aos { |
| 4 | ClockPublisher::ClockPublisher(aos::SimulatedEventLoopFactory *factory, |
| 5 | aos::EventLoop *event_loop) |
| 6 | : factory_(factory), |
| 7 | timepoints_sender_(event_loop->MakeSender<ClockTimepoints>("/clocks")) { |
| 8 | aos::TimerHandler *timer_handler = |
| 9 | event_loop->AddTimer([this]() { SendTimepoints(); }); |
| 10 | event_loop->OnRun([timer_handler, event_loop]() { |
Philipp Schrader | a671252 | 2023-07-05 20:25:11 -0700 | [diff] [blame] | 11 | timer_handler->Schedule(event_loop->context().monotonic_event_time, |
| 12 | std::chrono::seconds(1)); |
James Kuszmaul | 80d6c42 | 2023-01-06 14:16:04 -0800 | [diff] [blame] | 13 | }); |
| 14 | } |
| 15 | |
| 16 | void ClockPublisher::SendTimepoints() { |
| 17 | std::vector<flatbuffers::Offset<NodeTimepoint>> timepoints; |
| 18 | auto builder = timepoints_sender_.MakeBuilder(); |
| 19 | for (const aos::Node *node : factory_->nodes()) { |
| 20 | const NodeEventLoopFactory *node_factory = |
| 21 | factory_->GetNodeEventLoopFactory(node); |
| 22 | flatbuffers::Offset<flatbuffers::String> node_name = |
| 23 | (node != nullptr) |
| 24 | ? builder.fbb()->CreateString(node->name()->string_view()) |
| 25 | : flatbuffers::Offset<flatbuffers::String>(0); |
| 26 | NodeTimepoint::Builder timepoint_builder = |
| 27 | builder.MakeBuilder<NodeTimepoint>(); |
| 28 | if (node != nullptr) { |
| 29 | timepoint_builder.add_node(node_name); |
| 30 | } |
| 31 | if (node_factory->is_running()) { |
| 32 | timepoint_builder.add_boot_count(node_factory->boot_count()); |
| 33 | timepoint_builder.add_monotonic_time( |
| 34 | node_factory->monotonic_now().time_since_epoch().count()); |
| 35 | timepoint_builder.add_realtime_time( |
| 36 | node_factory->realtime_now().time_since_epoch().count()); |
| 37 | } |
| 38 | timepoints.push_back(timepoint_builder.Finish()); |
| 39 | } |
| 40 | const flatbuffers::Offset< |
| 41 | flatbuffers::Vector<flatbuffers::Offset<NodeTimepoint>>> |
| 42 | timepoints_offset = builder.fbb()->CreateVector(timepoints); |
| 43 | ClockTimepoints::Builder timepoints_builder = |
| 44 | builder.MakeBuilder<ClockTimepoints>(); |
| 45 | timepoints_builder.add_distributed_clock( |
| 46 | factory_->distributed_now().time_since_epoch().count()); |
| 47 | timepoints_builder.add_clocks(timepoints_offset); |
| 48 | builder.CheckOk(builder.Send(timepoints_builder.Finish())); |
| 49 | } |
| 50 | |
| 51 | } // namespace aos |