Converted PhasedLoop over to monotonic_clock.

Change-Id: Ic8857c4412abb7c19dd3df4aaa5f6c8aa74e9dc6
diff --git a/aos/common/time.h b/aos/common/time.h
index 40b72b0..ba795a9 100644
--- a/aos/common/time.h
+++ b/aos/common/time.h
@@ -28,8 +28,10 @@
 
   // Returns the epoch (0).
   static constexpr monotonic_clock::time_point epoch() {
-    return time_point(duration(0));
+    return time_point(zero());
   }
+
+  static constexpr monotonic_clock::duration zero() { return duration(0); }
 };
 
 namespace time {
@@ -146,8 +148,10 @@
   }
 
   // Construct a time representing the period of hertz.
-  static constexpr Time FromRate(int hertz) {
-    return Time(0, kNSecInSec / hertz);
+  static constexpr ::std::chrono::nanoseconds FromRate(int hertz) {
+    return ::std::chrono::duration_cast<::std::chrono::nanoseconds>(
+               ::std::chrono::seconds(1)) /
+           hertz;
   }
 
   // Checks whether or not this time is within amount nanoseconds of other.
diff --git a/aos/common/time_test.cc b/aos/common/time_test.cc
index 3ae82ab..e1811db 100644
--- a/aos/common/time_test.cc
+++ b/aos/common/time_test.cc
@@ -255,7 +255,7 @@
 }
 
 TEST(TimeTest, FromRate) {
-  EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 100)), Time::FromRate(100));
+  EXPECT_EQ(::std::chrono::milliseconds(10), Time::FromRate(100));
 }
 
 // Test the monotonic_clock and sleep_until functions.
diff --git a/aos/common/util/phased_loop.cc b/aos/common/util/phased_loop.cc
index b5804c8..9c81ffb 100644
--- a/aos/common/util/phased_loop.cc
+++ b/aos/common/util/phased_loop.cc
@@ -10,15 +10,21 @@
              frequency + Time::InUS(offset));
 }
 
