Drivetrain now kind of works.

Change-Id: Ib8a518f849553949fff1095421cef1fd6f977f44
diff --git a/aos/input/drivetrain_input.cc b/aos/input/drivetrain_input.cc
index c4fd232..a5827c3 100644
--- a/aos/input/drivetrain_input.cc
+++ b/aos/input/drivetrain_input.cc
@@ -207,9 +207,9 @@
       kWheelVelocityHigh(2, 2), kWheelVelocityLow(2, 5), kWheelTorqueHigh(2, 3),
       kWheelTorqueLow(2, 6);
 
-  const ButtonLocation kQuickTurn(1, 4);
-  const ButtonLocation kShiftHigh(1, 2);
-  const ButtonLocation kShiftLow(1, 3);
+  const ButtonLocation kQuickTurn(1, 3);
+  const ButtonLocation kShiftHigh(1, 1);
+  const ButtonLocation kShiftLow(1, 2);
 
   // Nop
   const ButtonLocation kTurn1(1, 9);
diff --git a/frc971/control_loops/drivetrain/drivetrain_config.h b/frc971/control_loops/drivetrain/drivetrain_config.h
index c0c7482..6de9883 100644
--- a/frc971/control_loops/drivetrain/drivetrain_config.h
+++ b/frc971/control_loops/drivetrain/drivetrain_config.h
@@ -67,6 +67,8 @@
 
   double quickturn_wheel_multiplier;
 
+  double wheel_multiplier;
+
   // Converts the robot state to a linear distance position, velocity.
   static Eigen::Matrix<double, 2, 1> LeftRightToLinear(
       const Eigen::Matrix<double, 7, 1> &left_right) {
diff --git a/frc971/control_loops/drivetrain/drivetrain_lib_test.cc b/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
index 594d504..5faae63 100644
--- a/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
+++ b/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
@@ -57,6 +57,7 @@
       0,
 
       0.25,
+      1.00,
       1.00};
 
   return kDrivetrainConfig;
diff --git a/frc971/control_loops/drivetrain/polydrivetrain.cc b/frc971/control_loops/drivetrain/polydrivetrain.cc
index a842f50..97df2cf 100644
--- a/frc971/control_loops/drivetrain/polydrivetrain.cc
+++ b/frc971/control_loops/drivetrain/polydrivetrain.cc
@@ -121,8 +121,10 @@
   wheel_ = 2.0 * wheel - wheel_;
   quickturn_ = quickturn;
 
-  if (!quickturn_) {
+  if (quickturn_) {
     wheel_ *= dt_config_.quickturn_wheel_multiplier;
+  } else {
+    wheel_ *= dt_config_.wheel_multiplier;
   }
 
   static const double kThrottleDeadband = 0.05;
diff --git a/y2012/control_loops/drivetrain/drivetrain_base.cc b/y2012/control_loops/drivetrain/drivetrain_base.cc
index aa8f9e4..6f817f8 100644
--- a/y2012/control_loops/drivetrain/drivetrain_base.cc
+++ b/y2012/control_loops/drivetrain/drivetrain_base.cc
@@ -36,10 +36,11 @@
       drivetrain::kLowGearRatio,
       kThreeStateDriveShifter,
       kThreeStateDriveShifter,
-      true,
+      true /* default_high_gear */,
       0.0,
-      0.4,
-      1.0};
+      0.4 /* wheel_non_linearity */,
+      1.0 /* quickturn_wheel_multiplier */,
+      1.0 /* wheel_multiplier */};
 
   return kDrivetrainConfig;
 };
diff --git a/y2014/control_loops/drivetrain/drivetrain_base.cc b/y2014/control_loops/drivetrain/drivetrain_base.cc
index 2c3a6f8..b43323b 100644
--- a/y2014/control_loops/drivetrain/drivetrain_base.cc
+++ b/y2014/control_loops/drivetrain/drivetrain_base.cc
@@ -32,10 +32,12 @@
       constants::GetValues().low_gear_ratio,
       constants::GetValues().left_drive.shifter_hall_effect,
       constants::GetValues().right_drive.shifter_hall_effect,
