milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 1 | #include "y2022/control_loops/superstructure/superstructure.h" |
| 2 | |
| 3 | #include "aos/events/event_loop.h" |
| 4 | |
| 5 | namespace y2022 { |
| 6 | namespace control_loops { |
| 7 | namespace superstructure { |
| 8 | |
| 9 | using frc971::control_loops::AbsoluteEncoderProfiledJointStatus; |
| 10 | using frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus; |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame^] | 11 | using frc971::control_loops::RelativeEncoderProfiledJointStatus; |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 12 | |
| 13 | Superstructure::Superstructure(::aos::EventLoop *event_loop, |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame^] | 14 | std::shared_ptr<const constants::Values> values, |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 15 | const ::std::string &name) |
| 16 | : frc971::controls::ControlLoop<Goal, Position, Status, Output>(event_loop, |
Siddhant Kanwar | 0e37f59 | 2022-02-21 19:26:50 -0800 | [diff] [blame] | 17 | name), |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame^] | 18 | |
| 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), |
| 23 | drivetrain_status_fetcher_( |
| 24 | event_loop->MakeFetcher<frc971::control_loops::drivetrain::Status>( |
| 25 | "/drivetrain")) { |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 26 | event_loop->SetRuntimeRealtimePriority(30); |
| 27 | } |
| 28 | |
| 29 | void Superstructure::RunIteration(const Goal *unsafe_goal, |
Siddhant Kanwar | 0e37f59 | 2022-02-21 19:26:50 -0800 | [diff] [blame] | 30 | const Position *position, |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 31 | aos::Sender<Output>::Builder *output, |
| 32 | aos::Sender<Status>::Builder *status) { |
| 33 | if (WasReset()) { |
| 34 | AOS_LOG(ERROR, "WPILib reset, restarting\n"); |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame^] | 35 | intake_front_.Reset(); |
| 36 | intake_back_.Reset(); |
| 37 | turret_.Reset(); |
| 38 | climber_.Reset(); |
| 39 | } |
| 40 | |
| 41 | drivetrain_status_fetcher_.Fetch(); |
| 42 | const float velocity = robot_velocity(); |
| 43 | |
| 44 | double roller_speed_compensated_front = 0; |
| 45 | double roller_speed_compensated_back = 0; |
| 46 | double transfer_roller_speed = 0; |
| 47 | |
| 48 | if (unsafe_goal != nullptr) { |
| 49 | roller_speed_compensated_front = |
| 50 | unsafe_goal->roller_speed_front() + |
| 51 | std::max(velocity * unsafe_goal->roller_speed_compensation(), 0.0); |
| 52 | |
| 53 | roller_speed_compensated_back = |
| 54 | unsafe_goal->roller_speed_back() - |
| 55 | std::min(velocity * unsafe_goal->roller_speed_compensation(), 0.0); |
| 56 | |
| 57 | transfer_roller_speed = unsafe_goal->transfer_roller_speed(); |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 58 | } |
| 59 | |
Siddhant Kanwar | 0e37f59 | 2022-02-21 19:26:50 -0800 | [diff] [blame] | 60 | OutputT output_struct; |
| 61 | |
| 62 | flatbuffers::Offset<RelativeEncoderProfiledJointStatus> |
| 63 | climber_status_offset = climber_.Iterate( |
| 64 | unsafe_goal != nullptr ? unsafe_goal->climber() : nullptr, |
| 65 | position->climber(), |
| 66 | output != nullptr ? &(output_struct.climber_voltage) : nullptr, |
| 67 | status->fbb()); |
| 68 | |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame^] | 69 | flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus> |
| 70 | intake_status_offset_front = intake_front_.Iterate( |
| 71 | unsafe_goal != nullptr ? unsafe_goal->intake_front() : nullptr, |
| 72 | position->intake_front(), |
| 73 | output != nullptr ? &(output_struct.intake_voltage_front) : nullptr, |
| 74 | status->fbb()); |
| 75 | |
| 76 | flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus> |
| 77 | intake_status_offset_back = intake_back_.Iterate( |
| 78 | unsafe_goal != nullptr ? unsafe_goal->intake_back() : nullptr, |
| 79 | position->intake_back(), |
| 80 | output != nullptr ? &(output_struct.intake_voltage_back) : nullptr, |
| 81 | status->fbb()); |
| 82 | |
| 83 | flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus> |
| 84 | turret_status_offset = turret_.Iterate( |
| 85 | unsafe_goal != nullptr ? unsafe_goal->turret() : nullptr, |
| 86 | position->turret(), |
| 87 | output != nullptr ? &(output_struct.turret_voltage) : nullptr, |
| 88 | status->fbb()); |
| 89 | |
Siddhant Kanwar | 0e37f59 | 2022-02-21 19:26:50 -0800 | [diff] [blame] | 90 | if (output != nullptr) { |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame^] | 91 | output_struct.roller_voltage_front = roller_speed_compensated_front; |
| 92 | output_struct.roller_voltage_back = roller_speed_compensated_back; |
| 93 | output_struct.transfer_roller_voltage = transfer_roller_speed; |
| 94 | |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 95 | output->CheckOk(output->Send(Output::Pack(*output->fbb(), &output_struct))); |
| 96 | } |
| 97 | |
| 98 | Status::Builder status_builder = status->MakeBuilder<Status>(); |
| 99 | |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame^] | 100 | const bool zeroed = intake_front_.zeroed() && intake_back_.zeroed() && |
| 101 | turret_.zeroed() && climber_.zeroed(); |
| 102 | const bool estopped = intake_front_.estopped() || intake_back_.estopped() || |
| 103 | turret_.estopped() || climber_.zeroed(); |
| 104 | |
| 105 | status_builder.add_zeroed(zeroed); |
| 106 | status_builder.add_estopped(estopped); |
| 107 | |
| 108 | status_builder.add_intake_front(intake_status_offset_front); |
| 109 | status_builder.add_intake_back(intake_status_offset_back); |
| 110 | status_builder.add_turret(turret_status_offset); |
Siddhant Kanwar | 0e37f59 | 2022-02-21 19:26:50 -0800 | [diff] [blame] | 111 | status_builder.add_climber(climber_status_offset); |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 112 | |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 113 | (void)status->Send(status_builder.Finish()); |
| 114 | } |
| 115 | |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame^] | 116 | double Superstructure::robot_velocity() const { |
| 117 | return (drivetrain_status_fetcher_.get() != nullptr |
| 118 | ? drivetrain_status_fetcher_->robot_speed() |
| 119 | : 0.0); |
| 120 | } |
| 121 | |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 122 | } // namespace superstructure |
| 123 | } // namespace control_loops |
| 124 | } // namespace y2022 |