-int PhasedLoop::Iterate(const Time &now) {
-  const Time next_time = Time::InNS(((now - offset_).ToNSec() + 1) /
-                                    interval_.ToNSec() * interval_.ToNSec()) +
-                         ((now < offset_) ? Time::kZero : interval_) + offset_;
+int PhasedLoop::Iterate(const monotonic_clock::time_point now) {
+  const monotonic_clock::time_point next_time =
+      monotonic_clock::time_point(
+          (((now - offset_).time_since_epoch() + monotonic_clock::duration(1)) /
+           interval_) *
+          interval_) +
+      ((now.time_since_epoch() < offset_) ? monotonic_clock::zero()
+                                          : interval_) +
+      offset_;
 
-  const Time difference = next_time - last_time_;
-  const int result = difference.ToNSec() / interval_.ToNSec();
+  const monotonic_clock::duration difference = next_time - last_time_;
+  const int result = difference / interval_;
   CHECK_EQ(difference, interval_ * result);
-  CHECK_EQ(0, (next_time - offset_).ToNSec() % interval_.ToNSec());
+  CHECK_EQ(
+      0, (next_time - offset_).time_since_epoch().count() % interval_.count());
   CHECK_GE(next_time, now);
   CHECK_LE(next_time - now, interval_);
   last_time_ = next_time;
diff --git a/aos/common/util/phased_loop.h b/aos/common/util/phased_loop.h
index fc0f247..7614ed2 100644
--- a/aos/common/util/phased_loop.h
+++ b/aos/common/util/phased_loop.h
@@ -22,40 +22,47 @@
   //   ...
   //   10000.1s
   // offset must be >= Time::kZero and < interval.
-  PhasedLoop(const Time &interval, const Time &offset = Time::kZero)
+  PhasedLoop(
+      const monotonic_clock::duration interval,
+      const monotonic_clock::duration offset = monotonic_clock::duration(0))
       : interval_(interval), offset_(offset), last_time_(offset) {
-    CHECK_GE(offset, Time::kZero);
-    CHECK_GT(interval, Time::kZero);
+    CHECK_GE(offset, monotonic_clock::duration(0));
+    CHECK_GT(interval, monotonic_clock::duration(0));
     CHECK_LT(offset, interval);
     Reset();
   }
 
   // Resets the count of skipped iterations.
-  // Iterate(now) will return 1 and set sleep_time() to something within
-  // interval of now.
-  void Reset(const Time &now = Time::Now()) { Iterate(now - interval_); }
+  // 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()) {
+    Iterate(monotonic_now - interval_);
+  }
 
-  // Calculates the next time to run after now.
+  // Calculates the next time to run after monotonic_now.
   // The result can be retrieved with sleep_time().
   // Returns the number of iterations which have passed (1 if this is called
-  // often enough). This can be < 1 iff now goes backwards between calls.
-  int Iterate(const Time &now = Time::Now());
+  // often enough). This can be < 1 iff monotonic_now goes backwards between
+  // calls.
+  int Iterate(const monotonic_clock::time_point monotonic_now =
+                  monotonic_clock::now());
 
   // Sleeps until the next time and returns the number of iterations which have
   // passed.
   int SleepUntilNext() {
-    const int r = Iterate(Time::Now());
-    SleepUntil(sleep_time());
+    const int r = Iterate(monotonic_clock::now());
+    ::std::this_thread::sleep_until(sleep_time());
     return r;
   }
 
-  const Time &sleep_time() const { return last_time_; }
+  monotonic_clock::time_point sleep_time() const { return last_time_; }
 
  private:
-  const Time interval_, offset_;
+  const monotonic_clock::duration interval_, offset_;
 
   // The time we most recently slept until.
-  Time last_time_ = Time::kZero;
+  monotonic_clock::time_point last_time_ = monotonic_clock::epoch();
 };
 
 }  // namespace time
diff --git a/aos/common/util/phased_loop_test.cc b/aos/common/util/phased_loop_test.cc
index 1641a92..b013c2e 100644
--- a/aos/common/util/phased_loop_test.cc
+++ b/aos/common/util/phased_loop_test.cc
@@ -8,111 +8,115 @@
 namespace time {
 namespace testing {
 
+using ::std::chrono::milliseconds;
+
 class PhasedLoopTest : public ::testing::Test {
  protected:
-  PhasedLoopTest() {
-    ::aos::testing::EnableTestLogging();
-  }
+  PhasedLoopTest() { ::aos::testing::EnableTestLogging(); }
 };
 
 typedef PhasedLoopTest PhasedLoopDeathTest;
 
+monotonic_clock::time_point InMs(int ms) {
+  return monotonic_clock::time_point(::std::chrono::milliseconds(ms));
+}
+
 TEST_F(PhasedLoopTest, Reset) {
   {
-    PhasedLoop loop(Time::InMS(100), Time::kZero);
+    PhasedLoop loop(milliseconds(100), milliseconds(0));
 
-    loop.Reset(Time::kZero);
-    EXPECT_EQ(Time::InMS(0), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::kZero));
-    EXPECT_EQ(Time::InMS(100), loop.sleep_time());
+    loop.Reset(monotonic_clock::epoch());
+    EXPECT_EQ(InMs(0), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(monotonic_clock::epoch()));
+    EXPECT_EQ(InMs(100), loop.sleep_time());
 
-    loop.Reset(Time::InMS(99));
-    EXPECT_EQ(Time::InMS(0), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::InMS(99)));
-    EXPECT_EQ(Time::InMS(100), loop.sleep_time());
+    loop.Reset(InMs(99));
+    EXPECT_EQ(InMs(0), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(InMs(99)));
+    EXPECT_EQ(InMs(100), loop.sleep_time());
 
-    loop.Reset(Time::InMS(100));
-    EXPECT_EQ(Time::InMS(100), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::InMS(199)));
-    EXPECT_EQ(Time::InMS(200), loop.sleep_time());
+    loop.Reset(InMs(100));
+    EXPECT_EQ(InMs(100), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(InMs(199)));
+    EXPECT_EQ(InMs(200), loop.sleep_time());
 
-    loop.Reset(Time::InMS(101));
-    EXPECT_EQ(Time::InMS(100), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::InMS(101)));
-    EXPECT_EQ(Time::InMS(200), loop.sleep_time());
+    loop.Reset(InMs(101));
+    EXPECT_EQ(InMs(100), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(InMs(101)));
+    EXPECT_EQ(InMs(200), loop.sleep_time());
   }
   {
-    PhasedLoop loop(Time::InMS(100), Time::InMS(1));
-    loop.Reset(Time::kZero);
-    EXPECT_EQ(Time::InMS(-99), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::kZero));
-    EXPECT_EQ(Time::InMS(1), loop.sleep_time());
+    PhasedLoop loop(milliseconds(100), 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(Time::InMS(100), Time::InMS(99));
+    PhasedLoop loop(milliseconds(100), milliseconds(99));
 
-    loop.Reset(Time::kZero);
-    EXPECT_EQ(Time::InMS(-1), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::kZero));
-    EXPECT_EQ(Time::InMS(99), loop.sleep_time());
+    loop.Reset(monotonic_clock::epoch());
+    EXPECT_EQ(InMs(-1), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(monotonic_clock::epoch()));
+    EXPECT_EQ(InMs(99), loop.sleep_time());
 
