blob: 39c913eeb8820269b060c451e8e0fa15d3e614fa [file] [log] [blame]
Stephan Massaltd021f972020-01-05 20:41:23 -08001#include "y2020/control_loops/superstructure/superstructure.h"
2
3#include "aos/events/event_loop.h"
4
5namespace y2020 {
6namespace control_loops {
7namespace superstructure {
8
9using frc971::control_loops::AbsoluteEncoderProfiledJointStatus;
10using frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus;
11
12Superstructure::Superstructure(::aos::EventLoop *event_loop,
13 const ::std::string &name)
14 : aos::controls::ControlLoop<Goal, Position, Status, Output>(event_loop,
Sabina Daviscf08b152020-01-31 22:12:09 -080015 name),
Sabina Davis0f2d38c2020-02-08 17:01:21 -080016 hood_(constants::GetValues().hood),
Kai Tinkessfb460372020-02-08 14:05:48 -080017 intake_joint_(constants::GetValues().intake),
Sabina Davis0f31d3f2020-02-20 20:41:00 -080018 turret_(constants::GetValues().turret.subsystem_params),
19 shooter_() {
Sabina Daviscf08b152020-01-31 22:12:09 -080020 event_loop->SetRuntimeRealtimePriority(30);
Stephan Massaltd021f972020-01-05 20:41:23 -080021}
22
Sabina Daviscf08b152020-01-31 22:12:09 -080023void Superstructure::RunIteration(const Goal *unsafe_goal,
24 const Position *position,
Stephan Massaltd021f972020-01-05 20:41:23 -080025 aos::Sender<Output>::Builder *output,
26 aos::Sender<Status>::Builder *status) {
27 if (WasReset()) {
28 AOS_LOG(ERROR, "WPILib reset, restarting\n");
Sabina Daviscf08b152020-01-31 22:12:09 -080029 hood_.Reset();
Sabina Davis0f2d38c2020-02-08 17:01:21 -080030 intake_joint_.Reset();
Kai Tinkessfb460372020-02-08 14:05:48 -080031 turret_.Reset();
Stephan Massaltd021f972020-01-05 20:41:23 -080032 }
33
Sabina Davis0f31d3f2020-02-20 20:41:00 -080034 const aos::monotonic_clock::time_point position_timestamp =
35 event_loop()->context().monotonic_event_time;
36
Sabina Daviscf08b152020-01-31 22:12:09 -080037 OutputT output_struct;
38
39 flatbuffers::Offset<AbsoluteEncoderProfiledJointStatus> hood_status_offset =
40 hood_.Iterate(unsafe_goal != nullptr ? unsafe_goal->hood() : nullptr,
41 position->hood(),
42 output != nullptr ? &(output_struct.hood_voltage) : nullptr,
43 status->fbb());
44
Sabina Davis0f2d38c2020-02-08 17:01:21 -080045 flatbuffers::Offset<AbsoluteEncoderProfiledJointStatus> intake_status_offset =
46 intake_joint_.Iterate(
47 unsafe_goal != nullptr ? unsafe_goal->intake() : nullptr,
48 position->intake_joint(),
49 output != nullptr ? &(output_struct.intake_joint_voltage) : nullptr,
50 status->fbb());
51
Kai Tinkessfb460372020-02-08 14:05:48 -080052 flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
53 turret_status_offset = turret_.Iterate(
54 unsafe_goal != nullptr ? unsafe_goal->turret() : nullptr,
55 position->turret(),
56 output != nullptr ? &(output_struct.turret_voltage) : nullptr,
57 status->fbb());
58
Sabina Davis0f31d3f2020-02-20 20:41:00 -080059 flatbuffers::Offset<ShooterStatus> shooter_status_offset =
60 shooter_.RunIteration(
61 unsafe_goal != nullptr ? unsafe_goal->shooter() : nullptr,
62 position->shooter(), status->fbb(),
63 output != nullptr ? &(output_struct) : nullptr, position_timestamp);
64
John Park0a245a02020-02-02 14:10:15 -080065 climber_.Iterate(unsafe_goal, output != nullptr ? &(output_struct) : nullptr);
66
Sabina Daviscf08b152020-01-31 22:12:09 -080067 bool zeroed;
68 bool estopped;
69
Sabina Davis0f2d38c2020-02-08 17:01:21 -080070 {
Kai Tinkessfb460372020-02-08 14:05:48 -080071 const AbsoluteEncoderProfiledJointStatus *const hood_status =
Sabina Davis0f2d38c2020-02-08 17:01:21 -080072 GetMutableTemporaryPointer(*status->fbb(), hood_status_offset);
Stephan Massaltd021f972020-01-05 20:41:23 -080073
Kai Tinkessfb460372020-02-08 14:05:48 -080074 const AbsoluteEncoderProfiledJointStatus *const intake_status =
Sabina Davis0f2d38c2020-02-08 17:01:21 -080075 GetMutableTemporaryPointer(*status->fbb(), intake_status_offset);
76
Kai Tinkessfb460372020-02-08 14:05:48 -080077 const PotAndAbsoluteEncoderProfiledJointStatus *const turret_status =
78 GetMutableTemporaryPointer(*status->fbb(), turret_status_offset);
79
80 zeroed = hood_status->zeroed() && intake_status->zeroed() &&
81 turret_status->zeroed();
82 estopped = hood_status->estopped() || intake_status->estopped() ||
83 turret_status->estopped();
Stephan Massaltd021f972020-01-05 20:41:23 -080084 }
85
86 Status::Builder status_builder = status->MakeBuilder<Status>();
87
Sabina Daviscf08b152020-01-31 22:12:09 -080088 status_builder.add_zeroed(zeroed);
89 status_builder.add_estopped(estopped);
90
91 status_builder.add_hood(hood_status_offset);
Sabina Davis0f2d38c2020-02-08 17:01:21 -080092 status_builder.add_intake(intake_status_offset);
Kai Tinkessfb460372020-02-08 14:05:48 -080093 status_builder.add_turret(turret_status_offset);
Sabina Davis0f31d3f2020-02-20 20:41:00 -080094 status_builder.add_shooter(shooter_status_offset);
Stephan Massaltd021f972020-01-05 20:41:23 -080095
96 status->Send(status_builder.Finish());
Sabina Davis0f2d38c2020-02-08 17:01:21 -080097
98 if (output != nullptr) {
99 if (unsafe_goal) {
100 output_struct.intake_roller_voltage = unsafe_goal->roller_voltage();
101 } else {
102 output_struct.intake_roller_voltage = 0.0;
103 }
104 output->Send(Output::Pack(*output->fbb(), &output_struct));
105 }
Stephan Massaltd021f972020-01-05 20:41:23 -0800106}
107
Sabina Daviscf08b152020-01-31 22:12:09 -0800108} // namespace superstructure
Stephan Massaltd021f972020-01-05 20:41:23 -0800109} // namespace control_loops
110} // namespace y2020