blob: 18db6d6993970cbfdfd4855052656204aa77e436 [file] [log] [blame]
Niko Sohmers3860f8a2024-01-12 21:05:19 -08001#include "y2024/control_loops/superstructure/superstructure.h"
2
3#include "aos/events/event_loop.h"
4#include "aos/flatbuffer_merge.h"
5#include "aos/network/team_number.h"
6#include "frc971/shooter_interpolation/interpolation.h"
7#include "frc971/zeroing/wrap.h"
8
9DEFINE_bool(ignore_distance, false,
10 "If true, ignore distance when shooting and obay joystick_reader");
11
Stephan Pleinesf63bde82024-01-13 15:59:33 -080012namespace y2024::control_loops::superstructure {
Niko Sohmers3860f8a2024-01-12 21:05:19 -080013
14using ::aos::monotonic_clock;
15
16using frc971::control_loops::AbsoluteEncoderProfiledJointStatus;
17using frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus;
18using frc971::control_loops::RelativeEncoderProfiledJointStatus;
19
20Superstructure::Superstructure(::aos::EventLoop *event_loop,
21 std::shared_ptr<const constants::Values> values,
22 const ::std::string &name)
23 : frc971::controls::ControlLoop<Goal, Position, Status, Output>(event_loop,
24 name),
25 values_(values),
26 constants_fetcher_(event_loop),
Niko Sohmersafc51fe2024-01-29 17:48:35 -080027 robot_constants_(CHECK_NOTNULL(&constants_fetcher_.constants())),
Niko Sohmers3860f8a2024-01-12 21:05:19 -080028 drivetrain_status_fetcher_(
29 event_loop->MakeFetcher<frc971::control_loops::drivetrain::Status>(
30 "/drivetrain")),
31 joystick_state_fetcher_(
Niko Sohmersafc51fe2024-01-29 17:48:35 -080032 event_loop->MakeFetcher<aos::JoystickState>("/aos")),
Niko Sohmerse735fa82024-02-02 16:49:02 -080033 transfer_goal_(TransferRollerGoal::NONE),
Niko Sohmersafc51fe2024-01-29 17:48:35 -080034 intake_pivot_(
35 robot_constants_->common()->intake_pivot(),
Filip Kujawa6d717632024-02-01 11:40:55 -080036 robot_constants_->robot()->intake_constants()->zeroing_constants()),
37 climber_(
38 robot_constants_->common()->climber(),
39 robot_constants_->robot()->climber_constants()->zeroing_constants()) {
Niko Sohmers3860f8a2024-01-12 21:05:19 -080040 event_loop->SetRuntimeRealtimePriority(30);
41}
42
43void Superstructure::RunIteration(const Goal *unsafe_goal,
44 const Position *position,
45 aos::Sender<Output>::Builder *output,
46 aos::Sender<Status>::Builder *status) {
47 const monotonic_clock::time_point timestamp =
48 event_loop()->context().monotonic_event_time;
49
50 (void)timestamp;
Niko Sohmers3860f8a2024-01-12 21:05:19 -080051 (void)position;
52
53 if (WasReset()) {
54 AOS_LOG(ERROR, "WPILib reset, restarting\n");
Niko Sohmersafc51fe2024-01-29 17:48:35 -080055 intake_pivot_.Reset();
Filip Kujawa6d717632024-02-01 11:40:55 -080056 climber_.Reset();
Niko Sohmers3860f8a2024-01-12 21:05:19 -080057 }
58
59 OutputT output_struct;
Niko Sohmersafc51fe2024-01-29 17:48:35 -080060
61 double intake_pivot_position =
62 robot_constants_->common()->intake_pivot_set_points()->retracted();
63
64 if (unsafe_goal != nullptr &&
65 unsafe_goal->intake_pivot_goal() == IntakePivotGoal::EXTENDED) {
66 intake_pivot_position =
67 robot_constants_->common()->intake_pivot_set_points()->extended();
68 }
69
70 IntakeRollerState intake_roller_state = IntakeRollerState::NONE;
71
72 switch (unsafe_goal != nullptr ? unsafe_goal->intake_roller_goal()
73 : IntakeRollerGoal::NONE) {
74 case IntakeRollerGoal::NONE:
75 output_struct.intake_roller_voltage = 0.0;
76 break;
77 case IntakeRollerGoal::SPIT:
Niko Sohmerse735fa82024-02-02 16:49:02 -080078 transfer_goal_ = TransferRollerGoal::TRANSFER_OUT;
Niko Sohmersafc51fe2024-01-29 17:48:35 -080079 intake_roller_state = IntakeRollerState::SPITTING;
80 output_struct.intake_roller_voltage =
81 robot_constants_->common()->intake_roller_voltages()->spitting();
82 break;
83 case IntakeRollerGoal::INTAKE:
Niko Sohmerse735fa82024-02-02 16:49:02 -080084 transfer_goal_ = TransferRollerGoal::TRANSFER_IN;
Niko Sohmersafc51fe2024-01-29 17:48:35 -080085 intake_roller_state = IntakeRollerState::INTAKING;
86 output_struct.intake_roller_voltage =
87 robot_constants_->common()->intake_roller_voltages()->intaking();
88 break;
89 }
90
Niko Sohmerse735fa82024-02-02 16:49:02 -080091 TransferRollerState transfer_roller_state = TransferRollerState::NONE;
92
93 switch (unsafe_goal != nullptr ? transfer_goal_ : TransferRollerGoal::NONE) {
94 case TransferRollerGoal::NONE:
95 output_struct.transfer_roller_voltage = 0.0;
96 break;
97 case TransferRollerGoal::TRANSFER_IN:
98 if (position->transfer_beambreak()) {
99 transfer_goal_ = TransferRollerGoal::NONE;
100 transfer_roller_state = TransferRollerState::NONE;
101 output_struct.transfer_roller_voltage = 0.0;
102 break;
103 }
104 transfer_roller_state = TransferRollerState::TRANSFERING_IN;
105 output_struct.transfer_roller_voltage =
106 robot_constants_->common()->transfer_roller_voltages()->transfer_in();
107 break;
108 case TransferRollerGoal::TRANSFER_OUT:
109 transfer_roller_state = TransferRollerState::TRANSFERING_OUT;
110 output_struct.transfer_roller_voltage = robot_constants_->common()
111 ->transfer_roller_voltages()
112 ->transfer_out();
113 break;
114 }
115
Filip Kujawa6d717632024-02-01 11:40:55 -0800116 double climber_position =
117 robot_constants_->common()->climber_set_points()->retract();
118
119 if (unsafe_goal != nullptr) {
120 switch (unsafe_goal->climber_goal()) {
121 case ClimberGoal::FULL_EXTEND:
122 climber_position =
123 robot_constants_->common()->climber_set_points()->full_extend();
124 break;
125 case ClimberGoal::HALF_EXTEND:
126 climber_position =
127 robot_constants_->common()->climber_set_points()->half_extend();
128 break;
129 case ClimberGoal::RETRACT:
130 climber_position =
131 robot_constants_->common()->climber_set_points()->retract();
132 break;
133 default:
134 break;
135 }
136 }
137
Niko Sohmers3860f8a2024-01-12 21:05:19 -0800138 if (joystick_state_fetcher_.Fetch() &&
139 joystick_state_fetcher_->has_alliance()) {
140 alliance_ = joystick_state_fetcher_->alliance();
141 }
Niko Sohmersafc51fe2024-01-29 17:48:35 -0800142
Niko Sohmers3860f8a2024-01-12 21:05:19 -0800143 drivetrain_status_fetcher_.Fetch();
144
Niko Sohmersafc51fe2024-01-29 17:48:35 -0800145 aos::FlatbufferFixedAllocatorArray<
146 frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemGoal, 512>
147 intake_pivot_goal_buffer;
148
149 intake_pivot_goal_buffer.Finish(
150 frc971::control_loops::CreateStaticZeroingSingleDOFProfiledSubsystemGoal(
151 *intake_pivot_goal_buffer.fbb(), intake_pivot_position));
152
153 const frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemGoal
154 *intake_pivot_goal = &intake_pivot_goal_buffer.message();
155
156 const flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
157 intake_pivot_status_offset = intake_pivot_.Iterate(
158 intake_pivot_goal, position->intake_pivot(),
159 output != nullptr ? &output_struct.intake_pivot_voltage : nullptr,
160 status->fbb());
161
Filip Kujawa6d717632024-02-01 11:40:55 -0800162 aos::FlatbufferFixedAllocatorArray<
163 frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemGoal, 512>
164 climber_goal_buffer;
165
166 climber_goal_buffer.Finish(
167 frc971::control_loops::CreateStaticZeroingSingleDOFProfiledSubsystemGoal(
168 *climber_goal_buffer.fbb(), climber_position));
169
170 const frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemGoal
171 *climber_goal = &climber_goal_buffer.message();
172
173 const flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
174 climber_status_offset = climber_.Iterate(
175 climber_goal, position->climber(),
176 output != nullptr ? &output_struct.climber_voltage : nullptr,
177 status->fbb());
178
Niko Sohmers3860f8a2024-01-12 21:05:19 -0800179 if (output) {
180 output->CheckOk(output->Send(Output::Pack(*output->fbb(), &output_struct)));
181 }
182
183 Status::Builder status_builder = status->MakeBuilder<Status>();
Niko Sohmersafc51fe2024-01-29 17:48:35 -0800184
Filip Kujawa6d717632024-02-01 11:40:55 -0800185 const bool zeroed = intake_pivot_.zeroed() && climber_.zeroed();
186 const bool estopped = intake_pivot_.estopped() || climber_.estopped();
Niko Sohmersafc51fe2024-01-29 17:48:35 -0800187
188 status_builder.add_zeroed(zeroed);
189 status_builder.add_estopped(estopped);
190 status_builder.add_intake_roller_state(intake_roller_state);
191 status_builder.add_intake_pivot_state(intake_pivot_status_offset);
Niko Sohmerse735fa82024-02-02 16:49:02 -0800192 status_builder.add_transfer_roller_state(transfer_roller_state);
Filip Kujawa6d717632024-02-01 11:40:55 -0800193 status_builder.add_climber_state(climber_status_offset);
Niko Sohmers3860f8a2024-01-12 21:05:19 -0800194
195 (void)status->Send(status_builder.Finish());
196}
197
198double Superstructure::robot_velocity() const {
199 return (drivetrain_status_fetcher_.get() != nullptr
200 ? drivetrain_status_fetcher_->robot_speed()
201 : 0.0);
202}
203
Stephan Pleinesf63bde82024-01-13 15:59:33 -0800204} // namespace y2024::control_loops::superstructure