Convert all year's robots to proper event loops

Each robot has a couple of event loops, one per thread.  Each of these
threads corresponds to the threads from before the change.  y2016 has
been tested on real hardware.

Change-Id: I99f726a8bc0498204c1a3b99f15508119eed9ad3
diff --git a/frc971/wpilib/pdp_fetcher.cc b/frc971/wpilib/pdp_fetcher.cc
index 01c9613..98da761 100644
--- a/frc971/wpilib/pdp_fetcher.cc
+++ b/frc971/wpilib/pdp_fetcher.cc
@@ -5,41 +5,42 @@
 #include "aos/events/event-loop.h"
 #include "aos/init.h"
 #include "aos/logging/queue_logging.h"
-#include "aos/util/phased_loop.h"
 #include "frc971/wpilib/ahal/PowerDistributionPanel.h"
 #include "frc971/wpilib/pdp_values.q.h"
 
 namespace frc971 {
 namespace wpilib {
 
-void PDPFetcher::operator()() {
-  ::aos::SetCurrentThreadName("PDPFetcher");
-  ::std::unique_ptr<frc::PowerDistributionPanel> pdp(
-      new frc::PowerDistributionPanel());
+namespace chrono = ::std::chrono;
 
-  ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(20),
-                                      ::aos::monotonic_clock::now(),
-                                      ::std::chrono::milliseconds(4));
+PDPFetcher::PDPFetcher(::aos::EventLoop *event_loop)
+    : event_loop_(event_loop),
+      pdp_values_sender_(
+          event_loop_->MakeSender<::frc971::PDPValues>(".frc971.pdp_values")),
+      pdp_(new frc::PowerDistributionPanel()) {
+  event_loop_->set_name("PDPFetcher");
 
-  // TODO(austin): Event loop instead of while loop.
-  while (true) {
-    {
-      const int iterations = phased_loop.SleepUntilNext();
-      if (iterations != 1) {
-        LOG(DEBUG, "PDPFetcher skipped %d iterations\n", iterations - 1);
-      }
-    }
-    auto message = pdp_values_sender_.MakeMessage();
-    message->voltage = pdp->GetVoltage();
-    message->temperature = pdp->GetTemperature();
-    message->power = pdp->GetTotalPower();
-    for (int i = 0; i < 16; ++i) {
-      message->currents[i] = pdp->GetCurrent(i);
-    }
-    LOG_STRUCT(DEBUG, "got", *message);
-    if (!message.Send()) {
-      LOG(WARNING, "sending pdp values failed\n");
-    }
+  // SCHED_OTHER on purpose.
+  event_loop_->AddPhasedLoop([this](int iterations) { Loop(iterations); },
+                             chrono::milliseconds(20), chrono::milliseconds(4));
+}
+
+PDPFetcher::~PDPFetcher() {}
+
+void PDPFetcher::Loop(int iterations) {
+  if (iterations != 1) {
+    LOG(DEBUG, "PDPFetcher skipped %d iterations\n", iterations - 1);
+  }
+  auto message = pdp_values_sender_.MakeMessage();
+  message->voltage = pdp_->GetVoltage();
+  message->temperature = pdp_->GetTemperature();
+  message->power = pdp_->GetTotalPower();
+  for (int i = 0; i < 16; ++i) {
+    message->currents[i] = pdp_->GetCurrent(i);
+  }
+  LOG_STRUCT(DEBUG, "got", *message);
+  if (!message.Send()) {
+    LOG(WARNING, "sending pdp values failed\n");
   }
 }