blob: f8c731f10cbf9ccd321e875d01181c9f1c5d3634 [file] [log] [blame]
James Kuszmaul80d6c422023-01-06 14:16:04 -08001#include "aos/util/clock_publisher.h"
2
3namespace aos {
4ClockPublisher::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 Schradera6712522023-07-05 20:25:11 -070011 timer_handler->Schedule(event_loop->context().monotonic_event_time,
12 std::chrono::seconds(1));
James Kuszmaul80d6c422023-01-06 14:16:04 -080013 });
14}
15
16void 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