blob: a9541b75982012dae26eafaa4a8bf6c1e74aa65a [file] [log] [blame]
Comran Morshed5323ecb2015-12-26 20:50:55 +00001#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_H_
2#define FRC971_CONTROL_LOOPS_DRIVETRAIN_H_
3
4#include "Eigen/Dense"
5
Comran Morshed5323ecb2015-12-26 20:50:55 +00006#include "aos/common/controls/control_loop.h"
7#include "aos/common/controls/polytope.h"
Austin Schuh093535c2016-03-05 23:21:00 -08008#include "aos/common/controls/polytope.h"
9#include "aos/common/util/log_interval.h"
Comran Morshed5323ecb2015-12-26 20:50:55 +000010#include "frc971/control_loops/drivetrain/drivetrain.q.h"
Austin Schuh093535c2016-03-05 23:21:00 -080011#include "frc971/control_loops/drivetrain/drivetrain_config.h"
12#include "frc971/control_loops/drivetrain/gear.h"
Comran Morshed5323ecb2015-12-26 20:50:55 +000013#include "frc971/control_loops/drivetrain/polydrivetrain.h"
14#include "frc971/control_loops/drivetrain/ssdrivetrain.h"
Comran Morshed5323ecb2015-12-26 20:50:55 +000015
16namespace frc971 {
17namespace control_loops {
18namespace drivetrain {
19
20class DrivetrainLoop : public aos::controls::ControlLoop<
21 ::frc971::control_loops::DrivetrainQueue> {
22 public:
23 // Constructs a control loop which can take a Drivetrain or defaults to the
24 // drivetrain at frc971::control_loops::drivetrain
Adam Snaiderbc918b62016-02-27 21:03:39 -080025 explicit DrivetrainLoop(
26 const DrivetrainConfig &dt_config,
Comran Morshed5323ecb2015-12-26 20:50:55 +000027 ::frc971::control_loops::DrivetrainQueue *my_drivetrain =
28 &::frc971::control_loops::drivetrain_queue);
29
Austin Schuh093535c2016-03-05 23:21:00 -080030 int ControllerIndexFromGears();
31
Comran Morshed5323ecb2015-12-26 20:50:55 +000032 protected:
33 // Executes one cycle of the control loop.
Adam Snaiderbc918b62016-02-27 21:03:39 -080034 void RunIteration(
Comran Morshed5323ecb2015-12-26 20:50:55 +000035 const ::frc971::control_loops::DrivetrainQueue::Goal *goal,
36 const ::frc971::control_loops::DrivetrainQueue::Position *position,
37 ::frc971::control_loops::DrivetrainQueue::Output *output,
Adam Snaiderbc918b62016-02-27 21:03:39 -080038 ::frc971::control_loops::DrivetrainQueue::Status *status) override;
39
40 void Zero(::frc971::control_loops::DrivetrainQueue::Output *output) override;
Comran Morshed5323ecb2015-12-26 20:50:55 +000041
Comran Morshed5323ecb2015-12-26 20:50:55 +000042 double last_gyro_heading_ = 0.0;
43 double last_gyro_rate_ = 0.0;
44
45 const DrivetrainConfig dt_config_;
46
Comran Morshed5323ecb2015-12-26 20:50:55 +000047 StateFeedbackLoop<7, 2, 3> kf_;
Austin Schuh41565602016-02-28 20:10:49 -080048 PolyDrivetrain dt_openloop_;
49 DrivetrainMotorsSS dt_closedloop_;
Comran Morshed5323ecb2015-12-26 20:50:55 +000050
Austin Schuh093535c2016-03-05 23:21:00 -080051 // Current gears for each drive side.
52 Gear left_gear_;
53 Gear right_gear_;
54
Comran Morshed5323ecb2015-12-26 20:50:55 +000055 double last_left_voltage_ = 0;
56 double last_right_voltage_ = 0;
57
58 double integrated_kf_heading_ = 0;
Austin Schuh093535c2016-03-05 23:21:00 -080059
60 bool left_high_requested_;
61 bool right_high_requested_;
Comran Morshed5323ecb2015-12-26 20:50:55 +000062};
63
64} // namespace drivetrain
65} // namespace control_loops
66} // namespace frc971
67
68#endif // FRC971_CONTROL_LOOPS_DRIVETRAIN_H_