blob: eea1c3070440e1f8107265c771ce3d0770631fee [file] [log] [blame]
Brian Silvermand9566392018-06-10 15:02:03 -07001#ifndef MOTORS_MOTOR_CONTROLS_H_
2#define MOTORS_MOTOR_CONTROLS_H_
3
4#include <array>
5#include <complex>
6
7#include "motors/math.h"
8#include "motors/motor.h"
9
10#include "Eigen/Dense"
11
12namespace frc971 {
13namespace motors {
14
15class MotorControlsImplementation : public MotorControls {
16 public:
17 template <int kRows, int kCols>
18 using ComplexMatrix = ::Eigen::Matrix<::std::complex<float>, kRows, kCols>;
19
20 MotorControlsImplementation();
21 ~MotorControlsImplementation() override = default;
22
James Kuszmaul998d3032018-09-08 15:41:41 -070023 void Reset() override {
24 estimated_velocity_ = 0;
25 filtered_current_ = 0;
26 }
27
28 static constexpr int constant_counts_per_revolution() { return 2048; }
Brian Silvermand9566392018-06-10 15:02:03 -070029
30 int mechanical_counts_per_revolution() const override {
31 return constant_counts_per_revolution();
32 }
33 int electrical_counts_per_revolution() const override {
34 return constant_counts_per_revolution();
35 }
James Kuszmaul998d3032018-09-08 15:41:41 -070036 float scale_current_reading(float reading) const override { return reading; }
Brian Silvermand9566392018-06-10 15:02:03 -070037
James Kuszmaul998d3032018-09-08 15:41:41 -070038 ::std::array<float, 3> DoIteration(const float raw_currents[3],
39 uint32_t theta,
40 const float command_current) override;
Brian Silvermand9566392018-06-10 15:02:03 -070041
42 int16_t Debug(uint32_t theta) override;
43
44 float estimated_velocity() const override { return estimated_velocity_; }
45
James Kuszmaul998d3032018-09-08 15:41:41 -070046 int16_t i_goal(size_t ii) const override {
47 return static_cast<int16_t>(I_last_[ii] * 10.0f);
48 }
49
James Kuszmaul521eb652018-10-17 19:09:33 -070050 float overall_measured_current() const { return overall_measured_current_; }
51
Brian Silvermand9566392018-06-10 15:02:03 -070052 private:
53 const ComplexMatrix<3, 1> E1Unrotated_, E2Unrotated_;
54
55 float estimated_velocity_ = 0;
56 float filtered_current_ = 0;
James Kuszmaul521eb652018-10-17 19:09:33 -070057 float overall_measured_current_ = 0;
Brian Silvermand9566392018-06-10 15:02:03 -070058
59 ::Eigen::Matrix<float, 3, 1> I_last_ = ::Eigen::Matrix<float, 3, 1>::Zero();
James Kuszmaul521eb652018-10-17 19:09:33 -070060 ::Eigen::Matrix<float, 3, 1> I_prev_ =
61 ::Eigen::Matrix<float, 3, 1>::Zero();
Brian Silvermand9566392018-06-10 15:02:03 -070062
63 int16_t debug_[9];
64};
65
66} // namespace motors
67} // namespace frc971
68
69#endif // MOTORS_MOTOR_CONTROLS_H_