Update Hood to use AbsoluteAndAbsolute position

Change-Id: I3e88718560a6e3983681a3430dc31b5431c1a743
diff --git a/frc971/wpilib/encoder_and_potentiometer.h b/frc971/wpilib/encoder_and_potentiometer.h
index b86ad54..5089620 100644
--- a/frc971/wpilib/encoder_and_potentiometer.h
+++ b/frc971/wpilib/encoder_and_potentiometer.h
@@ -198,6 +198,36 @@
   ::std::unique_ptr<frc::AnalogInput> potentiometer_;
 };
 
+// Class to hold two CTRE encoders, one with both index pulses and absolute
+// angle pwm, and another that can only turn once and only reports absolute
+// angle pwm.
+class AbsoluteAndAbsoluteEncoder {
+ public:
+  void set_single_turn_absolute_pwm(
+      ::std::unique_ptr<frc::DigitalInput> input) {
+    single_turn_duty_cycle_.set_input(::std::move(input));
+  }
+
+  void set_absolute_pwm(::std::unique_ptr<frc::DigitalInput> input) {
+    duty_cycle_.set_input(::std::move(input));
+  }
+
+  void set_encoder(::std::unique_ptr<frc::Encoder> encoder) {
+    encoder_ = ::std::move(encoder);
+  }
+
+  double ReadAbsoluteEncoder() const { return duty_cycle_.Read(); }
+  double ReadSingleTurnAbsoluteEncoder() const {
+    return single_turn_duty_cycle_.Read();
+  }
+  int32_t ReadRelativeEncoder() const { return encoder_->GetRaw(); }
+
+ private:
+  DutyCycleReader duty_cycle_;
+  DutyCycleReader single_turn_duty_cycle_;
+  ::std::unique_ptr<frc::Encoder> encoder_;
+};
+
 class AbsoluteEncoder {
  public:
   void set_absolute_pwm(::std::unique_ptr<frc::DigitalInput> input) {