blob: 8f0f1f09f90722ea8111f8354cafdd48fb3bb3b1 [file] [log] [blame]
Maxwell Hendersonf29e3182023-05-25 06:51:24 -07001#ifndef FRC971_WPILIB_FALCON_H_
2#define FRC971_WPILIB_FALCON_H_
3
4#include <chrono>
5#include <cinttypes>
6#include <vector>
7
Maxwell Hendersonfcc0d122023-08-05 17:03:34 -07008#include "ctre/phoenix6/TalonFX.hpp"
Maxwell Hendersonf29e3182023-05-25 06:51:24 -07009#include "glog/logging.h"
10
Maxwell Hendersonf8c96892023-06-28 19:55:59 -070011#include "aos/commonmath.h"
Maxwell Hendersonf29e3182023-05-25 06:51:24 -070012#include "aos/init.h"
13#include "aos/logging/logging.h"
14#include "frc971/control_loops/drivetrain/drivetrain_can_position_generated.h"
15
16namespace control_loops = ::frc971::control_loops;
17
18namespace frc971 {
19namespace wpilib {
20
21static constexpr units::frequency::hertz_t kCANUpdateFreqHz = 200_Hz;
Maxwell Hendersonf8c96892023-06-28 19:55:59 -070022static constexpr double kMaxBringupPower = 12.0;
Maxwell Hendersonf29e3182023-05-25 06:51:24 -070023
24// Gets info from and writes to falcon motors using the TalonFX controller.
25class Falcon {
26 public:
27 Falcon(int device_id, std::string canbus,
Maxwell Hendersonfcc0d122023-08-05 17:03:34 -070028 std::vector<ctre::phoenix6::BaseStatusSignal *> *signals,
Maxwell Hendersonf29e3182023-05-25 06:51:24 -070029 double stator_current_limit, double supply_current_limit);
30
31 void PrintConfigs();
32
Maxwell Hendersonfcc0d122023-08-05 17:03:34 -070033 void WriteConfigs(ctre::phoenix6::signals::InvertedValue invert);
Maxwell Hendersonf8c96892023-06-28 19:55:59 -070034 ctre::phoenix::StatusCode WriteCurrent(double current, double max_voltage);
Maxwell Hendersonf29e3182023-05-25 06:51:24 -070035
Maxwell Hendersonfcc0d122023-08-05 17:03:34 -070036 ctre::phoenix6::hardware::TalonFX *talon() { return &talon_; }
Maxwell Hendersonf29e3182023-05-25 06:51:24 -070037
38 void SerializePosition(flatbuffers::FlatBufferBuilder *fbb);
39
40 std::optional<flatbuffers::Offset<control_loops::CANFalcon>> TakeOffset();
41
42 int device_id() const { return device_id_; }
43 float device_temp() const { return device_temp_.GetValue().value(); }
44 float supply_voltage() const { return supply_voltage_.GetValue().value(); }
45 float supply_current() const { return supply_current_.GetValue().value(); }
46 float torque_current() const { return torque_current_.GetValue().value(); }
47 float duty_cycle() const { return duty_cycle_.GetValue().value(); }
48 float position() const {
49 return static_cast<units::angle::radian_t>(position_.GetValue()).value();
50 }
51
52 // returns the monotonic timestamp of the latest timesynced reading in the
53 // timebase of the the syncronized CAN bus clock.
54 int64_t GetTimestamp() {
55 std::chrono::nanoseconds latest_timestamp =
56 torque_current_.GetTimestamp().GetTime();
57
58 return latest_timestamp.count();
59 }
60
61 void RefreshNontimesyncedSignals() { device_temp_.Refresh(); };
62
63 void set_stator_current_limit(double stator_current_limit) {
64 stator_current_limit_ = stator_current_limit;
65 }
66
67 void set_supply_current_limit(double supply_current_limit) {
68 supply_current_limit_ = supply_current_limit;
69 }
70
71 private:
Maxwell Hendersonfcc0d122023-08-05 17:03:34 -070072 ctre::phoenix6::hardware::TalonFX talon_;
Maxwell Hendersonf29e3182023-05-25 06:51:24 -070073 int device_id_;
74
Maxwell Hendersonfcc0d122023-08-05 17:03:34 -070075 ctre::phoenix6::signals::InvertedValue inverted_;
Maxwell Hendersonf29e3182023-05-25 06:51:24 -070076
Maxwell Hendersonfcc0d122023-08-05 17:03:34 -070077 ctre::phoenix6::StatusSignal<units::temperature::celsius_t> device_temp_;
78 ctre::phoenix6::StatusSignal<units::voltage::volt_t> supply_voltage_;
79 ctre::phoenix6::StatusSignal<units::current::ampere_t> supply_current_,
Maxwell Hendersonf29e3182023-05-25 06:51:24 -070080 torque_current_;
Maxwell Hendersonfcc0d122023-08-05 17:03:34 -070081 ctre::phoenix6::StatusSignal<units::angle::turn_t> position_;
82 ctre::phoenix6::StatusSignal<units::dimensionless::scalar_t> duty_cycle_;
Maxwell Hendersonf29e3182023-05-25 06:51:24 -070083
84 double stator_current_limit_;
85 double supply_current_limit_;
86
87 std::optional<flatbuffers::Offset<control_loops::CANFalcon>>
88 last_position_offset_;
89};
90} // namespace wpilib
91} // namespace frc971
92#endif // FRC971_WPILIB_FALCON_H_