blob: 87b0bc0de8e70a63b0725219e9a7f781db43bd53 [file] [log] [blame]
Niko Sohmersc4d2c502024-02-19 19:35:35 -08001#ifndef Y2024_CONTROL_LOOPS_SUPERSTRUCTURE_SHOOTER_H_
2#define Y2024_CONTROL_LOOPS_SUPERSTRUCTURE_SHOOTER_H_
3
4#include "frc971/control_loops/catapult/catapult.h"
5#include "frc971/control_loops/catapult/catapult_goal_static.h"
6#include "frc971/control_loops/static_zeroing_single_dof_profiled_subsystem.h"
7#include "frc971/shooter_interpolation/interpolation.h"
8#include "frc971/zeroing/pot_and_absolute_encoder.h"
9#include "y2024/constants.h"
10#include "y2024/constants/constants_generated.h"
11#include "y2024/control_loops/superstructure/aiming.h"
Niko Sohmersac4d8872024-02-23 13:55:47 -080012#include "y2024/control_loops/superstructure/collision_avoidance.h"
Niko Sohmersc4d2c502024-02-19 19:35:35 -080013#include "y2024/control_loops/superstructure/superstructure_can_position_generated.h"
14#include "y2024/control_loops/superstructure/superstructure_goal_generated.h"
15#include "y2024/control_loops/superstructure/superstructure_position_generated.h"
16#include "y2024/control_loops/superstructure/superstructure_status_generated.h"
17
18namespace y2024::control_loops::superstructure {
19
20// The shooter class will control the various subsystems involved in the
21// shooter- the turret, altitude, and catapult.
22class Shooter {
23 public:
24 using PotAndAbsoluteEncoderSubsystem =
25 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystem<
26 ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator,
27 ::frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus>;
28
29 using CatapultSubsystem =
30 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystem<
31 ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator,
32 ::frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus,
33 ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator,
34 aos::util::AsymmetricTrapezoidProfile>;
35
36 Shooter(aos::EventLoop *event_loop, const Constants *robot_constants);
37
38 void Reset() {
39 catapult_.Reset();
40 turret_.Reset();
41 altitude_.Reset();
42 }
43
44 void Estop() {
45 catapult_.Estop();
46 turret_.Estop();
47 altitude_.Estop();
48 }
49
50 bool zeroed() {
51 return catapult_.zeroed() && turret_.zeroed() && altitude_.zeroed();
52 }
53
54 bool estopped() {
55 return catapult_.estopped() && turret_.estopped() && altitude_.estopped();
56 }
57
58 inline const PotAndAbsoluteEncoderSubsystem &turret() const {
59 return turret_;
60 }
61
62 inline const PotAndAbsoluteEncoderSubsystem &altitude() const {
63 return altitude_;
64 }
65
66 flatbuffers::Offset<ShooterStatus> Iterate(
Filip Kujawa7a799602024-02-23 12:27:47 -080067 const Position *position, const ShooterGoal *shooter_goal, bool fire,
Niko Sohmersc4d2c502024-02-19 19:35:35 -080068 double *catapult_output, double *altitude_output, double *turret_output,
Maxwell Hendersond5bf47a2024-02-23 17:16:48 -080069 double *retention_roller_output,
70 double *retention_roller_stator_current_limit, double battery_voltage,
Niko Sohmersac4d8872024-02-23 13:55:47 -080071 /* Hacky way to use collision avoidance in this class */
72 CollisionAvoidance *collision_avoidance,
73 const double intake_pivot_position, double *max_turret_intake_position,
Filip Kujawa7a799602024-02-23 12:27:47 -080074 double *min_intake_pivot_position,
75 /* If true, go to extend collision avoidance position */ bool standby,
76 flatbuffers::FlatBufferBuilder *fbb);
Niko Sohmersc4d2c502024-02-19 19:35:35 -080077
78 private:
79 CatapultState state_ = CatapultState::RETRACTING;
80
81 bool CatapultClose() const {
82 return (std::abs(catapult_.estimated_position() -
83 catapult_.unprofiled_goal(0, 0)) < 0.05 &&
84 std::abs(catapult_.estimated_velocity()) < 0.5);
85 }
86
87 aos::Fetcher<frc971::control_loops::drivetrain::Status>
88 drivetrain_status_fetcher_;
89
90 aos::Fetcher<y2024::control_loops::superstructure::CANPosition>
91 superstructure_can_position_fetcher_;
92
93 const Constants *robot_constants_;
94
95 CatapultSubsystem catapult_;
96
97 PotAndAbsoluteEncoderSubsystem turret_;
98 PotAndAbsoluteEncoderSubsystem altitude_;
99
100 Aimer aimer_;
101
102 frc971::shooter_interpolation::InterpolationTable<
103 y2024::constants::Values::ShotParams>
104 interpolation_table_;
Niko Sohmersc4d2c502024-02-19 19:35:35 -0800105};
106
107} // namespace y2024::control_loops::superstructure
108
109#endif