From 86b19db430a15f3ded36491d3a75f2af60ed1bb9 Mon Sep 17 00:00:00 2001 From: Yannis Chatzikonstantinou Date: Wed, 25 Feb 2026 14:55:50 +0200 Subject: [PATCH 1/2] fix homing retraction reference --- firmware/src/controller/homing_planner.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/src/controller/homing_planner.c b/firmware/src/controller/homing_planner.c index 611108c1..a9f12cf3 100644 --- a/firmware/src/controller/homing_planner.c +++ b/firmware/src/controller/homing_planner.c @@ -58,7 +58,7 @@ TM_RAMFUNC bool homing_planner_evaluate() if (state.stay_t_current >= config.max_stay_t) { // First time the endstop is considered found, reset origins and setpoints - frame_user_to_position_sensor_set_offset(observer_pos); + frame_user_to_position_sensor_set_offset(position_observer_get_pos_estimate()); controller_set_pos_setpoint_user_frame(0); controller_set_vel_setpoint_user_frame(0); } From 7a70c432bd58bc49b27e2a008cf78c427ced8e1d Mon Sep 17 00:00:00 2001 From: Yannis Chatzikonstantinou Date: Wed, 25 Feb 2026 19:14:28 +0200 Subject: [PATCH 2/2] persist homing planner config to NVM HomingPlannerConfig was missing from the NVM save/restore chain, causing homing parameters to revert to defaults after power cycle. Co-authored-by: Cursor --- studio/Python/tests/test_nvm.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/studio/Python/tests/test_nvm.py b/studio/Python/tests/test_nvm.py index b0fd45a9..3c3dc8a4 100644 --- a/studio/Python/tests/test_nvm.py +++ b/studio/Python/tests/test_nvm.py @@ -112,6 +112,34 @@ def test_c_parameter_persistence(self): self.erase_config() time.sleep(0.2) + def test_c2_homing_parameter_persistence(self): + """ + Test persisting homing parameters across config saves. + WARNING: This will perform one NVRAM write and two erase cycles. + """ + self.check_state(0) + self.erase_config() + time.sleep(0.2) + + self.tm.homing.velocity = 5000 + self.tm.homing.max_homing_t = 10.0 + self.tm.homing.retract_dist = 2000 + self.tm.homing.stall_detect.velocity = 3000 + self.tm.homing.stall_detect.delta_pos = 500 + self.tm.homing.stall_detect.t = 2.0 + self.save_config() + + time.sleep(0.2) + self.reset_and_wait() + self.assertAlmostEqual(self.tm.homing.velocity, 5000 * tick / s, delta=1 * tick / s) + self.assertAlmostEqual(self.tm.homing.max_homing_t, 10.0 * s, delta=0.01 * s) + self.assertAlmostEqual(self.tm.homing.retract_dist, 2000 * tick, delta=1 * tick) + self.assertAlmostEqual(self.tm.homing.stall_detect.velocity, 3000 * tick / s, delta=1 * tick / s) + self.assertAlmostEqual(self.tm.homing.stall_detect.delta_pos, 500 * tick, delta=1 * tick) + self.assertAlmostEqual(self.tm.homing.stall_detect.t, 2.0 * s, delta=0.01 * s) + self.erase_config() + time.sleep(0.2) + def test_d_position_control_w_loaded_config(self): """ Test position control after saving and loading config.