blob: f7019072676dc0dce6991828efab4e367f24dd7a [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
7namespace y2022_bot3 {
8namespace control_loops {
9namespace superstructure {
10
11using frc971::control_loops::AbsoluteEncoderProfiledJointStatus;
12using frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus;
13using frc971::control_loops::RelativeEncoderProfiledJointStatus;
14
15Superstructure::Superstructure(::aos::EventLoop *event_loop,
16 std::shared_ptr<const constants::Values> values,
17 const ::std::string &name)
18 : frc971::controls::ControlLoop<Goal, Position, Status, Output>(event_loop,
19 name),
20 values_(values),
Niko Sohmers74c5b592022-09-10 13:41:46 -070021 climber_left_(values_->climber_left.subsystem_params),
22 climber_right_(values_->climber_right.subsystem_params),
23 intake_(values_->intake.subsystem_params),
Henry Speiser354d2782022-07-22 13:56:48 -070024 drivetrain_status_fetcher_(
25 event_loop->MakeFetcher<frc971::control_loops::drivetrain::Status>(
26 "/drivetrain")),
27 joystick_state_fetcher_(
28 event_loop->MakeFetcher<aos::JoystickState>("/aos")) {
29 event_loop->SetRuntimeRealtimePriority(30);
30}
31
32void Superstructure::RunIteration(const Goal *unsafe_goal,
33 const Position *position,
34 aos::Sender<Output>::Builder *output,
35 aos::Sender<Status>::Builder *status) {
Henry Speiser354d2782022-07-22 13:56:48 -070036 if (WasReset()) {
37 AOS_LOG(ERROR, "WPILib reset, restarting\n");
38 }
39
40 OutputT output_struct;
41
42 if (joystick_state_fetcher_.Fetch() &&
43 joystick_state_fetcher_->has_alliance()) {
44 alliance_ = joystick_state_fetcher_->alliance();
45 }
46
47 drivetrain_status_fetcher_.Fetch();
48
Niko Sohmers74c5b592022-09-10 13:41:46 -070049 const flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
50 intake_status_offset = intake_.Iterate(
51 unsafe_goal != nullptr ? unsafe_goal->intake() : nullptr,
52 position->intake(),
53 output != nullptr ? &output_struct.intake_voltage : nullptr,
54 status->fbb());
55
56 const flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
57 climber_left_status_offset = climber_left_.Iterate(
58 unsafe_goal != nullptr ? unsafe_goal->climber_left() : nullptr,
59 position->climber_left(),
60 output != nullptr ? &output_struct.climber_voltage_left : nullptr,
61 status->fbb());
62
63 const flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
64 climber_right_status_offset = climber_right_.Iterate(
65 unsafe_goal != nullptr ? unsafe_goal->climber_right() : nullptr,
66 position->climber_right(),
67 output != nullptr ? &output_struct.climber_voltage_right : nullptr,
68 status->fbb());
69
70 if (output != nullptr) {
71 output_struct.roller_voltage =
72 (unsafe_goal != nullptr ? unsafe_goal->roller_speed() : 0.0);
73 }
Henry Speiser354d2782022-07-22 13:56:48 -070074 output->CheckOk(output->Send(Output::Pack(*output->fbb(), &output_struct)));
75
76 Status::Builder status_builder = status->MakeBuilder<Status>();
77
Niko Sohmers74c5b592022-09-10 13:41:46 -070078 const bool zeroed =
79 intake_.zeroed() && climber_left_.zeroed() && climber_right_.zeroed();
80 const bool estopped = intake_.estopped() || climber_left_.estopped() ||
81 climber_right_.estopped();
82
83 status_builder.add_zeroed(zeroed);
84 status_builder.add_estopped(estopped);
85 status_builder.add_intake(intake_status_offset);
86 status_builder.add_climber_left(climber_left_status_offset);
87 status_builder.add_climber_right(climber_right_status_offset);
Henry Speiser354d2782022-07-22 13:56:48 -070088
89 (void)status->Send(status_builder.Finish());
90}
91
92} // namespace superstructure
93} // namespace control_loops
94} // namespace y2022_bot3