Add superstructure state machine

Managing balls from the intake into the catapult

Change-Id: I88535ee82a876d63fe49e3607c6986690d704daf
Signed-off-by: Milind Upadhyay <milind.upadhyay@gmail.com>
Signed-off-by: Ravago Jones <ravagojones@gmail.com>
diff --git a/y2022/control_loops/superstructure/superstructure.h b/y2022/control_loops/superstructure/superstructure.h
index dfd4265..13a790a 100644
--- a/y2022/control_loops/superstructure/superstructure.h
+++ b/y2022/control_loops/superstructure/superstructure.h
@@ -7,6 +7,7 @@
 #include "y2022/constants.h"
 #include "y2022/control_loops/superstructure/catapult/catapult.h"
 #include "y2022/control_loops/superstructure/collision_avoidance.h"
+#include "y2022/control_loops/superstructure/superstructure_can_position_generated.h"
 #include "y2022/control_loops/superstructure/superstructure_goal_generated.h"
 #include "y2022/control_loops/superstructure/superstructure_output_generated.h"
 #include "y2022/control_loops/superstructure/superstructure_position_generated.h"
@@ -29,6 +30,11 @@
           ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator,
           ::frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus>;
 
+  static constexpr double kTurretGoalThreshold = 0.01;
+  static constexpr double kCatapultGoalThreshold = 0.01;
+  // potentiometer will be more noisy
+  static constexpr double kFlipperGoalThreshold = 0.05;
+
   explicit Superstructure(::aos::EventLoop *event_loop,
                           std::shared_ptr<const constants::Values> values,
                           const ::std::string &name = "/superstructure");
@@ -58,15 +64,32 @@
   PotAndAbsoluteEncoderSubsystem intake_front_;
   PotAndAbsoluteEncoderSubsystem intake_back_;
   PotAndAbsoluteEncoderSubsystem turret_;
+  catapult::Catapult catapult_;
 
   CollisionAvoidance collision_avoidance_;
 
   aos::Fetcher<frc971::control_loops::drivetrain::Status>
       drivetrain_status_fetcher_;
+  aos::Fetcher<CANPosition> can_position_fetcher_;
+
+  int prev_shot_count_ = 0;
+
+  bool flippers_open_ = false;
+  bool reseating_in_catapult_ = false;
+  bool fire_ = false;
+
+  aos::monotonic_clock::time_point intake_beambreak_timer_ =
+      aos::monotonic_clock::min_time;
+  aos::monotonic_clock::time_point transferring_timer_ =
+      aos::monotonic_clock::min_time;
+  aos::monotonic_clock::time_point loading_timer_ =
+      aos::monotonic_clock::min_time;
+  aos::monotonic_clock::time_point flipper_opening_start_time_ =
+      aos::monotonic_clock::min_time;
+  SuperstructureState state_ = SuperstructureState::IDLE;
+  IntakeState intake_state_ = IntakeState::NO_BALL;
 
   DISALLOW_COPY_AND_ASSIGN(Superstructure);
-
-  catapult::Catapult catapult_;
 };
 
 }  // namespace superstructure