13 using key_type = std::string;
20 std::chrono::steady_clock::duration control_time {std::chrono::milliseconds{1}};
21 std::chrono::steady_clock::duration offline_timeout {std::chrono::milliseconds{100}};
23 fp32 encoder_counts_per_turn {65535.f};
25 fp32 speed_rad_per_count {0.f};
27 const std::string& key()
const {
return name; }
30 static bool valid_configuration(
const info_type& info) {
31 const auto& pid = info.pid_params;
32 return !info.name.empty() && !info.can_name.empty() && info.id >= 1 && info.id <= 32
33 && std::isfinite(info.radius) && info.radius > 0.f
34 && std::isfinite(info.encoder_counts_per_turn) && info.encoder_counts_per_turn >= 1.f
35 && info.encoder_counts_per_turn <= 65536.f
36 && std::isfinite(info.speed_rad_per_count) && info.speed_rad_per_count > 0.f
37 && info.speed_rad_per_count <= std::numeric_limits<fp32>::max() / 32768.f
38 && (info.direction == 1 || info.direction == -1)
39 && info.control_time > std::chrono::steady_clock::duration::zero()
40 && info.offline_timeout >= info.control_time
41 && std::isfinite(pid.kp) && std::isfinite(pid.ki) && std::isfinite(pid.kd)
42 && std::isfinite(pid.max_out) && pid.max_out > 0.f && pid.max_out <= 32767.f
43 && std::isfinite(pid.max_iout) && pid.max_iout >= 0.f && pid.max_iout <= pid.max_out;
45 explicit m9025(
const info_type& info);
48 std::string desc()
const {
return std::format(
"M9025 motor {} on {}", info_.name, info_.can_name); }
57 bool supports_current_control()
const override {
return true; }
58 fp32 requested_current()
const override {
return enabled_ && !
offline() ? current_ : 0.f; }
59 fp32 max_current()
const override {
return std::min(info_.pid_params.max_out, 32767.f); }
60 fp32 target_angle_speed()
const override {
return pid_.target(); }
61 void set_output_scale(fp32 scale)
override { output_scale_ = scale; }
62 void set_current_limit(fp32 limit)
override { current_limit_ = limit; }
63 int16_t current()
const {
64 return motor_protocol::gated_current(current_, output_scale_, current_limit_, enabled_, !
offline());
71 fp32 output_scale_ {1.f};
72 fp32 current_limit_ {std::numeric_limits<fp32>::infinity()};
73 bool direct_current_ {
false};
74 bool connected_ {
false};
75 bool started_ {
false};
76 bool enabled_ {
false};