Support replaying the realtime clock from logs

This adds the concept of the realtime offset to the event scheduler.

Side note: the event scheduler is going to have to get significantly
more complicated when multi-node log files show up.

Change-Id: Ia6f891c77b8c3badcea930cdfa0e236acbff7801
diff --git a/aos/events/logging/logger.cc b/aos/events/logging/logger.cc
index e38c476..e35fe5b 100644
--- a/aos/events/logging/logger.cc
+++ b/aos/events/logging/logger.cc
@@ -390,6 +390,19 @@
           ->realtime_start_time()));
 }
 
+void LogReader::Register(SimulatedEventLoopFactory *event_loop_factory) {
+  event_loop_unique_ptr_ = event_loop_factory->MakeEventLoop("log_reader");
+  event_loop_factory_ = event_loop_factory;
+  // We don't run timing reports when trying to print out logged data, because
+  // otherwise we would end up printing out the timing reports themselves...
+  // This is only really relevant when we are replaying into a simulation.
+  event_loop_unique_ptr_->SkipTimingReport();
+
+  Register(event_loop_unique_ptr_.get());
+  event_loop_factory_->RunFor(monotonic_start_time() -
+                              event_loop_factory_->monotonic_now());
+}
+
 void LogReader::Register(EventLoop *event_loop) {
   event_loop_ = event_loop;
 
@@ -422,7 +435,17 @@
     FlatbufferVector<MessageHeader> front = std::move(channel.front());
 
     CHECK(front.message().data() != nullptr);
+
     if (oldest_channel_index.first > monotonic_start_time()) {
+      // If we have access to the factory, use it to fix the realtime time.
+      if (event_loop_factory_ != nullptr) {
+        event_loop_factory_->SetRealtimeOffset(
+            monotonic_clock::time_point(
+                chrono::nanoseconds(front.message().monotonic_sent_time())),
+            realtime_clock::time_point(
+                chrono::nanoseconds(front.message().realtime_sent_time())));
+      }
+
       channel.raw_sender->Send(front.message().data()->Data(),
                                front.message().data()->size());
     } else {
@@ -463,6 +486,10 @@
   for (size_t i = 0; i < channels_.size(); ++i) {
     channels_[i].raw_sender.reset();
   }
+
+  event_loop_factory_ = nullptr;
+  event_loop_unique_ptr_.reset();
+  event_loop_ = nullptr;
 }
 
 void LogReader::EmplaceDataBack(FlatbufferVector<MessageHeader> &&new_data) {