blob: 939723068b3b4f7b179c83e1916c1ba7b4b7e0d7 [file] [log] [blame]
Sabina Davisd004fd62019-02-02 23:51:46 -08001#ifndef FRC971_WPILIB_DRIVETRAIN_WRITER_H_
2#define FRC971_WPILIB_DRIVETRAIN_WRITER_H_
3
4#include "aos/commonmath.h"
5
Austin Schuhbd1fe9c2019-06-29 16:35:48 -07006#include "frc971/control_loops/drivetrain/drivetrain.q.h"
Sabina Davisd004fd62019-02-02 23:51:46 -08007#include "frc971/wpilib/ahal/PWM.h"
8#include "frc971/wpilib/loop_output_handler.h"
9
10namespace frc971 {
11namespace wpilib {
12
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070013class DrivetrainWriter : public ::frc971::wpilib::LoopOutputHandler<
14 ::frc971::control_loops::DrivetrainQueue::Output> {
Sabina Davisd004fd62019-02-02 23:51:46 -080015 public:
Austin Schuhdf6cbb12019-02-02 13:46:52 -080016 DrivetrainWriter(::aos::EventLoop *event_loop)
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070017 : ::frc971::wpilib::LoopOutputHandler<
18 ::frc971::control_loops::DrivetrainQueue::Output>(
19 event_loop, ".frc971.control_loops.drivetrain_queue.output") {}
Austin Schuhdf6cbb12019-02-02 13:46:52 -080020
Sabina Davisd004fd62019-02-02 23:51:46 -080021 void set_left_controller0(::std::unique_ptr<::frc::PWM> t, bool reversed) {
22 left_controller0_ = ::std::move(t);
23 reversed_left0_ = reversed;
24 }
25
26 void set_right_controller0(::std::unique_ptr<::frc::PWM> t, bool reversed) {
27 right_controller0_ = ::std::move(t);
28 reversed_right0_ = reversed;
29 }
30
31 void set_left_controller1(::std::unique_ptr<::frc::PWM> t, bool reversed) {
32 left_controller1_ = ::std::move(t);
33 reversed_left1_ = reversed;
34 }
35
36 void set_right_controller1(::std::unique_ptr<::frc::PWM> t, bool reversed) {
37 right_controller1_ = ::std::move(t);
38 reversed_right1_ = reversed;
39 }
40
41 private:
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070042 void Write(
43 const ::frc971::control_loops::DrivetrainQueue::Output &output) override;
Sabina Davisd004fd62019-02-02 23:51:46 -080044 void Stop() override;
45
46 double SafeSpeed(bool reversed, double voltage) {
47 return (::aos::Clip((reversed ? -1.0 : 1.0) * voltage, -12.0, 12.0) /
48 12.0);
49 }
50
51 ::std::unique_ptr<::frc::PWM> left_controller0_, right_controller0_,
52 left_controller1_, right_controller1_;
53
54 bool reversed_right0_, reversed_left0_, reversed_right1_, reversed_left1_;
55};
56
57} // namespace wpilib
58} // namespace frc971
59
60#endif // FRC971_WPILIB_DRIVETRAIN_WRITER_H_