Source code for pyccapt.control.nkt_photonics.origamiClassCLI

"""Origami XPS laser control over the vendor CLI protocol.

Vendor / origin
---------------
The CLI command set used in this module (``ly_oxp2_*``, ``e_freq``,
``e_div``, ``e_mode``, ``e_power``, ``e_mlp``, ``ls_wavelength``, etc.)
is defined and owned by **NKT Photonics A/S** for their Origami XP /
XPS series femtosecond lasers. This file is a thin Python wrapper
around that ASCII serial protocol; the protocol itself is documented
in NKT's CLI reference and the Origami QSG (see
``T:/Monajem/Oxcart_laser_manual/`` on the lab network and
``800-621-0X.pdf`` series).

The original wrapper (`origClass`) was authored by **Ian Baker (NKT
Photonics), version 1.1** and shipped as an example with the NKT SDK.
Subsequent edits in this repository are local extensions for pyccapt
integration; the underlying CLI commands remain NKT's.

Use of the Origami / OXPS hardware and its CLI protocol is subject to
NKT Photonics' licence terms; consult NKT's documentation before
distributing this file outside this project.
"""

from time import sleep

import serial


# Control static object for Origami using CLI
# Version 1.1
#
# Author: Ian Baker (NKT Photonics)
# Origin: NKT Photonics SDK example, adapted for pyccapt.


[docs] class origClass: ## Control methods def __init__(self, comPort): self.comPort = comPort self.ser = None self.last_error = None
[docs] def open_port(self): try: self.ser = serial.Serial( port=self.comPort, baudrate=38400, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, rtscts=False ) self.last_error = None return 0 except Exception as e: self.last_error = e return -1
[docs] def close_port(self): self.ser.close()
[docs] def Listen(self): cmd = "ly_oxp2_listen\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def Standby(self): cmd = "ly_oxp2_standby\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def Enable(self): cmd = "ly_oxp2_enabled\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def Temp(self, comPort): # Displays the laser system temperatures (needs a read back) # Open the port cmd = "ly_oxp2_temp_status\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) return dataBack.decode()
[docs] def Power(self, power): """Set the IR seed/pump power setpoint of the OXPS. Units: ``power`` is in **Watts** (the same convention as the ``max_laser_power`` config entry and the test report, e.g. "IR power set to 4.65 W"). Range is 0 .. ``max_laser_power``. The corresponding CLI command is ``ly_oxp2_power=<value>``; the firmware echoes back ``ly_oxp2_power <value>`` on success. """ cmd = "ly_oxp2_power=" + str(power) + "\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def PowerRead(self): cmd = "ly_oxp2_power?\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def AOM(self, power): cmd = "e_power=" + str(power) + "\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def AOMRead(self): # Displays the e_power setting cmd = "e_power?\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def Freq(self, freq): cmd = "e_freq=" + str(freq) + "\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def FreqRead(self): cmd = "e_freq?\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def Div(self, division): cmd = "e_div=" + str(division) + "\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def DivRead(self): cmd = "e_div?\r\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def Mode(self, mode): cmd = "e_mode " + str(mode) + "\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def ModeRead(self): cmd = "e_mode?\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def StatusRead(self): cmd = "ly_oxp2_dev_status\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def StatusMode(self): cmd = "ly_oxp2_mode\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def ServiceMode(self): cmd = "ly_oxp2_service_mode\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def DigitalGateLogic(self, choice): cmd = "ly_oxp2_digiop=" + str(choice) + "\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def DigitalGateLogicRead(self): cmd = "ly_oxp2_digiop?\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def AOMEnable(self): cmd = "ly_oxp2_output_enable\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def AOMDisable(self): cmd = "ly_oxp2_output_disable\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def AOMState(self): cmd = "ly_oxp2_output?\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def InterbusEnable(self): # AOM is open if return value is 0 and closed if return value is 1] cmd = "ly_oxp2_nktpbus=1\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: dataBack = self.ser.readline() dataStore.append(dataBack.decode()) sleep(0.1) return dataBack.decode()
[docs] def wavelength_change(self, wavelength): cmd = "ls_wavelength=" + str(wavelength) + "\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: data_back = self.ser.readline() dataStore.append(data_back.decode()) sleep(0.1) return data_back.decode()
[docs] def wavelength_read(self): cmd = "ls_wavelength?\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: data_back = self.ser.readline() dataStore.append(data_back.decode()) sleep(0.1) return data_back.decode()
[docs] def read_average_power(self): cmd = "e_mlp?\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: data_back = self.ser.readline() dataStore.append(data_back.decode()) sleep(0.1) return data_back.decode()
[docs] def freq_avaliable(self): cmd = "e_freq_available?\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: data_back = self.ser.readline() print(data_back.decode()) dataStore.append(data_back.decode()) sleep(0.1) return data_back.decode()
[docs] def power_read_dv_green(self): cmd = "ls_output_power?\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: data_back = self.ser.readline() dataStore.append(data_back.decode()) sleep(0.1) return data_back.decode()
[docs] def status_led(self): cmd = "ly_oxp2_mode?\n" self.ser.write(cmd.encode()) sleep(0.1) dataStore = [] while self.ser.in_waiting: data_back = self.ser.readline() dataStore.append(data_back.decode()) sleep(0.1) return data_back.decode()