37 m_pid_chain(pid_chain)
40 .or_else([](
const auto& e) {
panic(std::move(e.message)); });
42 (void)manager.
registerMotor(m_driver, Traits::template feedback_id<id>()).or_else([](
const auto& e)
44 panic(std::move(e.message));
47 .
pushOutput(m_driver, Traits::template control_id<id>(), Traits::template control_offset<id>(), 0, 0);
51 this->m_disabled_func(std::move(frame));
52 }).or_else([](
const auto& e)
54 panic(std::move(e.message));
61 (void)manager.
deregisterMotor(m_driver, Traits::template control_id<id>()).or_else([](
const auto& e)
63 panic(std::move(e.message));
67 tl::expected<void, Error> enable()
69 return m_driver.registerCallback({Traits::template feedback_id<id>()}, [
this](
Can::CanFrame&& frame)
71 this->m_enabled_func(std::move(frame));
75 tl::expected<void, Error> disable()
77 return m_driver.registerCallback({Traits::template feedback_id<id>()}, [
this](
Can::CanFrame&& frame)
79 this->m_disabled_func(std::move(frame));
83 void setAngRef(
const float ref)
85 m_ang_ref.store(ref, std::memory_order_release);
88 void setPosRef(
const float ref)
90 m_pos_ref.store(ref, std::memory_order_release);
95 return m_Buffer.readCopy();
99 static constexpr float RPM_2_ANGLE_PER_SEC = 6.0f;
104 auto& [last_ecd, ecd, angle_single_round, angular, real_current, temperature, total_angle, total_round,
105 output_current] = status;
110 angle_single_round = Traits::ecd_to_angle(
static_cast<float>(ecd));
111 angular = RPM_2_ANGLE_PER_SEC *
static_cast<float>(frame.
rpm);
113 if (ecd - last_ecd > 4096)
117 else if (ecd - last_ecd < -4096)
121 total_angle =
static_cast<float>(total_round) * 360 + angle_single_round;
128 trMsgToStatus(msg, this->m_Buffer.write());
129 this->m_Buffer.swap();
134#ifdef CONFIG_OM_DJI_MOTOR_SKIP_N_FRAME
135#if CONFIG_OM_DJI_MOTOR_SKIP_N_FRAME != 0
136 if (m_skip_frame++ < CONFIG_OM_DJI_MOTOR_SKIP_N_FRAME)
return;
141 trMsgToStatus(msg, this->m_Buffer.write());
145 ang_result = m_pid_chain.compute(m_ang_ref.load(std::memory_order_acquire),
146 this->m_Buffer.write().angular);
150 ang_result = m_pid_chain
152 m_pos_ref.load(std::memory_order_acquire), this->m_Buffer.write().total_angle,
153 this->m_Buffer.write().angular
156 ang_result = std::clamp(ang_result,
static_cast<float>(-Traits::max_current),
157 static_cast<float>(Traits::max_current));
158 const auto output_current =
static_cast<int16_t
>(ang_result);
159 this->m_Buffer.write().output_current = output_current;
160 this->m_Buffer.swap();
161 const uint8_t hi_byte = output_current >> 8;
162 const uint8_t lo_byte = output_current & 0xFF;
164 Traits::template control_offset<id>(),
173 std::atomic<float> m_ang_ref{};
174 std::atomic<float> m_pos_ref{};
175#ifdef CONFIG_OM_DJI_MOTOR_SKIP_N_FRAME
176#if CONFIG_OM_DJI_MOTOR_SKIP_N_FRAME != 0
177 uint8_t m_skip_frame{};