blob: 46f1ec23bc69b38d0067f6fae67fa7f44fe2c980 [file] [log] [blame]
Brian Silvermanc71537c2016-01-01 13:43:14 -08001#include <stdio.h>
2#include <string.h>
3#include <unistd.h>
4#include <inttypes.h>
5
Austin Schuh8aec1ed2016-05-01 13:29:20 -07006#include <chrono>
Brian Silvermanc71537c2016-01-01 13:43:14 -08007#include <thread>
8#include <mutex>
9#include <functional>
10
Parker Schuhd3b7a8872018-02-19 16:42:27 -080011#include "frc971/wpilib/ahal/AnalogInput.h"
12#include "frc971/wpilib/ahal/Compressor.h"
13#include "frc971/wpilib/ahal/DigitalGlitchFilter.h"
14#include "frc971/wpilib/ahal/DriverStation.h"
15#include "frc971/wpilib/ahal/Encoder.h"
16#include "frc971/wpilib/ahal/PowerDistributionPanel.h"
17#include "frc971/wpilib/ahal/Relay.h"
18#include "frc971/wpilib/ahal/Talon.h"
Brian Silverman5090c432016-01-02 14:44:26 -080019#include "frc971/wpilib/wpilib_robot_base.h"
Brian Silvermanc71537c2016-01-01 13:43:14 -080020#undef ERROR
21
Austin Schuhdf6cbb12019-02-02 13:46:52 -080022#include "aos/events/shm-event-loop.h"
Brian Silvermanf819b442019-01-20 16:51:04 -080023#include "aos/init.h"
John Park33858a32018-09-28 23:05:48 -070024#include "aos/logging/logging.h"
25#include "aos/logging/queue_logging.h"
Brian Silvermanf819b442019-01-20 16:51:04 -080026#include "aos/make_unique.h"
27#include "aos/robot_state/robot_state.q.h"
28#include "aos/stl_mutex/stl_mutex.h"
John Park33858a32018-09-28 23:05:48 -070029#include "aos/time/time.h"
30#include "aos/util/log_interval.h"
31#include "aos/util/phased_loop.h"
32#include "aos/util/wrapping_counter.h"
Austin Schuh2a671df2016-11-26 15:00:06 -080033#include "frc971/control_loops/drivetrain/drivetrain.q.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"
42#include "frc971/wpilib/logging.q.h"
43#include "frc971/wpilib/loop_output_handler.h"
Austin Schuh45a549f2019-02-02 15:43:56 -080044#include "frc971/wpilib/sensor_reader.h"
Austin Schuh2a671df2016-11-26 15:00:06 -080045#include "y2012/control_loops/accessories/accessories.q.h"
Brian Silvermanc71537c2016-01-01 13:43:14 -080046
47#ifndef M_PI
48#define M_PI 3.14159265358979323846
49#endif
50
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070051using ::y2012::control_loops::AccessoriesQueue;
Parker Schuhd3b7a8872018-02-19 16:42:27 -080052using namespace frc;
Brian Silvermanf819b442019-01-20 16:51:04 -080053using aos::make_unique;
Brian Silvermanc71537c2016-01-01 13:43:14 -080054
55namespace y2012 {
56namespace wpilib {
57
Brian Silvermanc71537c2016-01-01 13:43:14 -080058double drivetrain_translate(int32_t in) {
59 return -static_cast<double>(in) /
60 (256.0 /*cpr*/ * 4.0 /*4x*/) *
61 1 *
62 (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI) * 2.0 / 2.0;
63}
64
65double drivetrain_velocity_translate(double in) {
66 return (1.0 / in) / 256.0 /*cpr*/ *
67 1 *
68 (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI) * 2.0 / 2.0;
69}
70
Austin Schuh45a549f2019-02-02 15:43:56 -080071class SensorReader : public ::frc971::wpilib::SensorReader {
Brian Silvermanc71537c2016-01-01 13:43:14 -080072 public:
Austin Schuhdf6cbb12019-02-02 13:46:52 -080073 SensorReader(::aos::EventLoop *event_loop)
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070074 : ::frc971::wpilib::SensorReader(event_loop),
75 accessories_position_sender_(
76 event_loop->MakeSender<::aos::control_loops::Position>(
Austin Schuhbd0a40f2019-06-30 14:56:31 -070077 ".y2012.control_loops.accessories_queue.position")),
78 drivetrain_position_sender_(
79 event_loop->MakeSender<
80 ::frc971::control_loops::DrivetrainQueue::Position>(
81 ".frc971.control_loops.drivetrain_queue.position")) {}
Brian Silvermanc71537c2016-01-01 13:43:14 -080082
Brian Silvermanc71537c2016-01-01 13:43:14 -080083 void RunIteration() {
Brian Silvermanc71537c2016-01-01 13:43:14 -080084 {
Austin Schuhbd0a40f2019-06-30 14:56:31 -070085 auto drivetrain_message = drivetrain_position_sender_.MakeMessage();
Brian Silvermanc71537c2016-01-01 13:43:14 -080086 drivetrain_message->right_encoder =
87 drivetrain_translate(drivetrain_right_encoder_->GetRaw());
88 drivetrain_message->left_encoder =
89 -drivetrain_translate(drivetrain_left_encoder_->GetRaw());
90 drivetrain_message->left_speed =
91 drivetrain_velocity_translate(drivetrain_left_encoder_->GetPeriod());
92 drivetrain_message->right_speed =
93 drivetrain_velocity_translate(drivetrain_right_encoder_->GetPeriod());
94
95 drivetrain_message.Send();
96 }
97
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070098 accessories_position_sender_.MakeMessage().Send();
Brian Silvermanc71537c2016-01-01 13:43:14 -080099 }
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700100
101 private:
102 ::aos::Sender<::aos::control_loops::Position> accessories_position_sender_;
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700103 ::aos::Sender<::frc971::control_loops::DrivetrainQueue::Position>
104 drivetrain_position_sender_;
Brian Silvermanc71537c2016-01-01 13:43:14 -0800105};
106
107class SolenoidWriter {
108 public:
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700109 SolenoidWriter(::aos::EventLoop *event_loop,
110 const ::std::unique_ptr<::frc971::wpilib::BufferedPcm> &pcm)
111 : event_loop_(event_loop),
112 pcm_(pcm),
113 drivetrain_fetcher_(
114 event_loop_
115 ->MakeFetcher<::frc971::control_loops::DrivetrainQueue::Output>(
116 ".y2012.control_loops.drivetrain_queue.output")),
117 accessories_fetcher_(event_loop_->MakeFetcher<
118 ::y2012::control_loops::AccessoriesQueue::Message>(
119 ".y2012.control_loops.accessories_queue.output")) {
120 event_loop_->set_name("Solenoids");
121 event_loop_->SetRuntimeRealtimePriority(27);
122
123 event_loop_->AddPhasedLoop([this](int iterations) { Loop(iterations); },
124 ::std::chrono::milliseconds(20),
125 ::std::chrono::milliseconds(1));
126 }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800127
128 void set_drivetrain_high(
129 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
130 drivetrain_high_ = ::std::move(s);
131 }
132
133 void set_drivetrain_low(
134 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
135 drivetrain_low_ = ::std::move(s);
136 }
137
138 void set_s1(::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
139 s1_ = ::std::move(s);
140 }
141
142 void set_s2(::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
143 s2_ = ::std::move(s);
144 }
145
146 void set_s3(::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
147 s3_ = ::std::move(s);
148 }
149
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700150 void Loop(const int iterations) {
151 if (iterations != 1) {
152 LOG(DEBUG, "Solenoids skipped %d iterations\n", iterations - 1);
153 }
Brian Silverman5090c432016-01-02 14:44:26 -0800154
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700155 {
156 accessories_fetcher_.Fetch();
157 if (accessories_fetcher_.get()) {
158 LOG_STRUCT(DEBUG, "solenoids", *accessories_fetcher_);
159 s1_->Set(accessories_fetcher_->solenoids[0]);
160 s2_->Set(accessories_fetcher_->solenoids[1]);
161 s3_->Set(accessories_fetcher_->solenoids[2]);
Brian Silverman5090c432016-01-02 14:44:26 -0800162 }
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700163 }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800164
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700165 {
166 drivetrain_fetcher_.Fetch();
167 if (drivetrain_fetcher_.get()) {
168 LOG_STRUCT(DEBUG, "solenoids", *drivetrain_fetcher_);
169 const bool high =
170 drivetrain_fetcher_->left_high || drivetrain_fetcher_->right_high;
171 drivetrain_high_->Set(high);
172 drivetrain_low_->Set(!high);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800173 }
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700174 }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800175
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700176 {
177 ::frc971::wpilib::PneumaticsToLog to_log;
178 pcm_->Flush();
179 to_log.read_solenoids = pcm_->GetAll();
180 LOG_STRUCT(DEBUG, "pneumatics info", to_log);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800181 }
182 }
183
Brian Silvermanc71537c2016-01-01 13:43:14 -0800184 private:
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700185 ::aos::EventLoop *event_loop_;
186
Brian Silvermanc71537c2016-01-01 13:43:14 -0800187 const ::std::unique_ptr<::frc971::wpilib::BufferedPcm> &pcm_;
188
189 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> drivetrain_high_;
190 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> drivetrain_low_;
191 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s1_, s2_, s3_;
192
193 ::std::unique_ptr<Compressor> compressor_;
194
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700195 ::aos::Fetcher<::frc971::control_loops::DrivetrainQueue::Output>
196 drivetrain_fetcher_;
197 ::aos::Fetcher<::y2012::control_loops::AccessoriesQueue::Message>
198 accessories_fetcher_;
Brian Silvermanc71537c2016-01-01 13:43:14 -0800199};
200
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700201class AccessoriesWriter
202 : public ::frc971::wpilib::LoopOutputHandler<AccessoriesQueue::Message> {
Brian Silvermanc71537c2016-01-01 13:43:14 -0800203 public:
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800204 AccessoriesWriter(::aos::EventLoop *event_loop)
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700205 : ::frc971::wpilib::LoopOutputHandler<AccessoriesQueue::Message>(
206 event_loop, ".y2012.control_loops.accessories_queue.output") {}
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800207
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700208 void set_talon1(::std::unique_ptr<Talon> t) { talon1_ = ::std::move(t); }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800209
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700210 void set_talon2(::std::unique_ptr<Talon> t) { talon2_ = ::std::move(t); }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800211
212 private:
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700213 virtual void Write(const AccessoriesQueue::Message &output) override {
214 talon1_->SetSpeed(output.sticks[0]);
215 talon2_->SetSpeed(output.sticks[1]);
216 LOG_STRUCT(DEBUG, "will output", output);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800217 }
218
219 virtual void Stop() override {
220 LOG(WARNING, "shooter output too old\n");
Brian Silverman6eaa2d82017-02-04 20:48:30 -0800221 talon1_->SetDisabled();
222 talon2_->SetDisabled();
Brian Silvermanc71537c2016-01-01 13:43:14 -0800223 }
224
225 ::std::unique_ptr<Talon> talon1_, talon2_;
226};
227
Brian Silverman5090c432016-01-02 14:44:26 -0800228class WPILibRobot : public ::frc971::wpilib::WPILibRobotBase {
Brian Silvermanc71537c2016-01-01 13:43:14 -0800229 public:
230 ::std::unique_ptr<Encoder> make_encoder(int index) {
231 return make_unique<Encoder>(10 + index * 2, 11 + index * 2, false,
232 Encoder::k4X);
233 }
234
Brian Silverman5090c432016-01-02 14:44:26 -0800235 void Run() override {
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700236 // Thread 1.
237 ::aos::ShmEventLoop joystick_sender_event_loop;
238 ::frc971::wpilib::JoystickSender joystick_sender(
239 &joystick_sender_event_loop);
240 AddLoop(&joystick_sender_event_loop);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800241
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700242 // Thread 2.
243 ::aos::ShmEventLoop sensor_reader_event_loop;
244 SensorReader sensor_reader(&sensor_reader_event_loop);
245 sensor_reader.set_drivetrain_left_encoder(make_encoder(0));
246 sensor_reader.set_drivetrain_right_encoder(make_encoder(1));
247 AddLoop(&sensor_reader_event_loop);
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800248
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700249 // Thread 3.
250 ::aos::ShmEventLoop output_event_loop;
251 ::frc971::wpilib::DrivetrainWriter drivetrain_writer(&output_event_loop);
Sabina Davise33f59a2019-02-03 01:17:45 -0800252 drivetrain_writer.set_left_controller0(
253 ::std::unique_ptr<Talon>(new Talon(3)), true);
254 drivetrain_writer.set_right_controller0(
255 ::std::unique_ptr<Talon>(new Talon(4)), false);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800256
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700257 ::y2012::wpilib::AccessoriesWriter accessories_writer(&output_event_loop);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800258 accessories_writer.set_talon1(::std::unique_ptr<Talon>(new Talon(5)));
259 accessories_writer.set_talon2(::std::unique_ptr<Talon>(new Talon(6)));
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700260 AddLoop(&output_event_loop);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800261
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700262 // Thread 4.
263 ::aos::ShmEventLoop solenoid_writer_event_loop;
Brian Silvermanc71537c2016-01-01 13:43:14 -0800264 ::std::unique_ptr<::frc971::wpilib::BufferedPcm> pcm(
265 new ::frc971::wpilib::BufferedPcm());
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700266 SolenoidWriter solenoid_writer(&solenoid_writer_event_loop, pcm);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800267 solenoid_writer.set_drivetrain_high(pcm->MakeSolenoid(0));
268 solenoid_writer.set_drivetrain_low(pcm->MakeSolenoid(2));
269 solenoid_writer.set_s1(pcm->MakeSolenoid(1));
270 solenoid_writer.set_s2(pcm->MakeSolenoid(3));
271 solenoid_writer.set_s3(pcm->MakeSolenoid(4));
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700272 AddLoop(&solenoid_writer_event_loop);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800273
Austin Schuhbd1fe9c2019-06-29 16:35:48 -0700274 RunLoops();
Brian Silvermanc71537c2016-01-01 13:43:14 -0800275 }
276};
277
278} // namespace wpilib
279} // namespace y2012
280
281
Brian Silverman5090c432016-01-02 14:44:26 -0800282AOS_ROBOT_CLASS(::y2012::wpilib::WPILibRobot);