From 1cbcf499e4436669ff85fa2b76d1663ec1f158d5 Mon Sep 17 00:00:00 2001 From: Christian <80114847+TheBest6337@users.noreply.github.com> Date: Fri, 6 Feb 2026 19:10:57 +0100 Subject: [PATCH] Add manual homing functionality for addon motor 3 --- .../winder/gluetex/hooks/useGluetex.ts | 12 ++++++ .../gluetex/pages/GluetexAddonsPage.tsx | 12 ++++++ machines/src/gluetex/api.rs | 5 +++ .../controllers/addon_motor_controller.rs | 42 +++++++++++++++++++ 4 files changed, 71 insertions(+) diff --git a/electron/src/machines/winder/gluetex/hooks/useGluetex.ts b/electron/src/machines/winder/gluetex/hooks/useGluetex.ts index 768c7985..29a7dc41 100644 --- a/electron/src/machines/winder/gluetex/hooks/useGluetex.ts +++ b/electron/src/machines/winder/gluetex/hooks/useGluetex.ts @@ -250,6 +250,9 @@ export function useGluetex() { const { request: requestAddonMotor3SetPause } = useMachineMutation( z.object({ SetAddonMotor3Pause: z.number() }), ); + const { request: requestHomeAddonMotor3 } = useMachineMutation( + z.literal("HomeAddonMotor3"), + ); // Slave Puller mutations const { request: requestSlavePullerSetEnabled } = useMachineMutation( @@ -1016,6 +1019,14 @@ export function useGluetex() { }); }; + const homeAddonMotor3 = () => { + // Trigger manual homing for addon motor 3 + requestHomeAddonMotor3({ + machine_identification_unique: machineIdentification, + data: "HomeAddonMotor3", + }); + }; + // Addon Motor Forward direction setters const setStepper3Forward = (forward: boolean) => { updateStateOptimistically( @@ -1788,5 +1799,6 @@ export function useGluetex() { setStepper5Forward, setStepper3Konturlaenge, setStepper3Pause, + homeAddonMotor3, }; } diff --git a/electron/src/machines/winder/gluetex/pages/GluetexAddonsPage.tsx b/electron/src/machines/winder/gluetex/pages/GluetexAddonsPage.tsx index 2b45e1fb..69c40e4d 100644 --- a/electron/src/machines/winder/gluetex/pages/GluetexAddonsPage.tsx +++ b/electron/src/machines/winder/gluetex/pages/GluetexAddonsPage.tsx @@ -45,6 +45,7 @@ export function GluetexAddonsPage() { setStepper5Slave, setStepper3Konturlaenge, setStepper3Pause, + homeAddonMotor3, } = useGluetex(); // Calculate max speed based on gear ratio (same as main puller) @@ -318,6 +319,17 @@ export function GluetexAddonsPage() { )} + diff --git a/machines/src/gluetex/api.rs b/machines/src/gluetex/api.rs index 402ea50d..b2554699 100644 --- a/machines/src/gluetex/api.rs +++ b/machines/src/gluetex/api.rs @@ -189,6 +189,7 @@ pub enum Mutation { SetAddonMotor5SlaveRatio(f64), SetAddonMotor3Konturlaenge(f64), SetAddonMotor3Pause(f64), + HomeAddonMotor3, // Slave Puller SetSlavePullerEnabled(bool), @@ -769,6 +770,10 @@ impl MachineApi for Gluetex { self.addon_motor_3_controller.set_pause_mm(pause_mm); self.emit_state(); } + Mutation::HomeAddonMotor3 => { + self.addon_motor_3_controller.start_manual_homing(); + self.emit_state(); + } Mutation::SetSlavePullerEnabled(enabled) => { self.slave_puller_user_enabled = enabled; // Re-apply the current mode to update the controller state diff --git a/machines/src/gluetex/controllers/addon_motor_controller.rs b/machines/src/gluetex/controllers/addon_motor_controller.rs index 78879dc5..5c0b4109 100644 --- a/machines/src/gluetex/controllers/addon_motor_controller.rs +++ b/machines/src/gluetex/controllers/addon_motor_controller.rs @@ -41,6 +41,8 @@ pub struct AddonMotorController { accumulated_distance: f64, /// Whether the motor needs homing on next enable needs_homing: bool, + /// Whether the motor is in manual homing mode (triggered by user button) + manual_homing: bool, } impl AddonMotorController { @@ -60,6 +62,7 @@ impl AddonMotorController { pattern_state: PatternControlState::Idle, accumulated_distance: 0.0, needs_homing: false, + manual_homing: false, } } @@ -168,6 +171,19 @@ impl AddonMotorController { self.pattern_state } + /// Start manual homing - moves motor in positive direction until endstop is hit + /// + /// This method initiates a manual homing sequence, putting the motor into + /// the Homing state. The motor will move in the positive direction at a fixed + /// speed until the endstop is triggered, then automatically go to standby. + pub fn start_manual_homing(&mut self) { + self.enabled = true; + self.manual_homing = true; + self.pattern_state = PatternControlState::Homing; + self.accumulated_distance = 0.0; + self.needs_homing = false; + } + /// Calculate the motor angular velocity based on puller angular velocity and ratio /// /// # Arguments @@ -211,6 +227,32 @@ impl AddonMotorController { endstop_hit: Option, puller_length_moved: Length, ) { + // Handle manual homing first (highest priority) + if self.manual_homing { + // Enable motor if not already enabled + if !motor.is_enabled() { + motor.set_enabled(true); + } + + if let Some(endstop_triggered) = endstop_hit { + if endstop_triggered { + // Endstop hit - stop motor, disable, and exit manual homing + let _ = motor.set_speed(0.0); + motor.set_enabled(false); + self.enabled = false; + self.manual_homing = false; + self.pattern_state = PatternControlState::Idle; + return; + } + } + + // Move towards endstop at fixed speed (0.5 rev/s regardless of puller speed) + let homing_velocity = AngularVelocity::new::(0.5); + let steps_per_second = self.converter.angular_velocity_to_steps(homing_velocity); + let _ = motor.set_speed(steps_per_second); + return; + } + if !self.enabled { // If disabled, ensure motor is not enabled if motor.is_enabled() {