|
|
@@ -646,6 +646,43 @@ def home(timeout=90):
|
|
|
if not (state.homed_x and state.homed_y):
|
|
|
logger.warning(f"Did not receive all homing messages (X:{state.homed_x}, Y:{state.homed_y})")
|
|
|
|
|
|
+ # Retry homing for the axis that didn't home
|
|
|
+ retry_axis = None
|
|
|
+ if state.homed_x and not state.homed_y:
|
|
|
+ retry_axis = "Y"
|
|
|
+ elif state.homed_y and not state.homed_x:
|
|
|
+ retry_axis = "X"
|
|
|
+
|
|
|
+ if retry_axis:
|
|
|
+ logger.info(f"{retry_axis} axis didn't home, nudging and retrying...")
|
|
|
+ # Wait for idle first
|
|
|
+ check_idle()
|
|
|
+ # Send small movement to move away from sensor
|
|
|
+ state.conn.send(f"G1 {retry_axis}10 F{homing_speed}\n")
|
|
|
+ time.sleep(2)
|
|
|
+ check_idle()
|
|
|
+ # Retry homing
|
|
|
+ state.conn.send("$H\n")
|
|
|
+ logger.info(f"Sent $H retry, waiting for {retry_axis} homing message...")
|
|
|
+ retry_start = time.time()
|
|
|
+ while (time.time() - retry_start) < 20:
|
|
|
+ try:
|
|
|
+ response = state.conn.readline()
|
|
|
+ if response:
|
|
|
+ logger.debug(f"Retry homing response: {response}")
|
|
|
+ if f"[MSG:Homed:{retry_axis}]" in response:
|
|
|
+ if retry_axis == "X":
|
|
|
+ state.homed_x = True
|
|
|
+ else:
|
|
|
+ state.homed_y = True
|
|
|
+ logger.info(f"Retry successful: Received [MSG:Homed:{retry_axis}]")
|
|
|
+ break
|
|
|
+ except Exception as e:
|
|
|
+ logger.error(f"Error reading retry response: {e}")
|
|
|
+ time.sleep(0.1)
|
|
|
+ if (retry_axis == "X" and not state.homed_x) or (retry_axis == "Y" and not state.homed_y):
|
|
|
+ logger.error(f"{retry_axis} axis homing retry failed")
|
|
|
+
|
|
|
# Wait for idle state after $H
|
|
|
logger.info("Waiting for device to reach idle state after $H...")
|
|
|
idle_reached = check_idle()
|