blob: da1af8262b99e93e329b30fbeaf8bc215d290844 [file] [log] [blame]
milind-u086d7262022-01-19 20:44:18 -08001#include "y2022/control_loops/superstructure/superstructure.h"
2
3#include "aos/events/event_loop.h"
4
5namespace y2022 {
6namespace control_loops {
7namespace superstructure {
8
9using frc971::control_loops::AbsoluteEncoderProfiledJointStatus;
10using frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus;
Henry Speiser55aa3ba2022-02-21 23:21:12 -080011using frc971::control_loops::RelativeEncoderProfiledJointStatus;
milind-u086d7262022-01-19 20:44:18 -080012
13Superstructure::Superstructure(::aos::EventLoop *event_loop,
Henry Speiser55aa3ba2022-02-21 23:21:12 -080014 std::shared_ptr<const constants::Values> values,
milind-u086d7262022-01-19 20:44:18 -080015 const ::std::string &name)
16 : frc971::controls::ControlLoop<Goal, Position, Status, Output>(event_loop,
Siddhant Kanwar0e37f592022-02-21 19:26:50 -080017 name),
Austin Schuh39f26f62022-02-24 21:34:46 -080018 values_(values),
19 climber_(values_->climber.subsystem_params),
20 intake_front_(values_->intake_front.subsystem_params),
21 intake_back_(values_->intake_back.subsystem_params),
22 turret_(values_->turret.subsystem_params),
Henry Speiser55aa3ba2022-02-21 23:21:12 -080023 drivetrain_status_fetcher_(
24 event_loop->MakeFetcher<frc971::control_loops::drivetrain::Status>(
Austin Schuh39f26f62022-02-24 21:34:46 -080025 "/drivetrain")),
26 catapult_(*values_) {
milind-u086d7262022-01-19 20:44:18 -080027 event_loop->SetRuntimeRealtimePriority(30);
28}
29
30void Superstructure::RunIteration(const Goal *unsafe_goal,
Siddhant Kanwar0e37f592022-02-21 19:26:50 -080031 const Position *position,
milind-u086d7262022-01-19 20:44:18 -080032 aos::Sender<Output>::Builder *output,
33 aos::Sender<Status>::Builder *status) {
Austin Schuh39f26f62022-02-24 21:34:46 -080034 OutputT output_struct;
35
milind-u086d7262022-01-19 20:44:18 -080036 if (WasReset()) {
37 AOS_LOG(ERROR, "WPILib reset, restarting\n");
Henry Speiser55aa3ba2022-02-21 23:21:12 -080038 intake_front_.Reset();
39 intake_back_.Reset();
40 turret_.Reset();
41 climber_.Reset();
Austin Schuh39f26f62022-02-24 21:34:46 -080042 catapult_.Reset();
Henry Speiser55aa3ba2022-02-21 23:21:12 -080043 }
44
45 drivetrain_status_fetcher_.Fetch();
46 const float velocity = robot_velocity();
47
48 double roller_speed_compensated_front = 0;
49 double roller_speed_compensated_back = 0;
50 double transfer_roller_speed = 0;
51
52 if (unsafe_goal != nullptr) {
53 roller_speed_compensated_front =
54 unsafe_goal->roller_speed_front() +
55 std::max(velocity * unsafe_goal->roller_speed_compensation(), 0.0);
56
57 roller_speed_compensated_back =
58 unsafe_goal->roller_speed_back() -
59 std::min(velocity * unsafe_goal->roller_speed_compensation(), 0.0);
60
61 transfer_roller_speed = unsafe_goal->transfer_roller_speed();
milind-u086d7262022-01-19 20:44:18 -080062 }
63
Austin Schuh39f26f62022-02-24 21:34:46 -080064
65 const flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
66 catapult_status_offset = catapult_.Iterate(
67 unsafe_goal, position,
68 output != nullptr ? &(output_struct.catapult_voltage) : nullptr,
69 status->fbb());
Siddhant Kanwar0e37f592022-02-21 19:26:50 -080070
71 flatbuffers::Offset<RelativeEncoderProfiledJointStatus>
72 climber_status_offset = climber_.Iterate(
73 unsafe_goal != nullptr ? unsafe_goal->climber() : nullptr,
74 position->climber(),
75 output != nullptr ? &(output_struct.climber_voltage) : nullptr,
76 status->fbb());
77
Henry Speiser55aa3ba2022-02-21 23:21:12 -080078 flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
79 intake_status_offset_front = intake_front_.Iterate(
80 unsafe_goal != nullptr ? unsafe_goal->intake_front() : nullptr,
81 position->intake_front(),
82 output != nullptr ? &(output_struct.intake_voltage_front) : nullptr,
83 status->fbb());
84
85 flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
86 intake_status_offset_back = intake_back_.Iterate(
87 unsafe_goal != nullptr ? unsafe_goal->intake_back() : nullptr,
88 position->intake_back(),
89 output != nullptr ? &(output_struct.intake_voltage_back) : nullptr,
90 status->fbb());
91
92 flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus>
93 turret_status_offset = turret_.Iterate(
94 unsafe_goal != nullptr ? unsafe_goal->turret() : nullptr,
95 position->turret(),
96 output != nullptr ? &(output_struct.turret_voltage) : nullptr,
97 status->fbb());
98
Siddhant Kanwar0e37f592022-02-21 19:26:50 -080099 if (output != nullptr) {
Henry Speiser55aa3ba2022-02-21 23:21:12 -0800100 output_struct.roller_voltage_front = roller_speed_compensated_front;
101 output_struct.roller_voltage_back = roller_speed_compensated_back;
102 output_struct.transfer_roller_voltage = transfer_roller_speed;
103
milind-u086d7262022-01-19 20:44:18 -0800104 output->CheckOk(output->Send(Output::Pack(*output->fbb(), &output_struct)));
105 }
106
107 Status::Builder status_builder = status->MakeBuilder<Status>();
108
Henry Speiser55aa3ba2022-02-21 23:21:12 -0800109 const bool zeroed = intake_front_.zeroed() && intake_back_.zeroed() &&
Austin Schuh39f26f62022-02-24 21:34:46 -0800110 turret_.zeroed() && climber_.zeroed() && catapult_.zeroed();
Henry Speiser55aa3ba2022-02-21 23:21:12 -0800111 const bool estopped = intake_front_.estopped() || intake_back_.estopped() ||
Austin Schuh39f26f62022-02-24 21:34:46 -0800112 turret_.estopped() || climber_.estopped() || catapult_.estopped();
Henry Speiser55aa3ba2022-02-21 23:21:12 -0800113
114 status_builder.add_zeroed(zeroed);
115 status_builder.add_estopped(estopped);
116
117 status_builder.add_intake_front(intake_status_offset_front);
118 status_builder.add_intake_back(intake_status_offset_back);
119 status_builder.add_turret(turret_status_offset);
Siddhant Kanwar0e37f592022-02-21 19:26:50 -0800120 status_builder.add_climber(climber_status_offset);
Austin Schuh39f26f62022-02-24 21:34:46 -0800121 status_builder.add_catapult(catapult_status_offset);
122 status_builder.add_solve_time(catapult_.solve_time());
123 status_builder.add_mpc_active(catapult_.mpc_active());
Austin Schuh80fc2752022-02-25 13:33:56 -0800124 status_builder.add_shot_count(catapult_.shot_count());
milind-u086d7262022-01-19 20:44:18 -0800125
milind-u086d7262022-01-19 20:44:18 -0800126 (void)status->Send(status_builder.Finish());
127}
128
Henry Speiser55aa3ba2022-02-21 23:21:12 -0800129double Superstructure::robot_velocity() const {
130 return (drivetrain_status_fetcher_.get() != nullptr
131 ? drivetrain_status_fetcher_->robot_speed()
132 : 0.0);
133}
134
milind-u086d7262022-01-19 20:44:18 -0800135} // namespace superstructure
136} // namespace control_loops
137} // namespace y2022