"""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()