blob: e8dca61158b1e7a99edf394ea5791eb9d0fc9721 [file] [log] [blame]
Austin Schuh8347cb62017-04-08 14:37:34 -07001#include <inttypes.h>
Campbell Crowleyae6e8422017-02-05 12:38:50 -08002#include <stdio.h>
3#include <string.h>
4#include <unistd.h>
Campbell Crowleyae6e8422017-02-05 12:38:50 -08005
Campbell Crowleyae6e8422017-02-05 12:38:50 -08006#include <array>
Austin Schuh8347cb62017-04-08 14:37:34 -07007#include <chrono>
Brian Silverman50826c02017-02-18 14:40:25 -08008#include <cmath>
Austin Schuh8347cb62017-04-08 14:37:34 -07009#include <functional>
10#include <mutex>
11#include <thread>
Campbell Crowleyae6e8422017-02-05 12:38:50 -080012
Parker Schuhd3b7a8872018-02-19 16:42:27 -080013#include "frc971/wpilib/ahal/AnalogInput.h"
14#include "frc971/wpilib/ahal/Compressor.h"
15#include "frc971/wpilib/ahal/Counter.h"
16#include "frc971/wpilib/ahal/DigitalGlitchFilter.h"
17#include "frc971/wpilib/ahal/DriverStation.h"
18#include "frc971/wpilib/ahal/Encoder.h"
19#include "frc971/wpilib/ahal/Relay.h"
20#include "frc971/wpilib/ahal/Servo.h"
21#include "frc971/wpilib/ahal/VictorSP.h"
Campbell Crowleyae6e8422017-02-05 12:38:50 -080022#undef ERROR
23
John Park33858a32018-09-28 23:05:48 -070024#include "aos/commonmath.h"
Austin Schuhdf6cbb12019-02-02 13:46:52 -080025#include "aos/events/shm-event-loop.h"
Brian Silvermanf819b442019-01-20 16:51:04 -080026#include "aos/init.h"
John Park33858a32018-09-28 23:05:48 -070027#include "aos/logging/logging.h"
28#include "aos/logging/queue_logging.h"
Brian Silvermanf819b442019-01-20 16:51:04 -080029#include "aos/make_unique.h"
John Park33858a32018-09-28 23:05:48 -070030#include "aos/robot_state/robot_state.q.h"
31#include "aos/stl_mutex/stl_mutex.h"
32#include "aos/time/time.h"
33#include "aos/util/compiler_memory_barrier.h"
34#include "aos/util/log_interval.h"
35#include "aos/util/phased_loop.h"
36#include "aos/util/wrapping_counter.h"
Philipp Schrader996a2a22017-02-22 05:02:48 +000037#include "frc971/autonomous/auto.q.h"
Campbell Crowleyae6e8422017-02-05 12:38:50 -080038#include "frc971/control_loops/control_loops.q.h"
39#include "frc971/control_loops/drivetrain/drivetrain.q.h"
Austin Schuh8347cb62017-04-08 14:37:34 -070040#include "frc971/wpilib/ADIS16448.h"
41#include "frc971/wpilib/buffered_pcm.h"
42#include "frc971/wpilib/buffered_solenoid.h"
43#include "frc971/wpilib/dma.h"
44#include "frc971/wpilib/dma_edge_counting.h"
Sabina Davis7af11ad2019-02-03 01:16:45 -080045#include "frc971/wpilib/drivetrain_writer.h"
Austin Schuh8347cb62017-04-08 14:37:34 -070046#include "frc971/wpilib/encoder_and_potentiometer.h"
47#include "frc971/wpilib/interrupt_edge_counting.h"
48#include "frc971/wpilib/joystick_sender.h"
49#include "frc971/wpilib/logging.q.h"
50#include "frc971/wpilib/loop_output_handler.h"
51#include "frc971/wpilib/pdp_fetcher.h"
Austin Schuhbf29b6f2019-02-02 21:45:27 -080052#include "frc971/wpilib/sensor_reader.h"
Austin Schuh8347cb62017-04-08 14:37:34 -070053#include "frc971/wpilib/wpilib_robot_base.h"
Campbell Crowleyae6e8422017-02-05 12:38:50 -080054#include "y2017/constants.h"
Campbell Crowleyae6e8422017-02-05 12:38:50 -080055#include "y2017/control_loops/superstructure/superstructure.q.h"
Campbell Crowleyae6e8422017-02-05 12:38:50 -080056
Campbell Crowleyae6e8422017-02-05 12:38:50 -080057#ifndef M_PI
58#define M_PI 3.14159265358979323846
59#endif
60
61using ::frc971::control_loops::drivetrain_queue;
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070062using ::y2017::control_loops::SuperstructureQueue;
Brian Silverman052e69d2017-02-12 16:19:55 -080063using ::y2017::constants::Values;
Austin Schuh8347cb62017-04-08 14:37:34 -070064using ::aos::monotonic_clock;
65namespace chrono = ::std::chrono;
Parker Schuhd3b7a8872018-02-19 16:42:27 -080066using namespace frc;
Brian Silvermanf819b442019-01-20 16:51:04 -080067using aos::make_unique;
Campbell Crowleyae6e8422017-02-05 12:38:50 -080068
69namespace y2017 {
70namespace wpilib {
71namespace {
Brian Silverman052e69d2017-02-12 16:19:55 -080072
Campbell Crowleyae6e8422017-02-05 12:38:50 -080073constexpr double kMaxBringupPower = 12.0;
Campbell Crowleyae6e8422017-02-05 12:38:50 -080074
75// TODO(Brian): Fix the interpretation of the result of GetRaw here and in the
76// DMA stuff and then removing the * 2.0 in *_translate.
77// The low bit is direction.
78
Brian Silverman052e69d2017-02-12 16:19:55 -080079// TODO(brian): Use ::std::max instead once we have C++14 so that can be
80// constexpr.
81template <typename T>
82constexpr T max(T a, T b) {
83 return (a > b) ? a : b;
84}
85template <typename T, typename... Rest>
86constexpr T max(T a, T b, T c, Rest... rest) {
87 return max(max(a, b), c, rest...);
88}
Campbell Crowleyae6e8422017-02-05 12:38:50 -080089
Campbell Crowleyae6e8422017-02-05 12:38:50 -080090double drivetrain_translate(int32_t in) {
Brian Silverman052e69d2017-02-12 16:19:55 -080091 return static_cast<double>(in) /
92 Values::kDrivetrainEncoderCountsPerRevolution *
93 Values::kDrivetrainEncoderRatio * 2.0 * M_PI;
Campbell Crowleyae6e8422017-02-05 12:38:50 -080094}
95
96double drivetrain_velocity_translate(double in) {
Brian Silverman052e69d2017-02-12 16:19:55 -080097 return (1.0 / in) / Values::kDrivetrainCyclesPerRevolution *
98 Values::kDrivetrainEncoderRatio * 2.0 * M_PI;
Campbell Crowleyae6e8422017-02-05 12:38:50 -080099}
100
Brian Silverman50826c02017-02-18 14:40:25 -0800101// TODO(Travis): Make sure the number of turns is right.
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800102double intake_pot_translate(double voltage) {
Brian Silverman50826c02017-02-18 14:40:25 -0800103 return voltage * Values::kIntakePotRatio * (3.0 /*turns*/ / 5.0 /*volts*/) *
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800104 (2 * M_PI /*radians*/);
105}
106
Brian Silverman052e69d2017-02-12 16:19:55 -0800107constexpr double kMaxFastEncoderPulsesPerSecond =
108 max(Values::kMaxDrivetrainEncoderPulsesPerSecond,
109 Values::kMaxShooterEncoderPulsesPerSecond);
110static_assert(kMaxFastEncoderPulsesPerSecond <= 1300000,
111 "fast encoders are too fast");
112constexpr double kMaxMediumEncoderPulsesPerSecond =
113 max(Values::kMaxIntakeEncoderPulsesPerSecond,
114 Values::kMaxTurretEncoderPulsesPerSecond,
115 Values::kMaxIndexerEncoderPulsesPerSecond);
116static_assert(kMaxMediumEncoderPulsesPerSecond <= 400000,
117 "medium encoders are too fast");
118constexpr double kMaxSlowEncoderPulsesPerSecond =
119 Values::kMaxHoodEncoderPulsesPerSecond;
120static_assert(kMaxSlowEncoderPulsesPerSecond <= 100000,
121 "slow encoders are too fast");
Brianef030df2017-03-05 15:06:04 -0800122static_assert(kMaxSlowEncoderPulsesPerSecond < kMaxMediumEncoderPulsesPerSecond,
123 "slow encoders are faster than medium?");
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800124
125// Class to send position messages with sensor readings to our loops.
Austin Schuhbf29b6f2019-02-02 21:45:27 -0800126class SensorReader : public ::frc971::wpilib::SensorReader {
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800127 public:
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800128 SensorReader(::aos::EventLoop *event_loop)
Austin Schuha250b2d2019-05-27 16:14:02 -0700129 : ::frc971::wpilib::SensorReader(event_loop),
130 auto_mode_sender_(
131 event_loop->MakeSender<::frc971::autonomous::AutonomousMode>(
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700132 ".frc971.autonomous.auto_mode")),
133 superstructure_position_sender_(
134 event_loop->MakeSender<SuperstructureQueue::Position>(
135 ".y2017.control_loops.superstructure_queue.position")) {
Brian Silverman052e69d2017-02-12 16:19:55 -0800136 // Set to filter out anything shorter than 1/4 of the minimum pulse width
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800137 // we should ever see.
Austin Schuhbf29b6f2019-02-02 21:45:27 -0800138 UpdateFastEncoderFilterHz(kMaxFastEncoderPulsesPerSecond);
139 UpdateMediumEncoderFilterHz(kMaxMediumEncoderPulsesPerSecond);
Brianef030df2017-03-05 15:06:04 -0800140 hall_filter_.SetPeriodNanoSeconds(100000);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800141 }
142
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800143 void set_shooter_encoder(::std::unique_ptr<Encoder> encoder) {
Brian Silverman052e69d2017-02-12 16:19:55 -0800144 fast_encoder_filter_.Add(encoder.get());
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800145 shooter_encoder_ = ::std::move(encoder);
146 }
147
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800148 void set_intake_encoder(::std::unique_ptr<Encoder> encoder) {
Brian Silverman052e69d2017-02-12 16:19:55 -0800149 medium_encoder_filter_.Add(encoder.get());
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800150 intake_encoder_.set_encoder(::std::move(encoder));
151 }
152
153 void set_intake_potentiometer(::std::unique_ptr<AnalogInput> potentiometer) {
154 intake_encoder_.set_potentiometer(::std::move(potentiometer));
155 }
156
Brian Silverman50826c02017-02-18 14:40:25 -0800157 void set_intake_absolute(::std::unique_ptr<DigitalInput> input) {
158 intake_encoder_.set_absolute_pwm(::std::move(input));
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800159 }
160
Brian Silverman052e69d2017-02-12 16:19:55 -0800161 void set_indexer_encoder(::std::unique_ptr<Encoder> encoder) {
162 medium_encoder_filter_.Add(encoder.get());
Brianef030df2017-03-05 15:06:04 -0800163 indexer_counter_.set_encoder(encoder.get());
Brian Silverman052e69d2017-02-12 16:19:55 -0800164 indexer_encoder_ = ::std::move(encoder);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800165 }
166
Brianef030df2017-03-05 15:06:04 -0800167 void set_indexer_hall(::std::unique_ptr<DigitalInput> input) {
168 hall_filter_.Add(input.get());
169 indexer_counter_.set_input(input.get());
170 indexer_hall_ = ::std::move(input);
171 }
172
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800173 void set_turret_encoder(::std::unique_ptr<Encoder> encoder) {
Brian Silverman052e69d2017-02-12 16:19:55 -0800174 medium_encoder_filter_.Add(encoder.get());
Brianef030df2017-03-05 15:06:04 -0800175 turret_counter_.set_encoder(encoder.get());
176 turret_encoder_ = ::std::move(encoder);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800177 }
178
Brianef030df2017-03-05 15:06:04 -0800179 void set_turret_hall(::std::unique_ptr<DigitalInput> input) {
180 hall_filter_.Add(input.get());
181 turret_counter_.set_input(input.get());
182 turret_hall_ = ::std::move(input);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800183 }
184
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800185 void set_hood_encoder(::std::unique_ptr<Encoder> encoder) {
Brianef030df2017-03-05 15:06:04 -0800186 medium_encoder_filter_.Add(encoder.get());
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800187 hood_encoder_.set_encoder(::std::move(encoder));
188 }
189
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800190 void set_hood_index(::std::unique_ptr<DigitalInput> index) {
Brianef030df2017-03-05 15:06:04 -0800191 medium_encoder_filter_.Add(index.get());
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800192 hood_encoder_.set_index(::std::move(index));
193 }
194
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800195 void set_autonomous_mode(int i, ::std::unique_ptr<DigitalInput> sensor) {
196 autonomous_modes_.at(i) = ::std::move(sensor);
197 }
198
Austin Schuhbf29b6f2019-02-02 21:45:27 -0800199 void Start() {
200 AddToDMA(&indexer_counter_);
201 AddToDMA(&hood_encoder_);
202 AddToDMA(&turret_counter_);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800203 }
204
205 void RunIteration() {
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800206 {
207 auto drivetrain_message = drivetrain_queue.position.MakeMessage();
208 drivetrain_message->right_encoder =
209 drivetrain_translate(drivetrain_right_encoder_->GetRaw());
Austin Schuh0fc1e6d2017-02-21 02:04:10 -0800210 drivetrain_message->right_speed =
211 drivetrain_velocity_translate(drivetrain_right_encoder_->GetPeriod());
212
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800213 drivetrain_message->left_encoder =
214 -drivetrain_translate(drivetrain_left_encoder_->GetRaw());
215 drivetrain_message->left_speed =
216 drivetrain_velocity_translate(drivetrain_left_encoder_->GetPeriod());
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800217
218 drivetrain_message.Send();
219 }
Austin Schuhbf29b6f2019-02-02 21:45:27 -0800220 }
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800221
Austin Schuhbf29b6f2019-02-02 21:45:27 -0800222 void RunDMAIteration() {
223 const auto values = constants::GetValues();
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800224
225 {
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700226 auto superstructure_message = superstructure_position_sender_.MakeMessage();
Brian Silverman052e69d2017-02-12 16:19:55 -0800227 CopyPosition(intake_encoder_, &superstructure_message->intake,
Brian Silverman50826c02017-02-18 14:40:25 -0800228 Values::kIntakeEncoderCountsPerRevolution,
Austin Schuh0fc1e6d2017-02-21 02:04:10 -0800229 Values::kIntakeEncoderRatio, intake_pot_translate, true,
Brian Silverman052e69d2017-02-12 16:19:55 -0800230 values.intake.pot_offset);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800231
Brianef030df2017-03-05 15:06:04 -0800232 CopyPosition(indexer_counter_, &superstructure_message->column.indexer,
233 Values::kIndexerEncoderCountsPerRevolution,
Austin Schuh546a0382017-04-16 19:10:18 -0700234 Values::kIndexerEncoderRatio, true);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800235
Brian Silverman50826c02017-02-18 14:40:25 -0800236 superstructure_message->theta_shooter =
237 encoder_translate(shooter_encoder_->GetRaw(),
238 Values::kShooterEncoderCountsPerRevolution,
239 Values::kShooterEncoderRatio);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800240
Brian Silverman50826c02017-02-18 14:40:25 -0800241 CopyPosition(hood_encoder_, &superstructure_message->hood,
242 Values::kHoodEncoderCountsPerRevolution,
Austin Schuh0fc1e6d2017-02-21 02:04:10 -0800243 Values::kHoodEncoderRatio, true);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800244
Brianef030df2017-03-05 15:06:04 -0800245 CopyPosition(turret_counter_, &superstructure_message->column.turret,
Brian Silverman50826c02017-02-18 14:40:25 -0800246 Values::kTurretEncoderCountsPerRevolution,
Austin Schuhd5ccb862017-03-11 22:06:36 -0800247 Values::kTurretEncoderRatio, false);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800248
249 superstructure_message.Send();
250 }
251
252 {
Austin Schuha250b2d2019-05-27 16:14:02 -0700253 auto auto_mode_message = auto_mode_sender_.MakeMessage();
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800254 auto_mode_message->mode = 0;
255 for (size_t i = 0; i < autonomous_modes_.size(); ++i) {
Austin Schuh8347cb62017-04-08 14:37:34 -0700256 if (autonomous_modes_[i] && autonomous_modes_[i]->Get()) {
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800257 auto_mode_message->mode |= 1 << i;
258 }
259 }
260 LOG_STRUCT(DEBUG, "auto mode", *auto_mode_message);
261 auto_mode_message.Send();
262 }
263 }
264
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800265 private:
Austin Schuha250b2d2019-05-27 16:14:02 -0700266 ::aos::Sender<::frc971::autonomous::AutonomousMode> auto_mode_sender_;
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700267 ::aos::Sender<SuperstructureQueue::Position> superstructure_position_sender_;
Austin Schuha250b2d2019-05-27 16:14:02 -0700268
Austin Schuhbf29b6f2019-02-02 21:45:27 -0800269 DigitalGlitchFilter hall_filter_;
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800270
Austin Schuh2a3e0632018-02-19 16:24:49 -0800271 ::frc971::wpilib::AbsoluteEncoderAndPotentiometer intake_encoder_;
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800272
Brian Silverman052e69d2017-02-12 16:19:55 -0800273 ::std::unique_ptr<Encoder> indexer_encoder_;
Brianef030df2017-03-05 15:06:04 -0800274 ::std::unique_ptr<DigitalInput> indexer_hall_;
275 ::frc971::wpilib::DMAEdgeCounter indexer_counter_;
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800276
Brianef030df2017-03-05 15:06:04 -0800277 ::std::unique_ptr<Encoder> turret_encoder_;
278 ::std::unique_ptr<DigitalInput> turret_hall_;
279 ::frc971::wpilib::DMAEdgeCounter turret_counter_;
280
Brian Silverman7cce2d32017-02-19 21:48:48 -0800281 ::frc971::wpilib::DMAEncoder hood_encoder_;
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800282 ::std::unique_ptr<Encoder> shooter_encoder_;
283
284 ::std::array<::std::unique_ptr<DigitalInput>, 4> autonomous_modes_;
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800285};
286
Adam Snaidere0554ef2017-03-11 23:02:45 -0800287class SolenoidWriter {
288 public:
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700289 SolenoidWriter(::aos::EventLoop *event_loop)
290 : superstructure_output_fetcher_(
291 event_loop->MakeFetcher<SuperstructureQueue::Output>(
292 ".y2017.control_loops.superstructure_queue.output")) {
293 event_loop->set_name("Solenoids");
294 event_loop->SetRuntimeRealtimePriority(27);
295
296 event_loop->AddPhasedLoop([this](int iterations) { Loop(iterations); },
297 ::std::chrono::milliseconds(20),
298 ::std::chrono::milliseconds(1));
299 }
Adam Snaidere0554ef2017-03-11 23:02:45 -0800300
301 ::frc971::wpilib::BufferedPcm *pcm() { return &pcm_; }
302
Austin Schuh8347cb62017-04-08 14:37:34 -0700303 void set_lights(::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
Adam Snaidere0554ef2017-03-11 23:02:45 -0800304 lights_ = ::std::move(s);
305 }
306
Austin Schuh8347cb62017-04-08 14:37:34 -0700307 void set_rgb_light(::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
Austin Schuhc587c882017-03-29 21:33:10 -0700308 rgb_lights_ = ::std::move(s);
309 }
310
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700311 void Loop(const int iterations) {
312 if (iterations != 1) {
313 LOG(DEBUG, "Solenoids skipped %d iterations\n", iterations - 1);
Adam Snaidere0554ef2017-03-11 23:02:45 -0800314 }
Adam Snaidere0554ef2017-03-11 23:02:45 -0800315
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700316 {
317 superstructure_output_fetcher_.Fetch();
318 if (superstructure_output_fetcher_.get()) {
319 LOG_STRUCT(DEBUG, "solenoids", *superstructure_output_fetcher_);
320 lights_->Set(superstructure_output_fetcher_->lights_on);
321 rgb_lights_->Set(superstructure_output_fetcher_->red_light_on |
322 superstructure_output_fetcher_->green_light_on |
323 superstructure_output_fetcher_->blue_light_on);
324 }
325 }
326
327 pcm_.Flush();
328 }
Adam Snaidere0554ef2017-03-11 23:02:45 -0800329
330 private:
331 ::frc971::wpilib::BufferedPcm pcm_;
332
Austin Schuhc587c882017-03-29 21:33:10 -0700333 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> lights_, rgb_lights_;
Adam Snaidere0554ef2017-03-11 23:02:45 -0800334
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700335 ::aos::Fetcher<::y2017::control_loops::SuperstructureQueue::Output>
336 superstructure_output_fetcher_;
Adam Snaidere0554ef2017-03-11 23:02:45 -0800337};
338
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700339class SuperstructureWriter
340 : public ::frc971::wpilib::LoopOutputHandler<SuperstructureQueue::Output> {
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800341 public:
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800342 SuperstructureWriter(::aos::EventLoop *event_loop)
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700343 : ::frc971::wpilib::LoopOutputHandler<SuperstructureQueue::Output>(
344 event_loop, ".y2017.control_loops.superstructure_queue.output") {}
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800345
Austin Schuh8347cb62017-04-08 14:37:34 -0700346 void set_intake_victor(::std::unique_ptr<::frc::VictorSP> t) {
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800347 intake_victor_ = ::std::move(t);
348 }
Austin Schuh8347cb62017-04-08 14:37:34 -0700349 void set_intake_rollers_victor(::std::unique_ptr<::frc::VictorSP> t) {
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800350 intake_rollers_victor_ = ::std::move(t);
351 }
352
Austin Schuh8347cb62017-04-08 14:37:34 -0700353 void set_indexer_victor(::std::unique_ptr<::frc::VictorSP> t) {
Brian Silverman052e69d2017-02-12 16:19:55 -0800354 indexer_victor_ = ::std::move(t);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800355 }
Austin Schuh8347cb62017-04-08 14:37:34 -0700356 void set_indexer_roller_victor(::std::unique_ptr<::frc::VictorSP> t) {
Brian Silverman052e69d2017-02-12 16:19:55 -0800357 indexer_roller_victor_ = ::std::move(t);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800358 }
359
Austin Schuh6a8131b2017-04-08 15:39:22 -0700360 void set_gear_servo(::std::unique_ptr<::frc::Servo> t) {
361 gear_servo_ = ::std::move(t);
362 }
Austin Schuh8347cb62017-04-08 14:37:34 -0700363 void set_shooter_victor(::std::unique_ptr<::frc::VictorSP> t) {
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800364 shooter_victor_ = ::std::move(t);
365 }
Austin Schuh8347cb62017-04-08 14:37:34 -0700366 void set_turret_victor(::std::unique_ptr<::frc::VictorSP> t) {
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800367 turret_victor_ = ::std::move(t);
368 }
Austin Schuh8347cb62017-04-08 14:37:34 -0700369 void set_hood_victor(::std::unique_ptr<::frc::VictorSP> t) {
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800370 hood_victor_ = ::std::move(t);
371 }
372
Austin Schuhc587c882017-03-29 21:33:10 -0700373 void set_red_light(::std::unique_ptr<DigitalOutput> t) {
374 red_light_ = ::std::move(t);
375 }
376 void set_green_light(::std::unique_ptr<DigitalOutput> t) {
377 green_light_ = ::std::move(t);
378 }
379 void set_blue_light(::std::unique_ptr<DigitalOutput> t) {
380 blue_light_ = ::std::move(t);
381 }
382
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800383 private:
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700384 virtual void Write(const SuperstructureQueue::Output &output) override {
385 LOG_STRUCT(DEBUG, "will output", output);
386 intake_victor_->SetSpeed(::aos::Clip(output.voltage_intake,
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800387 -kMaxBringupPower, kMaxBringupPower) /
388 12.0);
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700389 intake_rollers_victor_->SetSpeed(output.voltage_intake_rollers / 12.0);
390 indexer_victor_->SetSpeed(-output.voltage_indexer / 12.0);
391 indexer_roller_victor_->SetSpeed(output.voltage_indexer_rollers / 12.0);
392 turret_victor_->SetSpeed(::aos::Clip(-output.voltage_turret,
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800393 -kMaxBringupPower, kMaxBringupPower) /
394 12.0);
395 hood_victor_->SetSpeed(
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700396 ::aos::Clip(output.voltage_hood, -kMaxBringupPower, kMaxBringupPower) /
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800397 12.0);
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700398 shooter_victor_->SetSpeed(output.voltage_shooter / 12.0);
Austin Schuhc587c882017-03-29 21:33:10 -0700399
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700400 red_light_->Set(output.red_light_on);
401 green_light_->Set(output.green_light_on);
402 blue_light_->Set(output.blue_light_on);
Austin Schuh6a8131b2017-04-08 15:39:22 -0700403
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700404 gear_servo_->SetPosition(output.gear_servo);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800405 }
406
407 virtual void Stop() override {
408 LOG(WARNING, "Superstructure output too old.\n");
409 intake_victor_->SetDisabled();
410 intake_rollers_victor_->SetDisabled();
Brian Silverman052e69d2017-02-12 16:19:55 -0800411 indexer_victor_->SetDisabled();
412 indexer_roller_victor_->SetDisabled();
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800413 turret_victor_->SetDisabled();
414 hood_victor_->SetDisabled();
415 shooter_victor_->SetDisabled();
Austin Schuhc587c882017-03-29 21:33:10 -0700416
Parker Schuhd3b7a8872018-02-19 16:42:27 -0800417 gear_servo_->SetRaw(0);
Austin Schuh6a8131b2017-04-08 15:39:22 -0700418
Austin Schuhc587c882017-03-29 21:33:10 -0700419 red_light_->Set(true);
420 green_light_->Set(true);
421 blue_light_->Set(true);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800422 }
423
Austin Schuh8347cb62017-04-08 14:37:34 -0700424 ::std::unique_ptr<::frc::VictorSP> intake_victor_, intake_rollers_victor_,
425 indexer_victor_, indexer_roller_victor_, shooter_victor_, turret_victor_,
426 hood_victor_;
Austin Schuhc587c882017-03-29 21:33:10 -0700427
Austin Schuh6a8131b2017-04-08 15:39:22 -0700428 ::std::unique_ptr<::frc::Servo> gear_servo_;
429
Austin Schuhc587c882017-03-29 21:33:10 -0700430 ::std::unique_ptr<DigitalOutput> red_light_, green_light_, blue_light_;
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800431};
432
433class WPILibRobot : public ::frc971::wpilib::WPILibRobotBase {
434 public:
435 ::std::unique_ptr<Encoder> make_encoder(int index) {
436 return make_unique<Encoder>(10 + index * 2, 11 + index * 2, false,
437 Encoder::k4X);
438 }
439
440 void Run() override {
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700441 // Thread 1.
442 ::aos::ShmEventLoop joystick_sender_event_loop;
443 ::frc971::wpilib::JoystickSender joystick_sender(
444 &joystick_sender_event_loop);
445 AddLoop(&joystick_sender_event_loop);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800446
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700447 // Thread 2.
448 ::aos::ShmEventLoop pdp_fetcher_event_loop;
449 ::frc971::wpilib::PDPFetcher pdp_fetcher(&pdp_fetcher_event_loop);
450 AddLoop(&pdp_fetcher_event_loop);
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800451
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700452 // Thread 3.
453 ::aos::ShmEventLoop sensor_reader_event_loop;
454 SensorReader sensor_reader(&sensor_reader_event_loop);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800455
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700456 sensor_reader.set_drivetrain_left_encoder(make_encoder(0));
457 sensor_reader.set_drivetrain_right_encoder(make_encoder(1));
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800458
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700459 sensor_reader.set_intake_encoder(make_encoder(3));
460 sensor_reader.set_intake_absolute(make_unique<DigitalInput>(0));
461 sensor_reader.set_intake_potentiometer(make_unique<AnalogInput>(4));
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800462
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700463 sensor_reader.set_indexer_encoder(make_encoder(5));
464 sensor_reader.set_indexer_hall(make_unique<DigitalInput>(4));
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800465
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700466 sensor_reader.set_turret_encoder(make_encoder(6));
467 sensor_reader.set_turret_hall(make_unique<DigitalInput>(2));
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800468
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700469 sensor_reader.set_hood_encoder(make_encoder(4));
470 sensor_reader.set_hood_index(make_unique<DigitalInput>(1));
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800471
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700472 sensor_reader.set_shooter_encoder(make_encoder(2));
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800473
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700474 sensor_reader.set_autonomous_mode(0, make_unique<DigitalInput>(9));
475 sensor_reader.set_autonomous_mode(1, make_unique<DigitalInput>(8));
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800476
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700477 sensor_reader.set_pwm_trigger(true);
Austin Schuh8347cb62017-04-08 14:37:34 -0700478
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700479 AddLoop(&sensor_reader_event_loop);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800480
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700481 // Thread 5.
482 ::aos::ShmEventLoop imu_event_loop;
Brian Silvermanb4439852017-02-24 19:49:09 -0800483 auto imu_trigger = make_unique<DigitalInput>(3);
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700484 ::frc971::wpilib::ADIS16448 imu(&imu_event_loop, SPI::Port::kOnboardCS1,
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800485 imu_trigger.get());
Brian Silvermana70994f2017-03-16 22:32:55 -0700486 imu.SetDummySPI(SPI::Port::kOnboardCS2);
487 auto imu_reset = make_unique<DigitalOutput>(6);
488 imu.set_reset(imu_reset.get());
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700489 AddLoop(&imu_event_loop);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800490
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700491 ::aos::ShmEventLoop output_event_loop;
492 ::frc971::wpilib::DrivetrainWriter drivetrain_writer(&output_event_loop);
Sabina Davis7af11ad2019-02-03 01:16:45 -0800493 drivetrain_writer.set_left_controller0(
494 ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(7)), true);
495 drivetrain_writer.set_right_controller0(
496 ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(3)), false);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800497
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700498 SuperstructureWriter superstructure_writer(&output_event_loop);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800499 superstructure_writer.set_intake_victor(
Austin Schuh8347cb62017-04-08 14:37:34 -0700500 ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(1)));
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800501 superstructure_writer.set_intake_rollers_victor(
Austin Schuh8347cb62017-04-08 14:37:34 -0700502 ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(4)));
Austin Schuh0fc1e6d2017-02-21 02:04:10 -0800503 superstructure_writer.set_indexer_victor(
Austin Schuh8347cb62017-04-08 14:37:34 -0700504 ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(6)));
Brian Silverman052e69d2017-02-12 16:19:55 -0800505 superstructure_writer.set_indexer_roller_victor(
Austin Schuh8347cb62017-04-08 14:37:34 -0700506 ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(5)));
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800507 superstructure_writer.set_turret_victor(
Austin Schuh8347cb62017-04-08 14:37:34 -0700508 ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(9)));
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800509 superstructure_writer.set_hood_victor(
Austin Schuh8347cb62017-04-08 14:37:34 -0700510 ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(2)));
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800511 superstructure_writer.set_shooter_victor(
Austin Schuh8347cb62017-04-08 14:37:34 -0700512 ::std::unique_ptr<::frc::VictorSP>(new ::frc::VictorSP(8)));
Austin Schuhc587c882017-03-29 21:33:10 -0700513
Austin Schuh6a8131b2017-04-08 15:39:22 -0700514 superstructure_writer.set_gear_servo(
515 ::std::unique_ptr<Servo>(new Servo(0)));
516
Austin Schuhc587c882017-03-29 21:33:10 -0700517 superstructure_writer.set_red_light(
518 ::std::unique_ptr<DigitalOutput>(new DigitalOutput(5)));
519 superstructure_writer.set_green_light(
520 ::std::unique_ptr<DigitalOutput>(new DigitalOutput(24)));
521 superstructure_writer.set_blue_light(
522 ::std::unique_ptr<DigitalOutput>(new DigitalOutput(25)));
523
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700524 AddLoop(&output_event_loop);
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800525
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700526 // Thread 6.
527 ::aos::ShmEventLoop solenoid_writer_event_loop;
528 SolenoidWriter solenoid_writer(&solenoid_writer_event_loop);
Adam Snaidere0554ef2017-03-11 23:02:45 -0800529 solenoid_writer.set_lights(solenoid_writer.pcm()->MakeSolenoid(0));
Austin Schuhc587c882017-03-29 21:33:10 -0700530 solenoid_writer.set_rgb_light(solenoid_writer.pcm()->MakeSolenoid(1));
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700531 AddLoop(&solenoid_writer_event_loop);
Adam Snaidere0554ef2017-03-11 23:02:45 -0800532
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700533 RunLoops();
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800534 }
535};
536
Brian Silverman052e69d2017-02-12 16:19:55 -0800537} // namespace
Campbell Crowleyae6e8422017-02-05 12:38:50 -0800538} // namespace wpilib
539} // namespace y2017
540
541AOS_ROBOT_CLASS(::y2017::wpilib::WPILibRobot);