-    loop.Reset(Time::InMS(98));
-    EXPECT_EQ(Time::InMS(-1), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::InMS(98)));
-    EXPECT_EQ(Time::InMS(99), loop.sleep_time());
+    loop.Reset(InMs(98));
+    EXPECT_EQ(InMs(-1), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(InMs(98)));
+    EXPECT_EQ(InMs(99), loop.sleep_time());
 
-    loop.Reset(Time::InMS(99));
-    EXPECT_EQ(Time::InMS(99), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::InMS(99)));
-    EXPECT_EQ(Time::InMS(199), loop.sleep_time());
+    loop.Reset(InMs(99));
+    EXPECT_EQ(InMs(99), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(InMs(99)));
+    EXPECT_EQ(InMs(199), loop.sleep_time());
 
-    loop.Reset(Time::InMS(100));
-    EXPECT_EQ(Time::InMS(99), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::InMS(100)));
-    EXPECT_EQ(Time::InMS(199), loop.sleep_time());
+    loop.Reset(InMs(100));
+    EXPECT_EQ(InMs(99), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(InMs(100)));
+    EXPECT_EQ(InMs(199), loop.sleep_time());
   }
 }
 
 TEST_F(PhasedLoopTest, Iterate) {
   {
-    PhasedLoop loop(Time::InMS(100), Time::InMS(99));
-    loop.Reset(Time::kZero);
-    EXPECT_EQ(1, loop.Iterate(Time::kZero));
-    EXPECT_EQ(Time::InMS(99), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::InMS(100)));
-    EXPECT_EQ(Time::InMS(199), loop.sleep_time());
-    EXPECT_EQ(0, loop.Iterate(Time::InMS(100)));
-    EXPECT_EQ(Time::InMS(199), loop.sleep_time());
-    EXPECT_EQ(0, loop.Iterate(Time::InMS(101)));
-    EXPECT_EQ(Time::InMS(199), loop.sleep_time());
-    EXPECT_EQ(0, loop.Iterate(Time::InMS(198)));
-    EXPECT_EQ(Time::InMS(199), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::InMS(199)));
-    EXPECT_EQ(Time::InMS(299), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::InMS(300)));
-    EXPECT_EQ(Time::InMS(399), loop.sleep_time());
-    EXPECT_EQ(3, loop.Iterate(Time::InMS(600)));
-    EXPECT_EQ(Time::InMS(699), loop.sleep_time());
+    PhasedLoop loop(milliseconds(100), milliseconds(99));
+    loop.Reset(monotonic_clock::epoch());
+    EXPECT_EQ(1, loop.Iterate(monotonic_clock::epoch()));
+    EXPECT_EQ(InMs(99), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(InMs(100)));
+    EXPECT_EQ(InMs(199), loop.sleep_time());
+    EXPECT_EQ(0, loop.Iterate(InMs(100)));
+    EXPECT_EQ(InMs(199), loop.sleep_time());
+    EXPECT_EQ(0, loop.Iterate(InMs(101)));
+    EXPECT_EQ(InMs(199), loop.sleep_time());
+    EXPECT_EQ(0, loop.Iterate(InMs(198)));
+    EXPECT_EQ(InMs(199), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(InMs(199)));
+    EXPECT_EQ(InMs(299), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(InMs(300)));
+    EXPECT_EQ(InMs(399), loop.sleep_time());
+    EXPECT_EQ(3, loop.Iterate(InMs(600)));
+    EXPECT_EQ(InMs(699), loop.sleep_time());
   }
   {
-    PhasedLoop loop(Time::InMS(100), Time::InMS(1));
-    loop.Reset(Time::kZero);
-    EXPECT_EQ(1, loop.Iterate(Time::kZero));
-    EXPECT_EQ(Time::InMS(1), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::InMS(100)));
-    EXPECT_EQ(Time::InMS(101), loop.sleep_time());
-    EXPECT_EQ(0, loop.Iterate(Time::InMS(100)));
-    EXPECT_EQ(Time::InMS(101), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::InMS(103)));
-    EXPECT_EQ(Time::InMS(201), loop.sleep_time());
-    EXPECT_EQ(0, loop.Iterate(Time::InMS(198)));
-    EXPECT_EQ(Time::InMS(201), loop.sleep_time());
-    EXPECT_EQ(0, loop.Iterate(Time::InMS(200)));
-    EXPECT_EQ(Time::InMS(201), loop.sleep_time());
-    EXPECT_EQ(1, loop.Iterate(Time::InMS(201)));
-    EXPECT_EQ(Time::InMS(301), loop.sleep_time());
-    EXPECT_EQ(3, loop.Iterate(Time::InMS(600)));
-    EXPECT_EQ(Time::InMS(601), loop.sleep_time());
+    PhasedLoop loop(milliseconds(100), milliseconds(1));
+    loop.Reset(monotonic_clock::epoch());
+    EXPECT_EQ(1, loop.Iterate(monotonic_clock::epoch()));
+    EXPECT_EQ(InMs(1), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(InMs(100)));
+    EXPECT_EQ(InMs(101), loop.sleep_time());
+    EXPECT_EQ(0, loop.Iterate(InMs(100)));
+    EXPECT_EQ(InMs(101), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(InMs(103)));
+    EXPECT_EQ(InMs(201), loop.sleep_time());
+    EXPECT_EQ(0, loop.Iterate(InMs(198)));
+    EXPECT_EQ(InMs(201), loop.sleep_time());
+    EXPECT_EQ(0, loop.Iterate(InMs(200)));
+    EXPECT_EQ(InMs(201), loop.sleep_time());
+    EXPECT_EQ(1, loop.Iterate(InMs(201)));
+    EXPECT_EQ(InMs(301), loop.sleep_time());
+    EXPECT_EQ(3, loop.Iterate(InMs(600)));
+    EXPECT_EQ(InMs(601), loop.sleep_time());
   }
 }
 