-      true,
+      true /* default_high_gear */,
       0,
-      0.25,
-      1.0};
+      0.25 /* wheel_non_linearity */,
+      1.0 /* quickturn_wheel_multiplier */,
+      1.0 /* wheel_multiplier */,
+  };
 
   return kDrivetrainConfig;
 };
diff --git a/y2014_bot3/control_loops/drivetrain/drivetrain_base.cc b/y2014_bot3/control_loops/drivetrain/drivetrain_base.cc
index 46fcb71..f05af98 100644
--- a/y2014_bot3/control_loops/drivetrain/drivetrain_base.cc
+++ b/y2014_bot3/control_loops/drivetrain/drivetrain_base.cc
@@ -27,21 +27,16 @@
       ::y2014_bot3::control_loops::drivetrain::MakeVelocityDrivetrainLoop,
       ::y2014_bot3::control_loops::drivetrain::MakeKFDrivetrainLoop,
 
-      drivetrain::kDt,
-      drivetrain::kRobotRadius,
-      drivetrain::kWheelRadius,
+      drivetrain::kDt, drivetrain::kRobotRadius, drivetrain::kWheelRadius,
       drivetrain::kV,
 
-      drivetrain::kHighGearRatio,
-      drivetrain::kLowGearRatio,
+      drivetrain::kHighGearRatio, drivetrain::kLowGearRatio,
 
       // No shifter sensors, so we could put anything for the things below.
-      kThreeStateDriveShifter,
-      kThreeStateDriveShifter,
-      false,
-      0.0,
-      0.60,
-      0.60};
+      kThreeStateDriveShifter, kThreeStateDriveShifter,
+      false /* default_high_gear */, 0.0, 0.60 /* wheel_non_linearity */,
+      0.60 /* quickturn_wheel_multiplier */, 1.0 /* wheel_multiplier */,
+  };
 
   return kDrivetrainConfig;
 };
diff --git a/y2016/control_loops/drivetrain/drivetrain_base.cc b/y2016/control_loops/drivetrain/drivetrain_base.cc
index 3f15694..7013c52 100644
--- a/y2016/control_loops/drivetrain/drivetrain_base.cc
+++ b/y2016/control_loops/drivetrain/drivetrain_base.cc
@@ -37,10 +37,12 @@
       drivetrain::kLowGearRatio,
       kThreeStateDriveShifter,
       kThreeStateDriveShifter,
-      true,
+      true /* default_high_gear */,
       constants::GetValues().down_error,
-      0.25,
-      1.0};
+      0.25 /* wheel_non_linearity */,
+      1.0 /* quickturn_wheel_multiplier */,
+      1.0 /* wheel_multiplier */,
+  };
 
   return kDrivetrainConfig;
 };
diff --git a/y2017/control_loops/drivetrain/drivetrain_base.cc b/y2017/control_loops/drivetrain/drivetrain_base.cc
index 9ff357b..bb22c0f 100644
--- a/y2017/control_loops/drivetrain/drivetrain_base.cc
+++ b/y2017/control_loops/drivetrain/drivetrain_base.cc
@@ -37,10 +37,12 @@
       drivetrain::kHighGearRatio,
       kThreeStateDriveShifter,
       kThreeStateDriveShifter,
-      true,
+      true /* default_high_gear */,
       constants::GetValues().down_error,
-      0.4,
-      1.0};
+      0.4 /* wheel_non_linearity */,
+      1.0 /* quickturn_wheel_multiplier */,
+      1.0 /* wheel_multiplier */,
+  };
 
   return kDrivetrainConfig;
 };
