Make monotonic_now a required parameter to PhasedLoop

This prepares us much better for mocking out time as part of the event
loop conversion.

Change-Id: I57560b97b265ddd41fe7a4e9f74d7b1324d15955
diff --git a/aos/actions/actor.h b/aos/actions/actor.h
index 57a2ecb..53b7040 100644
--- a/aos/actions/actor.h
+++ b/aos/actions/actor.h
@@ -53,6 +53,7 @@
   // succeeded.
   bool WaitOrCancel(monotonic_clock::duration duration) {
     ::aos::time::PhasedLoop phased_loop(::aos::controls::kLoopFrequency,
+                                        event_loop_->monotonic_now(),
                                         ::std::chrono::milliseconds(5) / 2);
     return !WaitUntil(
         [&phased_loop]() {
@@ -92,6 +93,8 @@
   // Set to true when we should stop ASAP.
   bool abort_ = false;
 
+  ::aos::EventLoop *event_loop() { return event_loop_; }
+
  private:
   // Checks if an action was initially running when the thread started.
   bool CheckInitialRunning();
diff --git a/aos/util/phased_loop.h b/aos/util/phased_loop.h
index 1c1aef1..7aa51d2 100644
--- a/aos/util/phased_loop.h
+++ b/aos/util/phased_loop.h
@@ -19,12 +19,13 @@
   // offset must be >= chrono::seconds(0) and < interval.
   PhasedLoop(
       const monotonic_clock::duration interval,
+      const monotonic_clock::time_point monotonic_now,
       const monotonic_clock::duration offset = monotonic_clock::duration(0))
       : interval_(interval), offset_(offset), last_time_(offset) {
     CHECK_GE(offset, monotonic_clock::duration(0));
     CHECK_GT(interval, monotonic_clock::duration(0));
     CHECK_LT(offset, interval);
-    Reset();
+    Reset(monotonic_now);
   }
 
   // Updates the offset and interval.
@@ -52,8 +53,7 @@
   // Resets the count of skipped iterations.
   // Iterate(monotonic_now) will return 1 and set sleep_time() to something
   // within interval of monotonic_now.
-  void Reset(const monotonic_clock::time_point monotonic_now =
-                 monotonic_clock::now()) {
+  void Reset(const monotonic_clock::time_point monotonic_now) {
     Iterate(monotonic_now - interval_);
   }
 
diff --git a/aos/util/phased_loop_test.cc b/aos/util/phased_loop_test.cc
index 2a52b90..4f07bcc 100644
--- a/aos/util/phased_loop_test.cc
+++ b/aos/util/phased_loop_test.cc
@@ -23,7 +23,8 @@
 
 TEST_F(PhasedLoopTest, Reset) {
   {
-    PhasedLoop loop(milliseconds(100), milliseconds(0));
+    PhasedLoop loop(milliseconds(100), monotonic_clock::epoch(),
+                    milliseconds(0));
 
     loop.Reset(monotonic_clock::epoch());
     EXPECT_EQ(InMs(0), loop.sleep_time());
@@ -46,14 +47,16 @@
     EXPECT_EQ(InMs(200), loop.sleep_time());
   }
   {
-    PhasedLoop loop(milliseconds(100), milliseconds(1));
+    PhasedLoop loop(milliseconds(100), monotonic_clock::epoch(),
+                    milliseconds(1));
     loop.Reset(monotonic_clock::epoch());
     EXPECT_EQ(InMs(-99), loop.sleep_time());
     EXPECT_EQ(1, loop.Iterate(monotonic_clock::epoch()));
     EXPECT_EQ(InMs(1), loop.sleep_time());
   }
   {
-    PhasedLoop loop(milliseconds(100), milliseconds(99));
+    PhasedLoop loop(milliseconds(100), monotonic_clock::epoch(),
+                    milliseconds(99));
 
     loop.Reset(monotonic_clock::epoch());
     EXPECT_EQ(InMs(-1), loop.sleep_time());
@@ -79,7 +82,8 @@
 
 TEST_F(PhasedLoopTest, Iterate) {
   {
-    PhasedLoop loop(milliseconds(100), milliseconds(99));
+    PhasedLoop loop(milliseconds(100), monotonic_clock::epoch(),
+                    milliseconds(99));
     loop.Reset(monotonic_clock::epoch());
     EXPECT_EQ(1, loop.Iterate(monotonic_clock::epoch()));
     EXPECT_EQ(InMs(99), loop.sleep_time());
@@ -99,7 +103,8 @@
     EXPECT_EQ(InMs(699), loop.sleep_time());
   }
   {
-    PhasedLoop loop(milliseconds(100), milliseconds(1));
+    PhasedLoop loop(milliseconds(100), monotonic_clock::epoch(),
+                    milliseconds(1));
     loop.Reset(monotonic_clock::epoch());
     EXPECT_EQ(1, loop.Iterate(monotonic_clock::epoch()));
     EXPECT_EQ(InMs(1), loop.sleep_time());
@@ -124,7 +129,7 @@
 // This seems like a rare case at first, but starting from zero needs to
 // work, which means negatives should too.
 TEST_F(PhasedLoopTest, CrossingZero) {
-  PhasedLoop loop(milliseconds(100), milliseconds(1));
+  PhasedLoop loop(milliseconds(100), monotonic_clock::epoch(), milliseconds(1));
   loop.Reset(InMs(-1000));
   EXPECT_EQ(InMs(-1099), loop.sleep_time());
   EXPECT_EQ(9, loop.Iterate(InMs(-250)));
@@ -152,7 +157,8 @@
 
 // Tests OffsetFromIntervalAndTime for various edge conditions.
 TEST_F(PhasedLoopTest, OffsetFromIntervalAndTimeTest) {
-  PhasedLoop loop(milliseconds(1000), milliseconds(300));
+  PhasedLoop loop(milliseconds(1000), monotonic_clock::epoch(),
+                  milliseconds(300));
 
   EXPECT_EQ(milliseconds(1),
             loop.OffsetFromIntervalAndTime(milliseconds(1000), InMs(1001)));
@@ -175,14 +181,18 @@
 
 // Tests that passing invalid values to the constructor dies correctly.
 TEST_F(PhasedLoopDeathTest, InvalidValues) {
-  EXPECT_DEATH(PhasedLoop(milliseconds(1), milliseconds(2)),
-               ".*offset<interval.*");
-  EXPECT_DEATH(PhasedLoop(milliseconds(1), milliseconds(1)),
-               ".*offset<interval.*");
-  EXPECT_DEATH(PhasedLoop(milliseconds(1), milliseconds(-1)),
-               ".*offset>=monotonic_clock::duration\\(0\\).*");
-  EXPECT_DEATH(PhasedLoop(milliseconds(0), milliseconds(0)),
-               ".*interval>monotonic_clock::duration\\(0\\).*");
+  EXPECT_DEATH(
+      PhasedLoop(milliseconds(1), monotonic_clock::epoch(), milliseconds(2)),
+      ".*offset<interval.*");
+  EXPECT_DEATH(
+      PhasedLoop(milliseconds(1), monotonic_clock::epoch(), milliseconds(1)),
+      ".*offset<interval.*");
+  EXPECT_DEATH(
+      PhasedLoop(milliseconds(1), monotonic_clock::epoch(), milliseconds(-1)),
+      ".*offset>=monotonic_clock::duration\\(0\\).*");
+  EXPECT_DEATH(
+      PhasedLoop(milliseconds(0), monotonic_clock::epoch(), milliseconds(0)),
+      ".*interval>monotonic_clock::duration\\(0\\).*");
 }
 
 }  // namespace testing