Moved DrivetrainWriter from y2014

Change-Id: I168b901e0bdc21668344c8003820ac9ff77f4c0b
diff --git a/y2014/BUILD b/y2014/BUILD
index d83a477..bf8f689 100644
--- a/y2014/BUILD
+++ b/y2014/BUILD
@@ -93,6 +93,7 @@
         "//frc971/wpilib:buffered_pcm",
         "//frc971/wpilib:dma",
         "//frc971/wpilib:dma_edge_counting",
+        "//frc971/wpilib:drivetrain_writer",
         "//frc971/wpilib:encoder_and_potentiometer",
         "//frc971/wpilib:gyro_sender",
         "//frc971/wpilib:interrupt_edge_counting",
diff --git a/y2014/wpilib_interface.cc b/y2014/wpilib_interface.cc
index d7aa8ee..650911a 100644
--- a/y2014/wpilib_interface.cc
+++ b/y2014/wpilib_interface.cc
@@ -34,6 +34,7 @@
 #include "frc971/wpilib/buffered_solenoid.h"
 #include "frc971/wpilib/dma.h"
 #include "frc971/wpilib/dma_edge_counting.h"
+#include "frc971/wpilib/drivetrain_writer.h"
 #include "frc971/wpilib/encoder_and_potentiometer.h"
 #include "frc971/wpilib/gyro_sender.h"
 #include "frc971/wpilib/interrupt_edge_counting.h"
@@ -513,38 +514,6 @@
   ::std::atomic<bool> run_{true};
 };
 
-class DrivetrainWriter : public ::frc971::wpilib::LoopOutputHandler {
- public:
-  void set_left_drivetrain_talon(::std::unique_ptr<Talon> t) {
-    left_drivetrain_talon_ = ::std::move(t);
-  }
-
-  void set_right_drivetrain_talon(::std::unique_ptr<Talon> t) {
-    right_drivetrain_talon_ = ::std::move(t);
-  }
-
- private:
-  virtual void Read() override {
-    ::frc971::control_loops::drivetrain_queue.output.FetchAnother();
-  }
-
-  virtual void Write() override {
-    auto &queue = ::frc971::control_loops::drivetrain_queue.output;
-    LOG_STRUCT(DEBUG, "will output", *queue);
-    left_drivetrain_talon_->SetSpeed(-queue->left_voltage / 12.0);
-    right_drivetrain_talon_->SetSpeed(queue->right_voltage / 12.0);
-  }
-
-  virtual void Stop() override {
-    LOG(WARNING, "drivetrain output too old\n");
-    left_drivetrain_talon_->SetDisabled();
-    right_drivetrain_talon_->SetDisabled();
-  }
-
-  ::std::unique_ptr<Talon> left_drivetrain_talon_;
-  ::std::unique_ptr<Talon> right_drivetrain_talon_;
-};
-
 class ShooterWriter : public ::frc971::wpilib::LoopOutputHandler {
  public:
   void set_shooter_talon(::std::unique_ptr<Talon> t) {
@@ -683,11 +652,11 @@
     ::frc971::wpilib::GyroSender gyro_sender;
     ::std::thread gyro_thread(::std::ref(gyro_sender));
 
-    DrivetrainWriter drivetrain_writer;
-    drivetrain_writer.set_left_drivetrain_talon(
-        ::std::unique_ptr<Talon>(new Talon(5)));
-    drivetrain_writer.set_right_drivetrain_talon(
-        ::std::unique_ptr<Talon>(new Talon(2)));
+    ::frc971::wpilib::DrivetrainWriter drivetrain_writer;
+    drivetrain_writer.set_left_controller0(
+        ::std::unique_ptr<Talon>(new Talon(5)), true);
+    drivetrain_writer.set_right_controller0(
+        ::std::unique_ptr<Talon>(new Talon(2)), false);
     ::std::thread drivetrain_writer_thread(::std::ref(drivetrain_writer));
 
     ::y2014::wpilib::ClawWriter claw_writer;