Skip to content

Commit 6cc01f7

Browse files
committed
Merge branch 'master' into 121-pipeline
get_all_settings just reports the values of problem settings as None rather than creating a new __errors__ entry in the returned dict.
2 parents 5f4240f + de9070e commit 6cc01f7

File tree

20 files changed

+682
-136
lines changed

20 files changed

+682
-136
lines changed

NEWS

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,18 @@ python-microscope releases.
44
Version 0.4.0 (upcoming)
55
------------------------
66

7+
* Selected most important, backwards incompatible, changes:
8+
9+
* The `Setting` class is now private. The only supported method to
10+
add settings to a `Device` is via its `add_setting` method.
11+
712
* New devices supported:
813

9-
* Coherent Obis laser.
14+
* Coherent Obis laser
15+
* Lumencor Spectra III light engine
1016
* Prior ProScan III controller
1117
* Prior filter wheels
18+
* Toptica iBeam laser
1219

1320
* Changes to device ABCs:
1421

@@ -17,6 +24,11 @@ Version 0.4.0 (upcoming)
1724
* The `Device._logger` attribute has been removed. It is
1825
recommended to use a logger for the module.
1926

27+
* DeformableMirror:
28+
29+
* Concrete classes must implement the `n_actuators` public
30+
property instead of the private _n_actuators`.
31+
2032
* The device server and clients no longer force pickle protocol
2133
version 2. If the client and server are running different Python
2234
versions it may be necessary to specify a version number. This

doc/supported-devices.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,13 @@ Lasers
3737
------
3838

3939
- Cobolt (:class:`microscope.lasers.cobolt`)
40-
- Coherent Sapphire (:class:`microscope.lasers.sapphire`)
4140
- Coherent Obis (:class:`microscope.lasers.obis`)
41+
- Coherent Sapphire (:class:`microscope.lasers.sapphire`)
4242
- Omicron Deepstar (:class:`microscope.lasers.deepstar`)
43+
- Toptica iBeam (:class:`microscope.lasers.toptica`)
4344

4445
Controllers
4546
-----------
4647

4748
- Prior ProScan III (:class:`microscope.controllers.prior`)
49+
- Lumencor Spectra III light engine (:class:`microscope.controllers.lumencor`)

microscope/cameras/atmcd.py

Lines changed: 58 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,11 @@
3131
"""
3232

3333
import logging
34-
import re, sys, functools, os, platform
34+
import sys, functools, os, platform
3535
import ctypes
3636
from ctypes import Structure, POINTER
3737
from ctypes import c_int, c_uint, c_long, c_ulong, c_longlong, c_ulonglong
3838
from ctypes import c_ubyte, c_short, c_float, c_double, c_char, c_char_p
39-
from ctypes import c_void_p
4039
from numpy.ctypeslib import ndpointer
4140

4241

@@ -1132,9 +1131,8 @@ def __str__(self):
11321131

11331132

11341133
from threading import Lock
1135-
import functools
11361134
from microscope import devices
1137-
from microscope.devices import keep_acquiring, Setting, Binning, ROI
1135+
from microscope.devices import keep_acquiring, Binning, ROI
11381136
import time
11391137

11401138
# A lock on the DLL used to ensure DLL calls act on the correct device.
@@ -1255,21 +1253,21 @@ def initialize(self):
12551253
# Mode
12561254
name = 'readout mode'
12571255
if self._readout_modes:
1258-
self.settings[name] = Setting(name, 'enum',
1259-
None,
1260-
self._set_readout_mode,
1261-
lambda: [str(mode) for mode in self._readout_modes])
1262-
self.settings[name].set(0)
1256+
self.add_setting(name, 'enum',
1257+
None,
1258+
self._set_readout_mode,
1259+
lambda: [str(mode) for mode in self._readout_modes])
1260+
self.set_setting(name, 0)
12631261
# TriggerMode
12641262
name = 'TriggerMode'
1265-
self.settings[name] = Setting(name, 'enum',
1266-
None,
1267-
self._bind(SetTriggerMode),
1268-
TriggerMode)
1263+
self.add_setting(name, 'enum',
1264+
None,
1265+
self._bind(SetTriggerMode),
1266+
TriggerMode)
12691267
if self._caps.ulTriggerModes & AC_TRIGGERMODE_EXTERNAL:
1270-
self.settings[name].set(TriggerMode.EXTERNAL)
1268+
self.set_setting(name, TriggerMode.EXTERNAL)
12711269
elif self._caps.ulTriggerModes & AC_TRIGGERMODE_CONTINUOUS:
1272-
self.settings[name].set(TriggerMode.SOFTWARE)
1270+
self.set_setting(name, TriggerMode.SOFTWARE)
12731271
# Gain - device will use either EMGain or MCPGain
12741272
name = 'gain'
12751273
getter, setter, vrange = None, None, None
@@ -1284,9 +1282,7 @@ def initialize(self):
12841282
setter = self._bind(SetMCPGain)
12851283
vrange = self._bind(GetMCPGainRange)
12861284
if getter or setter:
1287-
self.settings[name] = Setting(name, 'int',
1288-
getter, setter, vrange,
1289-
setter is None)
1285+
self.add_setting(name, 'int', getter, setter, vrange, setter is None)
12901286
# Temperature
12911287
name = 'TemperatureSetPoint'
12921288
getter, setter, vrange = None, None, None
@@ -1295,77 +1291,73 @@ def initialize(self):
12951291
if self._caps.ulGetFunctions & AC_GETFUNCTION_TEMPERATURERANGE:
12961292
vrange = self._bind(GetTemperatureRange)
12971293
if setter:
1298-
self.settings[name] = Setting(name, 'int',
1299-
None, setter, vrange,
1300-
setter is None)
1294+
self.add_setting(name, 'int', None, setter, vrange, setter is None)
13011295
# Set a conservative default temperature set-point.
1302-
self.settings[name].set(-20)
1296+
self.set_setting(name, -20)
13031297
# Fan control
13041298
name = 'Temperature'
1305-
self.settings[name] = Setting(name, 'int',
1306-
self.get_sensor_temperature,
1307-
None, (None, None), True)
1299+
self.add_setting(name, 'int', self.get_sensor_temperature, None, (None, None), True)
13081300
name = 'Fan mode'
1309-
self.settings[name] = Setting(name, 'enum',
1310-
None, # Can't query fan mode
1311-
self._bind(SetFanMode),
1312-
{0:'full', 1:'low', 2:'off'}
1313-
)
1301+
self.add_setting(name, 'enum',
1302+
None, # Can't query fan mode
1303+
self._bind(SetFanMode),
1304+
{0:'full', 1:'low', 2:'off'}
1305+
)
13141306
# Cooler control
13151307
name = 'Cooler Enabled'
1316-
self.settings[name] = Setting(name, 'bool',
1317-
None,
1318-
self._set_cooler_state,
1319-
None)
1320-
self.settings[name].set(True)
1308+
self.add_setting(name, 'bool',
1309+
None,
1310+
self._set_cooler_state,
1311+
None)
1312+
self.set_setting(name, True)
13211313
# Binning
13221314
name = 'Binning'
1323-
self.settings[name] = Setting(name, 'tuple',
1324-
self.get_binning,
1325-
self.set_binning,
1326-
None)
1315+
self.add_setting(name, 'tuple',
1316+
self.get_binning,
1317+
self.set_binning,
1318+
None)
13271319
# Roi
13281320
name = 'Roi'
1329-
self.settings[name] = Setting(name, 'tuple',
1330-
self.get_roi,
1331-
lambda roi: self.set_roi(*roi),
1332-
None)
1321+
self.add_setting(name, 'tuple',
1322+
self.get_roi,
1323+
lambda roi: self.set_roi(*roi),
1324+
None)
13331325
# BaselineClamp
13341326
name = 'BaselineClamp'
13351327
if self._caps.ulSetFunctions & AC_SETFUNCTION_BASELINECLAMP:
1336-
self.settings[name] = Setting(name, 'bool',
1337-
None,
1338-
self._bind(SetBaselineClamp))
1339-
self.settings[name].set(False)
1328+
self.add_setting(name, 'bool',
1329+
None,
1330+
self._bind(SetBaselineClamp))
1331+
self.set_setting(name, False)
13401332
# BaselineOffset
1341-
nam = 'BaselineOffset'
1333+
name = 'BaselineOffset'
13421334
if self._caps.ulSetFunctions & AC_SETFUNCTION_BASELINEOFFSET:
1343-
self.settings[name] = Setting(name, 'int',
1344-
None,
1345-
self._bind(SetBaselineOffset),
1346-
(-1000, 1000))
1347-
self.settings[name].set(0)
1335+
self.add_setting(name, 'int',
1336+
None,
1337+
self._bind(SetBaselineOffset),
1338+
(-1000, 1000))
1339+
self.set_setting(name, 0)
13481340
# EMAdvanced
13491341
name = 'EMAdvanced'
13501342
if self._caps.ulSetFunctions & AC_SETFUNCTION_EMADVANCED:
1351-
self.settings[name] = Setting(name, 'bool',
1352-
None,
1353-
self._bind(SetEMAdvanced))
1354-
self.settings[name].set(False)
1343+
self.add_setting(name, 'bool',
1344+
None,
1345+
self._bind(SetEMAdvanced))
1346+
self.set_setting(name, False)
13551347
# GateMode
13561348
name = 'GateMode'
13571349
if self._caps.ulSetFunctions & AC_SETFUNCTION_GATEMODE:
13581350
vrange = range(0, [5,6][self._caps.ulCameraType & AC_CAMERATYPE_ISTAR])
1359-
self.setings[name] = Setting(name, 'int',
1360-
None,
1361-
self._bind(SetGateMode),
1362-
vrange)
1351+
self.add_setting(name, 'int',
1352+
None,
1353+
self._bind(SetGateMode),
1354+
vrange)
13631355
# HighCapacity
13641356
name = 'HighCapacity'
13651357
if self._caps.ulSetFunctions & AC_SETFUNCTION_HIGHCAPACITY:
1366-
self.settings[name] = Setting(name, 'bool',
1367-
None,
1368-
self._bind(SetHighCapacity))
1358+
self.add_setting(name, 'bool',
1359+
None,
1360+
self._bind(SetHighCapacity))
13691361

13701362
def _fetch_data(self):
13711363
"""Poll for data and return it, with minimal processing.
@@ -1431,7 +1423,7 @@ def _on_enable(self):
14311423
SetReadMode(ReadMode.IMAGE)
14321424
x, y = GetDetector()
14331425
self._set_image()
1434-
if not IsTriggerModeAvailable(self.settings['TriggerMode'].get()):
1426+
if not IsTriggerModeAvailable(self.get_setting('TriggerMode')):
14351427
raise AtmcdException("Trigger mode is not valid.")
14361428
StartAcquisition()
14371429
return True
@@ -1508,7 +1500,7 @@ def get_sensor_temperature(self):
15081500

15091501
def get_trigger_type(self):
15101502
"""Return the microscope.devices trigger type."""
1511-
trig = self.settings['TriggerMode'].get()
1503+
trig = self.get_setting('TriggerMode')
15121504
if trig == TriggerMode.BULB:
15131505
return devices.TRIGGER_DURATION
15141506
elif trig == TriggerMode.SOFTWARE:

microscope/cameras/pvcam.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1255,7 +1255,7 @@ def _on_enable(self):
12551255
t_exp = int(self.exposure_time * 1e6)
12561256
else:
12571257
self._params[PARAM_EXP_RES].set_value(EXP_RES_ONE_MILLISEC)
1258-
t_exp = value = int(self.exposure_time * 1e3)
1258+
t_exp = int(self.exposure_time * 1e3)
12591259
# Configure camera, allocate buffer, and register callback.
12601260
if self._trigger == TRIG_SOFT:
12611261
# Software triggering for single frames.

microscope/cameras/ximea.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import numpy as np
2525

2626
from microscope import devices
27-
from microscope.devices import keep_acquiring, Binning, ROI
27+
from microscope.devices import keep_acquiring, ROI
2828

2929
#import ximea python module.
3030
from ximea import xiapi

0 commit comments

Comments
 (0)