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
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
2525from microscope import devices
2626
2727
28- @Pyro4 .expose
28+ _logger = logging .getLogger (__name__ )
29+
30+
2931class 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