Use ADIS16470 in 2020 robot

Change-Id: I0b0ff931b98efacaf7cb7d3ba92940c78c71af9e
diff --git a/y2020/BUILD b/y2020/BUILD
index 17d3020..b044f53 100644
--- a/y2020/BUILD
+++ b/y2020/BUILD
@@ -60,7 +60,7 @@
         "//frc971/autonomous:auto_mode_fbs",
         "//frc971/control_loops:control_loops_fbs",
         "//frc971/control_loops/drivetrain:drivetrain_position_fbs",
-        "//frc971/wpilib:ADIS16448",
+        "//frc971/wpilib:ADIS16470",
         "//frc971/wpilib:buffered_pcm",
         "//frc971/wpilib:drivetrain_writer",
         "//frc971/wpilib:encoder_and_potentiometer",
@@ -107,6 +107,7 @@
         "//y2020/control_loops/superstructure:superstructure_goal_fbs",
         "//y2020/control_loops/superstructure:superstructure_output_fbs",
         "//y2020/control_loops/superstructure:superstructure_position_fbs",
+        "//y2019/control_loops/drivetrain:target_selector_fbs",
         "//y2020/control_loops/superstructure:superstructure_status_fbs",
     ],
     visibility = ["//visibility:public"],
diff --git a/y2020/wpilib_interface.cc b/y2020/wpilib_interface.cc
index 4968c9f..a363775 100644
--- a/y2020/wpilib_interface.cc
+++ b/y2020/wpilib_interface.cc
@@ -34,7 +34,7 @@
 #include "ctre/phoenix/motorcontrol/can/TalonSRX.h"
 #include "frc971/autonomous/auto_mode_generated.h"
 #include "frc971/control_loops/drivetrain/drivetrain_position_generated.h"
-#include "frc971/wpilib/ADIS16448.h"
+#include "frc971/wpilib/ADIS16470.h"
 #include "frc971/wpilib/buffered_pcm.h"
 #include "frc971/wpilib/buffered_solenoid.h"
 #include "frc971/wpilib/dma.h"
@@ -130,7 +130,11 @@
     autonomous_modes_.at(i) = ::std::move(sensor);
   }
 
+  void set_imu(frc971::wpilib::ADIS16470 *imu) { imu_ = imu; }
+
   void RunIteration() override {
+    CHECK_NOTNULL(imu_)->DoReads();
+
     {
       auto builder = drivetrain_position_sender_.MakeBuilder();
       frc971::control_loops::drivetrain::Position::Builder drivetrain_builder =
@@ -181,6 +185,8 @@
       drivetrain_position_sender_;
 
   ::std::array<::std::unique_ptr<frc::DigitalInput>, 2> autonomous_modes_;
+
+  frc971::wpilib::ADIS16470 *imu_ = nullptr;
 };
 
 class SuperstructureWriter
@@ -224,6 +230,13 @@
     sensor_reader.set_drivetrain_left_encoder(make_encoder(0));
     sensor_reader.set_drivetrain_right_encoder(make_encoder(1));
 
+    auto imu_trigger = make_unique<frc::DigitalInput>(0);
+    auto imu_reset = make_unique<frc::DigitalOutput>(1);
+    auto spi = make_unique<frc::SPI>(frc::SPI::Port::kOnboardCS2);
+    frc971::wpilib::ADIS16470 imu(&sensor_reader_event_loop, spi.get(),
+                                  imu_trigger.get(), imu_reset.get());
+    sensor_reader.set_imu(&imu);
+
     AddLoop(&sensor_reader_event_loop);
 
     // Thread 4.
diff --git a/y2020/y2020.json b/y2020/y2020.json
index 411e3ff..7680ef5 100644
--- a/y2020/y2020.json
+++ b/y2020/y2020.json
@@ -17,6 +17,10 @@
       "frequency": 200
     },
     {
+      "name": "/drivetrain",
+      "type": "y2019.control_loops.drivetrain.TargetSelectorHint"
+    },
+    {
       "name": "/superstructure",
       "type": "y2020.control_loops.superstructure.Position",
       "frequency": 200