blob: 3dfa74cf2c9a68641ab6f00f4e1ec91ed4b10834 [file] [log] [blame]
Henry Speiser354d2782022-07-22 13:56:48 -07001#include "y2022_bot3/control_loops/superstructure/superstructure.h"
2
3#include "aos/events/event_loop.h"
4#include "aos/flatbuffer_merge.h"
5#include "frc971/zeroing/wrap.h"
6
Stephan Pleinesf63bde82024-01-13 15:59:33 -08007namespace y2022_bot3::control_loops::superstructure {
Henry Speiser354d2782022-07-22 13:56:48 -07008
9using frc971::control_loops::AbsoluteEncoderProfiledJointStatus;
10using frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus;
11using frc971::control_loops::RelativeEncoderProfiledJointStatus;
12
13Superstructure::Superstructure(::aos::EventLoop *event_loop,
14 std::shared_ptr<const constants::Values> values,
15 const ::std::string &name)
16 : frc971::controls::ControlLoop<Goal, Position, Status, Output>(event_loop,
17 name),
18 values_(values),
Niko Sohmers74c5b592022-09-10 13:41:46 -070019 climber_left_(values_->climber_left.subsystem_params),
20 climber_right_(values_->climber_right.subsystem_params),
21 intake_(values_->intake.subsystem_params),
Henry Speiser354d2782022-07-22 13:56:48 -070022 drivetrain_status_fetcher_(
23 event_loop->MakeFetcher<frc971::control_loops::drivetrain::Status>(
24 "/drivetrain")),
25 joystick_state_fetcher_(
26 event_loop->MakeFetcher<aos::JoystickState>("/aos")) {
27 event_loop->SetRuntimeRealtimePriority(30);
28}
29
30void Superstructure::RunIteration(const Goal *unsafe_goal,
31 const Position *position,
32 aos::Sender<Output>::Builder *output,
33 aos::Sender<Status>::Builder *status) {
Henry Speiser354d2782022-07-22 13:56:48 -070034 if (WasReset()) {
35 AOS_LOG(ERROR, "WPILib reset, restarting\n");
36 }
37
38 OutputT output_struct;
39
40 if (joystick_state_fetcher_.Fetch() &&
41 joystick_state_fetcher_->has_alliance()) {
42 alliance_ = joystick_state_fetcher_->alliance();
43 }
44
45 drivetrain_status_fetcher_.Fetch();
46
Niko Sohmers74c5b592022-09-10 13:41:46 -070047 const flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
48 intake_status_offset = intake_.Iterate(
49 unsafe_goal != nullptr ? unsafe_goal->intake() : nullptr,
50 position->intake(),
51 output != nullptr ? &output_struct.intake_voltage : nullptr,
52 status->fbb());
53
54 const flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
55 climber_left_status_offset = climber_left_.Iterate(
56 unsafe_goal != nullptr ? unsafe_goal->climber_left() : nullptr,
57 position->climber_left(),
58 output != nullptr ? &output_struct.climber_voltage_left : nullptr,
59 status->fbb());
60
61 const flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
62 climber_right_status_offset = climber_right_.Iterate(
63 unsafe_goal != nullptr ? unsafe_goal->climber_right() : nullptr,
64 position->climber_right(),
65 output != nullptr ? &output_struct.climber_voltage_right : nullptr,
66 status->fbb());
67
68 if (output != nullptr) {
69 output_struct.roller_voltage =
70 (unsafe_goal != nullptr ? unsafe_goal->roller_speed() : 0.0);
71 }
Henry Speiser354d2782022-07-22 13:56:48 -070072 output->CheckOk(output->Send(Output::Pack(*output->fbb(), &output_struct)));
73
74 Status::Builder status_builder = status->MakeBuilder<Status>();
75
Niko Sohmers74c5b592022-09-10 13:41:46 -070076 const bool zeroed =
77 intake_.zeroed() && climber_left_.zeroed() && climber_right_.zeroed();
78 const bool estopped = intake_.estopped() || climber_left_.estopped() ||
79 climber_right_.estopped();
80
81 status_builder.add_zeroed(zeroed);
82 status_builder.add_estopped(estopped);
83 status_builder.add_intake(intake_status_offset);
84 status_builder.add_climber_left(climber_left_status_offset);
85 status_builder.add_climber_right(climber_right_status_offset);
Henry Speiser354d2782022-07-22 13:56:48 -070086
87 (void)status->Send(status_builder.Finish());
88}
89
Stephan Pleinesf63bde82024-01-13 15:59:33 -080090} // namespace y2022_bot3::control_loops::superstructure