blob: 0d861a03b5092209f0ec602191aa6c9361191405 [file] [log] [blame]
Brian Silvermanc71537c2016-01-01 13:43:14 -08001#include <unistd.h>
Brian Silvermanc71537c2016-01-01 13:43:14 -08002
Austin Schuh8aec1ed2016-05-01 13:29:20 -07003#include <chrono>
Tyler Chatowbf0609c2021-07-31 16:13:27 -07004#include <cinttypes>
5#include <cstdio>
6#include <cstring>
Brian Silvermanc71537c2016-01-01 13:43:14 -08007#include <functional>
Tyler Chatowbf0609c2021-07-31 16:13:27 -07008#include <memory>
James Kuszmaul7077d342021-06-09 20:23:58 -07009#include <mutex>
10#include <thread>
Brian Silvermanc71537c2016-01-01 13:43:14 -080011
Parker Schuhd3b7a8872018-02-19 16:42:27 -080012#include "frc971/wpilib/ahal/AnalogInput.h"
13#include "frc971/wpilib/ahal/Compressor.h"
14#include "frc971/wpilib/ahal/DigitalGlitchFilter.h"
15#include "frc971/wpilib/ahal/DriverStation.h"
16#include "frc971/wpilib/ahal/Encoder.h"
17#include "frc971/wpilib/ahal/PowerDistributionPanel.h"
18#include "frc971/wpilib/ahal/Relay.h"
19#include "frc971/wpilib/ahal/Talon.h"
Brian Silverman5090c432016-01-02 14:44:26 -080020#include "frc971/wpilib/wpilib_robot_base.h"
Brian Silvermanc71537c2016-01-01 13:43:14 -080021#undef ERROR
22
Alex Perrycb7da4b2019-08-28 19:35:56 -070023#include "aos/events/shm_event_loop.h"
Brian Silvermanf819b442019-01-20 16:51:04 -080024#include "aos/init.h"
John Park33858a32018-09-28 23:05:48 -070025#include "aos/logging/logging.h"
Brian Silvermanf819b442019-01-20 16:51:04 -080026#include "aos/stl_mutex/stl_mutex.h"
John Park33858a32018-09-28 23:05:48 -070027#include "aos/time/time.h"
28#include "aos/util/log_interval.h"
29#include "aos/util/phased_loop.h"
30#include "aos/util/wrapping_counter.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -070031#include "frc971/control_loops/drivetrain/drivetrain_output_generated.h"
32#include "frc971/control_loops/drivetrain/drivetrain_position_generated.h"
James Kuszmaul7077d342021-06-09 20:23:58 -070033#include "frc971/input/robot_state_generated.h"
Brian Silvermanc71537c2016-01-01 13:43:14 -080034#include "frc971/wpilib/buffered_pcm.h"
Austin Schuh2a671df2016-11-26 15:00:06 -080035#include "frc971/wpilib/buffered_solenoid.h"
Brian Silvermanb5b46ca2016-03-13 01:14:17 -050036#include "frc971/wpilib/dma.h"
Austin Schuh2a671df2016-11-26 15:00:06 -080037#include "frc971/wpilib/dma_edge_counting.h"
Sabina Davise33f59a2019-02-03 01:17:45 -080038#include "frc971/wpilib/drivetrain_writer.h"
Austin Schuh2a671df2016-11-26 15:00:06 -080039#include "frc971/wpilib/encoder_and_potentiometer.h"
Austin Schuh2a671df2016-11-26 15:00:06 -080040#include "frc971/wpilib/interrupt_edge_counting.h"
41#include "frc971/wpilib/joystick_sender.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -070042#include "frc971/wpilib/logging_generated.h"
Austin Schuh2a671df2016-11-26 15:00:06 -080043#include "frc971/wpilib/loop_output_handler.h"
Austin Schuh45a549f2019-02-02 15:43:56 -080044#include "frc971/wpilib/sensor_reader.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -070045#include "y2012/control_loops/accessories/accessories_generated.h"
James Kuszmaul61750662021-06-21 21:32:33 -070046#include "y2012/control_loops/control_loops_generated.h"
Brian Silvermanc71537c2016-01-01 13:43:14 -080047
Alex Perrycb7da4b2019-08-28 19:35:56 -070048namespace accessories = ::y2012::control_loops::accessories;
Parker Schuhd3b7a8872018-02-19 16:42:27 -080049using namespace frc;
Vinay Sivae52a6b32021-07-10 15:19:26 -070050using std::make_unique;
Brian Silvermanc71537c2016-01-01 13:43:14 -080051
52namespace y2012 {
53namespace wpilib {
54
Brian Silvermanc71537c2016-01-01 13:43:14 -080055double drivetrain_translate(int32_t in) {
James Kuszmaul7077d342021-06-09 20:23:58 -070056 return -static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*4x*/) * 1 *
Brian Silvermanc71537c2016-01-01 13:43:14 -080057 (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI) * 2.0 / 2.0;
58}
59
60double drivetrain_velocity_translate(double in) {
James Kuszmaul7077d342021-06-09 20:23:58 -070061 return (1.0 / in) / 256.0 /*cpr*/ * 1 *
Brian Silvermanc71537c2016-01-01 13:43:14 -080062 (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI) * 2.0 / 2.0;
63}
64
Austin Schuh45a549f2019-02-02 15:43:56 -080065class SensorReader : public ::frc971::wpilib::SensorReader {
Brian Silvermanc71537c2016-01-01 13:43:14 -080066 public:
Austin Schuh217a9782019-12-21 23:02:50 -080067 SensorReader(::aos::ShmEventLoop *event_loop)
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070068 : ::frc971::wpilib::SensorReader(event_loop),
69 accessories_position_sender_(
70 event_loop->MakeSender<::aos::control_loops::Position>(
Alex Perrycb7da4b2019-08-28 19:35:56 -070071 "/accessories")),
Austin Schuhbd0a40f2019-06-30 14:56:31 -070072 drivetrain_position_sender_(
Alex Perrycb7da4b2019-08-28 19:35:56 -070073 event_loop
74 ->MakeSender<::frc971::control_loops::drivetrain::Position>(
75 "/drivetrain")) {}
Brian Silvermanc71537c2016-01-01 13:43:14 -080076
Brian Silvermanc71537c2016-01-01 13:43:14 -080077 void RunIteration() {
Brian Silvermanc71537c2016-01-01 13:43:14 -080078 {
Alex Perrycb7da4b2019-08-28 19:35:56 -070079 auto builder = drivetrain_position_sender_.MakeBuilder();
Brian Silvermanc71537c2016-01-01 13:43:14 -080080
Alex Perrycb7da4b2019-08-28 19:35:56 -070081 frc971::control_loops::drivetrain::Position::Builder position_builder =
82 builder.MakeBuilder<frc971::control_loops::drivetrain::Position>();
83 position_builder.add_right_encoder(
84 drivetrain_translate(drivetrain_right_encoder_->GetRaw()));
85 position_builder.add_left_encoder(
86 -drivetrain_translate(drivetrain_left_encoder_->GetRaw()));
87 position_builder.add_left_speed(
88 drivetrain_velocity_translate(drivetrain_left_encoder_->GetPeriod()));
89 position_builder.add_right_speed(drivetrain_velocity_translate(
90 drivetrain_right_encoder_->GetPeriod()));
91
92 builder.Send(position_builder.Finish());
Brian Silvermanc71537c2016-01-01 13:43:14 -080093 }
94
Alex Perrycb7da4b2019-08-28 19:35:56 -070095 {
96 auto builder = accessories_position_sender_.MakeBuilder();
97 builder.Send(
98 builder.MakeBuilder<::aos::control_loops::Position>().Finish());
99 }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800100 }
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700101
102 private:
103 ::aos::Sender<::aos::control_loops::Position> accessories_position_sender_;
Alex Perrycb7da4b2019-08-28 19:35:56 -0700104 ::aos::Sender<::frc971::control_loops::drivetrain::Position>
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700105 drivetrain_position_sender_;
Brian Silvermanc71537c2016-01-01 13:43:14 -0800106};
107
108class SolenoidWriter {
109 public:
Austin Schuh217a9782019-12-21 23:02:50 -0800110 SolenoidWriter(::aos::ShmEventLoop *event_loop,
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700111 const ::std::unique_ptr<::frc971::wpilib::BufferedPcm> &pcm)
112 : event_loop_(event_loop),
113 pcm_(pcm),
114 drivetrain_fetcher_(
115 event_loop_
Alex Perrycb7da4b2019-08-28 19:35:56 -0700116 ->MakeFetcher<::frc971::control_loops::drivetrain::Output>(
117 "/drivetrain")),
118 accessories_fetcher_(
119 event_loop_
120 ->MakeFetcher<::y2012::control_loops::accessories::Message>(
121 "/accessories")),
122 pneumatics_to_log_sender_(
123 event_loop->MakeSender<::frc971::wpilib::PneumaticsToLog>("/aos")) {
Austin Schuh217a9782019-12-21 23:02:50 -0800124 event_loop->set_name("Solenoids");
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700125 event_loop_->SetRuntimeRealtimePriority(27);
126
127 event_loop_->AddPhasedLoop([this](int iterations) { Loop(iterations); },
128 ::std::chrono::milliseconds(20),
129 ::std::chrono::milliseconds(1));
130 }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800131
132 void set_drivetrain_high(
133 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
134 drivetrain_high_ = ::std::move(s);
135 }
136
137 void set_drivetrain_low(
138 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
139 drivetrain_low_ = ::std::move(s);
140 }
141
142 void set_s1(::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
143 s1_ = ::std::move(s);
144 }
145
146 void set_s2(::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
147 s2_ = ::std::move(s);
148 }
149
150 void set_s3(::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
151 s3_ = ::std::move(s);
152 }
153
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700154 void Loop(const int iterations) {
155 if (iterations != 1) {
Austin Schuhf257f3c2019-10-27 21:00:43 -0700156 AOS_LOG(DEBUG, "Solenoids skipped %d iterations\n", iterations - 1);
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700157 }
Brian Silverman5090c432016-01-02 14:44:26 -0800158
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700159 {
160 accessories_fetcher_.Fetch();
161 if (accessories_fetcher_.get()) {
Alex Perrycb7da4b2019-08-28 19:35:56 -0700162 s1_->Set(accessories_fetcher_->solenoids()->Get(0));
163 s2_->Set(accessories_fetcher_->solenoids()->Get(1));
164 s3_->Set(accessories_fetcher_->solenoids()->Get(2));
Brian Silverman5090c432016-01-02 14:44:26 -0800165 }
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700166 }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800167
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700168 {
169 drivetrain_fetcher_.Fetch();
170 if (drivetrain_fetcher_.get()) {
Alex Perrycb7da4b2019-08-28 19:35:56 -0700171 const bool high = drivetrain_fetcher_->left_high() ||
172 drivetrain_fetcher_->right_high();
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700173 drivetrain_high_->Set(high);
174 drivetrain_low_->Set(!high);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800175 }
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700176 }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800177
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700178 {
Alex Perrycb7da4b2019-08-28 19:35:56 -0700179 auto builder = pneumatics_to_log_sender_.MakeBuilder();
180
181 ::frc971::wpilib::PneumaticsToLog::Builder to_log_builder =
182 builder.MakeBuilder<frc971::wpilib::PneumaticsToLog>();
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700183 pcm_->Flush();
Alex Perrycb7da4b2019-08-28 19:35:56 -0700184 to_log_builder.add_read_solenoids(pcm_->GetAll());
185 builder.Send(to_log_builder.Finish());
Brian Silvermanc71537c2016-01-01 13:43:14 -0800186 }
187 }
188
Brian Silvermanc71537c2016-01-01 13:43:14 -0800189 private:
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700190 ::aos::EventLoop *event_loop_;
191
Brian Silvermanc71537c2016-01-01 13:43:14 -0800192 const ::std::unique_ptr<::frc971::wpilib::BufferedPcm> &pcm_;
193
194 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> drivetrain_high_;
195 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> drivetrain_low_;
196 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s1_, s2_, s3_;
197
198 ::std::unique_ptr<Compressor> compressor_;
199
Alex Perrycb7da4b2019-08-28 19:35:56 -0700200 ::aos::Fetcher<::frc971::control_loops::drivetrain::Output>
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700201 drivetrain_fetcher_;
Alex Perrycb7da4b2019-08-28 19:35:56 -0700202 ::aos::Fetcher<::y2012::control_loops::accessories::Message>
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700203 accessories_fetcher_;
Alex Perrycb7da4b2019-08-28 19:35:56 -0700204
205 aos::Sender<::frc971::wpilib::PneumaticsToLog> pneumatics_to_log_sender_;
Brian Silvermanc71537c2016-01-01 13:43:14 -0800206};
207
Alex Perrycb7da4b2019-08-28 19:35:56 -0700208class AccessoriesWriter : public ::frc971::wpilib::LoopOutputHandler<
209 control_loops::accessories::Message> {
Brian Silvermanc71537c2016-01-01 13:43:14 -0800210 public:
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800211 AccessoriesWriter(::aos::EventLoop *event_loop)
Alex Perrycb7da4b2019-08-28 19:35:56 -0700212 : ::frc971::wpilib::LoopOutputHandler<
213 control_loops::accessories::Message>(event_loop, "/accessories") {}
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800214
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700215 void set_talon1(::std::unique_ptr<Talon> t) { talon1_ = ::std::move(t); }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800216
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700217 void set_talon2(::std::unique_ptr<Talon> t) { talon2_ = ::std::move(t); }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800218
219 private:
Alex Perrycb7da4b2019-08-28 19:35:56 -0700220 virtual void Write(
221 const control_loops::accessories::Message &output) override {
222 talon1_->SetSpeed(output.sticks()->Get(0));
223 talon2_->SetSpeed(output.sticks()->Get(1));
Brian Silvermanc71537c2016-01-01 13:43:14 -0800224 }
225
226 virtual void Stop() override {
Austin Schuhf257f3c2019-10-27 21:00:43 -0700227 AOS_LOG(WARNING, "shooter output too old\n");
Brian Silverman6eaa2d82017-02-04 20:48:30 -0800228 talon1_->SetDisabled();
229 talon2_->SetDisabled();
Brian Silvermanc71537c2016-01-01 13:43:14 -0800230 }
231
232 ::std::unique_ptr<Talon> talon1_, talon2_;
233};
234
Brian Silverman5090c432016-01-02 14:44:26 -0800235class WPILibRobot : public ::frc971::wpilib::WPILibRobotBase {
Brian Silvermanc71537c2016-01-01 13:43:14 -0800236 public:
237 ::std::unique_ptr<Encoder> make_encoder(int index) {
238 return make_unique<Encoder>(10 + index * 2, 11 + index * 2, false,
239 Encoder::k4X);
240 }
241
Brian Silverman5090c432016-01-02 14:44:26 -0800242 void Run() override {
Alex Perrycb7da4b2019-08-28 19:35:56 -0700243 aos::FlatbufferDetachedBuffer<aos::Configuration> config =
244 aos::configuration::ReadConfig("config.json");
245
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700246 // Thread 1.
Alex Perrycb7da4b2019-08-28 19:35:56 -0700247 ::aos::ShmEventLoop joystick_sender_event_loop(&config.message());
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700248 ::frc971::wpilib::JoystickSender joystick_sender(
249 &joystick_sender_event_loop);
250 AddLoop(&joystick_sender_event_loop);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800251
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700252 // Thread 2.
Alex Perrycb7da4b2019-08-28 19:35:56 -0700253 ::aos::ShmEventLoop sensor_reader_event_loop(&config.message());
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700254 SensorReader sensor_reader(&sensor_reader_event_loop);
255 sensor_reader.set_drivetrain_left_encoder(make_encoder(0));
256 sensor_reader.set_drivetrain_right_encoder(make_encoder(1));
257 AddLoop(&sensor_reader_event_loop);
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800258
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700259 // Thread 3.
Alex Perrycb7da4b2019-08-28 19:35:56 -0700260 ::aos::ShmEventLoop output_event_loop(&config.message());
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700261 ::frc971::wpilib::DrivetrainWriter drivetrain_writer(&output_event_loop);
Sabina Davise33f59a2019-02-03 01:17:45 -0800262 drivetrain_writer.set_left_controller0(
263 ::std::unique_ptr<Talon>(new Talon(3)), true);
264 drivetrain_writer.set_right_controller0(
265 ::std::unique_ptr<Talon>(new Talon(4)), false);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800266
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700267 ::y2012::wpilib::AccessoriesWriter accessories_writer(&output_event_loop);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800268 accessories_writer.set_talon1(::std::unique_ptr<Talon>(new Talon(5)));
269 accessories_writer.set_talon2(::std::unique_ptr<Talon>(new Talon(6)));
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700270 AddLoop(&output_event_loop);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800271
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700272 // Thread 4.
Alex Perrycb7da4b2019-08-28 19:35:56 -0700273 ::aos::ShmEventLoop solenoid_writer_event_loop(&config.message());
Brian Silvermanc71537c2016-01-01 13:43:14 -0800274 ::std::unique_ptr<::frc971::wpilib::BufferedPcm> pcm(
275 new ::frc971::wpilib::BufferedPcm());
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700276 SolenoidWriter solenoid_writer(&solenoid_writer_event_loop, pcm);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800277 solenoid_writer.set_drivetrain_high(pcm->MakeSolenoid(0));
278 solenoid_writer.set_drivetrain_low(pcm->MakeSolenoid(2));
279 solenoid_writer.set_s1(pcm->MakeSolenoid(1));
280 solenoid_writer.set_s2(pcm->MakeSolenoid(3));
281 solenoid_writer.set_s3(pcm->MakeSolenoid(4));
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700282 AddLoop(&solenoid_writer_event_loop);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800283
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700284 RunLoops();
Brian Silvermanc71537c2016-01-01 13:43:14 -0800285 }
286};
287
288} // namespace wpilib
289} // namespace y2012
290
Brian Silverman5090c432016-01-02 14:44:26 -0800291AOS_ROBOT_CLASS(::y2012::wpilib::WPILibRobot);