Skip to content

Commit 1ce7947

Browse files
committed
ObisLaser: updates for merge into master (issue #55)
This implementation is more than one year old and no longer is valid for the current microscope code. This commit does the following changes: * replaces Device._logger with a module logger. See issue #110. * removes use of *args from the constructor. See issue #84. * set default values for baudrate and timeout time. * replace isAlive() method with is_alive method (see e687cd0) * implement is_alive() to check if device is replying at all instead of using get_is_on() which only checks if device is emitting light. * implement get_min_power_mw() and get_power_mw(), and remove _set_power() and _get_power() which defines behaviour when setting power values outside valie range (issue #51).
1 parent 3dd521e commit 1ce7947

File tree

1 file changed

+46
-51
lines changed

1 file changed

+46
-51
lines changed

microscope/lasers/obis.py

Lines changed: 46 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
#!/usr/bin/python
1+
#!/usr/bin/env python
22
# -*- coding: utf-8
3-
#
3+
44
# Copyright 2016 Mick Phillips (mick.phillips@gmail.com)
5-
# Copyright 2018 David Pinto <david.pinto@bioch.ox.ac.uk>
5+
# Copyright 2019 David Miguel Susano Pinto <david.pinto@bioch.ox.ac.uk>
66
# Copyright 2018 Julio Mateos Langerak <julio.mateos-langerak@igh.cnrs.fr>
77
#
88
# This program is free software: you can redistribute it and/or modify
@@ -18,45 +18,46 @@
1818
# You should have received a copy of the GNU General Public License
1919
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2020

21-
import serial
21+
import logging
2222

23-
import Pyro4
23+
import serial
2424

2525
from microscope import devices
2626

2727

28-
@Pyro4.expose
28+
_logger = logging.getLogger(__name__)
29+
30+
2931
class ObisLaser(devices.SerialDeviceMixIn, devices.LaserDevice):
30-
def __init__(self, com, baud, timeout, *args, **kwargs):
31-
super(ObisLaser, self).__init__(*args, **kwargs)
32-
self.connection = serial.Serial(port=com,
33-
baudrate=baud,
32+
def __init__(self, com, baud=115200, timeout=0.5, **kwargs) -> None:
33+
super().__init__(**kwargs)
34+
self.connection = serial.Serial(port=com, baudrate=baud,
3435
timeout=timeout,
3536
stopbits=serial.STOPBITS_ONE,
3637
bytesize=serial.EIGHTBITS,
3738
parity=serial.PARITY_NONE)
3839
# Start a logger.
3940
self._write(b'SYSTem:INFormation:MODel?')
4041
response = self._readline()
41-
self._logger.info('OBIS laser model: [%s]' % response.decode())
42+
_logger.info('OBIS laser model: [%s]' % response.decode())
4243
self._write(b'SYSTem:INFormation:SNUMber?')
4344
response = self._readline()
44-
self._logger.info('OBIS laser serial number: [%s]' % response.decode())
45+
_logger.info('OBIS laser serial number: [%s]' % response.decode())
4546
self._write(b'SYSTem:CDRH?')
4647
response = self._readline()
47-
self._logger.info('CDRH safety: [%s]' % response.decode())
48+
_logger.info('CDRH safety: [%s]' % response.decode())
4849
self._write(b'SOURce:TEMPerature:APRobe?')
4950
response = self._readline()
50-
self._logger.info('TEC temperature control: [%s]' % response.decode())
51+
_logger.info('TEC temperature control: [%s]' % response.decode())
5152
self._write(b'*TST?')
5253
response = self._readline()
53-
self._logger.info('Self test procedure: [%s]' % response.decode())
54+
_logger.info('Self test procedure: [%s]' % response.decode())
5455

55-
# We need to ensure that autostart is disabled so that we can switch emission
56-
# on/off remotely.
56+
# We need to ensure that autostart is disabled so that we can
57+
# switch emission on/off remotely.
5758
self._write(b'SYSTem:AUTostart?')
5859
response = self._readline()
59-
self._logger.info('Response to Autostart: [%s]' % response.decode())
60+
_logger.info('Response to Autostart: [%s]' % response.decode())
6061

6162
def _write(self, command):
6263
"""Send a command."""
@@ -91,7 +92,7 @@ def get_status(self):
9192
@devices.SerialDeviceMixIn.lock_comms
9293
def enable(self):
9394
"""Turn the laser ON. Return True if we succeeded, False otherwise."""
94-
self._logger.info('Turning laser ON.')
95+
_logger.info('Turning laser ON.')
9596
# Exiting Sleep Mode.
9697
self._write(b'SOURce:TEMPerature:APRobe ON')
9798
self._flush_handshake()
@@ -100,12 +101,12 @@ def enable(self):
100101
self._flush_handshake()
101102
self._write(b'SOURce:AM:STATe?')
102103
response = self._readline()
103-
self._logger.info("SOURce:AM:STATe? [%s]" % response.decode())
104+
_logger.info("SOURce:AM:STATe? [%s]" % response.decode())
104105

105106
if not self.get_is_on():
106107
# Something went wrong.
107-
self._logger.error("Failed to turn ON. Current status:\r\n")
108-
self._logger.error(self.get_status())
108+
_logger.error("Failed to turn ON. Current status:\r\n")
109+
_logger.error(self.get_status())
109110
return False
110111
return True
111112

@@ -123,7 +124,6 @@ def _on_shutdown(self):
123124

124125

125126
def initialize(self):
126-
"""Initialization to do when cockpit connects."""
127127
# self.flush_buffer()
128128
# We ensure that handshaking is off.
129129
self._write(b'SYSTem:COMMunicate:HANDshaking ON')
@@ -136,61 +136,56 @@ def initialize(self):
136136
@devices.SerialDeviceMixIn.lock_comms
137137
def disable(self):
138138
"""Turn the laser OFF. Return True if we succeeded, False otherwise."""
139-
self._logger.info('Turning laser OFF.')
139+
_logger.info('Turning laser OFF.')
140140
# Turning LASER OFF
141141
self._write(b'SOURce:AM:STATe OFF')
142142
self._flush_handshake()
143143

144144
if self.get_is_on():
145-
# Something went wrong.
146-
self._logger.error("Failed to turn OFF. Current status:\r\n")
147-
self._logger.error(self.get_status())
145+
_logger.error("Failed to turn OFF. Current status:\r\n")
146+
_logger.error(self.get_status())
148147
return False
149148
return True
150149

151150
@devices.SerialDeviceMixIn.lock_comms
152-
def isAlive(self):
153-
return self.get_is_on
151+
def is_alive(self):
152+
self._write(b'*IDN?')
153+
reply = self._readline()
154+
# 'Coherent, Inc-<model name>-<firmware version>-<firmware date>'
155+
return reply.startswith(b'Coherent, Inc-')
154156

155157
@devices.SerialDeviceMixIn.lock_comms
156158
def get_is_on(self):
157159
"""Return True if the laser is currently able to produce light."""
158160
self._write(b'SOURce:AM:STATe?')
159161
response = self._readline()
160-
self._logger.info("Are we on? [%s]", response.decode())
162+
_logger.info("Are we on? [%s]", response.decode())
161163
return response == b'ON'
162164

163165
@devices.SerialDeviceMixIn.lock_comms
164-
def _set_power(self, power_w):
165-
"""Sets the power level in Watts"""
166-
if power_w > (self.get_max_power_mw() / 1000):
167-
return
168-
self._logger.info("Setting laser power to %.7sW", power_w)
169-
self._write(b'SOURce:POWer:LEVel:IMMediate:AMPLitude %.5f' % power_w)
170-
self._flush_handshake()
171-
curr_power = self._get_power()
172-
self._logger.info("Power response [%s]", curr_power)
173-
return curr_power
166+
def get_min_power_mw(self):
167+
self._write(b'SOURce:POWer:LIMit:LOW?')
168+
power_w = self._readline()
169+
return float(power_w.decode()) * 1000.0
174170

175171
@devices.SerialDeviceMixIn.lock_comms
176172
def get_max_power_mw(self):
177173
"""Gets the maximum laser power in mW."""
178-
self._write(b'SYSTem:INFormation:POWer?')
174+
self._write(b'SOURce:POWer:LIMit:HIGH?')
179175
power_w = self._readline()
180-
return int(float(power_w.decode()) * 1000)
176+
return float(power_w.decode()) * 1000.0
181177

182178
@devices.SerialDeviceMixIn.lock_comms
183-
def _get_power(self):
179+
def get_power_mw(self):
184180
if not self.get_is_on():
185-
# Laser is not on.
186-
return 0
181+
return 0.0
187182
self._write(b'SOURce:POWer:LEVel?')
188183
response = self._readline()
189-
return float(response.decode())
190-
191-
def get_power_mw(self):
192-
return 1000 * self._get_power()
184+
return float(response.decode()) * 1000.0
193185

186+
@devices.SerialDeviceMixIn.lock_comms
194187
def _set_power_mw(self, mw):
195-
mw = min(mw, self.get_max_power_mw())
196-
return self._set_power(mw / 1000)
188+
power_w = mw / 1000.0
189+
_logger.info("Setting laser power to %.7sW", power_w)
190+
self._write(b'SOURce:POWer:LEVel:IMMediate:AMPLitude %.5f' % power_w)
191+
self._flush_handshake()

0 commit comments

Comments
 (0)