Source code for panoptes.pocs.focuser.simulator
"""Simple focuser simulator for development and tests.
Implements a minimal AbstractFocuser that fakes connection and movement timing
without requiring hardware.
"""
import random
import time
from panoptes.pocs.focuser import AbstractFocuser
[docs]
class Focuser(AbstractFocuser):
"""
Simple focuser simulator
"""
def __init__(self, name="Simulated Focuser", port="/dev/ttyFAKE", *args, **kwargs):
super().__init__(*args, name=name, port=port, **kwargs)
self.logger.debug("Initialising simulator focuser")
self._is_moving = False
self.connect()
self.logger.info(f"{self} initialised")
##################################################################################################
# Properties
##################################################################################################
@property
def min_position(self):
"""
Returns position of close limit of focus travel, in encoder units
"""
return self._min_position
@property
def max_position(self):
"""
Returns position of far limit of focus travel, in encoder units
"""
return self._max_position
@property
def is_moving(self):
"""Whether the simulated focuser is moving.
Returns:
bool: True if a simulated move is in progress.
"""
return self._is_moving
##################################################################################################
# Methods
##################################################################################################
[docs]
def connect(self):
"""
Simulator pretends to connect a focuser and obtain details, current state.
"""
time.sleep(0.1)
self._connected = True
self._serial_number = f"SF{random.randint(0, 9999):04d}"
self._min_position = 0
self._max_position = 22200
if self.position is None:
self._position = random.randint(0, self._max_position)
self.logger.debug(f"Connected to focuser {self.uid}")
[docs]
def move_to(self, position):
"""Move focuser to a new encorder position"""
self.move_by(position - self.position)
return self.position
[docs]
def move_by(self, increment):
"""Move focuser by a given amount"""
self.logger.debug(f"Moving focuser {self.uid} by {increment}")
self._is_moving = True
time.sleep(1)
previous_position = self._position
position = previous_position + int(increment)
position = min(position, self.max_position)
position = max(position, self.min_position)
self._position = position
self._is_moving = False
return self.position