blob: 06cec41d4d9f4f984735e4b7cc38d3717a871aea [file] [log] [blame]
Niko Sohmers3860f8a2024-01-12 21:05:19 -08001#ifndef Y2024_CONTROL_LOOPS_SUPERSTRUCTURE_SUPERSTRUCTURE_H_
2#define Y2024_CONTROL_LOOPS_SUPERSTRUCTURE_SUPERSTRUCTURE_H_
3
4#include "aos/events/event_loop.h"
5#include "aos/json_to_flatbuffer.h"
Filip Kujawa7a799602024-02-23 12:27:47 -08006#include "aos/time/time.h"
Niko Sohmers3860f8a2024-01-12 21:05:19 -08007#include "frc971/constants/constants_sender_lib.h"
8#include "frc971/control_loops/control_loop.h"
9#include "frc971/control_loops/drivetrain/drivetrain_can_position_generated.h"
10#include "frc971/control_loops/drivetrain/drivetrain_status_generated.h"
11#include "frc971/zeroing/absolute_encoder.h"
12#include "frc971/zeroing/pot_and_absolute_encoder.h"
13#include "y2024/constants.h"
14#include "y2024/constants/constants_generated.h"
Niko Sohmersc4d2c502024-02-19 19:35:35 -080015#include "y2024/control_loops/superstructure/shooter.h"
Niko Sohmers3860f8a2024-01-12 21:05:19 -080016#include "y2024/control_loops/superstructure/superstructure_goal_generated.h"
17#include "y2024/control_loops/superstructure/superstructure_output_generated.h"
18#include "y2024/control_loops/superstructure/superstructure_position_generated.h"
19#include "y2024/control_loops/superstructure/superstructure_status_generated.h"
20
Maxwell Henderson09a4b022024-01-19 21:39:51 -080021namespace y2024::control_loops::superstructure {
Niko Sohmers3860f8a2024-01-12 21:05:19 -080022
23class Superstructure
24 : public ::frc971::controls::ControlLoop<Goal, Position, Status, Output> {
25 public:
Niko Sohmers74b0ad52024-02-03 18:00:31 -080026 using AbsoluteEncoderSubsystem =
27 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystem<
28 ::frc971::zeroing::AbsoluteEncoderZeroingEstimator,
29 ::frc971::control_loops::AbsoluteEncoderProfiledJointStatus>;
30
Niko Sohmersafc51fe2024-01-29 17:48:35 -080031 using PotAndAbsoluteEncoderSubsystem =
32 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystem<
33 ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator,
34 ::frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus>;
35
Niko Sohmers3860f8a2024-01-12 21:05:19 -080036 explicit Superstructure(::aos::EventLoop *event_loop,
Niko Sohmers3860f8a2024-01-12 21:05:19 -080037 const ::std::string &name = "/superstructure");
38
Niko Sohmers74b0ad52024-02-03 18:00:31 -080039 inline const AbsoluteEncoderSubsystem &intake_pivot() const {
Niko Sohmersafc51fe2024-01-29 17:48:35 -080040 return intake_pivot_;
41 }
42
Niko Sohmersc4d2c502024-02-19 19:35:35 -080043 inline const Shooter &shooter() const { return shooter_; }
Filip Kujawa7a799602024-02-23 12:27:47 -080044 inline const PotAndAbsoluteEncoderSubsystem &extend() const {
45 return extend_;
46 }
Niko Sohmersc4d2c502024-02-19 19:35:35 -080047
Niko Sohmers3860f8a2024-01-12 21:05:19 -080048 double robot_velocity() const;
49
50 protected:
51 virtual void RunIteration(const Goal *unsafe_goal, const Position *position,
52 aos::Sender<Output>::Builder *output,
53 aos::Sender<Status>::Builder *status) override;
54
55 private:
Niko Sohmers3860f8a2024-01-12 21:05:19 -080056 frc971::constants::ConstantsFetcher<Constants> constants_fetcher_;
Niko Sohmersafc51fe2024-01-29 17:48:35 -080057 const Constants *robot_constants_;
Niko Sohmers3860f8a2024-01-12 21:05:19 -080058 aos::Fetcher<frc971::control_loops::drivetrain::Status>
59 drivetrain_status_fetcher_;
60 aos::Fetcher<aos::JoystickState> joystick_state_fetcher_;
61
Niko Sohmersac4d8872024-02-23 13:55:47 -080062 CollisionAvoidance collision_avoidance_;
63
Niko Sohmers3860f8a2024-01-12 21:05:19 -080064 aos::Alliance alliance_ = aos::Alliance::kInvalid;
65
Filip Kujawa7a799602024-02-23 12:27:47 -080066 SuperstructureState state_ = SuperstructureState::IDLE;
67
Niko Sohmers6adb5b92024-03-16 17:47:54 -070068 bool trap_override_ = false;
69
Niko Sohmers5006fc42024-03-01 17:14:22 -080070 NoteGoal requested_note_goal_ = NoteGoal::NONE;
71
James Kuszmaul42a87452024-04-05 17:30:47 -070072 int climbing_ = 0;
73
Filip Kujawa0a1282b2024-03-23 12:36:51 -070074 // True if the transfer beambreak has been triggered since last intake request
75 bool note_in_transfer_ = false;
76
Niko Sohmers6adb5b92024-03-16 17:47:54 -070077 aos::monotonic_clock::time_point transfer_start_time_ =
78 aos::monotonic_clock::time_point::min();
79
Filip Kujawa77e3d8a2024-03-02 11:34:56 -080080 aos::monotonic_clock::time_point intake_end_time_ =
Filip Kujawa7a799602024-02-23 12:27:47 -080081 aos::monotonic_clock::time_point::min();
82
Filip Kujawa77e3d8a2024-03-02 11:34:56 -080083 aos::monotonic_clock::time_point loading_catapult_start_time_ =
Maxwell Hendersonf0d22622024-02-26 21:02:11 -080084 aos::monotonic_clock::time_point::min();
85
Niko Sohmers74b0ad52024-02-03 18:00:31 -080086 AbsoluteEncoderSubsystem intake_pivot_;
Niko Sohmers74b0ad52024-02-03 18:00:31 -080087
Niko Sohmersc4d2c502024-02-19 19:35:35 -080088 Shooter shooter_;
89
Filip Kujawa7a799602024-02-23 12:27:47 -080090 PotAndAbsoluteEncoderSubsystem extend_;
Niko Sohmers6adb5b92024-03-16 17:47:54 -070091
92 Debouncer extend_debouncer_;
93
Filip Kujawa0a1282b2024-03-23 12:36:51 -070094 Debouncer transfer_debouncer_;
95
Niko Sohmers3860f8a2024-01-12 21:05:19 -080096 DISALLOW_COPY_AND_ASSIGN(Superstructure);
97};
98
Maxwell Henderson09a4b022024-01-19 21:39:51 -080099} // namespace y2024::control_loops::superstructure
Niko Sohmers3860f8a2024-01-12 21:05:19 -0800100
101#endif // Y2024_CONTROL_LOOPS_SUPERSTRUCTURE_SUPERSTRUCTURE_H_