diff --git a/y2017_bot3/control_loops/drivetrain/drivetrain_base.cc b/y2017_bot3/control_loops/drivetrain/drivetrain_base.cc
index 1926fe6..e450315 100644
--- a/y2017_bot3/control_loops/drivetrain/drivetrain_base.cc
+++ b/y2017_bot3/control_loops/drivetrain/drivetrain_base.cc
@@ -35,7 +35,8 @@
       // TODO(Neil): Find out whigh position is default in pneumatics for the
       // gearing
       true /* default_high_gear */, 0 /* down_offset */,
-      0.4 /* wheel_non_linearity */, 1.0 /* quickturn_wheel_multiplier */
+      0.4 /* wheel_non_linearity */, 1.0 /* quickturn_wheel_multiplier */,
+      1.0 /* wheel_multiplier */,
   };
 
   return kDrivetrainConfig;
diff --git a/y2018/control_loops/drivetrain/drivetrain_base.cc b/y2018/control_loops/drivetrain/drivetrain_base.cc
index 67df3be..d589bc1 100644
--- a/y2018/control_loops/drivetrain/drivetrain_base.cc
+++ b/y2018/control_loops/drivetrain/drivetrain_base.cc
@@ -20,7 +20,7 @@
 const DrivetrainConfig &GetDrivetrainConfig() {
   static DrivetrainConfig kDrivetrainConfig{
       ::frc971::control_loops::drivetrain::ShifterType::HALL_EFFECT_SHIFTER,
-      ::frc971::control_loops::drivetrain::LoopType::OPEN_LOOP,
+      ::frc971::control_loops::drivetrain::LoopType::CLOSED_LOOP,
       ::frc971::control_loops::drivetrain::GyroType::SPARTAN_GYRO,
 
       ::y2018::control_loops::drivetrain::MakeDrivetrainLoop,
@@ -34,7 +34,8 @@
       kThreeStateDriveShifter, kThreeStateDriveShifter,
       true /* default_high_gear */, 0 /* down_offset if using constants use
                                    constants::GetValues().down_error */,
-      0.4 /* wheel_non_linearity */, 1.0 /* quickturn_wheel_multiplier */,
+      0.8 /* wheel_non_linearity */, 1.2 /* quickturn_wheel_multiplier */,
+      1.1 /* wheel_multiplier */,
   };
 
   return kDrivetrainConfig;
diff --git a/y2018/control_loops/python/drivetrain.py b/y2018/control_loops/python/drivetrain.py
index b630601..988ac74 100644
--- a/y2018/control_loops/python/drivetrain.py
+++ b/y2018/control_loops/python/drivetrain.py
@@ -14,28 +14,32 @@
 #robot radius needs confirming(set as distance of center wheels from each other)
 #J needs updating
 
-kDrivetrain = drivetrain.DrivetrainParams(J = 2.0,
-                                          mass = 54.4311,
-                                          robot_radius = 0.675 / 2.0,
-                                          wheel_radius = 0.127 / 2.0,
-                                          G_low = 46.0 / 60.0 * 20.0 / 48.0 * 14.0 / 62.0 ,
-                                          G_high = 62.0 / 44.0 * 20.0 / 48.0 * 14.0 / 62.0,
-                                          q_pos_low = 0.12,
-                                          q_pos_high = 0.14,
-                                          q_vel_low = 1.0,
-                                          q_vel_high = 0.95)
+kDrivetrain = drivetrain.DrivetrainParams(
+    J=2.5,
+    mass=68.0,
+    robot_radius=0.616 / 2.0,
+    wheel_radius=0.127 / 2.0,
+    G_low=46.0 / 60.0 * 20.0 / 48.0 * 14.0 / 62.0,
+    G_high=62.0 / 44.0 * 20.0 / 48.0 * 14.0 / 62.0,
+    q_pos_low=0.12,
+    q_pos_high=0.14,
+    q_vel_low=1.0,
+    q_vel_high=0.95,
+    controller_poles=[0.82, 0.82],
+)
+
 
 def main(argv):
-  argv = FLAGS(argv)
-  glog.init()
+    argv = FLAGS(argv)
+    glog.init()
 
-  if FLAGS.plot:
-    drivetrain.PlotDrivetrainMotions(kDrivetrain)
-  elif len(argv) != 5:
-    print "Expected .h file name and .cc file name"
-  else:
-    # Write the generated constants out to a file.
-    drivetrain.WriteDrivetrain(argv[1:3], argv[3:5], 'y2018', kDrivetrain)
+    if FLAGS.plot:
+        drivetrain.PlotDrivetrainMotions(kDrivetrain)
+    elif len(argv) != 5:
+        print "Expected .h file name and .cc file name"
+    else:
+        # Write the generated constants out to a file.
+        drivetrain.WriteDrivetrain(argv[1:3], argv[3:5], 'y2018', kDrivetrain)
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv))
+    sys.exit(main(sys.argv))
diff --git a/y2018/wpilib_interface.cc b/y2018/wpilib_interface.cc
index cc59769..aa13298 100644
--- a/y2018/wpilib_interface.cc
+++ b/y2018/wpilib_interface.cc
@@ -41,6 +41,7 @@
 #include "frc971/wpilib/dma.h"
 #include "frc971/wpilib/dma_edge_counting.h"
 #include "frc971/wpilib/encoder_and_potentiometer.h"
