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() {