blob: 59ceac589b3dd494b4cc5132f66b63a31f99ceaa [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 Schuh2a671df2016-11-26 15:00:06 -080051using ::frc971::control_loops::drivetrain_queue;
Brian Silvermanc71537c2016-01-01 13:43:14 -080052using ::y2012::control_loops::accessories_queue;
Parker Schuhd3b7a8872018-02-19 16:42:27 -080053using namespace frc;
Brian Silvermanf819b442019-01-20 16:51:04 -080054using aos::make_unique;
Brian Silvermanc71537c2016-01-01 13:43:14 -080055
56namespace y2012 {
57namespace wpilib {
58
Brian Silvermanc71537c2016-01-01 13:43:14 -080059double drivetrain_translate(int32_t in) {
60 return -static_cast<double>(in) /
61 (256.0 /*cpr*/ * 4.0 /*4x*/) *
62 1 *
63 (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI) * 2.0 / 2.0;
64}
65
66double drivetrain_velocity_translate(double in) {
67 return (1.0 / in) / 256.0 /*cpr*/ *
68 1 *
69 (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI) * 2.0 / 2.0;
70}
71
Austin Schuh45a549f2019-02-02 15:43:56 -080072class SensorReader : public ::frc971::wpilib::SensorReader {
Brian Silvermanc71537c2016-01-01 13:43:14 -080073 public:
Austin Schuhdf6cbb12019-02-02 13:46:52 -080074 SensorReader(::aos::EventLoop *event_loop)
75 : ::frc971::wpilib::SensorReader(event_loop) {}
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 {
79 auto drivetrain_message = drivetrain_queue.position.MakeMessage();
80 drivetrain_message->right_encoder =
81 drivetrain_translate(drivetrain_right_encoder_->GetRaw());
82 drivetrain_message->left_encoder =
83 -drivetrain_translate(drivetrain_left_encoder_->GetRaw());
84 drivetrain_message->left_speed =
85 drivetrain_velocity_translate(drivetrain_left_encoder_->GetPeriod());
86 drivetrain_message->right_speed =
87 drivetrain_velocity_translate(drivetrain_right_encoder_->GetPeriod());
88
89 drivetrain_message.Send();
90 }
91
92 accessories_queue.position.MakeMessage().Send();
93 }
Brian Silvermanc71537c2016-01-01 13:43:14 -080094};
95
96class SolenoidWriter {
97 public:
98 SolenoidWriter(const ::std::unique_ptr<::frc971::wpilib::BufferedPcm> &pcm)
99 : pcm_(pcm),
100 drivetrain_(".y2012.control_loops.drivetrain_queue.output"),
101 accessories_(".y2012.control_loops.accessories_queue.output") {}
102
103 void set_drivetrain_high(
104 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
105 drivetrain_high_ = ::std::move(s);
106 }
107
108 void set_drivetrain_low(
109 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
110 drivetrain_low_ = ::std::move(s);
111 }
112
113 void set_s1(::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
114 s1_ = ::std::move(s);
115 }
116
117 void set_s2(::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
118 s2_ = ::std::move(s);
119 }
120
121 void set_s3(::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s) {
122 s3_ = ::std::move(s);
123 }
124
125 void operator()() {
126 ::aos::SetCurrentThreadName("Solenoids");
Brian Silverman5090c432016-01-02 14:44:26 -0800127 ::aos::SetCurrentThreadRealtimePriority(27);
128
Austin Schuh8aec1ed2016-05-01 13:29:20 -0700129 ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(20),
Austin Schuhd32b3622019-06-23 18:49:06 -0700130 ::aos::monotonic_clock::now(),
Austin Schuh8aec1ed2016-05-01 13:29:20 -0700131 ::std::chrono::milliseconds(1));
Brian Silvermanc71537c2016-01-01 13:43:14 -0800132
133 while (run_) {
Brian Silverman5090c432016-01-02 14:44:26 -0800134 {
135 const int iterations = phased_loop.SleepUntilNext();
136 if (iterations != 1) {
137 LOG(DEBUG, "Solenoids skipped %d iterations\n", iterations - 1);
138 }
139 }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800140
141 {
142 accessories_.FetchLatest();
143 if (accessories_.get()) {
144 LOG_STRUCT(DEBUG, "solenoids", *accessories_);
145 s1_->Set(accessories_->solenoids[0]);
146 s2_->Set(accessories_->solenoids[1]);
147 s3_->Set(accessories_->solenoids[2]);
148 }
149 }
150
151 {
152 drivetrain_.FetchLatest();
153 if (drivetrain_.get()) {
154 LOG_STRUCT(DEBUG, "solenoids", *drivetrain_);
155 const bool high = drivetrain_->left_high || drivetrain_->right_high;
156 drivetrain_high_->Set(high);
157 drivetrain_low_->Set(!high);
158 }
159 }
160
161 {
162 ::frc971::wpilib::PneumaticsToLog to_log;
163 pcm_->Flush();
164 to_log.read_solenoids = pcm_->GetAll();
165 LOG_STRUCT(DEBUG, "pneumatics info", to_log);
166 }
167 }
168 }
169
170 void Quit() { run_ = false; }
171
172 private:
173 const ::std::unique_ptr<::frc971::wpilib::BufferedPcm> &pcm_;
174
175 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> drivetrain_high_;
176 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> drivetrain_low_;
177 ::std::unique_ptr<::frc971::wpilib::BufferedSolenoid> s1_, s2_, s3_;
178
179 ::std::unique_ptr<Compressor> compressor_;
180
Austin Schuh2a671df2016-11-26 15:00:06 -0800181 ::aos::Queue<::frc971::control_loops::DrivetrainQueue::Output> drivetrain_;
Brian Silvermanc71537c2016-01-01 13:43:14 -0800182 ::aos::Queue<::y2012::control_loops::AccessoriesQueue::Message> accessories_;
183
184 ::std::atomic<bool> run_{true};
185};
186
Brian Silvermanc71537c2016-01-01 13:43:14 -0800187class AccessoriesWriter : public ::frc971::wpilib::LoopOutputHandler {
188 public:
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800189 AccessoriesWriter(::aos::EventLoop *event_loop)
190 : ::frc971::wpilib::LoopOutputHandler(event_loop) {}
191
Brian Silvermanc71537c2016-01-01 13:43:14 -0800192 void set_talon1(::std::unique_ptr<Talon> t) {
193 talon1_ = ::std::move(t);
194 }
195
196 void set_talon2(::std::unique_ptr<Talon> t) {
197 talon2_ = ::std::move(t);
198 }
199
200 private:
201 virtual void Read() override {
202 ::y2012::control_loops::accessories_queue.output.FetchAnother();
203 }
204
205 virtual void Write() override {
206 auto &queue = ::y2012::control_loops::accessories_queue.output;
Brian Silverman6eaa2d82017-02-04 20:48:30 -0800207 talon1_->SetSpeed(queue->sticks[0]);
208 talon2_->SetSpeed(queue->sticks[1]);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800209 LOG_STRUCT(DEBUG, "will output", *queue);
210 }
211
212 virtual void Stop() override {
213 LOG(WARNING, "shooter output too old\n");
Brian Silverman6eaa2d82017-02-04 20:48:30 -0800214 talon1_->SetDisabled();
215 talon2_->SetDisabled();
Brian Silvermanc71537c2016-01-01 13:43:14 -0800216 }
217
218 ::std::unique_ptr<Talon> talon1_, talon2_;
219};
220
Brian Silverman5090c432016-01-02 14:44:26 -0800221class WPILibRobot : public ::frc971::wpilib::WPILibRobotBase {
Brian Silvermanc71537c2016-01-01 13:43:14 -0800222 public:
223 ::std::unique_ptr<Encoder> make_encoder(int index) {
224 return make_unique<Encoder>(10 + index * 2, 11 + index * 2, false,
225 Encoder::k4X);
226 }
227
Brian Silverman5090c432016-01-02 14:44:26 -0800228 void Run() override {
Brian Silvermanc71537c2016-01-01 13:43:14 -0800229 ::aos::InitNRT();
230 ::aos::SetCurrentThreadName("StartCompetition");
231
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800232 ::aos::ShmEventLoop event_loop;
233
234 ::frc971::wpilib::JoystickSender joystick_sender(&event_loop);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800235 ::std::thread joystick_thread(::std::ref(joystick_sender));
236
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800237 SensorReader reader(&event_loop);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800238
239 reader.set_drivetrain_left_encoder(make_encoder(0));
240 reader.set_drivetrain_right_encoder(make_encoder(1));
241
242 ::std::thread reader_thread(::std::ref(reader));
243
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800244 ::frc971::wpilib::DrivetrainWriter drivetrain_writer(&event_loop);
Sabina Davise33f59a2019-02-03 01:17:45 -0800245 drivetrain_writer.set_left_controller0(
246 ::std::unique_ptr<Talon>(new Talon(3)), true);
247 drivetrain_writer.set_right_controller0(
248 ::std::unique_ptr<Talon>(new Talon(4)), false);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800249 ::std::thread drivetrain_writer_thread(::std::ref(drivetrain_writer));
250
Austin Schuhdf6cbb12019-02-02 13:46:52 -0800251 ::y2012::wpilib::AccessoriesWriter accessories_writer(&event_loop);
Brian Silvermanc71537c2016-01-01 13:43:14 -0800252 accessories_writer.set_talon1(::std::unique_ptr<Talon>(new Talon(5)));
253 accessories_writer.set_talon2(::std::unique_ptr<Talon>(new Talon(6)));
254 ::std::thread accessories_writer_thread(::std::ref(accessories_writer));
255
256 ::std::unique_ptr<::frc971::wpilib::BufferedPcm> pcm(
257 new ::frc971::wpilib::BufferedPcm());
258 SolenoidWriter solenoid_writer(pcm);
259 solenoid_writer.set_drivetrain_high(pcm->MakeSolenoid(0));
260 solenoid_writer.set_drivetrain_low(pcm->MakeSolenoid(2));
261 solenoid_writer.set_s1(pcm->MakeSolenoid(1));
262 solenoid_writer.set_s2(pcm->MakeSolenoid(3));
263 solenoid_writer.set_s3(pcm->MakeSolenoid(4));
264
265 ::std::thread solenoid_thread(::std::ref(solenoid_writer));
266
267 // Wait forever. Not much else to do...
Brian Silverman5090c432016-01-02 14:44:26 -0800268 while (true) {
269 const int r = select(0, nullptr, nullptr, nullptr, nullptr);
270 if (r != 0) {
271 PLOG(WARNING, "infinite select failed");
272 } else {
273 PLOG(WARNING, "infinite select succeeded??\n");
274 }
275 }
Brian Silvermanc71537c2016-01-01 13:43:14 -0800276
277 LOG(ERROR, "Exiting WPILibRobot\n");
278
279 joystick_sender.Quit();
280 joystick_thread.join();
281 reader.Quit();
282 reader_thread.join();
283
284 drivetrain_writer.Quit();
285 drivetrain_writer_thread.join();
286 accessories_writer.Quit();
287 accessories_writer_thread.join();
288
289 ::aos::Cleanup();
290 }
291};
292
293} // namespace wpilib
294} // namespace y2012
295
296
Brian Silverman5090c432016-01-02 14:44:26 -0800297AOS_ROBOT_CLASS(::y2012::wpilib::WPILibRobot);