Loading noctua/api/telescope.py +1 −1 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ class Error(BaseResource): '''Try to clean the errors.''' error_number = await self.get_payload() res = await self.run_blocking(self.dev.clear, error_number) res = await self.run_blocking(self.dev.clear_error, error_number) return self.make_response(res) Loading noctua/config/devices.ini +5 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,11 @@ pos_imaging = 120 pos_spectro = 110 pos_echelle = 100 [ao] module = stx class = Ao node = STX ###################################### [teccam] Loading noctua/devices/mako.py +1 −1 Original line number Diff line number Diff line Loading @@ -166,7 +166,7 @@ class Guider(Mako): return filename def save_fits(self, filename="temp.fits"): def download(self, filename="temp.fits"): """Save the current frame as a FITS file.""" raw = self.matrix Loading noctua/devices/stx.py +105 −34 Original line number Diff line number Diff line Loading @@ -188,11 +188,11 @@ class Camera(STX): """ super().__init__(url) self.cam = "Imager" self.sensor = "Imager" def abort(self): """Aborts the current exposure.""" self.put(f"{self.cam}AbortExposure") self.put(f"{self.sensor}AbortExposure") def start(self, duration, frametype, datetime=None): """ Loading Loading @@ -222,7 +222,7 @@ class Camera(STX): params = {"Duration": duration, "FrameType": frametype, "DateTime": datetime} self.put(f"{self.cam}StartExposure", params=params) self.put(f"{self.sensor}StartExposure", params=params) def download(self, filepath=temp_fits): Loading @@ -238,7 +238,7 @@ class Camera(STX): self._wait_if_needed() log.debug(f"Getting original FITS") res = requests.get(f"{self.addr}/Imager.FIT") res = requests.get(f"{self.addr}/{self.sensor}.FIT") log.debug(f"Got original FITS") with open(filepath, 'wb') as f: Loading Loading @@ -278,14 +278,14 @@ class Camera(STX): "NumY": height } self.put(f"{self.cam}SetSettings", params=params) self.put(f"{self.sensor}SetSettings", params=params) def full_frame(self): """Sets the camera to use the full sensor area.""" params = ["CameraXSize", "CameraYSize"] try: cam_x, cam_y = self.get(f"{self.cam}GetSettings", params=params) cam_x, cam_y = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -301,7 +301,7 @@ class Camera(STX): params = ["CameraXSize", "CameraYSize"] try: cam_x, cam_y = self.get(f"{self.cam}GetSettings", params=params) cam_x, cam_y = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -322,7 +322,7 @@ class Camera(STX): params = ["CameraXSize", "CameraYSize"] try: cam_x, cam_y = self.get(f"{self.cam}GetSettings", params=params) cam_x, cam_y = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -344,7 +344,7 @@ class Camera(STX): params = ["BinX", "BinY"] try: binx, biny = self.get(f"{self.cam}GetSettings", params=params) binx, biny = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -366,7 +366,7 @@ class Camera(STX): return params = {"BinX": b[0], "BinY": b[1]} self.put(f"{self.cam}SetSettings", params=params) self.put(f"{self.sensor}SetSettings", params=params) @property def filter(self): Loading Loading @@ -397,7 +397,7 @@ class Camera(STX): """bool: The current state of the CCD cooler (True=On, False=Off).""" params = ["CoolerState"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error: return None Loading @@ -414,14 +414,14 @@ class Camera(STX): return params = {"CoolerState": "1" if b else "0"} self.put(f"{self.cam}SetSettings", params=params) self.put(f"{self.sensor}SetSettings", params=params) @property def temperature(self): """float: The current CCD temperature in degrees Celsius.""" params = ["CCDTemperature"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error: return None Loading @@ -438,7 +438,7 @@ class Camera(STX): return params = {"CCDTemperatureSetpoint": t} self.put(f"{self.cam}SetSettings", params=params) self.put(f"{self.sensor}SetSettings", params=params) @property def all(self): Loading @@ -458,7 +458,7 @@ class Camera(STX): "StartY", "NumX", "NumY"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error or not res or len(res) != len(params): return {} Loading Loading @@ -509,7 +509,7 @@ class Camera(STX): """float: The ambient temperature in degrees Celsius.""" params = ["AmbientTemperature"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error: return None Loading @@ -521,7 +521,7 @@ class Camera(STX): params = ["CameraXSize", "CameraYSize", "BinX", "BinY"] try: camx, camy, binx, biny = self.get(f"{self.cam}GetSettings", params=params) camx, camy, binx, biny = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -547,7 +547,7 @@ class Camera(STX): """int: The current cooler power level in percent.""" params = ["CoolerPower"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error: return None Loading @@ -570,7 +570,7 @@ class Camera(STX): """list of int: The maximum sensor dimensions [X, Y] for current binning.""" params = ["CameraXSize", "CameraYSize"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error: return [None, None] Loading @@ -582,7 +582,7 @@ class Camera(STX): """float: The current CCD temperature setpoint in degrees Celsius.""" params = ["CCDTemperatureSetpoint"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error: return None Loading @@ -594,7 +594,7 @@ class Camera(STX): 0=Idle, 2=Exposing, 3=Reading, 5=Error. """ res = self.get(f"{self.cam}State") res = self.get(f"{self.sensor}State") if self.error: return None Loading @@ -606,7 +606,7 @@ class Camera(STX): 1 if an image is ready for download, 0 otherwise. """ res = self.get(f"{self.cam}ImageReady") res = self.get(f"{self.sensor}ImageReady") if self.error: return None Loading @@ -628,7 +628,7 @@ class Camera(STX): params = ["StartX", "NumX", "BinX"] try: startx, numx, binx = self.get(f"{self.cam}GetSettings", params=params) startx, numx, binx = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -647,7 +647,7 @@ class Camera(STX): params = ["StartY", "NumY", "BinY"] try: starty, numy, biny = self.get(f"{self.cam}GetSettings", params=params) starty, numy, biny = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -667,7 +667,7 @@ class Camera(STX): params = ["StartX", "StartY", "BinX", "BinY"] try: startx, starty, binx, biny = self.get( f"{self.cam}GetSettings", params=params) f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -685,7 +685,7 @@ class Camera(STX): params = ["StartX", "StartY", "NumX", "NumY", "BinX", "BinY"] try: startx, starty, numx, numy, binx, biny = self.get( f"{self.cam}GetSettings", params=params) f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -710,7 +710,7 @@ class Guider(Camera): """ super().__init__(url) self.cam = "ExtGuider" self.sensor = "ExtGuider" @property Loading @@ -729,6 +729,20 @@ class Guider(Camera): log.warning(f"Not available in External Guider") return None @property def ambient(self): """float: The ambient temperature in degrees Celsius.""" log.warning(f"Not available in External Guider") return None @property def setpoint(self): """float: The current CCD temperature setpoint in degrees Celsius.""" log.warning(f"Not available in External Guider") return None @property def temperature(self): Loading @@ -748,7 +762,6 @@ class Guider(Camera): """dict: A comprehensive dictionary of the current camera state.""" params = [ "AmbientTemperature", "BinX", "BinY", "CameraXSize", Loading @@ -757,13 +770,13 @@ class Guider(Camera): "StartY", "NumX", "NumY"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error or not res or len(res) != len(params): return {} try: ambient, binx, biny, camx, camy, startx, starty, numx, numy = res binx, biny, camx, camy, startx, starty, numx, numy = res b_x, b_y = int(binx), int(biny) x_start, y_start = int(startx) // b_x, int(starty) // b_y Loading @@ -775,8 +788,7 @@ class Guider(Camera): self.error.append(msg) if self.error: return {"ambient": None, "binning": [None, None], return {"binning": [None, None], "max_range": [None, None], "xystart": [None, None], "xyend": [None, None], Loading @@ -785,8 +797,7 @@ class Guider(Camera): "center": [None, None], } return {"ambient": round(ambient, 1), "binning": [b_x, b_y], return {"binning": [b_x, b_y], "max_range": [int(camx) // b_x, int(camy) // b_y], "xystart": [x_start, y_start], "xyend": [x_end, y_end], Loading @@ -794,3 +805,63 @@ class Guider(Camera): "yrange": [y_start, y_end], "center": [int(camx) // b_x // 2, int(camy) // b_y // 2], } class Ao(STX): """ Base wrapper class for SBIG AO-X """ def __init__(self, url): """ Constructor """ super().__init__(url) self.sensor = "AO" @property def state(self): """int: The current state of the imaging CCD. 0=Idle, 1=Moving. """ res = self.get(f"{self.sensor}Status") if self.error: return None return res if self.state != 0: log.error( f"Cannot change position, AO is not idle. State: { self.state}") self.error.append("AO not idle") return params = {"XPosition": b[0], "Yposition": b[1]} self.put(f"{self.sensor}Guide", params=params) @property def position(self): log.warning(f"Not available in AO. Only setter [x,y]") return None @position.setter def position(self, b): if self.state != 0: log.error( f"Cannot change position, AO is not idle. State: { self.state}") self.error.append("AO not idle") return params = {"XPosition": b[0], "YPosition": b[1]} self.put(f"{self.sensor}Guide", params=params) Loading
noctua/api/telescope.py +1 −1 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ class Error(BaseResource): '''Try to clean the errors.''' error_number = await self.get_payload() res = await self.run_blocking(self.dev.clear, error_number) res = await self.run_blocking(self.dev.clear_error, error_number) return self.make_response(res) Loading
noctua/config/devices.ini +5 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,11 @@ pos_imaging = 120 pos_spectro = 110 pos_echelle = 100 [ao] module = stx class = Ao node = STX ###################################### [teccam] Loading
noctua/devices/mako.py +1 −1 Original line number Diff line number Diff line Loading @@ -166,7 +166,7 @@ class Guider(Mako): return filename def save_fits(self, filename="temp.fits"): def download(self, filename="temp.fits"): """Save the current frame as a FITS file.""" raw = self.matrix Loading
noctua/devices/stx.py +105 −34 Original line number Diff line number Diff line Loading @@ -188,11 +188,11 @@ class Camera(STX): """ super().__init__(url) self.cam = "Imager" self.sensor = "Imager" def abort(self): """Aborts the current exposure.""" self.put(f"{self.cam}AbortExposure") self.put(f"{self.sensor}AbortExposure") def start(self, duration, frametype, datetime=None): """ Loading Loading @@ -222,7 +222,7 @@ class Camera(STX): params = {"Duration": duration, "FrameType": frametype, "DateTime": datetime} self.put(f"{self.cam}StartExposure", params=params) self.put(f"{self.sensor}StartExposure", params=params) def download(self, filepath=temp_fits): Loading @@ -238,7 +238,7 @@ class Camera(STX): self._wait_if_needed() log.debug(f"Getting original FITS") res = requests.get(f"{self.addr}/Imager.FIT") res = requests.get(f"{self.addr}/{self.sensor}.FIT") log.debug(f"Got original FITS") with open(filepath, 'wb') as f: Loading Loading @@ -278,14 +278,14 @@ class Camera(STX): "NumY": height } self.put(f"{self.cam}SetSettings", params=params) self.put(f"{self.sensor}SetSettings", params=params) def full_frame(self): """Sets the camera to use the full sensor area.""" params = ["CameraXSize", "CameraYSize"] try: cam_x, cam_y = self.get(f"{self.cam}GetSettings", params=params) cam_x, cam_y = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -301,7 +301,7 @@ class Camera(STX): params = ["CameraXSize", "CameraYSize"] try: cam_x, cam_y = self.get(f"{self.cam}GetSettings", params=params) cam_x, cam_y = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -322,7 +322,7 @@ class Camera(STX): params = ["CameraXSize", "CameraYSize"] try: cam_x, cam_y = self.get(f"{self.cam}GetSettings", params=params) cam_x, cam_y = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -344,7 +344,7 @@ class Camera(STX): params = ["BinX", "BinY"] try: binx, biny = self.get(f"{self.cam}GetSettings", params=params) binx, biny = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -366,7 +366,7 @@ class Camera(STX): return params = {"BinX": b[0], "BinY": b[1]} self.put(f"{self.cam}SetSettings", params=params) self.put(f"{self.sensor}SetSettings", params=params) @property def filter(self): Loading Loading @@ -397,7 +397,7 @@ class Camera(STX): """bool: The current state of the CCD cooler (True=On, False=Off).""" params = ["CoolerState"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error: return None Loading @@ -414,14 +414,14 @@ class Camera(STX): return params = {"CoolerState": "1" if b else "0"} self.put(f"{self.cam}SetSettings", params=params) self.put(f"{self.sensor}SetSettings", params=params) @property def temperature(self): """float: The current CCD temperature in degrees Celsius.""" params = ["CCDTemperature"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error: return None Loading @@ -438,7 +438,7 @@ class Camera(STX): return params = {"CCDTemperatureSetpoint": t} self.put(f"{self.cam}SetSettings", params=params) self.put(f"{self.sensor}SetSettings", params=params) @property def all(self): Loading @@ -458,7 +458,7 @@ class Camera(STX): "StartY", "NumX", "NumY"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error or not res or len(res) != len(params): return {} Loading Loading @@ -509,7 +509,7 @@ class Camera(STX): """float: The ambient temperature in degrees Celsius.""" params = ["AmbientTemperature"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error: return None Loading @@ -521,7 +521,7 @@ class Camera(STX): params = ["CameraXSize", "CameraYSize", "BinX", "BinY"] try: camx, camy, binx, biny = self.get(f"{self.cam}GetSettings", params=params) camx, camy, binx, biny = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -547,7 +547,7 @@ class Camera(STX): """int: The current cooler power level in percent.""" params = ["CoolerPower"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error: return None Loading @@ -570,7 +570,7 @@ class Camera(STX): """list of int: The maximum sensor dimensions [X, Y] for current binning.""" params = ["CameraXSize", "CameraYSize"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error: return [None, None] Loading @@ -582,7 +582,7 @@ class Camera(STX): """float: The current CCD temperature setpoint in degrees Celsius.""" params = ["CCDTemperatureSetpoint"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error: return None Loading @@ -594,7 +594,7 @@ class Camera(STX): 0=Idle, 2=Exposing, 3=Reading, 5=Error. """ res = self.get(f"{self.cam}State") res = self.get(f"{self.sensor}State") if self.error: return None Loading @@ -606,7 +606,7 @@ class Camera(STX): 1 if an image is ready for download, 0 otherwise. """ res = self.get(f"{self.cam}ImageReady") res = self.get(f"{self.sensor}ImageReady") if self.error: return None Loading @@ -628,7 +628,7 @@ class Camera(STX): params = ["StartX", "NumX", "BinX"] try: startx, numx, binx = self.get(f"{self.cam}GetSettings", params=params) startx, numx, binx = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -647,7 +647,7 @@ class Camera(STX): params = ["StartY", "NumY", "BinY"] try: starty, numy, biny = self.get(f"{self.cam}GetSettings", params=params) starty, numy, biny = self.get(f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -667,7 +667,7 @@ class Camera(STX): params = ["StartX", "StartY", "BinX", "BinY"] try: startx, starty, binx, biny = self.get( f"{self.cam}GetSettings", params=params) f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -685,7 +685,7 @@ class Camera(STX): params = ["StartX", "StartY", "NumX", "NumY", "BinX", "BinY"] try: startx, starty, numx, numy, binx, biny = self.get( f"{self.cam}GetSettings", params=params) f"{self.sensor}GetSettings", params=params) except ValueError as e: msg = f"Device exception: {e}" log.error(msg) Loading @@ -710,7 +710,7 @@ class Guider(Camera): """ super().__init__(url) self.cam = "ExtGuider" self.sensor = "ExtGuider" @property Loading @@ -729,6 +729,20 @@ class Guider(Camera): log.warning(f"Not available in External Guider") return None @property def ambient(self): """float: The ambient temperature in degrees Celsius.""" log.warning(f"Not available in External Guider") return None @property def setpoint(self): """float: The current CCD temperature setpoint in degrees Celsius.""" log.warning(f"Not available in External Guider") return None @property def temperature(self): Loading @@ -748,7 +762,6 @@ class Guider(Camera): """dict: A comprehensive dictionary of the current camera state.""" params = [ "AmbientTemperature", "BinX", "BinY", "CameraXSize", Loading @@ -757,13 +770,13 @@ class Guider(Camera): "StartY", "NumX", "NumY"] res = self.get(f"{self.cam}GetSettings", params=params) res = self.get(f"{self.sensor}GetSettings", params=params) if self.error or not res or len(res) != len(params): return {} try: ambient, binx, biny, camx, camy, startx, starty, numx, numy = res binx, biny, camx, camy, startx, starty, numx, numy = res b_x, b_y = int(binx), int(biny) x_start, y_start = int(startx) // b_x, int(starty) // b_y Loading @@ -775,8 +788,7 @@ class Guider(Camera): self.error.append(msg) if self.error: return {"ambient": None, "binning": [None, None], return {"binning": [None, None], "max_range": [None, None], "xystart": [None, None], "xyend": [None, None], Loading @@ -785,8 +797,7 @@ class Guider(Camera): "center": [None, None], } return {"ambient": round(ambient, 1), "binning": [b_x, b_y], return {"binning": [b_x, b_y], "max_range": [int(camx) // b_x, int(camy) // b_y], "xystart": [x_start, y_start], "xyend": [x_end, y_end], Loading @@ -794,3 +805,63 @@ class Guider(Camera): "yrange": [y_start, y_end], "center": [int(camx) // b_x // 2, int(camy) // b_y // 2], } class Ao(STX): """ Base wrapper class for SBIG AO-X """ def __init__(self, url): """ Constructor """ super().__init__(url) self.sensor = "AO" @property def state(self): """int: The current state of the imaging CCD. 0=Idle, 1=Moving. """ res = self.get(f"{self.sensor}Status") if self.error: return None return res if self.state != 0: log.error( f"Cannot change position, AO is not idle. State: { self.state}") self.error.append("AO not idle") return params = {"XPosition": b[0], "Yposition": b[1]} self.put(f"{self.sensor}Guide", params=params) @property def position(self): log.warning(f"Not available in AO. Only setter [x,y]") return None @position.setter def position(self, b): if self.state != 0: log.error( f"Cannot change position, AO is not idle. State: { self.state}") self.error.append("AO not idle") return params = {"XPosition": b[0], "YPosition": b[1]} self.put(f"{self.sensor}Guide", params=params)