@@ -120,40 +124,42 @@
 // 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(Time::InMS(100), Time::InMS(1));
-  loop.Reset(Time::InMS(-1000));
-  EXPECT_EQ(Time::InMS(-1099), loop.sleep_time());
-  EXPECT_EQ(9, loop.Iterate(Time::InMS(-250)));
-  EXPECT_EQ(Time::InMS(-199), loop.sleep_time());
-  EXPECT_EQ(1, loop.Iterate(Time::InMS(-199)));
-  EXPECT_EQ(Time::InMS(-99), loop.sleep_time());
-  EXPECT_EQ(1, loop.Iterate(Time::InMS(-90)));
-  EXPECT_EQ(Time::InMS(1), loop.sleep_time());
-  EXPECT_EQ(0, loop.Iterate(Time::InMS(0)));
-  EXPECT_EQ(Time::InMS(1), loop.sleep_time());
-  EXPECT_EQ(1, loop.Iterate(Time::InMS(1)));
-  EXPECT_EQ(Time::InMS(101), loop.sleep_time());
+  PhasedLoop loop(milliseconds(100), milliseconds(1));
+  loop.Reset(InMs(-1000));
+  EXPECT_EQ(InMs(-1099), loop.sleep_time());
+  EXPECT_EQ(9, loop.Iterate(InMs(-250)));
+  EXPECT_EQ(InMs(-199), loop.sleep_time());
+  EXPECT_EQ(1, loop.Iterate(InMs(-199)));
+  EXPECT_EQ(InMs(-99), loop.sleep_time());
+  EXPECT_EQ(1, loop.Iterate(InMs(-90)));
+  EXPECT_EQ(InMs(1), loop.sleep_time());
+  EXPECT_EQ(0, loop.Iterate(InMs(0)));
+  EXPECT_EQ(InMs(1), loop.sleep_time());
+  EXPECT_EQ(1, loop.Iterate(InMs(1)));
+  EXPECT_EQ(InMs(101), loop.sleep_time());
 
