Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 44 additions & 45 deletions daemons/generic/filterwheel
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ class Filterwheel(HispecDaemon): #pylint: disable = W0223

# Daemon state
self.state = {
'connected': False,
'error': ''
}

Expand All @@ -52,69 +51,69 @@ 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)
except ConnectionRefusedError as e:
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", {})
Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand Down
125 changes: 63 additions & 62 deletions daemons/hsfei/piaa-gimbalmount
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ class PiaaGimbalmount(HispecDaemon): #pylint: disable = W0223

# Daemon state
self.state = {
'connected': False,
'error': '',
'enabled': False,
'isloopsclosed': False
Expand All @@ -68,75 +67,77 @@ 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)
except ConnectionRefusedError as e:
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:
Expand Down Expand Up @@ -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'''
Expand All @@ -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:
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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"}
Expand Down Expand Up @@ -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"}
Expand All @@ -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"}
Expand All @@ -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:
Expand All @@ -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:
Expand Down Expand Up @@ -446,4 +447,4 @@ def main():


if __name__ == '__main__':
main()
main()
Loading