Switch to DMAPulseWidthReader for imu yaw rate

We think there might be a maximum number of counters you can use. There
are two of them in each DutyCycleReader and the extras stop working if you add
too many of them.

Change-Id: I062d026e350aa42c74286c93f4399d76838bd595
Signed-off-by: Ravago Jones <ravagojones@gmail.com>
diff --git a/y2022/wpilib_interface.cc b/y2022/wpilib_interface.cc
index eb70b6f..00417f0 100644
--- a/y2022/wpilib_interface.cc
+++ b/y2022/wpilib_interface.cc
@@ -141,6 +141,13 @@
     UpdateMediumEncoderFilterHz(kMaxMediumEncoderPulsesPerSecond);
   }
 
+  void Start() override {
+    // TODO(Ravago): Figure out why adding multiple DMA readers results in weird
+    // behavior
+    // AddToDMA(&imu_heading_reader_);
+    AddToDMA(&imu_yaw_rate_reader_);
+  }
+
   // Auto mode switches.
   void set_autonomous_mode(int i, ::std::unique_ptr<frc::DigitalInput> sensor) {
     autonomous_modes_.at(i) = ::std::move(sensor);
@@ -162,11 +169,13 @@
   }
 
   void set_heading_input(::std::unique_ptr<frc::DigitalInput> sensor) {
-    imu_heading_reader_.set_input(::std::move(sensor));
+    imu_heading_input_ = ::std::move(sensor);
+    imu_heading_reader_.set_input(imu_heading_input_.get());
   }
 
   void set_yaw_rate_input(::std::unique_ptr<frc::DigitalInput> sensor) {
-    imu_yaw_rate_reader_.set_input(::std::move(sensor));
+    imu_yaw_rate_input_ = ::std::move(sensor);
+    imu_yaw_rate_reader_.set_input(imu_yaw_rate_input_.get());
   }
 
   void RunIteration() override {
@@ -272,14 +281,19 @@
       constexpr double kScaledRangeLow = 0.1;
       constexpr double kScaledRangeHigh = 0.9;
 
+      constexpr double kPWMFrequencyHz = 200;
+      double heading_duty_cycle =
+          imu_heading_reader_.last_width() * kPWMFrequencyHz;
+      double velocity_duty_cycle =
+          imu_yaw_rate_reader_.last_width() * kPWMFrequencyHz;
+
       constexpr double kDutyCycleScale =
           1 / (kScaledRangeHigh - kScaledRangeLow);
-
       // scale from 0.1 - 0.9 to 0 - 1
       double rescaled_heading_duty_cycle =
-          (imu_heading_reader_.Read() - kScaledRangeLow) * kDutyCycleScale;
+          (heading_duty_cycle - kScaledRangeLow) * kDutyCycleScale;
       double rescaled_velocity_duty_cycle =
-          (imu_yaw_rate_reader_.Read() - kScaledRangeLow) * kDutyCycleScale;
+          (velocity_duty_cycle - kScaledRangeLow) * kDutyCycleScale;
 
       if (!std::isnan(rescaled_heading_duty_cycle)) {
         gyro_reading_builder.add_angle(rescaled_heading_duty_cycle *
@@ -393,14 +407,15 @@
   std::array<std::unique_ptr<frc::DigitalInput>, 2> autonomous_modes_;
 
   std::unique_ptr<frc::DigitalInput> intake_beambreak_front_,
-      intake_beambreak_back_, turret_beambreak_;
+      intake_beambreak_back_, turret_beambreak_, imu_heading_input_,
+      imu_yaw_rate_input_;
 
   std::unique_ptr<frc::AnalogInput> climber_potentiometer_,
       flipper_arm_right_potentiometer_, flipper_arm_left_potentiometer_;
   frc971::wpilib::AbsoluteEncoderAndPotentiometer intake_encoder_front_,
       intake_encoder_back_, turret_encoder_, catapult_encoder_;
 
-  frc971::wpilib::DutyCycleReader imu_heading_reader_, imu_yaw_rate_reader_;
+  frc971::wpilib::DMAPulseWidthReader imu_heading_reader_, imu_yaw_rate_reader_;
 };
 
 class SuperstructureWriter