Use ADIS16448 in y2020

This updates the IMU transform to be correct for the yaw axis, but may
have the X/Y axes/signs wrong if we care about accelerometer or
roll/pitch data.

Change-Id: I73d86c8be18f447bb35fc13666ccfdda29fef257
Signed-off-by: James Kuszmaul <jabukuszmaul@gmail.com>
diff --git a/y2020/wpilib_interface.cc b/y2020/wpilib_interface.cc
index b8def33..4667f25 100644
--- a/y2020/wpilib_interface.cc
+++ b/y2020/wpilib_interface.cc
@@ -36,6 +36,7 @@
 #include "frc971/autonomous/auto_mode_generated.h"
 #include "frc971/control_loops/drivetrain/drivetrain_position_generated.h"
 #include "frc971/input/robot_state_generated.h"
+#include "frc971/wpilib/ADIS16448.h"
 #include "frc971/wpilib/ADIS16470.h"
 #include "frc971/wpilib/buffered_pcm.h"
 #include "frc971/wpilib/buffered_solenoid.h"
@@ -220,7 +221,9 @@
   }
 
   void RunIteration() override {
-    CHECK_NOTNULL(imu_)->DoReads();
+    if (imu_ != nullptr) {
+      imu_->DoReads();
+    }
 
     {
       auto builder = drivetrain_position_sender_.MakeBuilder();
@@ -589,10 +592,14 @@
           make_unique<frc::DigitalInput>(6), make_unique<frc::DigitalInput>(7));
     }
 
+    AddLoop(&sensor_reader_event_loop);
+
     // Note: If ADIS16470 is plugged in directly to the roboRIO SPI port without
     // the Spartan Board, then trigger is on 26, reset 27, and chip select is
     // CS0.
-    frc::SPI::Port spi_port = frc::SPI::Port::kOnboardCS2;
+    // TODO(james): Double check whether the above is still accurate/useful with
+    // the ADIS16448. No reason it shouldn't be.
+    frc::SPI::Port spi_port = frc::SPI::Port::kOnboardCS1;
     std::unique_ptr<frc::DigitalInput> imu_trigger;
     std::unique_ptr<frc::DigitalOutput> imu_reset;
     if (::aos::network::GetTeamNumber() ==
@@ -604,11 +611,23 @@
       imu_trigger = make_unique<frc::DigitalInput>(9);
       imu_reset = make_unique<frc::DigitalOutput>(8);
     }
-    auto spi = make_unique<frc::SPI>(spi_port);
-    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);
+    ::aos::ShmEventLoop imu_event_loop(&config.message());
+    std::unique_ptr<frc971::wpilib::ADIS16448> old_imu;
+    std::unique_ptr<frc971::wpilib::ADIS16470> new_imu;
+    std::unique_ptr<frc::SPI> imu_spi;
+    if (::aos::network::GetTeamNumber() ==
+        constants::Values::kCompTeamNumber) {
+      old_imu = make_unique<frc971::wpilib::ADIS16448>(
+          &imu_event_loop, spi_port, imu_trigger.get());
+      old_imu->SetDummySPI(frc::SPI::Port::kOnboardCS2);
+      old_imu->set_reset(imu_reset.get());
+    } else {
+      imu_spi = make_unique<frc::SPI>(spi_port);
+      new_imu = make_unique<frc971::wpilib::ADIS16470>(
+          &imu_event_loop, imu_spi.get(), imu_trigger.get(), imu_reset.get());
+      sensor_reader.set_imu(new_imu.get());
+    }
+    AddLoop(&imu_event_loop);
 
     // Thread 4.
     ::aos::ShmEventLoop output_event_loop(&config.message());