+#include "frc971/wpilib/gyro_sender.h"
 #include "frc971/wpilib/interrupt_edge_counting.h"
 #include "frc971/wpilib/joystick_sender.h"
 #include "frc971/wpilib/logging.q.h"
@@ -93,14 +94,18 @@
 }
 
 double drivetrain_translate(int32_t in) {
-  return static_cast<double>(in) /
-         Values::kDrivetrainEncoderCountsPerRevolution() *
-         Values::kDrivetrainEncoderRatio() * control_loops::drivetrain::kWheelRadius;
+  return ((static_cast<double>(in) /
+           Values::kDrivetrainEncoderCountsPerRevolution()) *
+          (2.0 * M_PI)) *
+         Values::kDrivetrainEncoderRatio() *
+         control_loops::drivetrain::kWheelRadius;
 }
 
 double drivetrain_velocity_translate(double in) {
-  return (1.0 / in) / Values::kDrivetrainCyclesPerRevolution() *
-         Values::kDrivetrainEncoderRatio() * control_loops::drivetrain::kWheelRadius;
+  return (((1.0 / in) / Values::kDrivetrainCyclesPerRevolution()) *
+          (2.0 * M_PI)) *
+         Values::kDrivetrainEncoderRatio() *
+         control_loops::drivetrain::kWheelRadius;
 }
 
 double proximal_pot_translate(double voltage) {
@@ -833,9 +838,12 @@
     imu.set_reset(imu_reset.get());
     ::std::thread imu_thread(::std::ref(imu));
 
-// While as of 2/9/18 the drivetrain Victors are SPX, it appears as though they
-// are identical, as far as DrivetrainWriter is concerned, to the SP variety
-// so all the Victors are written as SPs.
+    ::frc971::wpilib::GyroSender gyro_sender;
+    ::std::thread gyro_thread(::std::ref(gyro_sender));
+
+    // While as of 2/9/18 the drivetrain Victors are SPX, it appears as though
+    // they are identical, as far as DrivetrainWriter is concerned, to the SP
+    // variety so all the Victors are written as SPs.
 
     DrivetrainWriter drivetrain_writer;
     drivetrain_writer.set_drivetrain_left_victor(
@@ -895,6 +903,9 @@
     imu.Quit();
     imu_thread.join();
 
+    gyro_sender.Quit();
+    gyro_thread.join();
+
     drivetrain_writer.Quit();
     drivetrain_writer_thread.join();
     superstructure_writer.Quit();