-  EXPECT_EQ(0, loop.Iterate(Time::InMS(2)));
-  EXPECT_EQ(Time::InMS(101), loop.sleep_time());
+  EXPECT_EQ(0, loop.Iterate(InMs(2)));
+  EXPECT_EQ(InMs(101), loop.sleep_time());
 
-  EXPECT_EQ(-2, loop.Iterate(Time::InMS(-101)));
-  EXPECT_EQ(Time::InMS(-99), loop.sleep_time());
-  EXPECT_EQ(1, loop.Iterate(Time::InMS(-99)));
-  EXPECT_EQ(Time::InMS(1), loop.sleep_time());
+  EXPECT_EQ(-2, loop.Iterate(InMs(-101)));
+  EXPECT_EQ(InMs(-99), loop.sleep_time());
+  EXPECT_EQ(1, loop.Iterate(InMs(-99)));
+  EXPECT_EQ(InMs(1), loop.sleep_time());
 
-  EXPECT_EQ(0, loop.Iterate(Time::InMS(-99)));
-  EXPECT_EQ(Time::InMS(1), loop.sleep_time());
+  EXPECT_EQ(0, loop.Iterate(InMs(-99)));
+  EXPECT_EQ(InMs(1), loop.sleep_time());
 }
 
 // Tests that passing invalid values to the constructor dies correctly.
 TEST_F(PhasedLoopDeathTest, InvalidValues) {
-  EXPECT_DEATH(PhasedLoop(Time::InMS(1), Time::InMS(2)), ".*offset<interval.*");
-  EXPECT_DEATH(PhasedLoop(Time::InMS(1), Time::InMS(1)), ".*offset<interval.*");
-  EXPECT_DEATH(PhasedLoop(Time::InMS(1), Time::InMS(-1)),
-               ".*offset>=Time::kZero.*");
-  EXPECT_DEATH(PhasedLoop(Time::InMS(0), Time::InMS(0)),
-               ".*interval>Time::kZero.*");
+  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\\).*");
 }
 
 }  // namespace testing
