Convert y2014 AutoMode queue to an EventLoop

Change-Id: Ic9d6e80da8c955eb8c61e6b2b2fba220da1b62ec
diff --git a/y2014/actors/autonomous_actor.cc b/y2014/actors/autonomous_actor.cc
index e241d11..d4818e2 100644
--- a/y2014/actors/autonomous_actor.cc
+++ b/y2014/actors/autonomous_actor.cc
@@ -33,6 +33,8 @@
     ::frc971::autonomous::AutonomousActionQueueGroup *s)
     : frc971::autonomous::BaseAutonomousActor(
           event_loop, s, control_loops::GetDrivetrainConfig()),
+      auto_mode_fetcher_(event_loop->MakeFetcher<::y2014::sensors::AutoMode>(
+          ".y2014.sensors.auto_mode")),
       hot_goal_fetcher_(
           event_loop->MakeFetcher<::y2014::HotGoal>(".y2014.hot_goal")) {}
 
@@ -239,18 +241,17 @@
   LOG(INFO, "Handling auto mode\n");
 
   AutoVersion auto_version;
-  ::y2014::sensors::auto_mode.FetchLatest();
-  if (!::y2014::sensors::auto_mode.get()) {
+  auto_mode_fetcher_.Fetch();
+  if (!auto_mode_fetcher_.get()) {
     LOG(WARNING, "not sure which auto mode to use\n");
     auto_version = AutoVersion::kStraight;
   } else {
     static const double kSelectorMin = 0.2, kSelectorMax = 4.4;
 
     const double kSelectorStep = (kSelectorMax - kSelectorMin) / 3.0;
-    if (::y2014::sensors::auto_mode->voltage < kSelectorStep + kSelectorMin) {
+    if (auto_mode_fetcher_->voltage < kSelectorStep + kSelectorMin) {
       auto_version = AutoVersion::kSingleHot;
-    } else if (::y2014::sensors::auto_mode->voltage <
-               2 * kSelectorStep + kSelectorMin) {
+    } else if (auto_mode_fetcher_->voltage < 2 * kSelectorStep + kSelectorMin) {
       auto_version = AutoVersion::kStraight;
     } else {
       auto_version = AutoVersion::kDoubleHot;
diff --git a/y2014/actors/autonomous_actor.h b/y2014/actors/autonomous_actor.h
index 47195b5..8439151 100644
--- a/y2014/actors/autonomous_actor.h
+++ b/y2014/actors/autonomous_actor.h
@@ -9,6 +9,7 @@
 #include "frc971/autonomous/base_autonomous_actor.h"
 #include "frc971/control_loops/drivetrain/drivetrain.q.h"
 #include "frc971/control_loops/drivetrain/drivetrain_config.h"
+#include "y2014/queues/auto_mode.q.h"
 #include "y2014/queues/hot_goal.q.h"
 
 namespace y2014 {
@@ -37,6 +38,7 @@
 
   bool WaitUntilClawDone();
 
+  ::aos::Fetcher<::y2014::sensors::AutoMode> auto_mode_fetcher_;
   ::aos::Fetcher<::y2014::HotGoal> hot_goal_fetcher_;
 };
 
diff --git a/y2014/queues/auto_mode.q b/y2014/queues/auto_mode.q
index 49c6192..b07f526 100644
--- a/y2014/queues/auto_mode.q
+++ b/y2014/queues/auto_mode.q
@@ -1,6 +1,7 @@
 package y2014.sensors;
 
+// Published on ".y2014.sensors.auto_mode"
 message AutoMode {
+  // Voltage of the analog auto selector knob.
 	double voltage;
 };
-queue AutoMode auto_mode;
diff --git a/y2014/wpilib_interface.cc b/y2014/wpilib_interface.cc
index 3bc5e39..c9d15dd 100644
--- a/y2014/wpilib_interface.cc
+++ b/y2014/wpilib_interface.cc
@@ -119,7 +119,9 @@
 class SensorReader : public ::frc971::wpilib::SensorReader {
  public:
   SensorReader(::aos::EventLoop *event_loop)
-      : ::frc971::wpilib::SensorReader(event_loop) {
+      : ::frc971::wpilib::SensorReader(event_loop),
+        auto_mode_sender_(event_loop->MakeSender<::y2014::sensors::AutoMode>(
+            ".y2014.sensors.auto_mode")) {
     // Set it to filter out anything shorter than 1/4 of the minimum pulse width
     // we should ever see.
     UpdateMediumEncoderFilterHz(kMaximumEncoderPulsesPerSecond);
@@ -265,9 +267,11 @@
       drivetrain_message.Send();
     }
 
-    ::y2014::sensors::auto_mode.MakeWithBuilder()
-        .voltage(auto_selector_analog_->GetVoltage())
-        .Send();
+    {
+      auto auto_mode_message = auto_mode_sender_.MakeMessage();
+      auto_mode_message->voltage = auto_selector_analog_->GetVoltage();
+      auto_mode_message.Send();
+    }
   }
 
   void RunDmaIteration() {
@@ -390,6 +394,8 @@
         shooter_translate(counter->last_negative_encoder_value());
   }
 
+  ::aos::Sender<::y2014::sensors::AutoMode> auto_mode_sender_;
+
   ::std::unique_ptr<AnalogInput> auto_selector_analog_;
 
   ::std::unique_ptr<AnalogInput> low_left_drive_hall_;