Add climber and intake motors

Signed-off-by: Nikita Narang <nikitanarang123@gmail.com>
Change-Id: I2c7fa4c18b2030d65d193ee5486f6f9233097bf0
diff --git a/y2022_bot3/wpilib_interface.cc b/y2022_bot3/wpilib_interface.cc
index 0366256..c591c9d 100644
--- a/y2022_bot3/wpilib_interface.cc
+++ b/y2022_bot3/wpilib_interface.cc
@@ -242,10 +242,45 @@
       : frc971::wpilib::LoopOutputHandler<superstructure::Output>(
             event_loop, "/superstructure") {}
 
- private:
-  void Stop() override { AOS_LOG(WARNING, "Superstructure output too old.\n"); }
+  void set_intake_roller_falcon(
+      ::std::unique_ptr<::ctre::phoenix::motorcontrol::can::TalonFX> t) {
+    intake_roller_falcon_ = std::move(t);
+    intake_roller_falcon_->ConfigSupplyCurrentLimit(
+        {true, Values::kIntakeRollerSupplyCurrentLimit(),
+         Values::kIntakeRollerSupplyCurrentLimit(), 0});
+    intake_roller_falcon_->ConfigStatorCurrentLimit(
+        {true, Values::kIntakeRollerStatorCurrentLimit(),
+         Values::kIntakeRollerStatorCurrentLimit(), 0});
+  }
 
-  void Write(const superstructure::Output &output) override { (void)output; }
+  void set_climber_falcon_left(std::unique_ptr<frc::TalonFX> t) {
+    climber_falcon_left_ = std::move(t);
+  }
+
+  void set_climber_falcon_right(std::unique_ptr<frc::TalonFX> t) {
+    climber_falcon_right_ = std::move(t);
+  }
+
+  void set_intake_falcon(std::unique_ptr<frc::TalonFX> t) {
+    intake_falcon_ = std::move(t);
+  }
+
+ private:
+  void Stop() override {
+    AOS_LOG(WARNING, "Superstructure output too old.\n");
+    climber_falcon_left_->SetDisabled();
+    climber_falcon_right_->SetDisabled();
+    intake_falcon_->SetDisabled();
+    intake_roller_falcon_->Set(
+        ctre::phoenix::motorcontrol::ControlMode::Disabled, 0);
+  }
+
+  void Write(const superstructure::Output &output) override {
+    WritePwm(output.climber_voltage_left(), climber_falcon_left_.get());
+    WritePwm(output.climber_voltage_right(), climber_falcon_right_.get());
+    WritePwm(output.intake_voltage(), intake_falcon_.get());
+    WriteCan(output.roller_voltage(), intake_roller_falcon_.get());
+  }
 
   static void WriteCan(const double voltage,
                        ::ctre::phoenix::motorcontrol::can::TalonFX *falcon) {
@@ -259,6 +294,11 @@
     motor->SetSpeed(std::clamp(voltage, -kMaxBringupPower, kMaxBringupPower) /
                     12.0);
   }
+
+  ::std::shared_ptr<::ctre::phoenix::motorcontrol::can::TalonFX>
+      intake_roller_falcon_;
+  ::std::unique_ptr<::frc::TalonFX> climber_falcon_left_, climber_falcon_right_,
+      intake_falcon_;
 };
 
 class WPILibRobot : public ::frc971::wpilib::WPILibRobotBase {
@@ -307,7 +347,12 @@
         ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(1)), true);
 
     SuperstructureWriter superstructure_writer(&output_event_loop);
-
+    superstructure_writer.set_climber_falcon_left(make_unique<frc::TalonFX>(2));
+    superstructure_writer.set_climber_falcon_right(
+        make_unique<frc::TalonFX>(3));
+    superstructure_writer.set_intake_falcon(make_unique<frc::TalonFX>(4));
+    superstructure_writer.set_intake_roller_falcon(
+        make_unique<::ctre::phoenix::motorcontrol::can::TalonFX>(0));
     AddLoop(&output_event_loop);
 
     // Thread 5.