3
3
import threading
4
4
from datetime import datetime
5
5
import time
6
- from typing import Tuple
7
- from astropy . io import fits
6
+ from typing import Tuple , Any , Optional , Dict
7
+ import numpy as np
8
8
9
9
from pyobs .interfaces import ICamera , IWindow , IBinning , ICooling
10
10
from pyobs .modules .camera .basecamera import BaseCamera
11
11
from pyobs .images import Image
12
12
from pyobs .utils .enums import ExposureStatus
13
- from pyobs_fli .flidriver import *
13
+ from pyobs_fli .flidriver import FliDriver , FliTemperature
14
14
15
15
16
16
log = logging .getLogger (__name__ )
@@ -20,23 +20,23 @@ class FliCamera(BaseCamera, ICamera, IWindow, IBinning, ICooling):
20
20
"""A pyobs module for FLI cameras."""
21
21
__module__ = 'pyobs_fli'
22
22
23
- def __init__ (self , setpoint : float = - 20 , * args , ** kwargs ):
23
+ def __init__ (self , setpoint : float = - 20. , ** kwargs : Any ):
24
24
"""Initializes a new FliCamera.
25
25
26
26
Args:
27
27
setpoint: Cooling temperature setpoint.
28
28
"""
29
- BaseCamera .__init__ (self , * args , * *kwargs )
29
+ BaseCamera .__init__ (self , ** kwargs )
30
30
31
31
# variables
32
- self ._driver = None
33
- self ._temp_setpoint = setpoint
32
+ self ._driver : Optional [ FliDriver ] = None
33
+ self ._temp_setpoint : Optional [ float ] = setpoint
34
34
35
35
# window and binning
36
- self ._window = None
37
- self ._binning = None
36
+ self ._window = ( 0 , 0 , 0 , 0 )
37
+ self ._binning = ( 1 , 1 )
38
38
39
- def open (self ):
39
+ def open (self ) -> None :
40
40
"""Open module."""
41
41
BaseCamera .open (self )
42
42
@@ -58,9 +58,10 @@ def open(self):
58
58
self ._window , self ._binning = self ._driver .get_window_binning ()
59
59
60
60
# set cooling
61
- self .set_cooling (True , self ._temp_setpoint )
61
+ if self ._temp_setpoint is not None :
62
+ self .set_cooling (True , self ._temp_setpoint )
62
63
63
- def close (self ):
64
+ def close (self ) -> None :
64
65
"""Close the module."""
65
66
BaseCamera .close (self )
66
67
@@ -70,31 +71,33 @@ def close(self):
70
71
self ._driver .close ()
71
72
self ._driver = None
72
73
73
- def get_full_frame (self , * args , ** kwargs ) -> Tuple [int , int , int , int ]:
74
+ def get_full_frame (self , ** kwargs : Any ) -> Tuple [int , int , int , int ]:
74
75
"""Returns full size of CCD.
75
76
76
77
Returns:
77
78
Tuple with left, top, width, and height set.
78
79
"""
80
+ if self ._driver is None :
81
+ raise ValueError ('No camera driver.' )
79
82
return self ._driver .get_full_frame ()
80
83
81
- def get_window (self , * args , ** kwargs ) -> Tuple [int , int , int , int ]:
84
+ def get_window (self , ** kwargs : Any ) -> Tuple [int , int , int , int ]:
82
85
"""Returns the camera window.
83
86
84
87
Returns:
85
88
Tuple with left, top, width, and height set.
86
89
"""
87
90
return self ._window
88
91
89
- def get_binning (self , * args , ** kwargs ) -> Tuple [int , int ]:
92
+ def get_binning (self , ** kwargs : Any ) -> Tuple [int , int ]:
90
93
"""Returns the camera binning.
91
94
92
95
Returns:
93
96
Tuple with x and y.
94
97
"""
95
98
return self ._binning
96
99
97
- def set_window (self , left : float , top : float , width : float , height : float , * args , ** kwargs ) :
100
+ def set_window (self , left : int , top : int , width : int , height : int , ** kwargs : Any ) -> None :
98
101
"""Set the camera window.
99
102
100
103
Args:
@@ -109,7 +112,7 @@ def set_window(self, left: float, top: float, width: float, height: float, *args
109
112
self ._window = (left , top , width , height )
110
113
log .info ('Setting window to %dx%d at %d,%d...' , width , height , left , top )
111
114
112
- def set_binning (self , x : int , y : int , * args , ** kwargs ) :
115
+ def set_binning (self , x : int , y : int , ** kwargs : Any ) -> None :
113
116
"""Set the camera binning.
114
117
115
118
Args:
@@ -137,6 +140,10 @@ def _expose(self, exposure_time: float, open_shutter: bool, abort_event: threadi
137
140
ValueError: If exposure was not successful.
138
141
"""
139
142
143
+ # check driver
144
+ if self ._driver is None :
145
+ raise ValueError ('No camera driver.' )
146
+
140
147
# set binning
141
148
log .info ("Set binning to %dx%d." , self ._binning [0 ], self ._binning [1 ])
142
149
self ._driver .set_binning (* self ._binning )
@@ -220,16 +227,18 @@ def _expose(self, exposure_time: float, open_shutter: bool, abort_event: threadi
220
227
self ._change_exposure_status (ExposureStatus .IDLE )
221
228
return image
222
229
223
- def _abort_exposure (self ):
230
+ def _abort_exposure (self ) -> None :
224
231
"""Abort the running exposure. Should be implemented by derived class.
225
232
226
233
Raises:
227
234
ValueError: If an error occured.
228
235
"""
236
+ if self ._driver is None :
237
+ raise ValueError ('No camera driver.' )
229
238
self ._driver .cancel_exposure ()
230
239
self ._camera_status = ExposureStatus .IDLE
231
240
232
- def get_cooling_status (self , * args , ** kwargs ) -> Tuple [bool , float , float ]:
241
+ def get_cooling_status (self , ** kwargs : Any ) -> Tuple [bool , float , float ]:
233
242
"""Returns the current status for the cooling.
234
243
235
244
Returns:
@@ -238,21 +247,25 @@ def get_cooling_status(self, *args, **kwargs) -> Tuple[bool, float, float]:
238
247
SetPoint (float): Setpoint for the cooling in celsius.
239
248
Power (float): Current cooling power in percent or None.
240
249
"""
250
+ if self ._driver is None :
251
+ raise ValueError ('No camera driver.' )
241
252
enabled = self ._temp_setpoint is not None
242
- return enabled , self ._temp_setpoint , self ._driver .get_cooler_power ()
253
+ return enabled , self ._temp_setpoint if self . _temp_setpoint is not None else 99. , self ._driver .get_cooler_power ()
243
254
244
- def get_temperatures (self , * args , ** kwargs ) -> dict :
255
+ def get_temperatures (self , ** kwargs : Any ) -> Dict [ str , float ] :
245
256
"""Returns all temperatures measured by this module.
246
257
247
258
Returns:
248
259
Dict containing temperatures.
249
260
"""
261
+ if self ._driver is None :
262
+ raise ValueError ('No camera driver.' )
250
263
return {
251
264
'CCD' : self ._driver .get_temp (FliTemperature .CCD ),
252
265
'Base' : self ._driver .get_temp (FliTemperature .BASE )
253
266
}
254
267
255
- def set_cooling (self , enabled : bool , setpoint : float , * args , ** kwargs ) :
268
+ def set_cooling (self , enabled : bool , setpoint : float , ** kwargs : Any ) -> None :
256
269
"""Enables/disables cooling and sets setpoint.
257
270
258
271
Args:
@@ -262,6 +275,8 @@ def set_cooling(self, enabled: bool, setpoint: float, *args, **kwargs):
262
275
Raises:
263
276
ValueError: If cooling could not be set.
264
277
"""
278
+ if self ._driver is None :
279
+ raise ValueError ('No camera driver.' )
265
280
266
281
# log
267
282
if enabled :
0 commit comments