diff --git a/frc971/wpilib/pdp_fetcher.cc b/frc971/wpilib/pdp_fetcher.cc
index 4e6be32..846de60 100644
--- a/frc971/wpilib/pdp_fetcher.cc
+++ b/frc971/wpilib/pdp_fetcher.cc
@@ -1,5 +1,7 @@
 #include "frc971/wpilib/pdp_fetcher.h"
 
+#include <chrono>
+
 #include "aos/common/logging/queue_logging.h"
 #include "aos/linux_code/init.h"
 #include "aos/common/util/phased_loop.h"
@@ -12,8 +14,8 @@
   ::aos::SetCurrentThreadName("PDPFetcher");
   ::std::unique_ptr<PowerDistributionPanel> pdp(new PowerDistributionPanel());
 
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(20),
-                                      ::aos::time::Time::InMS(4));
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(20),
+                                      ::std::chrono::milliseconds(4));
 
   while (true) {
     {
diff --git a/y2012/wpilib/wpilib_interface.cc b/y2012/wpilib/wpilib_interface.cc
index 6702dc4..290f067 100644
--- a/y2012/wpilib/wpilib_interface.cc
+++ b/y2012/wpilib/wpilib_interface.cc
@@ -3,6 +3,7 @@
 #include <unistd.h>
 #include <inttypes.h>
 
+#include <chrono>
 #include <thread>
 #include <mutex>
 #include <functional>
@@ -104,8 +105,8 @@
         &DriverStation::GetInstance();
 #endif
 
-    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                        ::aos::time::Time::InMS(4));
+    ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                        ::std::chrono::milliseconds(4));
 
     ::aos::SetCurrentThreadRealtimePriority(40);
     while (run_) {
@@ -183,8 +184,8 @@
     ::aos::SetCurrentThreadName("Solenoids");
     ::aos::SetCurrentThreadRealtimePriority(27);
 
-    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(20),
-                                        ::aos::time::Time::InMS(1));
+    ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(20),
+                                        ::std::chrono::milliseconds(1));
 
     while (run_) {
       {
diff --git a/y2014/wpilib/wpilib_interface.cc b/y2014/wpilib/wpilib_interface.cc
index 5195ab6..a53d54b 100644
--- a/y2014/wpilib/wpilib_interface.cc
+++ b/y2014/wpilib/wpilib_interface.cc
@@ -4,6 +4,7 @@
 #include <inttypes.h>
 
 #include <thread>
+#include <chrono>
 #include <mutex>
 #include <functional>
 
@@ -260,8 +261,8 @@
     bottom_reader_.Start();
     dma_synchronizer_->Start();
 
-    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                        ::aos::time::Time::InMS(4));
+    ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                        ::std::chrono::milliseconds(4));
 
     ::aos::SetCurrentThreadRealtimePriority(40);
     while (run_) {
@@ -504,8 +505,8 @@
     ::aos::SetCurrentThreadName("Solenoids");
     ::aos::SetCurrentThreadRealtimePriority(27);
 
-    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(20),
-                                        ::aos::time::Time::InMS(1));
+    ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(20),
+                                        ::std::chrono::milliseconds(1));
 
     while (run_) {
       {
diff --git a/y2014_bot3/wpilib/wpilib_interface.cc b/y2014_bot3/wpilib/wpilib_interface.cc
index e1e07a0..6a3457a 100644
--- a/y2014_bot3/wpilib/wpilib_interface.cc
+++ b/y2014_bot3/wpilib/wpilib_interface.cc
@@ -3,6 +3,7 @@
 #include <unistd.h>
 #include <inttypes.h>
 
+#include <chrono>
 #include <thread>
 #include <mutex>
 #include <functional>
@@ -97,8 +98,8 @@
         &DriverStation::GetInstance();
 #endif
 
-    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                        ::aos::time::Time::InMS(4));
+    ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                        ::std::chrono::milliseconds(4));
 
     ::aos::SetCurrentThreadRealtimePriority(40);
     while (run_) {
@@ -185,8 +186,8 @@
     ::aos::SetCurrentThreadName("Solenoids");
     ::aos::SetCurrentThreadRealtimePriority(27);
 
-    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(20),
-                                        ::aos::time::Time::InMS(1));
+    ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(20),
+                                        ::std::chrono::milliseconds(1));
 
     while (run_) {
       {
diff --git a/y2015/wpilib/wpilib_interface.cc b/y2015/wpilib/wpilib_interface.cc
index 3130424..14ca146 100644
--- a/y2015/wpilib/wpilib_interface.cc
+++ b/y2015/wpilib/wpilib_interface.cc
@@ -3,9 +3,10 @@
 #include <unistd.h>
 #include <inttypes.h>
 
-#include <thread>
-#include <mutex>
+#include <chrono>
 #include <functional>
+#include <mutex>
+#include <thread>
 
 #include "Encoder.h"
 #include "Talon.h"
@@ -241,8 +242,8 @@
     wrist_encoder_.Start();
     dma_synchronizer_->Start();
 
-    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                        ::aos::time::Time::InMS(4));
+    ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                        ::std::chrono::milliseconds(4));
 
     ::aos::SetCurrentThreadRealtimePriority(40);
     while (run_) {
@@ -418,8 +419,8 @@
     ::aos::SetCurrentThreadName("Solenoids");
     ::aos::SetCurrentThreadRealtimePriority(27);
 
-    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(20),
-                                        ::aos::time::Time::InMS(1));
+    ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(20),
+                                        ::std::chrono::milliseconds(1));
 
     while (run_) {
       {
diff --git a/y2015_bot3/wpilib/wpilib_interface.cc b/y2015_bot3/wpilib/wpilib_interface.cc
index cb2acf1..bbfa91e 100644
--- a/y2015_bot3/wpilib/wpilib_interface.cc
+++ b/y2015_bot3/wpilib/wpilib_interface.cc
@@ -3,6 +3,7 @@
 #include <unistd.h>
 #include <inttypes.h>
 
+#include <chrono>
 #include <thread>
 #include <mutex>
 #include <functional>
@@ -137,8 +138,8 @@
         &DriverStation::GetInstance();
 #endif
 
-    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                        ::aos::time::Time::InMS(4));
+    ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                        ::std::chrono::milliseconds(4));
 
     ::aos::SetCurrentThreadRealtimePriority(40);
     while (run_) {
@@ -242,8 +243,8 @@
     ::aos::SetCurrentThreadName("Solenoids");
     ::aos::SetCurrentThreadRealtimePriority(27);
 
-    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(20),
-                                        ::aos::time::Time::InMS(1));
+    ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(20),
+                                        ::std::chrono::milliseconds(1));
 
     while (run_) {
       {
diff --git a/y2016/actors/autonomous_actor.cc b/y2016/actors/autonomous_actor.cc
index 199dda5..6636e77 100644
--- a/y2016/actors/autonomous_actor.cc
+++ b/y2016/actors/autonomous_actor.cc
@@ -2,6 +2,7 @@
 
 #include <inttypes.h>
 
+#include <chrono>
 #include <cmath>
 
 #include "aos/common/util/phased_loop.h"
@@ -102,8 +103,8 @@
     return;
   }
 
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
   while (true) {
     // Poll the running bit and see if we should cancel.
     phased_loop.SleepUntilNext();
@@ -116,8 +117,8 @@
 constexpr double kDoNotTurnCare = 2.0;
 
 bool AutonomousActor::WaitForDriveNear(double distance, double angle) {
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
   constexpr double kPositionTolerance = 0.02;
   constexpr double kProfileTolerance = 0.001;
 
@@ -164,8 +165,8 @@
 }
 
 bool AutonomousActor::WaitForDriveProfileDone() {
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
   constexpr double kProfileTolerance = 0.001;
 
   while (true) {
@@ -187,8 +188,8 @@
 }
 
 bool AutonomousActor::WaitForMaxBy(double angle) {
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
   double max_angle = -M_PI;
   while (true) {
     if (ShouldCancel()) {
@@ -211,8 +212,8 @@
 }
 
 bool AutonomousActor::WaitForAboveAngle(double angle) {
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
   while (true) {
     if (ShouldCancel()) {
       return false;
@@ -231,8 +232,8 @@
 }
 
 bool AutonomousActor::WaitForBelowAngle(double angle) {
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
   while (true) {
     if (ShouldCancel()) {
       return false;
@@ -276,8 +277,8 @@
 }
 
 bool AutonomousActor::WaitForDriveDone() {
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
 
   while (true) {
     if (ShouldCancel()) {
@@ -397,8 +398,8 @@
     LOG(ERROR, "Sending shooter goal failed.\n");
   }
 
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
   while (true) {
     if (ShouldCancel()) return;
 
@@ -414,8 +415,8 @@
 }
 
 void AutonomousActor::WaitForShooterSpeed() {
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
   while (true) {
     if (ShouldCancel()) return;
 
@@ -442,8 +443,8 @@
   double last_angle = 0.0;
   int ready_to_fire = 0;
 
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
   ::aos::time::Time end_time =
       ::aos::time::Time::Now() + align_duration;
   while (end_time > ::aos::time::Time::Now()) {
@@ -783,8 +784,8 @@
 }
 
 void AutonomousActor::WaitForBallOrDriveDone() {
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
   while (true) {
     if (ShouldCancel()) {
       return;
@@ -1164,8 +1165,8 @@
 
   LOG(INFO, "Done %f\n", (aos::time::Time::Now() - start_time).ToSeconds());
 
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
 
   while (!ShouldCancel()) {
     phased_loop.SleepUntilNext();
diff --git a/y2016/actors/vision_align_actor.cc b/y2016/actors/vision_align_actor.cc
index 00695f0..9491cd4 100644
--- a/y2016/actors/vision_align_actor.cc
+++ b/y2016/actors/vision_align_actor.cc
@@ -1,5 +1,6 @@
 #include "y2016/actors/vision_align_actor.h"
 
+#include <chrono>
 #include <functional>
 #include <numeric>
 
@@ -28,8 +29,8 @@
     const actors::VisionAlignActionParams & /*params*/) {
   const double robot_radius =
       control_loops::drivetrain::GetDrivetrainConfig().robot_radius;
-  ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                      ::aos::time::Time::InMS(5) / 2);
+  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                      ::std::chrono::milliseconds(5) / 2);
   while (true) {
     const int iterations = phased_loop.SleepUntilNext();
     if (iterations != 1) {
diff --git a/y2016/wpilib/wpilib_interface.cc b/y2016/wpilib/wpilib_interface.cc
index acf820f..d7fc261 100644
--- a/y2016/wpilib/wpilib_interface.cc
+++ b/y2016/wpilib/wpilib_interface.cc
@@ -3,6 +3,7 @@
 #include <unistd.h>
 #include <inttypes.h>
 
+#include <chrono>
 #include <thread>
 #include <mutex>
 #include <functional>
@@ -282,8 +283,8 @@
 
     dma_synchronizer_->Start();
 
-    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
-                                        ::aos::time::Time::InMS(4));
+    ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
+                                        ::std::chrono::milliseconds(4));
 
     ::aos::SetCurrentThreadRealtimePriority(40);
     while (run_) {
@@ -472,8 +473,8 @@
     ::aos::SetCurrentThreadName("Solenoids");
     ::aos::SetCurrentThreadRealtimePriority(27);
 
-    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(20),
-                                        ::aos::time::Time::InMS(1));
+    ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(20),
+                                        ::std::chrono::milliseconds(1));
 
     while (run_) {
       {