Commit 36c7f387 authored by vertighel's avatar vertighel
Browse files

Implemented AO-X wrapper in stx.py

parent 9c9eeff8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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)


+5 −0
Original line number Diff line number Diff line
@@ -16,6 +16,11 @@ pos_imaging = 120
pos_spectro = 110
pos_echelle = 100

[ao]
module = stx
class = Ao
node = STX

######################################

[teccam]
+1 −1
Original line number Diff line number Diff line
@@ -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
+105 −34
Original line number Diff line number Diff line
@@ -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):
        """
@@ -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):
@@ -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:
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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):
@@ -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

@@ -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

@@ -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):
@@ -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 {}
@@ -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

@@ -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)
@@ -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

@@ -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]

@@ -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

@@ -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

@@ -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

@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -710,7 +710,7 @@ class Guider(Camera):
        """
        
        super().__init__(url)
        self.cam = "ExtGuider"
        self.sensor = "ExtGuider"

        
    @property
@@ -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):
@@ -748,7 +762,6 @@ class Guider(Camera):
        """dict: A comprehensive dictionary of the current camera state."""

        params = [
            "AmbientTemperature",
            "BinX",
            "BinY",
            "CameraXSize",
@@ -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
@@ -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],
@@ -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],
@@ -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)