From 7f1018bb8b33e004ff96feb452e0a556b2213e79 Mon Sep 17 00:00:00 2001 From: melfey Date: Fri, 12 Jun 2026 18:36:54 -0500 Subject: [PATCH] Changed Motor::Controller from a trait to a Struct I realized that I was trying to do inheirtance rather than composition which is the rust way. This should be a much bet --- src/core/logic/motor.rs | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/core/logic/motor.rs b/src/core/logic/motor.rs index 0bf9839..b961b0f 100644 --- a/src/core/logic/motor.rs +++ b/src/core/logic/motor.rs @@ -4,30 +4,38 @@ use crate::core::motor::{Direction, Speed}; use crate::core::logic::pid; #[derive(Debug, Clone, Copy, PartialEq)] -pub struct Data { - pub max_speed: Speed, - pub pid: pid::PID, - pub current_direction: Direction, +/// # Motor Controller +/// This is a motor controller that takes in a generic type T that has implemented the needed traits. +/// Most specifically Driver and Sensor. +/// +/// ## Usage +/// +/// Creating this allows for the controller a motor via a simple PID f32 signed Speed command, rather than u16 speed commands +pub struct Controller +where + T: motor::Driver + motor::Sensor, +{ + pub motor: T, + max_speed: Speed, + pid: pid::PID, + current_direction: Direction, } -///Controller trait for motors. Motors with this trait, automatically have controls included -pub trait Controller: motor::Driver + motor::Sensor { - ///Create a Data field using the Data type in your motor struct, and return it here. The rest of the trait is automatic - fn data(&mut self) -> Data; - +///Controller Impl for the adding the PID logic for handling the motor compiston +impl Controller { ///Uses the given set_speed and then will handle the rest of the control logic to accurately* hit the requested speed - fn control(&mut self, set_speed: Speed) { - let data = &mut self.data(); - let max_speed_rads = data.max_speed.rads(); + pub fn control(&mut self, set_speed: Speed) { + let max_speed_rads = self.max_speed.rads(); let set_speed_rads = set_speed.rads().clamp(-max_speed_rads, max_speed_rads); - data.pid.set_point(set_speed_rads); - let pid_output = data.pid.pid_step(self.get_speed().rads()); + self.pid.set_point(set_speed_rads); + let pid_output = self.pid.pid_step(self.motor.get_speed().rads()); - self.data().current_direction.dir_from_f32(pid_output); + self.current_direction.dir_from_f32(pid_output); let motor_command = (pid_output * 65535.0) as u16; - self.set_speed_and_direction(motor_command, data.current_direction); + self.motor + .set_speed_and_direction(motor_command, self.current_direction); } }