diff --git a/daemons/generic/filterwheel b/daemons/generic/filterwheel index cbbb203..9425046 100755 --- a/daemons/generic/filterwheel +++ b/daemons/generic/filterwheel @@ -30,7 +30,6 @@ class Filterwheel(HispecDaemon): #pylint: disable = W0223 # Daemon state self.state = { - 'connected': False, 'error': '' } @@ -52,10 +51,10 @@ class Filterwheel(HispecDaemon): #pylint: disable = W0223 self.state['error'] = 'No IP address or port specified' return try: + self._register_keywords() connection = self.connect(True) if not connection.get("ok"): raise ConnectionError(connection.get("Error")) - self.state['connected'] = True self.logger.info("Daemon started successfully and connected to hardware") self.initialize() self.logger.info("Initialized %s", self.daemon_desc) @@ -63,58 +62,58 @@ class Filterwheel(HispecDaemon): #pylint: disable = W0223 self.logger.error("Failed to connect to hardware: %s", e) self.logger.warning("Daemon will start but hardware is not available") self.state['error'] = str(e) - self.state['connected'] = False def initialize(self): """handles initialization""" - if not self.state['connected']: + if not self.dev.is_connected(): return {"ok": False, "error": "Not connected to hardware"} - try: self.dev.initialize() - self.keyword_registry.bool("isconnected", - getter=self.dev.is_connected, - setter=self.keyword_wrapper(self.connect, key="isconnected"), - description="Check if daemon can talk to the FW controller.") - self.keyword_registry.string("error", - getter=lambda: self.state['error'], - description="Get the current error message.") - self.keyword_registry.int("positionvalue", - getter=self.keyword_wrapper(self.get_pos, key="position"), - setter=self.keyword_wrapper(self.set_pos, key="position"), - validator=self._check_soft_limits, - units=self.units, - description="Set and get current position of FilterWheel.") - self.keyword_registry.string("positionnamed", - getter=self.keyword_wrapper(self.cur_named_position, key="named_pos"), - setter=self.keyword_wrapper(self.goto_named_pos, key="named_pos"), - validator=self._check_named, - description="Set and get named position of FilterWheel.") - self.keyword_registry.int("softmin", - getter=lambda: self._soft_min, - setter=lambda v: setattr(self, "_soft_min", int(v)), - units=self.units, - description="Software lower limit for filter wheel position.") - self.keyword_registry.int("softmax", - getter=lambda: self._soft_max, - setter=lambda v: setattr(self, "_soft_max", int(v)), - units=self.units, - description="Software upper limit for filter wheel position.") - self.keyword_registry.int("hardmin", - getter=lambda: self._hard_min, - units=self.units, - description="Hardware lower limit for filter wheel position.") - self.keyword_registry.int("hardmax", - getter=lambda: self._hard_max, - units=self.units, - description="Hardware upper limit for filter wheel position.") - except Exception as e: # pylint: disable=W0718 self.logger.error("Error: %s",e) self.state['error'] = str(e) return {"ok":False , "error": str(e)} return {"ok": True} + def _register_keywords(self): + """Register keywords for the daemon.""" + self.keyword_registry.bool("isconnected", + getter=self.dev.is_connected, + setter=self.keyword_wrapper(self.connect, key="isconnected"), + description="Check if daemon can talk to the FW controller.") + self.keyword_registry.string("error", + getter=lambda: self.state['error'], + description="Get the current error message.") + self.keyword_registry.int("positionvalue", + getter=self.keyword_wrapper(self.get_pos, key="position"), + setter=self.keyword_wrapper(self.set_pos, key="position"), + validator=self._check_soft_limits, + units=self.units, + description="Set and get current position of FilterWheel.") + self.keyword_registry.string("positionnamed", + getter=self.keyword_wrapper(self.cur_named_position, key="named_pos"), + setter=self.keyword_wrapper(self.goto_named_pos, key="named_pos"), + validator=self._check_named, + description="Set and get named position of FilterWheel.") + self.keyword_registry.int("softmin", + getter=lambda: self._soft_min, + setter=lambda v: setattr(self, "_soft_min", int(v)), + units=self.units, + description="Software lower limit for filter wheel position.") + self.keyword_registry.int("softmax", + getter=lambda: self._soft_max, + setter=lambda v: setattr(self, "_soft_max", int(v)), + units=self.units, + description="Software upper limit for filter wheel position.") + self.keyword_registry.int("hardmin", + getter=lambda: self._hard_min, + units=self.units, + description="Hardware lower limit for filter wheel position.") + self.keyword_registry.int("hardmax", + getter=lambda: self._hard_max, + units=self.units, + description="Hardware upper limit for filter wheel position.") + def get_named_positions(self): """Get named positions from config (e.g., home, deployed, science).""" return self._config.get("named_positions", {}) @@ -177,7 +176,7 @@ class Filterwheel(HispecDaemon): #pylint: disable = W0223 def get_pos(self): '''gets current position''' - if not self.state['connected']: + if not self.dev.is_connected(): return {"ok": False, "error": "Not connected to hardware"} try: @@ -191,7 +190,7 @@ class Filterwheel(HispecDaemon): #pylint: disable = W0223 def set_pos(self, pos): '''sets current position''' - if not self.state['connected']: + if not self.dev.is_connected(): return {"ok": False, "error": "Not connected to hardware"} try: @@ -207,7 +206,7 @@ class Filterwheel(HispecDaemon): #pylint: disable = W0223 def goto_named_pos(self, name): '''moves to named position''' - if not self.state['connected']: + if not self.dev.is_connected(): return {"ok": False, "error": "Not connected to hardware"} try: diff --git a/daemons/hsfei/piaa-gimbalmount b/daemons/hsfei/piaa-gimbalmount index b8fbe07..32fbb16 100755 --- a/daemons/hsfei/piaa-gimbalmount +++ b/daemons/hsfei/piaa-gimbalmount @@ -41,7 +41,6 @@ class PiaaGimbalmount(HispecDaemon): #pylint: disable = W0223 # Daemon state self.state = { - 'connected': False, 'error': '', 'enabled': False, 'isloopsclosed': False @@ -68,60 +67,11 @@ class PiaaGimbalmount(HispecDaemon): #pylint: disable = W0223 return try: + self._register_keywords() connection = self.connect(True) if not connection.get("ok"): raise ConnectionError(connection.get("error")) - self.state['connected'] = True self.initialize() - self.keyword_registry.bool("isconnected", - getter=self.dev.is_connected, - setter=self.keyword_wrapper(self.connect, key="isconnected"), - description="Check if daemon can talk to the GimbalMount controller.") - self.keyword_registry.bool("isloopsclosed", - getter=self.dev.is_loop_closed, - setter=self.keyword_wrapper(self.set_loops, key="isloopsclosed"), - description="Check if gimbal loops are closed.") - self.keyword_registry.float("positionvaluex", - getter=self.keyword_wrapper(self.get_xpos, key="position"), - setter=self.keyword_wrapper(self.set_xpos, key="position"), - validator=self._check_soft_limits, - units=self.units, - description="Set and get current position of GimbalMount.") - self.keyword_registry.float("positionvaluey", - getter=self.keyword_wrapper(self.get_ypos, key="position"), - setter=self.keyword_wrapper(self.set_ypos, key="position"), - validator=self._check_soft_limits, - units=self.units, - description="Set and get current position of GimbalMount.") - self.keyword_registry.string("positionnamed", - getter=self.keyword_wrapper(self.cur_named_position, key="named_pos"), - setter=self.keyword_wrapper(self.goto_named_pos, key="named_pos"), - validator=self._check_named, - description="Set and get named position of GimbalMount.") - self.keyword_registry.int("softmin", - getter=lambda: self._soft_min, - setter=lambda v: setattr(self, "_soft_min", int(v)), - units=self.units, - description="Software lower limit for gimbal position.") - self.keyword_registry.int("softmax", - getter=lambda: self._soft_max, - setter=lambda v: setattr(self, "_soft_max", int(v)), - units=self.units, - description="Software upper limit for gimbal position.") - self.keyword_registry.int("hardmin", - getter=lambda: self._hard_min, - units=self.units, - description="Hardware lower limit for gimbal position.") - self.keyword_registry.int("hardmax", - getter=lambda: self._hard_max, - units=self.units, - description="Hardware upper limit for gimbal position.") - self.keyword_registry.string("status", - getter=self.keyword_wrapper(self.status,key="status"), - description="Grabs status of gimbal mount") - self.keyword_registry.trigger("cleanup", - action=self.clean_up_gimbal, - description="Clean up Gimbal, Open loops and set voltage to 0") self.logger.info("Daemon started successfully and connected to hardware") self.logger.info("Initialized %s", self.daemon_desc) @@ -129,14 +79,65 @@ class PiaaGimbalmount(HispecDaemon): #pylint: disable = W0223 self.logger.error("Failed to connect to hardware: %s", e) self.logger.warning("Daemon will start but hardware is not available") self.state['error'] = str(e) - self.state['connected'] = False self.logger.info("Starting %s Daemon", self.daemon_desc) + def _register_keywords(self): + """Registers keywords for the daemon.""" + self.keyword_registry.bool("is_connected", + getter=self.dev.is_connected(), + setter=self.keyword_wrapper(self.connect, key="is_connected"), + description="Check if daemon can talk to the GimbalMount controller.") + self.keyword_registry.bool("isloopsclosed", + getter=self.dev.is_loop_closed, + setter=self.keyword_wrapper(self.set_loops, key="isloopsclosed"), + description="Check if gimbal loops are closed.") + self.keyword_registry.float("positionvaluex", + getter=self.keyword_wrapper(self.get_xpos, key="position"), + setter=self.keyword_wrapper(self.set_xpos, key="position"), + validator=self._check_soft_limits, + units=self.units, + description="Set and get current position of GimbalMount.") + self.keyword_registry.float("positionvaluey", + getter=self.keyword_wrapper(self.get_ypos, key="position"), + setter=self.keyword_wrapper(self.set_ypos, key="position"), + validator=self._check_soft_limits, + units=self.units, + description="Set and get current position of GimbalMount.") + self.keyword_registry.string("positionnamed", + getter=self.keyword_wrapper(self.cur_named_position, key="named_pos"), + setter=self.keyword_wrapper(self.goto_named_pos, key="named_pos"), + validator=self._check_named, + description="Set and get named position of GimbalMount.") + self.keyword_registry.int("softmin", + getter=lambda: self._soft_min, + setter=lambda v: setattr(self, "_soft_min", int(v)), + units=self.units, + description="Software lower limit for gimbal position.") + self.keyword_registry.int("softmax", + getter=lambda: self._soft_max, + setter=lambda v: setattr(self, "_soft_max", int(v)), + units=self.units, + description="Software upper limit for gimbal position.") + self.keyword_registry.int("hardmin", + getter=lambda: self._hard_min, + units=self.units, + description="Hardware lower limit for gimbal position.") + self.keyword_registry.int("hardmax", + getter=lambda: self._hard_max, + units=self.units, + description="Hardware upper limit for gimbal position.") + self.keyword_registry.string("status", + getter=self.keyword_wrapper(self.status,key="status"), + description="Grabs status of gimbal mount") + self.keyword_registry.trigger("cleanup", + action=self.clean_up_gimbal, + description="Clean up Gimbal, Open loops and set voltage to 0") + def initialize(self): """handles initialization""" # for PPC102_Coms, this involves setting the enable - if not self.state['connected']: + if not self.dev.is_connected(): return {"ok": False, "error": "Not connected to hardware"} try: @@ -171,7 +172,7 @@ class PiaaGimbalmount(HispecDaemon): #pylint: disable = W0223 except Exception as e: # pylint: disable=W0718 self.logger.error("Failed to Connect or Disconnect with Hardware: %s",e) return {"ok": False, "error": str(e)} - return {"ok": True, "isconnected": result} + return {"ok": True, "is_connected": result} def clean_up_gimbal(self): '''Cleans up gimbal settings''' @@ -188,7 +189,7 @@ class PiaaGimbalmount(HispecDaemon): #pylint: disable = W0223 def status(self): """handles status""" - if not self.state['connected']: + if not self.dev.is_connected(): return {"ok": False, "error": "Not connected to hardware"} try: @@ -216,7 +217,7 @@ class PiaaGimbalmount(HispecDaemon): #pylint: disable = W0223 def is_loops_closed(self): '''checks if loops are closed''' - if not self.state['connected']: + if not self.dev.is_connected(): return {"ok": False, "error": "Not connected to hardware"} try: @@ -269,7 +270,7 @@ class PiaaGimbalmount(HispecDaemon): #pylint: disable = W0223 def get_pos(self, axis : int): '''gets current position''' - if not self.state['connected']: + if not self.dev.is_connected(): return {"ok": False, "error": "Not connected to hardware"} if not self.state['enabled']: return {"ok": False, "error": "Device not enabled"} @@ -298,7 +299,7 @@ class PiaaGimbalmount(HispecDaemon): #pylint: disable = W0223 def set_volts(self, axis: int, volts: float): '''sets output voltage for open loop control''' - if not self.state['connected']: + if not self.dev.is_connected(): return {"ok": False, "error": "Not connected to hardware"} if not self.state['enabled']: return {"ok": False, "error": "Device not enabled"} @@ -324,7 +325,7 @@ class PiaaGimbalmount(HispecDaemon): #pylint: disable = W0223 def set_pos(self, axis, pos): '''sets current position''' - if not self.state['connected']: + if not self.dev.is_connected(): return {"ok": False, "error": "Not connected to hardware"} if not self.state['enabled']: return {"ok": False, "error": "Device not enabled"} @@ -347,7 +348,7 @@ class PiaaGimbalmount(HispecDaemon): #pylint: disable = W0223 def goto_named_pos(self, name): '''moves to named position''' - if not self.state['connected']: + if not self.dev.is_connected(): return {"ok": False, "error": "Not connected to hardware"} try: @@ -365,7 +366,7 @@ class PiaaGimbalmount(HispecDaemon): #pylint: disable = W0223 def cur_named_position(self): """Get the name of the current position, if it matches a named position.""" - if not self.state['connected']: + if not self.dev.is_connected(): return {"ok": False, "error": "Not connected to hardware"} try: @@ -446,4 +447,4 @@ def main(): if __name__ == '__main__': - main() + main() \ No newline at end of file