@@ -22,8 +22,8 @@ namespace
2222
2323} // namespace
2424
25- Focuser::Focuser (FocuserStepper &stepper, const char *firmware_version)
26- : m_firmware_version(firmware_version), m_stepper(stepper)
25+ Focuser::Focuser (FocuserStepper &stepper, PositionStore *store, const char *firmware_version)
26+ : m_firmware_version(firmware_version), m_stepper(stepper), m_store(store)
2727{
2828 (void )set_stepper_driver_enabled (true );
2929}
@@ -50,6 +50,8 @@ int Focuser::initialise()
5050 return ret;
5151 }
5252
53+ restore_position ();
54+
5355 uint64_t interval_ns = 0 ;
5456 {
5557 MutexLock lock (m_state.lock );
@@ -139,6 +141,7 @@ void Focuser::stop()
139141 (void )m_stepper.stop ();
140142 (void )set_stepper_driver_enabled (false );
141143 k_sem_give (&m_state.move_sem );
144+ save_position (actual16);
142145 LOG_INF (" stop()" );
143146}
144147
@@ -157,19 +160,7 @@ uint16_t Focuser::getCurrentPosition()
157160
158161void Focuser::setCurrentPosition (uint16_t position)
159162{
160- LOG_DBG (" setCurrentPosition()" );
161- int ret = m_stepper.set_reference_position (static_cast <int32_t >(position));
162- if (ret != 0 )
163- {
164- LOG_ERR (" Failed to set reference position (%d)" , ret);
165- }
166-
167- MutexLock lock (m_state.lock );
168- m_state.staged_position = position;
169- m_state.desired_position = position;
170- m_state.move_request = false ;
171- m_state.cancel_move = false ;
172- LOG_INF (" setCurrentPosition 0x%04x (%u)" , position, position);
163+ applyCurrentPosition (position, true );
173164}
174165
175166uint16_t Focuser::getNewPosition ()
@@ -356,6 +347,8 @@ void Focuser::move_to(uint16_t target)
356347 {
357348 (void )set_stepper_driver_enabled (false );
358349 }
350+
351+ save_position (actual16);
359352 LOG_DBG (" Motion complete -> 0x%04x (%d)" , static_cast <uint16_t >(actual & 0xFFFF ), actual);
360353}
361354
@@ -391,6 +384,64 @@ int32_t Focuser::read_actual_position()
391384 return actual;
392385}
393386
387+ void Focuser::restore_position ()
388+ {
389+ if (m_store == nullptr )
390+ {
391+ LOG_INF (" No position store configured; using default position 0" );
392+ return ;
393+ }
394+
395+ uint16_t persisted = 0U ;
396+ if (m_store->load (persisted))
397+ {
398+ LOG_INF (" Restoring focuser position 0x%04x (%u) from store" , persisted, persisted);
399+ applyCurrentPosition (persisted, false );
400+ }
401+ else
402+ {
403+ LOG_INF (" No persisted focuser position found, defaulting to 0" );
404+ }
405+ }
406+
407+ void Focuser::applyCurrentPosition (uint16_t position, bool persist)
408+ {
409+ LOG_DBG (" setCurrentPosition()" );
410+ int ret = m_stepper.set_reference_position (static_cast <int32_t >(position));
411+ if (ret != 0 )
412+ {
413+ LOG_ERR (" Failed to set reference position (%d)" , ret);
414+ }
415+
416+ {
417+ MutexLock lock (m_state.lock );
418+ m_state.staged_position = position;
419+ m_state.desired_position = position;
420+ m_state.move_request = false ;
421+ m_state.cancel_move = false ;
422+ }
423+
424+ if (persist)
425+ {
426+ save_position (position);
427+ LOG_INF (" setCurrentPosition 0x%04x (%u)" , position, position);
428+ }
429+ else
430+ {
431+ LOG_INF (" setCurrentPosition 0x%04x (%u) (no persist)" , position, position);
432+ }
433+ }
434+
435+ void Focuser::save_position (uint16_t position)
436+ {
437+ if (m_store == nullptr )
438+ {
439+ return ;
440+ }
441+
442+ m_store->save (position);
443+ }
444+
394445int Focuser::set_stepper_driver_enabled (bool enable)
395446{
396447 const int ret = m_stepper.enable_driver (enable);
0 commit comments