Merge "Chop out the MotorDanger junk"
diff --git a/third_party/allwpilib_2017/BUILD b/third_party/allwpilib_2017/BUILD
index 054ef08..1903912 100644
--- a/third_party/allwpilib_2017/BUILD
+++ b/third_party/allwpilib_2017/BUILD
@@ -46,6 +46,11 @@
   'ADXRS450_Gyro',
   'GyroBase',
   'IterativeRobot',
+  'MotorSafety',
+  'MotorSafetyHelper',
+  'SafePWM',
+  'SpeedController',
+  'PWMSpeedController',
 ]
 
 # Whole subdirectories of WPILib we don't want around.
diff --git a/third_party/allwpilib_2017/wpilibc/athena/include/Relay.h b/third_party/allwpilib_2017/wpilibc/athena/include/Relay.h
index 6d7f877..de550d2 100644
--- a/third_party/allwpilib_2017/wpilibc/athena/include/Relay.h
+++ b/third_party/allwpilib_2017/wpilibc/athena/include/Relay.h
@@ -11,13 +11,10 @@
 #include <string>
 
 #include "HAL/Types.h"
-#include "MotorSafety.h"
 #include "SensorBase.h"
 
 namespace frc {
 
-class MotorSafetyHelper;
-
 /**
  * Class for Spike style relay outputs.
  * Relays are intended to be connected to spikes or similar relays. The relay
@@ -29,8 +26,7 @@
  * independently for something that does not care about voltage polarity (like
  * a solenoid).
  */
-class Relay : public MotorSafety,
-              public SensorBase {
+class Relay : public SensorBase {
  public:
   enum Value { kOff, kOn, kForward, kReverse };
   enum Direction { kBothDirections, kForwardOnly, kReverseOnly };
@@ -42,22 +38,12 @@
   Value Get() const;
   int GetChannel() const;
 
-  void SetExpiration(double timeout) override;
-  double GetExpiration() const override;
-  bool IsAlive() const override;
-  void StopMotor() override;
-  bool IsSafetyEnabled() const override;
-  void SetSafetyEnabled(bool enabled) override;
-  void GetDescription(std::ostringstream& desc) const override;
-
  private:
   int m_channel;
   Direction m_direction;
 
   HAL_RelayHandle m_forwardHandle = HAL_kInvalidHandle;
   HAL_RelayHandle m_reverseHandle = HAL_kInvalidHandle;
-
-  std::unique_ptr<MotorSafetyHelper> m_safetyHelper;
 };
 
 }  // namespace frc
diff --git a/third_party/allwpilib_2017/wpilibc/athena/include/Talon.h b/third_party/allwpilib_2017/wpilibc/athena/include/Talon.h
index 793d77b..6b8fb7f 100644
--- a/third_party/allwpilib_2017/wpilibc/athena/include/Talon.h
+++ b/third_party/allwpilib_2017/wpilibc/athena/include/Talon.h
@@ -7,14 +7,14 @@
 
 #pragma once
 
-#include "PWMSpeedController.h"
+#include "PWM.h"
 
 namespace frc {
 
 /**
  * Cross the Road Electronics (CTRE) Talon and Talon SR Speed Controller
  */
-class Talon : public PWMSpeedController {
+class Talon : public PWM {
  public:
   explicit Talon(int channel);
   virtual ~Talon() = default;
diff --git a/third_party/allwpilib_2017/wpilibc/athena/src/DriverStation.cpp b/third_party/allwpilib_2017/wpilibc/athena/src/DriverStation.cpp
index 95d20b7..521cf3b 100644
--- a/third_party/allwpilib_2017/wpilibc/athena/src/DriverStation.cpp
+++ b/third_party/allwpilib_2017/wpilibc/athena/src/DriverStation.cpp
@@ -14,7 +14,6 @@
 #include "HAL/HAL.h"
 #include "HAL/Power.h"
 #include "HAL/cpp/Log.h"
-#include "MotorSafetyHelper.h"
 #include "Timer.h"
 #include "Utility.h"
 #include "WPIErrors.h"
@@ -588,7 +587,6 @@
 
 void DriverStation::Run() {
   m_isRunning = true;
-  int period = 0;
   while (m_isRunning) {
     HAL_WaitForDSData();
     GetData();
@@ -602,10 +600,6 @@
     }
     m_waitForDataCond.notify_all();
 
-    if (++period >= 4) {
-      MotorSafetyHelper::CheckMotors();
-      period = 0;
-    }
     if (m_userInDisabled) HAL_ObserveUserProgramDisabled();
     if (m_userInAutonomous) HAL_ObserveUserProgramAutonomous();
     if (m_userInTeleop) HAL_ObserveUserProgramTeleop();
diff --git a/third_party/allwpilib_2017/wpilibc/athena/src/Relay.cpp b/third_party/allwpilib_2017/wpilibc/athena/src/Relay.cpp
index 201963b..3e9597a 100644
--- a/third_party/allwpilib_2017/wpilibc/athena/src/Relay.cpp
+++ b/third_party/allwpilib_2017/wpilibc/athena/src/Relay.cpp
@@ -12,7 +12,6 @@
 
 #include "HAL/HAL.h"
 #include "HAL/Ports.h"
-#include "MotorSafetyHelper.h"
 #include "WPIErrors.h"
 
 using namespace frc;
@@ -82,9 +81,6 @@
       return;
     }
   }
-
-  m_safetyHelper = std::make_unique<MotorSafetyHelper>(this);
-  m_safetyHelper->SetSafetyEnabled(false);
 }
 
 /**
@@ -206,57 +202,3 @@
 }
 
 int Relay::GetChannel() const { return m_channel; }
-
-/**
- * Set the expiration time for the Relay object
- * @param timeout The timeout (in seconds) for this relay object
- */
-void Relay::SetExpiration(double timeout) {
-  m_safetyHelper->SetExpiration(timeout);
-}
-
-/**
- * Return the expiration time for the relay object.
- * @return The expiration time value.
- */
-double Relay::GetExpiration() const { return m_safetyHelper->GetExpiration(); }
-
-/**
- * Check if the relay object is currently alive or stopped due to a timeout.
- *
- * @return a bool value that is true if the motor has NOT timed out and should
- *         still be running.
- */
-bool Relay::IsAlive() const { return m_safetyHelper->IsAlive(); }
-
-/**
- * Stop the motor associated with this PWM object.
- *
- * This is called by the MotorSafetyHelper object when it has a timeout for this
- * relay and needs to stop it from running.
- */
-void Relay::StopMotor() { Set(kOff); }
-
-/**
- * Enable/disable motor safety for this device.
- *
- * Turn on and off the motor safety option for this relay object.
- *
- * @param enabled True if motor safety is enforced for this object
- */
-void Relay::SetSafetyEnabled(bool enabled) {
-  m_safetyHelper->SetSafetyEnabled(enabled);
-}
-
-/**
- * Check if motor safety is enabled for this object.
- *
- * @returns True if motor safety is enforced for this object
- */
-bool Relay::IsSafetyEnabled() const {
-  return m_safetyHelper->IsSafetyEnabled();
-}
-
-void Relay::GetDescription(std::ostringstream& desc) const {
-  desc << "Relay " << GetChannel();
-}
diff --git a/third_party/allwpilib_2017/wpilibc/athena/src/Talon.cpp b/third_party/allwpilib_2017/wpilibc/athena/src/Talon.cpp
index 8143865..ca2e6c3 100644
--- a/third_party/allwpilib_2017/wpilibc/athena/src/Talon.cpp
+++ b/third_party/allwpilib_2017/wpilibc/athena/src/Talon.cpp
@@ -17,7 +17,7 @@
  * @param channel The PWM channel number that the Talon is attached to. 0-9 are
  *                on-board, 10-19 are on the MXP port
  */
-Talon::Talon(int channel) : PWMSpeedController(channel) {
+Talon::Talon(int channel) : PWM(channel) {
   /* Note that the Talon uses the following bounds for PWM values. These values
    * should work reasonably well for most controllers, but if users experience
    * issues such as asymmetric behavior around the deadband or inability to
diff --git a/y2012/wpilib/wpilib_interface.cc b/y2012/wpilib/wpilib_interface.cc
index 8493496..baefca6 100644
--- a/y2012/wpilib/wpilib_interface.cc
+++ b/y2012/wpilib/wpilib_interface.cc
@@ -252,14 +252,14 @@
   virtual void Write() override {
     auto &queue = drivetrain_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    left_drivetrain_talon_->Set(-queue->left_voltage / 12.0);
-    right_drivetrain_talon_->Set(queue->right_voltage / 12.0);
+    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_->Disable();
-    right_drivetrain_talon_->Disable();
+    left_drivetrain_talon_->SetDisabled();
+    right_drivetrain_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> left_drivetrain_talon_;
@@ -283,15 +283,15 @@
 
   virtual void Write() override {
     auto &queue = ::y2012::control_loops::accessories_queue.output;
-    talon1_->Set(queue->sticks[0]);
-    talon2_->Set(queue->sticks[1]);
+    talon1_->SetSpeed(queue->sticks[0]);
+    talon2_->SetSpeed(queue->sticks[1]);
     LOG_STRUCT(DEBUG, "will output", *queue);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "shooter output too old\n");
-    talon1_->Disable();
-    talon2_->Disable();
+    talon1_->SetDisabled();
+    talon2_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> talon1_, talon2_;
diff --git a/y2014/wpilib/wpilib_interface.cc b/y2014/wpilib/wpilib_interface.cc
index a53d54b..b5dee33 100644
--- a/y2014/wpilib/wpilib_interface.cc
+++ b/y2014/wpilib/wpilib_interface.cc
@@ -590,14 +590,14 @@
   virtual void Write() override {
     auto &queue = ::frc971::control_loops::drivetrain_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    left_drivetrain_talon_->Set(-queue->left_voltage / 12.0);
-    right_drivetrain_talon_->Set(queue->right_voltage / 12.0);
+    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_->Disable();
-    right_drivetrain_talon_->Disable();
+    left_drivetrain_talon_->SetDisabled();
+    right_drivetrain_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> left_drivetrain_talon_;
@@ -618,12 +618,12 @@
   virtual void Write() override {
     auto &queue = ::y2014::control_loops::shooter_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    shooter_talon_->Set(queue->voltage / 12.0);
+    shooter_talon_->SetSpeed(queue->voltage / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "shooter output too old\n");
-    shooter_talon_->Disable();
+    shooter_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> shooter_talon_;
@@ -663,22 +663,22 @@
   virtual void Write() override {
     auto &queue = ::y2014::control_loops::claw_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    intake1_talon_->Set(queue->intake_voltage / 12.0);
-    intake2_talon_->Set(queue->intake_voltage / 12.0);
-    bottom_claw_talon_->Set(-queue->bottom_claw_voltage / 12.0);
-    top_claw_talon_->Set(queue->top_claw_voltage / 12.0);
-    left_tusk_talon_->Set(queue->tusk_voltage / 12.0);
-    right_tusk_talon_->Set(-queue->tusk_voltage / 12.0);
+    intake1_talon_->SetSpeed(queue->intake_voltage / 12.0);
+    intake2_talon_->SetSpeed(queue->intake_voltage / 12.0);
+    bottom_claw_talon_->SetSpeed(-queue->bottom_claw_voltage / 12.0);
+    top_claw_talon_->SetSpeed(queue->top_claw_voltage / 12.0);
+    left_tusk_talon_->SetSpeed(queue->tusk_voltage / 12.0);
+    right_tusk_talon_->SetSpeed(-queue->tusk_voltage / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "claw output too old\n");
-    intake1_talon_->Disable();
-    intake2_talon_->Disable();
-    bottom_claw_talon_->Disable();
-    top_claw_talon_->Disable();
-    left_tusk_talon_->Disable();
-    right_tusk_talon_->Disable();
+    intake1_talon_->SetDisabled();
+    intake2_talon_->SetDisabled();
+    bottom_claw_talon_->SetDisabled();
+    top_claw_talon_->SetDisabled();
+    left_tusk_talon_->SetDisabled();
+    right_tusk_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> top_claw_talon_;
diff --git a/y2014_bot3/wpilib/wpilib_interface.cc b/y2014_bot3/wpilib/wpilib_interface.cc
index 4abbfce..83ec9a9 100644
--- a/y2014_bot3/wpilib/wpilib_interface.cc
+++ b/y2014_bot3/wpilib/wpilib_interface.cc
@@ -276,14 +276,14 @@
   virtual void Write() override {
     auto &queue = ::frc971::control_loops::drivetrain_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    left_drivetrain_talon_->Set(-queue->left_voltage / 12.0);
-    right_drivetrain_talon_->Set(queue->right_voltage / 12.0);
+    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_->Disable();
-    right_drivetrain_talon_->Disable();
+    left_drivetrain_talon_->SetDisabled();
+    right_drivetrain_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> left_drivetrain_talon_;
@@ -315,20 +315,20 @@
   virtual void Write() override {
     auto &queue = ::y2014_bot3::control_loops::rollers_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    rollers_front_left_intake_talon_->Set(queue->front_intake_voltage / 12.0);
-    rollers_front_right_intake_talon_->Set(-(queue->front_intake_voltage / 12.0));
-    rollers_back_left_intake_talon_->Set(queue->back_intake_voltage / 12.0);
-    rollers_back_right_intake_talon_->Set(-(queue->back_intake_voltage / 12.0));
-    rollers_low_goal_talon_->Set(queue->low_goal_voltage / 12.0);
+    rollers_front_left_intake_talon_->SetSpeed(queue->front_intake_voltage / 12.0);
+    rollers_front_right_intake_talon_->SetSpeed(-(queue->front_intake_voltage / 12.0));
+    rollers_back_left_intake_talon_->SetSpeed(queue->back_intake_voltage / 12.0);
+    rollers_back_right_intake_talon_->SetSpeed(-(queue->back_intake_voltage / 12.0));
+    rollers_low_goal_talon_->SetSpeed(queue->low_goal_voltage / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "Intake output too old\n");
-    rollers_front_left_intake_talon_->Disable();
-    rollers_front_right_intake_talon_->Disable();
-    rollers_back_left_intake_talon_->Disable();
-    rollers_back_right_intake_talon_->Disable();
-    rollers_low_goal_talon_->Disable();
+    rollers_front_left_intake_talon_->SetDisabled();
+    rollers_front_right_intake_talon_->SetDisabled();
+    rollers_back_left_intake_talon_->SetDisabled();
+    rollers_back_right_intake_talon_->SetDisabled();
+    rollers_low_goal_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> rollers_front_left_intake_talon_,
diff --git a/y2015/wpilib/wpilib_interface.cc b/y2015/wpilib/wpilib_interface.cc
index 0c643b4..f44b82a 100644
--- a/y2015/wpilib/wpilib_interface.cc
+++ b/y2015/wpilib/wpilib_interface.cc
@@ -520,12 +520,12 @@
   virtual void Write() override {
     auto &queue = ::y2015::autonomous::can_control;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    can_talon_->Set(queue->can_voltage / 12.0);
+    can_talon_->SetSpeed(queue->can_voltage / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "Can output too old\n");
-    can_talon_->Disable();
+    can_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> can_talon_;
@@ -549,14 +549,14 @@
   virtual void Write() override {
     auto &queue = ::frc971::control_loops::drivetrain_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    left_drivetrain_talon_->Set(queue->left_voltage / 12.0);
-    right_drivetrain_talon_->Set(-queue->right_voltage / 12.0);
+    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_->Disable();
-    right_drivetrain_talon_->Disable();
+    left_drivetrain_talon_->SetDisabled();
+    right_drivetrain_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> left_drivetrain_talon_;
@@ -589,18 +589,18 @@
   virtual void Write() override {
     auto &queue = ::y2015::control_loops::fridge::fridge_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    left_arm_talon_->Set(queue->left_arm / 12.0);
-    right_arm_talon_->Set(-queue->right_arm / 12.0);
-    left_elevator_talon_->Set(queue->left_elevator / 12.0);
-    right_elevator_talon_->Set(-queue->right_elevator / 12.0);
+    left_arm_talon_->SetSpeed(queue->left_arm / 12.0);
+    right_arm_talon_->SetSpeed(-queue->right_arm / 12.0);
+    left_elevator_talon_->SetSpeed(queue->left_elevator / 12.0);
+    right_elevator_talon_->SetSpeed(-queue->right_elevator / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "Fridge output too old.\n");
-    left_arm_talon_->Disable();
-    right_arm_talon_->Disable();
-    left_elevator_talon_->Disable();
-    right_elevator_talon_->Disable();
+    left_arm_talon_->SetDisabled();
+    right_arm_talon_->SetDisabled();
+    left_elevator_talon_->SetDisabled();
+    right_elevator_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> left_arm_talon_;
@@ -631,16 +631,16 @@
   virtual void Write() override {
     auto &queue = ::y2015::control_loops::claw_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    left_intake_talon_->Set(queue->intake_voltage / 12.0);
-    right_intake_talon_->Set(-queue->intake_voltage / 12.0);
-    wrist_talon_->Set(-queue->voltage / 12.0);
+    left_intake_talon_->SetSpeed(queue->intake_voltage / 12.0);
+    right_intake_talon_->SetSpeed(-queue->intake_voltage / 12.0);
+    wrist_talon_->SetSpeed(-queue->voltage / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "Claw output too old.\n");
-    left_intake_talon_->Disable();
-    right_intake_talon_->Disable();
-    wrist_talon_->Disable();
+    left_intake_talon_->SetDisabled();
+    right_intake_talon_->SetDisabled();
+    wrist_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> left_intake_talon_;
diff --git a/y2015_bot3/wpilib/wpilib_interface.cc b/y2015_bot3/wpilib/wpilib_interface.cc
index b92d02b..84e8664 100644
--- a/y2015_bot3/wpilib/wpilib_interface.cc
+++ b/y2015_bot3/wpilib/wpilib_interface.cc
@@ -344,14 +344,14 @@
   virtual void Write() override {
     auto &queue = drivetrain_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    left_drivetrain_talon_->Set(queue->left_voltage / 12.0);
-    right_drivetrain_talon_->Set(-queue->right_voltage / 12.0);
+    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_->Disable();
-    right_drivetrain_talon_->Disable();
+    left_drivetrain_talon_->SetDisabled();
+    right_drivetrain_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> left_drivetrain_talon_;
@@ -376,14 +376,14 @@
   virtual void Write() override {
     auto &queue = ::y2015_bot3::control_loops::elevator_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    elevator_talon1_->Set(queue->elevator / 12.0);
-    elevator_talon2_->Set(-queue->elevator / 12.0);
+    elevator_talon1_->SetSpeed(queue->elevator / 12.0);
+    elevator_talon2_->SetSpeed(-queue->elevator / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "Elevator output too old.\n");
-    elevator_talon1_->Disable();
-    elevator_talon2_->Disable();
+    elevator_talon1_->SetDisabled();
+    elevator_talon2_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> elevator_talon1_;
@@ -408,14 +408,14 @@
   virtual void Write() override {
     auto &queue = ::y2015_bot3::control_loops::intake_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    intake_talon1_->Set(queue->intake / 12.0);
-    intake_talon2_->Set(-queue->intake / 12.0);
+    intake_talon1_->SetSpeed(queue->intake / 12.0);
+    intake_talon2_->SetSpeed(-queue->intake / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "Intake output too old.\n");
-    intake_talon1_->Disable();
-    intake_talon2_->Disable();
+    intake_talon1_->SetDisabled();
+    intake_talon2_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> intake_talon1_;
@@ -443,14 +443,14 @@
   virtual void Write() override {
     auto &queue = ::y2015_bot3::autonomous::can_grabber_control;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    can_grabber_talon1_->Set(queue->can_grabber_voltage / 12.0);
-    can_grabber_talon2_->Set(-queue->can_grabber_voltage / 12.0);
+    can_grabber_talon1_->SetSpeed(queue->can_grabber_voltage / 12.0);
+    can_grabber_talon2_->SetSpeed(-queue->can_grabber_voltage / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "Can grabber output too old\n");
-    can_grabber_talon1_->Disable();
-    can_grabber_talon2_->Disable();
+    can_grabber_talon1_->SetDisabled();
+    can_grabber_talon2_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> can_grabber_talon1_, can_grabber_talon2_;
diff --git a/y2016/wpilib/wpilib_interface.cc b/y2016/wpilib/wpilib_interface.cc
index d7fc261..c998a3a 100644
--- a/y2016/wpilib/wpilib_interface.cc
+++ b/y2016/wpilib/wpilib_interface.cc
@@ -579,14 +579,14 @@
   virtual void Write() override {
     auto &queue = ::frc971::control_loops::drivetrain_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    drivetrain_left_talon_->Set(queue->left_voltage / 12.0);
-    drivetrain_right_talon_->Set(-queue->right_voltage / 12.0);
+    drivetrain_left_talon_->SetSpeed(queue->left_voltage / 12.0);
+    drivetrain_right_talon_->SetSpeed(-queue->right_voltage / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "drivetrain output too old\n");
-    drivetrain_left_talon_->Disable();
-    drivetrain_right_talon_->Disable();
+    drivetrain_left_talon_->SetDisabled();
+    drivetrain_right_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> drivetrain_left_talon_, drivetrain_right_talon_;
@@ -611,14 +611,14 @@
     auto &queue = ::y2016::control_loops::shooter::shooter_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
 
-    shooter_left_talon_->Set(queue->voltage_left / 12.0);
-    shooter_right_talon_->Set(-queue->voltage_right / 12.0);
+    shooter_left_talon_->SetSpeed(queue->voltage_left / 12.0);
+    shooter_right_talon_->SetSpeed(-queue->voltage_right / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "Shooter output too old.\n");
-    shooter_left_talon_->Disable();
-    shooter_right_talon_->Disable();
+    shooter_left_talon_->SetDisabled();
+    shooter_right_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> shooter_left_talon_, shooter_right_talon_;
@@ -658,25 +658,25 @@
   virtual void Write() override {
     auto &queue = ::y2016::control_loops::superstructure_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    intake_talon_->Set(::aos::Clip(queue->voltage_intake, -kMaxBringupPower,
-                                   kMaxBringupPower) /
-                       12.0);
-    shoulder_talon_->Set(::aos::Clip(-queue->voltage_shoulder,
-                                     -kMaxBringupPower, kMaxBringupPower) /
-                         12.0);
-    wrist_talon_->Set(
+    intake_talon_->SetSpeed(::aos::Clip(queue->voltage_intake,
+                                        -kMaxBringupPower, kMaxBringupPower) /
+                            12.0);
+    shoulder_talon_->SetSpeed(::aos::Clip(-queue->voltage_shoulder,
+                                          -kMaxBringupPower, kMaxBringupPower) /
+                              12.0);
+    wrist_talon_->SetSpeed(
         ::aos::Clip(queue->voltage_wrist, -kMaxBringupPower, kMaxBringupPower) /
         12.0);
-    top_rollers_talon_->Set(-queue->voltage_top_rollers / 12.0);
-    bottom_rollers_talon_->Set(-queue->voltage_bottom_rollers / 12.0);
-    climber_talon_->Set(-queue->voltage_climber / 12.0);
+    top_rollers_talon_->SetSpeed(-queue->voltage_top_rollers / 12.0);
+    bottom_rollers_talon_->SetSpeed(-queue->voltage_bottom_rollers / 12.0);
+    climber_talon_->SetSpeed(-queue->voltage_climber / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "Superstructure output too old.\n");
-    intake_talon_->Disable();
-    shoulder_talon_->Disable();
-    wrist_talon_->Disable();
+    intake_talon_->SetDisabled();
+    shoulder_talon_->SetDisabled();
+    wrist_talon_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> intake_talon_, shoulder_talon_, wrist_talon_,
diff --git a/y2016_bot4/wpilib/wpilib_interface.cc b/y2016_bot4/wpilib/wpilib_interface.cc
index 70039f5..065494f 100644
--- a/y2016_bot4/wpilib/wpilib_interface.cc
+++ b/y2016_bot4/wpilib/wpilib_interface.cc
@@ -171,18 +171,18 @@
   virtual void Write() override {
     auto &queue = ::frc971::control_loops::drivetrain_queue.output;
     LOG_STRUCT(DEBUG, "will output", *queue);
-    drivetrain_left_talon_0_->Set(-queue->left_voltage / 12.0);
-    drivetrain_left_talon_1_->Set(-queue->left_voltage / 12.0);
-    drivetrain_right_talon_0_->Set(queue->right_voltage / 12.0);
-    drivetrain_right_talon_1_->Set(queue->right_voltage / 12.0);
+    drivetrain_left_talon_0_->SetSpeed(-queue->left_voltage / 12.0);
+    drivetrain_left_talon_1_->SetSpeed(-queue->left_voltage / 12.0);
+    drivetrain_right_talon_0_->SetSpeed(queue->right_voltage / 12.0);
+    drivetrain_right_talon_1_->SetSpeed(queue->right_voltage / 12.0);
   }
 
   virtual void Stop() override {
     LOG(WARNING, "drivetrain output too old\n");
-    drivetrain_left_talon_0_->Disable();
-    drivetrain_right_talon_0_->Disable();
-    drivetrain_left_talon_1_->Disable();
-    drivetrain_right_talon_1_->Disable();
+    drivetrain_left_talon_0_->SetDisabled();
+    drivetrain_right_talon_0_->SetDisabled();
+    drivetrain_left_talon_1_->SetDisabled();
+    drivetrain_right_talon_1_->SetDisabled();
   }
 
   ::std::unique_ptr<Talon> drivetrain_left_talon_0_, drivetrain_right_talon_0_,