Make LogReader::OnStart able to start applications at times

There are 2 main features missing from OnStart to make it truly useful
at scale.
1) We need to be able to start applications...
2) Only replaying a time range (typically on the RT clock) is very
   helpful.

Add support for 1.

2 is more tricky.  I considered putting the logic outside LogReader, but
in the end, the bookkeeping for starting and stopping is bad enough that
it really helps to have LogReader manage and synchronize it.  Maybe we
can refactor it back out later.

Change-Id: I4ddf6e18819d3aadd02f38776bbc7aef843a96b0
Signed-off-by: Austin Schuh <austin.schuh@bluerivertech.com>
diff --git a/aos/events/simulated_event_loop_test.cc b/aos/events/simulated_event_loop_test.cc
index a94b895..09202ff 100644
--- a/aos/events/simulated_event_loop_test.cc
+++ b/aos/events/simulated_event_loop_test.cc
@@ -181,6 +181,29 @@
   EXPECT_EQ(counter, 0);
 }
 
+// Test that TemporarilyStopAndRun respects and preserves running.
+TEST(EventSchedulerTest, TemporarilyStopAndRun) {
+  int counter = 0;
+  EventSchedulerScheduler scheduler_scheduler;
+  EventScheduler scheduler(0);
+  scheduler_scheduler.AddEventScheduler(&scheduler);
+
+  scheduler_scheduler.TemporarilyStopAndRun(
+      [&]() { CHECK(!scheduler_scheduler.is_running()); });
+  ASSERT_FALSE(scheduler_scheduler.is_running());
+
+  FunctionEvent e([&]() {
+    counter += 1;
+    CHECK(scheduler_scheduler.is_running());
+    scheduler_scheduler.TemporarilyStopAndRun(
+        [&]() { CHECK(!scheduler_scheduler.is_running()); });
+    CHECK(scheduler_scheduler.is_running());
+  });
+  scheduler.Schedule(monotonic_clock::epoch() + chrono::seconds(1), &e);
+  scheduler_scheduler.Run();
+  EXPECT_EQ(counter, 1);
+}
+
 void SendTestMessage(aos::Sender<TestMessage> *sender, int value) {
   aos::Sender<TestMessage>::Builder builder = sender->MakeBuilder();
   TestMessage::Builder test_message_builder =