Source code for lantz.drivers.mpb.vfl

# -*- coding: utf-8 -*-
"""
    lantz.drivers.mpb.vfl
    ~~~~~~~~~~~~~~~~~~~~~

    :copyright: 2015 by Lantz Authors, see AUTHORS for more details.
    :license: BSD, see LICENSE for more details.
"""

from pyvisa import constants

from lantz import Action, Feat
from lantz.messagebased import MessageBasedDriver


[docs]class VFL(MessageBasedDriver): """Driver for any VFL MPB Communications laser. """ DEFAULTS = {'ASRL': {'write_termination': '\rD >', 'read_termination': '\r\n', 'baud_rate': 1200, 'bytesize': 8, 'parity': constants.Parity.none, 'stop_bits': constants.StopBits.one, 'encoding': 'ascii', }} #: flow control flags #RTSCTS = False #DSRDTR = False #XONXOFF = False @Feat(read_once=True) def idn(self): """Identification of the device """ return self.query('GETMODEL') @Feat() def status(self): """Current device status """ ans = self.query('shlaser') return ans.split('\r') # ENABLE LASER @Feat(values={True: '1', False: '0'}) def enabled(self): """Method for turning on the laser """ return self.query('GETLDENABLE') @enabled.setter def enabled(self, value): self.query('SETLDENABLE ' + value) # LASER'S CONTROL MODE AND SET POINT @Feat(values={'APC': '1', 'ACC': '0'}) def ctl_mode(self): """To handle laser diode current (mA) in Active Current Control Mode """ return self.query('GETPOWERENABLE') @ctl_mode.setter def ctl_mode(self, value): self.query('POWERENABLE {}'.format(value)) @Feat(units='mA') def current_sp(self): """To handle laser diode current (mA) in Active Current Control Mode """ return float(self.query('GETLDCUR 1')) @current_sp.setter def current_sp(self, value): self.query('SETLDCUR 1 {:.1f}'.format(value)) @Feat(units='mW') def power_sp(self): """To handle output power set point (mW) in APC Mode """ return float(self.query('GETPOWER 0')) @power_sp.setter def power_sp(self, value): self.query('SETPOWER 0 {:.0f}'.format(value)) # LASER'S CURRENT STATUS @Feat(units='mW') def power(self): """To get the laser emission power (mW) """ return float(self.query('POWER 0')) @Feat(units='mA') def ld_current(self): """To get the laser diode current (mA) """ return float(self.query('LDCURRENT 1')) @Feat(units='degC') def ld_temp(self): """To get the laser diode temperature (ºC) """ return float(self.query('LDTEMP 1')) @Feat(units='mA') def tec_current(self): """To get the thermoelectric cooler (TEC) current (mA) """ return float(self.query('TECCURRENT 1')) @Feat(units='degC') def tec_temp(self): """To get the thermoelectric cooler (TEC) temperature (ºC) """ return float(self.query('TECTEMP 1')) # SECOND HARMONIC GENERATOR METHODS @Feat(units='degC') def shg_temp_sp(self): """To handle the SHG temperature set point """ return float(self.query('GETSHGTEMP')) @shg_temp_sp.setter def shg_temp_sp(self, value): self.query('GETSHGTEMP {:.2f}'.format(value)) @Feat(units='degC') def shg_temp(self): """To get the SHG temperature """ return float(self.query('SHGTEMP')) @Feat() def shg_tune_info(self): """Getting information about laser ready for SHG tuning """ info = self.query('GETSHGTUNERDY').split() if info[0] == '0': ready = 'Laser not ready for SHG tuning. ' else: ready = 'Laser ready for SHG tuning. ' schedule = 'Next SHG tuning scheduled in {} '.format(info[1]) schedule += 'hours of operation. ' warm = 'Warm-up period expires in {} seconds.'.format(info[2]) ans = ready + schedule + warm return ans @Feat() def shg_tuning(self): """Initiating SHG tuning """ state = self.query('GETSHGTUNESTATE').split() if state[0] == '0': tuning = 'No SHG tuning performed since last reset. ' elif state[0] == '3': tuning = 'SHG tuning in progress. ' elif state[0] == '1': tuning = 'SHG tuning completed successfully. ' elif state[0] == '2': tuning = 'SHG tuning aborted. ' if state[1] == '0': error = 'No error detected.' elif state[1] == '1': error = 'Error: Laser not running in APC.' elif state[1] == '8': error = 'Error: Output Power not stabilized.' return tuning + error @Action() def tune_shg(self): self.query('SETSHGCMD 1') @Action() def tune_shg_stop(self): self.query('SETSHGCMD 2')
if __name__ == '__main__': import argparse import lantz.log parser = argparse.ArgumentParser(description='Test Kentech HRI') parser.add_argument('-i', '--interactive', action='store_true', default=False, help='Show interactive GUI') parser.add_argument('-p', '--port', type=str, default='COM3', help='Serial port to connect to') args = parser.parse_args() lantz.log.log_to_screen(lantz.log.DEBUG) with VFL.from_serial_port(args.port) as inst: if args.interactive: from lantz.ui.qtwidgets import start_test_app start_test_app(inst) else: # Add your test code here print('Non interactive mode') print(inst.idn) print(inst.shg_tuning)