blob: 195b5a349dd58a9896188d73e8831cb3465f8fb0 [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"
Alex Perrycb7da4b2019-08-28 19:35:56 -07005#include "frc971/control_loops/drivetrain/drivetrain_output_generated.h"
Sabina Davisd004fd62019-02-02 23:51:46 -08006#include "frc971/wpilib/ahal/PWM.h"
7#include "frc971/wpilib/loop_output_handler.h"
8
9namespace frc971 {
10namespace wpilib {
11
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070012class DrivetrainWriter : public ::frc971::wpilib::LoopOutputHandler<
Alex Perrycb7da4b2019-08-28 19:35:56 -070013 ::frc971::control_loops::drivetrain::Output> {
Sabina Davisd004fd62019-02-02 23:51:46 -080014 public:
Austin Schuh5229c7e2021-01-23 13:37:36 -080015 static constexpr double kMaxBringupPower = 12.0;
16
Austin Schuhdf6cbb12019-02-02 13:46:52 -080017 DrivetrainWriter(::aos::EventLoop *event_loop)
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070018 : ::frc971::wpilib::LoopOutputHandler<
Alex Perrycb7da4b2019-08-28 19:35:56 -070019 ::frc971::control_loops::drivetrain::Output>(event_loop,
20 "/drivetrain") {}
Austin Schuhdf6cbb12019-02-02 13:46:52 -080021
Sabina Davisd004fd62019-02-02 23:51:46 -080022 void set_left_controller0(::std::unique_ptr<::frc::PWM> t, bool reversed) {
23 left_controller0_ = ::std::move(t);
24 reversed_left0_ = reversed;
25 }
26
27 void set_right_controller0(::std::unique_ptr<::frc::PWM> t, bool reversed) {
28 right_controller0_ = ::std::move(t);
29 reversed_right0_ = reversed;
30 }
31
32 void set_left_controller1(::std::unique_ptr<::frc::PWM> t, bool reversed) {
33 left_controller1_ = ::std::move(t);
34 reversed_left1_ = reversed;
35 }
36
37 void set_right_controller1(::std::unique_ptr<::frc::PWM> t, bool reversed) {
38 right_controller1_ = ::std::move(t);
39 reversed_right1_ = reversed;
40 }
41
42 private:
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070043 void Write(
Alex Perrycb7da4b2019-08-28 19:35:56 -070044 const ::frc971::control_loops::drivetrain::Output &output) override;
Sabina Davisd004fd62019-02-02 23:51:46 -080045 void Stop() override;
46
47 double SafeSpeed(bool reversed, double voltage) {
Austin Schuh5229c7e2021-01-23 13:37:36 -080048 return (::aos::Clip((reversed ? -1.0 : 1.0) * voltage, -kMaxBringupPower,
49 kMaxBringupPower) /
50 12.0);
Sabina Davisd004fd62019-02-02 23:51:46 -080051 }
52
53 ::std::unique_ptr<::frc::PWM> left_controller0_, right_controller0_,
54 left_controller1_, right_controller1_;
55
56 bool reversed_right0_, reversed_left0_, reversed_right1_, reversed_left1_;
57};
58
59} // namespace wpilib
60} // namespace frc971
61
62#endif // FRC971_WPILIB_DRIVETRAIN_WRITER_H_