import multiprocessing
import os
import re
import sys
import time
import serial.tools.list_ports
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtCore import QThread
from PyQt6.QtGui import QPixmap
# Local module and scripts
from pyccapt.control.core import runtime
from pyccapt.control.nkt_photonics import origamiClassCLI
def _available_serial_ports_text():
ports = sorted(port.device for port in serial.tools.list_ports.comports() if getattr(port, "device", ""))
return ", ".join(ports) if ports else "none detected"
[docs]
class Ui_Laser_Control(object):
def __init__(self, variables, conf):
"""
Initialize the Ui_Laser_Control class.
Args:
variables: Global experiment variables.
conf: Configuration settings.
"""
self.variables = variables
self.conf = conf
self.listen_mode = False
self.standby_mode = False
self.enable_mode = False
self.laser_on_mode = False
self.change_laser_wavelegnth = False
self.change_laser_power = False
self.change_laser_rate = False
self.change_laser_divition_factor = False
self.index = 0
[docs]
def setupUi(self, Laser_Control):
"""
Setup the GUI for the laser control.
Args:
Laser_Control: The GUI window
Return:
None
"""
Laser_Control.setObjectName("Laser_Control")
Laser_Control.resize(1003, 345)
self.gridLayout_6 = QtWidgets.QGridLayout(Laser_Control)
self.gridLayout_6.setObjectName("gridLayout_6")
self.gridLayout_5 = QtWidgets.QGridLayout()
self.gridLayout_5.setObjectName("gridLayout_5")
self.gridLayout_3 = QtWidgets.QGridLayout()
self.gridLayout_3.setObjectName("gridLayout_3")
self.laser_wavelegnth = QtWidgets.QComboBox(parent=Laser_Control)
self.laser_wavelegnth.setStyleSheet("QComboBox{background: rgb(223,223,233)}")
self.laser_wavelegnth.setObjectName("laser_wavelegnth")
self.laser_wavelegnth.addItem("")
self.laser_wavelegnth.addItem("")
self.laser_wavelegnth.addItem("")
self.gridLayout_3.addWidget(self.laser_wavelegnth, 0, 1, 1, 1)
self.led_laser_on = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.led_laser_on.setFont(font)
self.led_laser_on.setObjectName("led_laser_on")
self.gridLayout_3.addWidget(self.led_laser_on, 1, 3, 1, 1)
self.laser_rate = QtWidgets.QComboBox(parent=Laser_Control)
self.laser_rate.setStyleSheet("QComboBox{background: rgb(223,223,233)}")
self.laser_rate.setObjectName("laser_rate")
self.laser_rate.addItem("")
self.laser_rate.addItem("")
self.laser_rate.addItem("")
self.laser_rate.addItem("")
self.laser_rate.addItem("")
self.laser_rate.addItem("")
self.laser_rate.addItem("")
self.gridLayout_3.addWidget(self.laser_rate, 2, 1, 1, 1)
self.led_laser_enable = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.led_laser_enable.setFont(font)
self.led_laser_enable.setObjectName("led_laser_enable")
self.gridLayout_3.addWidget(self.led_laser_enable, 0, 3, 1, 1)
self.laser_standby = QtWidgets.QPushButton(parent=Laser_Control)
self.laser_standby.setMinimumSize(QtCore.QSize(90, 25))
self.laser_standby.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.laser_standby.setStyleSheet("")
self.laser_standby.setObjectName("laser_standby")
self.gridLayout_3.addWidget(self.laser_standby, 2, 2, 1, 1)
self.label_2 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.gridLayout_3.addWidget(self.label_2, 2, 0, 1, 1)
self.laser_on = QtWidgets.QPushButton(parent=Laser_Control)
self.laser_on.setMinimumSize(QtCore.QSize(90, 25))
self.laser_on.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.laser_on.setStyleSheet("")
self.laser_on.setObjectName("laser_on")
self.gridLayout_3.addWidget(self.laser_on, 1, 2, 1, 1)
self.label_3 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.gridLayout_3.addWidget(self.label_3, 3, 0, 1, 1)
self.laser_enable = QtWidgets.QPushButton(parent=Laser_Control)
self.laser_enable.setMinimumSize(QtCore.QSize(90, 25))
self.laser_enable.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.laser_enable.setStyleSheet("")
self.laser_enable.setObjectName("laser_enable")
self.gridLayout_3.addWidget(self.laser_enable, 0, 2, 1, 1)
self.led_laser_listen = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.led_laser_listen.setFont(font)
self.led_laser_listen.setObjectName("led_laser_listen")
self.gridLayout_3.addWidget(self.led_laser_listen, 3, 3, 1, 1)
self.led_laser_laser_standby = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.led_laser_laser_standby.setFont(font)
self.led_laser_laser_standby.setObjectName("led_laser_laser_standby")
self.gridLayout_3.addWidget(self.led_laser_laser_standby, 2, 3, 1, 1)
self.label = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label.setFont(font)
self.label.setObjectName("label")
self.gridLayout_3.addWidget(self.label, 1, 0, 1, 1)
self.laser_listen = QtWidgets.QPushButton(parent=Laser_Control)
self.laser_listen.setMinimumSize(QtCore.QSize(90, 25))
self.laser_listen.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.laser_listen.setStyleSheet("")
self.laser_listen.setObjectName("laser_listen")
self.gridLayout_3.addWidget(self.laser_listen, 3, 2, 1, 1)
self.label_4 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_4.setFont(font)
self.label_4.setObjectName("label_4")
self.gridLayout_3.addWidget(self.label_4, 0, 0, 1, 1)
self.laser_divition_factor = QtWidgets.QSpinBox(parent=Laser_Control)
self.laser_divition_factor.setObjectName("laser_divition_factor")
self.gridLayout_3.addWidget(self.laser_divition_factor, 3, 1, 1, 1)
self.laser_power = QtWidgets.QDoubleSpinBox(parent=Laser_Control)
self.laser_power.setObjectName("doubleSpinBox")
self.gridLayout_3.addWidget(self.laser_power, 1, 1, 1, 1)
self.gridLayout_5.addLayout(self.gridLayout_3, 0, 0, 2, 3)
self.label_12 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_12.setFont(font)
self.label_12.setObjectName("label_12")
self.gridLayout_5.addWidget(self.label_12, 0, 4, 1, 1)
self.laser_scan_mode5 = QtWidgets.QComboBox(parent=Laser_Control)
self.laser_scan_mode5.setStyleSheet("QComboBox{background: rgb(223,223,233)}")
self.laser_scan_mode5.setObjectName("laser_scan_mode5")
self.laser_scan_mode5.addItem("")
self.gridLayout_5.addWidget(self.laser_scan_mode5, 0, 5, 1, 1)
self.scanning_disp = QtWidgets.QGraphicsView(parent=Laser_Control)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(1)
sizePolicy.setVerticalStretch(1)
sizePolicy.setHeightForWidth(self.scanning_disp.sizePolicy().hasHeightForWidth())
self.scanning_disp.setSizePolicy(sizePolicy)
self.scanning_disp.setMinimumSize(QtCore.QSize(250, 250))
self.scanning_disp.setStyleSheet("QWidget{\n"
" border: 0.5px solid gray;\n"
" }\n"
" ")
self.scanning_disp.setObjectName("scanning_disp")
self.gridLayout_5.addWidget(self.scanning_disp, 0, 6, 4, 1)
self.label_13 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_13.setFont(font)
self.label_13.setObjectName("label_13")
self.gridLayout_5.addWidget(self.label_13, 1, 4, 1, 1)
self.laser_focus_mode = QtWidgets.QComboBox(parent=Laser_Control)
self.laser_focus_mode.setStyleSheet("QComboBox{background: rgb(223,223,233)}")
self.laser_focus_mode.setObjectName("laser_focus_mode")
self.laser_focus_mode.addItem("")
self.gridLayout_5.addWidget(self.laser_focus_mode, 1, 5, 1, 1)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.label_9 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_9.setFont(font)
self.label_9.setObjectName("label_9")
self.horizontalLayout.addWidget(self.label_9)
self.laser_power_disp = QtWidgets.QLCDNumber(parent=Laser_Control)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred,
QtWidgets.QSizePolicy.Policy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.laser_power_disp.sizePolicy().hasHeightForWidth())
self.laser_power_disp.setSizePolicy(sizePolicy)
self.laser_power_disp.setMinimumSize(QtCore.QSize(100, 50))
self.laser_power_disp.setMaximumSize(QtCore.QSize(100, 50))
font = QtGui.QFont()
font.setPointSize(9)
self.laser_power_disp.setFont(font)
self.laser_power_disp.setStyleSheet("QLCDNumber{\n"
" border: 2px solid green;\n"
" border-radius: 10px;\n"
" padding: 0 8px;\n"
" }\n"
" ")
self.laser_power_disp.setObjectName("laser_power_disp")
self.horizontalLayout.addWidget(self.laser_power_disp)
self.label_10 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_10.setFont(font)
self.label_10.setObjectName("label_10")
self.horizontalLayout.addWidget(self.label_10)
self.laser_pulse_energy_disp = QtWidgets.QLCDNumber(parent=Laser_Control)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred,
QtWidgets.QSizePolicy.Policy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.laser_pulse_energy_disp.sizePolicy().hasHeightForWidth())
self.laser_pulse_energy_disp.setSizePolicy(sizePolicy)
self.laser_pulse_energy_disp.setMinimumSize(QtCore.QSize(100, 50))
self.laser_pulse_energy_disp.setMaximumSize(QtCore.QSize(100, 50))
font = QtGui.QFont()
font.setPointSize(9)
self.laser_pulse_energy_disp.setFont(font)
self.laser_pulse_energy_disp.setStyleSheet("QLCDNumber{\n"
" border: 2px solid green;\n"
" border-radius: 10px;\n"
" padding: 0 8px;\n"
" }\n"
" ")
self.laser_pulse_energy_disp.setObjectName("laser_pulse_energy_disp")
self.horizontalLayout.addWidget(self.laser_pulse_energy_disp)
self.label_11 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_11.setFont(font)
self.label_11.setObjectName("label_11")
self.horizontalLayout.addWidget(self.label_11)
self.laser_repetion_rate_disp = QtWidgets.QLCDNumber(parent=Laser_Control)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred,
QtWidgets.QSizePolicy.Policy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.laser_repetion_rate_disp.sizePolicy().hasHeightForWidth())
self.laser_repetion_rate_disp.setSizePolicy(sizePolicy)
self.laser_repetion_rate_disp.setMinimumSize(QtCore.QSize(100, 50))
self.laser_repetion_rate_disp.setMaximumSize(QtCore.QSize(100, 50))
font = QtGui.QFont()
font.setPointSize(9)
self.laser_repetion_rate_disp.setFont(font)
self.laser_repetion_rate_disp.setStyleSheet("QLCDNumber{\n"
" border: 2px solid green;\n"
" border-radius: 10px;\n"
" padding: 0 8px;\n"
" }\n"
" ")
self.laser_repetion_rate_disp.setObjectName("laser_repetion_rate_disp")
self.horizontalLayout.addWidget(self.laser_repetion_rate_disp)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.gridLayout_5.addLayout(self.horizontalLayout, 2, 0, 1, 6)
self.gridLayout_4 = QtWidgets.QGridLayout()
self.gridLayout_4.setObjectName("gridLayout_4")
self.label_19 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_19.setFont(font)
self.label_19.setObjectName("label_19")
self.gridLayout_4.addWidget(self.label_19, 0, 0, 1, 1)
self.laser_x_cord = QtWidgets.QLCDNumber(parent=Laser_Control)
self.laser_x_cord.setObjectName("laser_x_cord")
self.gridLayout_4.addWidget(self.laser_x_cord, 0, 1, 1, 1)
self.label_17 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_17.setFont(font)
self.label_17.setObjectName("label_17")
self.gridLayout_4.addWidget(self.label_17, 1, 0, 1, 1)
self.laser_y_cord = QtWidgets.QLCDNumber(parent=Laser_Control)
self.laser_y_cord.setObjectName("laser_y_cord")
self.gridLayout_4.addWidget(self.laser_y_cord, 1, 1, 1, 1)
self.label_18 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_18.setFont(font)
self.label_18.setObjectName("label_18")
self.gridLayout_4.addWidget(self.label_18, 2, 0, 1, 1)
self.laser_z_cord = QtWidgets.QLCDNumber(parent=Laser_Control)
self.laser_z_cord.setObjectName("laser_z_cord")
self.gridLayout_4.addWidget(self.laser_z_cord, 2, 1, 1, 1)
self.gridLayout_5.addLayout(self.gridLayout_4, 3, 0, 1, 1)
self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2.setObjectName("gridLayout_2")
self.label_14 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_14.setFont(font)
self.label_14.setObjectName("label_14")
self.gridLayout_2.addWidget(self.label_14, 0, 0, 1, 1)
self.laser_speed_lr = QtWidgets.QDoubleSpinBox(parent=Laser_Control)
self.laser_speed_lr.setStyleSheet("QDoubleSpinBox{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.laser_speed_lr.setObjectName("laser_speed_lr")
self.gridLayout_2.addWidget(self.laser_speed_lr, 0, 1, 1, 1)
self.label_15 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_15.setFont(font)
self.label_15.setObjectName("label_15")
self.gridLayout_2.addWidget(self.label_15, 1, 0, 1, 1)
self.laser_speed_ud = QtWidgets.QDoubleSpinBox(parent=Laser_Control)
self.laser_speed_ud.setStyleSheet("QDoubleSpinBox{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.laser_speed_ud.setObjectName("laser_speed_ud")
self.gridLayout_2.addWidget(self.laser_speed_ud, 1, 1, 1, 1)
self.label_16 = QtWidgets.QLabel(parent=Laser_Control)
font = QtGui.QFont()
font.setBold(True)
self.label_16.setFont(font)
self.label_16.setObjectName("label_16")
self.gridLayout_2.addWidget(self.label_16, 2, 0, 1, 1)
self.laser_speed_fb = QtWidgets.QDoubleSpinBox(parent=Laser_Control)
self.laser_speed_fb.setStyleSheet("QDoubleSpinBox{\n"
" background: rgb(223,223,233)\n"
" }\n"
" ")
self.laser_speed_fb.setObjectName("laser_speed_fb")
self.gridLayout_2.addWidget(self.laser_speed_fb, 2, 1, 1, 1)
self.gridLayout_5.addLayout(self.gridLayout_2, 3, 1, 1, 1)
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum)
self.gridLayout.addItem(spacerItem2, 0, 0, 1, 1)
self.laser_up = QtWidgets.QPushButton(parent=Laser_Control)
self.laser_up.setMinimumSize(QtCore.QSize(50, 25))
self.laser_up.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.laser_up.setStyleSheet("")
self.laser_up.setObjectName("laser_up")
self.gridLayout.addWidget(self.laser_up, 0, 1, 1, 1)
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum)
self.gridLayout.addItem(spacerItem3, 0, 2, 1, 1)
self.laser_left = QtWidgets.QPushButton(parent=Laser_Control)
self.laser_left.setMinimumSize(QtCore.QSize(50, 25))
self.laser_left.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.laser_left.setStyleSheet("")
self.laser_left.setObjectName("laser_left")
self.gridLayout.addWidget(self.laser_left, 1, 0, 1, 1)
spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum)
self.gridLayout.addItem(spacerItem4, 1, 1, 1, 1)
self.leser_right = QtWidgets.QPushButton(parent=Laser_Control)
self.leser_right.setMinimumSize(QtCore.QSize(50, 25))
self.leser_right.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.leser_right.setStyleSheet("")
self.leser_right.setObjectName("leser_right")
self.gridLayout.addWidget(self.leser_right, 1, 2, 1, 1)
spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum)
self.gridLayout.addItem(spacerItem5, 2, 0, 1, 1)
self.laser_down = QtWidgets.QPushButton(parent=Laser_Control)
self.laser_down.setMinimumSize(QtCore.QSize(50, 25))
self.laser_down.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.laser_down.setStyleSheet("")
self.laser_down.setObjectName("laser_down")
self.gridLayout.addWidget(self.laser_down, 2, 1, 1, 1)
spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum)
self.gridLayout.addItem(spacerItem6, 2, 2, 1, 1)
self.gridLayout_5.addLayout(self.gridLayout, 3, 2, 1, 1)
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.laser_forward = QtWidgets.QPushButton(parent=Laser_Control)
self.laser_forward.setStyleSheet("")
self.laser_forward.setObjectName("laser_forward")
self.verticalLayout.addWidget(self.laser_forward)
spacerItem7 = QtWidgets.QSpacerItem(17, 24, QtWidgets.QSizePolicy.Policy.Minimum,
QtWidgets.QSizePolicy.Policy.Expanding)
self.verticalLayout.addItem(spacerItem7)
self.laser_backward = QtWidgets.QPushButton(parent=Laser_Control)
self.laser_backward.setStyleSheet("")
self.laser_backward.setObjectName("laser_backward")
self.verticalLayout.addWidget(self.laser_backward)
self.gridLayout_5.addLayout(self.verticalLayout, 3, 3, 1, 2)
self.laser_home = QtWidgets.QPushButton(parent=Laser_Control)
self.laser_home.setStyleSheet("")
self.laser_home.setObjectName("laser_home")
self.gridLayout_5.addWidget(self.laser_home, 3, 5, 1, 1)
self.Error = QtWidgets.QLabel(parent=Laser_Control)
self.Error.setMinimumSize(QtCore.QSize(500, 30))
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(True)
font.setStrikeOut(False)
self.Error.setFont(font)
self.Error.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.Error.setWordWrap(True)
self.Error.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.LinksAccessibleByMouse)
self.Error.setObjectName("Error")
self.gridLayout_5.addWidget(self.Error, 4, 0, 1, 4)
self.start_scanning = QtWidgets.QPushButton(parent=Laser_Control)
self.start_scanning.setStyleSheet("QPushButton{background: rgb(193, 193, 193)}\n"
" ")
self.start_scanning.setObjectName("start_scanning")
self.gridLayout_5.addWidget(self.start_scanning, 4, 6, 1, 1)
self.nktpbus_mode_switch = QtWidgets.QPushButton(parent=Laser_Control)
self.nktpbus_mode_switch.setStyleSheet("QPushButton{background: rgb(193, 193, 193)}\n"
" ")
self.nktpbus_mode_switch.setObjectName("nktpbus_mode_switch")
self.gridLayout_5.addWidget(self.nktpbus_mode_switch, 4, 5, 1, 1)
self.gridLayout_6.addLayout(self.gridLayout_5, 0, 0, 1, 1)
self.retranslateUi(Laser_Control)
QtCore.QMetaObject.connectSlotsByName(Laser_Control)
Laser_Control.setTabOrder(self.laser_wavelegnth, self.laser_rate)
Laser_Control.setTabOrder(self.laser_rate, self.laser_enable)
Laser_Control.setTabOrder(self.laser_enable, self.laser_on)
Laser_Control.setTabOrder(self.laser_on, self.laser_standby)
Laser_Control.setTabOrder(self.laser_standby, self.laser_listen)
Laser_Control.setTabOrder(self.laser_listen, self.laser_scan_mode5)
Laser_Control.setTabOrder(self.laser_scan_mode5, self.laser_focus_mode)
Laser_Control.setTabOrder(self.laser_focus_mode, self.laser_speed_lr)
Laser_Control.setTabOrder(self.laser_speed_lr, self.laser_speed_ud)
Laser_Control.setTabOrder(self.laser_speed_ud, self.laser_speed_fb)
Laser_Control.setTabOrder(self.laser_speed_fb, self.laser_left)
Laser_Control.setTabOrder(self.laser_left, self.laser_up)
Laser_Control.setTabOrder(self.laser_up, self.leser_right)
Laser_Control.setTabOrder(self.leser_right, self.laser_down)
Laser_Control.setTabOrder(self.laser_down, self.laser_forward)
Laser_Control.setTabOrder(self.laser_forward, self.laser_backward)
Laser_Control.setTabOrder(self.laser_backward, self.laser_home)
Laser_Control.setTabOrder(self.laser_home, self.start_scanning)
Laser_Control.setTabOrder(self.start_scanning, self.scanning_disp)
######
self.led_red = QPixmap('./files/led-red-on.png')
self.led_green = QPixmap('./files/green-led-on.png')
self.led_orange = QPixmap('./files/led-orange.png')
self.led_laser_laser_standby.setPixmap(self.led_red)
self.led_laser_on.setPixmap(self.led_red)
self.led_laser_enable.setPixmap(self.led_red)
self.led_laser_listen.setPixmap(self.led_red)
self.laser_enable.setEnabled(False)
self.laser_on.setEnabled(False)
# self.laser_listen.clicked.connect(partial(self.start_task, self.laser_listen_clicked, self.laser_listen))
# self.laser_standby.clicked.connect(partial(self.start_task, self.laser_standby_clicked, self.laser_standby))
# self.laser_on.clicked.connect(partial(self.start_task, self.laser_on_clicked, self.laser_on))
# self.laser_enable.clicked.connect(partial(self.start_task, self.laser_enable_clicked, self.laser_enable))
self.listen_mode = False
self.standby_mode = False
self.on_mode = False
self.enable_ouput_mode = False
self.laser_listen.clicked.connect(self.laser_listen_clicked)
self.laser_standby.clicked.connect(self.laser_standby_clicked)
self.laser_on.clicked.connect(self.laser_on_clicked)
self.laser_enable.clicked.connect(self.laser_enable_clicked)
self.nktpbus_mode_switch.clicked.connect(self.switch_to_nktpbus_mode)
self.laser_wavelegnth.currentIndexChanged.connect(self.laser_wavelegnth_changed)
self.laser_power.valueChanged.connect(self.laser_power_changed)
self.laser_rate.currentIndexChanged.connect(self.laser_rate_changed)
self.laser_divition_factor.valueChanged.connect(self.laser_divition_factor_changed)
self.laser_device = origamiClassCLI.origClass(self.conf['COM_PORT_laser'])
self.variables.laser_pulse_energy = 0.0
try:
databack = self.laser_device.open_port()
if databack == 0:
self.laser_device.Listen()
self.laser_device.wavelength_change(0)
databack = self.laser_device.StatusRead()
# reset the values to default
self.laser_device.Power(float(self.laser_power.value()))
self.laser_device.Freq(self.laser_rate.currentIndex() + 4)
self.laser_repetion_rate_disp.display(400)
self.variables.laser_freq = 400000
self.laser_repetion_rate_disp.display(int(self.laser_rate.currentText()))
self.laser_device.Div(float(self.laser_divition_factor.value()))
if databack.strip() == 'ly_oxp2_dev_status 9':
self.led_laser_listen.setPixmap(self.led_green)
else:
print("The laser status code is:", databack)
else:
error_text = self.laser_device.last_error or "no response from device"
message = (
f"Laser is unavailable on {self.conf['COM_PORT_laser']}: {error_text}. "
f"Available serial ports: {_available_serial_ports_text()}."
)
print(message)
self.error_message(message)
self.laser_device = None
except Exception as e:
message = (
f"Laser is unavailable on {self.conf['COM_PORT_laser']}: {e}. "
f"Available serial ports: {_available_serial_ports_text()}."
)
print(message)
self.error_message(message)
self.laser_device = None
self.worker = Worker(self.check_laser_status)
self.worker.start()
[docs]
def retranslateUi(self, Laser_Control):
_translate = QtCore.QCoreApplication.translate
###
# Laser_Control.setWindowTitle(_translate("Laser_Control", "Form"))
Laser_Control.setWindowTitle(_translate("Laser_Control", "PyCCAPT Laser Control"))
Laser_Control.setWindowIcon(QtGui.QIcon('./files/logo.png'))
###
Laser_Control.setToolTip(_translate("Laser_Control", "<html><head/><body><p>1</p></body></html>"))
self.laser_wavelegnth.setItemText(0, _translate("Laser_Control", "IR"))
self.laser_wavelegnth.setItemText(1, _translate("Laser_Control", "Green"))
self.laser_wavelegnth.setItemText(2, _translate("Laser_Control", "DUV"))
self.led_laser_on.setText(_translate("Laser_Control", "Laser on"))
self.laser_rate.setItemText(0, _translate("Laser_Control", "400000"))
self.laser_rate.setItemText(1, _translate("Laser_Control", "500000"))
self.laser_rate.setItemText(2, _translate("Laser_Control", "579710"))
self.laser_rate.setItemText(3, _translate("Laser_Control", "720720"))
self.laser_rate.setItemText(4, _translate("Laser_Control", "800000"))
self.laser_rate.setItemText(5, _translate("Laser_Control", "898876"))
self.laser_rate.setItemText(6, _translate("Laser_Control", "1000000"))
self.led_laser_enable.setText(_translate("Laser_Control", "Output enable"))
self.laser_standby.setText(_translate("Laser_Control", "Standby"))
self.label_2.setText(_translate("Laser_Control", "Repetion rate (Hz)"))
self.laser_on.setText(_translate("Laser_Control", "Laser on"))
self.label_3.setText(_translate("Laser_Control", "Divition Factor"))
self.laser_enable.setText(_translate("Laser_Control", "Output Enable"))
self.led_laser_listen.setText(_translate("Laser_Control", "Listen"))
self.led_laser_laser_standby.setText(_translate("Laser_Control", "Standby"))
self.label.setText(_translate("Laser_Control", "Power control (mW)"))
self.laser_listen.setText(_translate("Laser_Control", "Listen"))
self.label_4.setText(_translate("Laser_Control", "Wavelength"))
self.label_12.setText(_translate("Laser_Control", "Scan mode"))
self.laser_scan_mode5.setItemText(0, _translate("Laser_Control", "Standard"))
self.label_13.setText(_translate("Laser_Control", "Focus mode"))
self.laser_focus_mode.setItemText(0, _translate("Laser_Control", "Standard"))
self.label_9.setText(_translate("Laser_Control", "Laser power (mW)"))
self.label_10.setText(_translate("Laser_Control", "Pulse energy (nJ)"))
self.label_11.setText(_translate("Laser_Control", "Frequency (KHz)"))
self.label_19.setText(_translate("Laser_Control", "x"))
self.label_17.setText(_translate("Laser_Control", "y"))
self.label_18.setText(_translate("Laser_Control", "z"))
self.label_14.setText(_translate("Laser_Control", "Speed L/R"))
self.label_15.setText(_translate("Laser_Control", "Speed U/D"))
self.label_16.setText(_translate("Laser_Control", "Speed F/B"))
self.laser_up.setText(_translate("Laser_Control", "up"))
self.laser_left.setText(_translate("Laser_Control", "Left"))
self.leser_right.setText(_translate("Laser_Control", "Right"))
self.laser_down.setText(_translate("Laser_Control", "Down"))
self.laser_forward.setText(_translate("Laser_Control", "Forward"))
self.laser_backward.setText(_translate("Laser_Control", "Backward"))
self.laser_home.setText(_translate("Laser_Control", "Home"))
self.Error.setText(_translate("Laser_Control", "<html><head/><body><p><br/></p></body></html>"))
self.start_scanning.setText(_translate("Laser_Control", "Start scaning"))
self.nktpbus_mode_switch.setText(_translate("Laser_Control", "Nktpbus mode"))
####
self.pattern_number = r'\b\d+\b'
self.timer_hide_error = QtCore.QTimer()
self.timer_hide_error.timeout.connect(self.hideMessage)
self.laser_power.setMinimum(0.0)
self.laser_power.setMaximum(self.conf['max_laser_power'])
self.laser_power.setSingleStep(0.1)
self.laser_divition_factor.setMinimum(1)
self.laser_divition_factor.setMaximum(1000000)
[docs]
def laser_enable_clicked(self):
"""
Handle the close event of the GatesWindow.
Args:
None
Return:
None
"""
self.enable_ouput_mode = True
[docs]
def laser_on_clicked(self):
"""
Handle the close event of the GatesWindow.
Args:
None
Return:
None
"""
self.on_mode = True
[docs]
def laser_standby_clicked(self):
"""
Handle the close event of the GatesWindow.
Args:
None
Return:
None
"""
self.standby_mode = True
[docs]
def laser_listen_clicked(self):
"""
Handle the close event of the GatesWindow.
Args:
None
Return:
None
"""
self.listen_mode = True
[docs]
def laser_wavelegnth_changed(self):
"""
Handle the close event of the GatesWindow.
Args:
None
Return:
None
"""
self.change_laser_wavelegnth = True
[docs]
def laser_power_changed(self):
"""
Handle the close event of the GatesWindow.
Args:
None
Return:
None
"""
self.change_laser_power = True
[docs]
def laser_rate_changed(self):
"""
Handle the close event of the GatesWindow.
Args:
None
Return:
None
"""
self.change_laser_rate = True
[docs]
def laser_divition_factor_changed(self):
"""
Handle the close event of the GatesWindow.
Args:
None
Return:
None
"""
self.change_laser_divition_factor = True
[docs]
def get_frequency(self, index):
"""
Handle the close event of the changing of laser rate.
Args:
None
Return:
None
"""
repetition_rates = {
4: 400000,
5: 500000,
6: 579710,
7: 720720,
8: 800000,
9: 898876,
10: 1000000
}
return repetition_rates.get(index, "Invalid index")
[docs]
def check_laser_status(self):
if self.laser_device is not None:
databack = self.laser_device.StatusRead()
if self.listen_mode:
if databack.strip() != 'ly_oxp2_dev_status 9':
self.laser_listen.setEnabled(False)
databack = self.laser_device.Listen()
elif databack.strip() == 'ly_oxp2_dev_status 9':
self.laser_device.AOM(0)
self.led_laser_listen.setPixmap(self.led_green)
self.led_laser_enable.setPixmap(self.led_red)
self.led_laser_on.setPixmap(self.led_red)
self.led_laser_laser_standby.setPixmap(self.led_red)
self.laser_enable.setEnabled(False)
self.laser_on.setEnabled(False)
self.on_mode = False
self.enable_ouput_mode = False
self.standby_mode = False
self.listen_mode = False
self.laser_listen.setEnabled(True)
self.laser_standby.setEnabled(True)
self.laser_wavelegnth.setEnabled(True)
elif self.standby_mode:
if databack.strip() != 'ly_oxp2_dev_status 33':
if self.laser_standby.isEnabled():
self.laser_standby.setEnabled(False)
self.laser_wavelegnth.setEnabled(True)
self.laser_on.setEnabled(False)
self.led_laser_listen.setPixmap(self.led_orange)
self.led_laser_laser_standby.setPixmap(self.led_orange)
self.laser_device.Standby()
else:
if self.led_laser_laser_standby.pixmap().toImage() == self.led_orange.toImage():
self.led_laser_laser_standby.setPixmap(self.led_green)
elif self.led_laser_laser_standby.pixmap().toImage() == self.led_green.toImage():
self.led_laser_laser_standby.setPixmap(self.led_orange)
elif databack.strip() == 'ly_oxp2_dev_status 33':
self.laser_device.AOM(0)
self.laser_on.setEnabled(True)
self.laser_standby.setEnabled(True)
self.led_laser_on.setPixmap(self.led_red)
self.led_laser_laser_standby.setPixmap(self.led_green)
self.led_laser_enable.setPixmap(self.led_red)
self.laser_enable.setEnabled(False)
self.standby_mode = False
elif self.on_mode:
if databack.strip() == 'ly_oxp2_dev_status 33':
if self.laser_on.isEnabled():
self.laser_on.setEnabled(False)
self.laser_wavelegnth.setEnabled(False)
self.led_laser_on.setPixmap(self.led_orange)
self.led_laser_laser_standby.setPixmap(self.led_orange)
self.laser_device.Enable()
elif databack.strip() == 'ly_oxp2_dev_status 129':
self.laser_on.setEnabled(True)
self.led_laser_on.setPixmap(self.led_green)
self.led_laser_laser_standby.setPixmap(self.led_orange)
self.led_laser_enable.setPixmap(self.led_green)
self.laser_enable.setEnabled(True)
self.laser_device.AOM(4000) # 4000 means AMO fully opeen
self.laser_device.AOMEnable()
self.on_mode = False
elif databack.strip() == 'ly_oxp2_dev_status 1':
if self.led_laser_on.pixmap().toImage() == self.led_orange.toImage():
self.led_laser_on.setPixmap(self.led_green)
elif self.led_laser_on.pixmap().toImage() == self.led_green.toImage():
self.led_laser_on.setPixmap(self.led_orange)
else:
self.on_mode = False
elif self.enable_ouput_mode:
self.laser_enable.setEnabled(False)
if databack.strip() == 'ly_oxp2_dev_status 65':
self.laser_device.AOMEnable()
self.laser_device.AOM(4000) # 4000 means AMO fully opeen
self.enable_ouput_mode = False
self.led_laser_enable.setPixmap(self.led_green)
self.laser_enable.setEnabled(True)
elif databack.strip() == 'ly_oxp2_dev_status 129':
self.laser_device.AOMDisable()
self.laser_device.AOM(0)
self.enable_ouput_mode = False
self.led_laser_enable.setPixmap(self.led_red)
self.laser_enable.setEnabled(True)
if self.change_laser_wavelegnth:
# if emission is on we cannot change the wavelength
if databack != 'ly_oxp2_dev_status 129':
self.laser_wavelegnth.setEnabled(False)
if self.laser_wavelegnth.currentText() == "IR":
dd = self.laser_device.wavelength_change(0)
elif self.laser_wavelegnth.currentText() == "Green":
dd = self.laser_device.wavelength_change(1)
elif self.laser_wavelegnth.currentText() == "DUV":
dd = self.laser_device.wavelength_change(3)
self.laser_wavelegnth.setEnabled(True)
else:
print('The laser is on, you can not change the wavelength')
self.change_laser_wavelegnth = False
if self.change_laser_power:
# only if the laser is on we can change the power
# if databack.strip() == 'ly_oxp2_dev_status 129':
self.laser_power.setEnabled(False)
self.laser_device.Power(float(self.laser_power.value()))
if databack.strip() == 'ly_oxp2_dev_status 129':
self.laser_device.AOM(4000) # 4000 means AMO fully opeen
else:
self.laser_device.AOM(0)
# Pulse energy in nJ
power_pe = self.laser_device.PowerRead()
power_pe = re.search(r'[-+]?\d*\.\d+|\d+', power_pe)
if power_pe:
power = float(power_pe.group())
else:
power = 'Nan'
self.laser_pulse_energy_disp.display(power)
# update variables for laser power
self.average_power = self.laser_device.read_average_power()
self.variables.laser_power = float(self.laser_power.value())
self.variables.laser_average_power = float(re.findall(self.pattern_number, self.average_power)[0])
self.laser_power_disp.display(self.variables.laser_average_power)
self.laser_power.setEnabled(True)
# else:
# print('The laser is off, you can not change the power')
self.change_laser_power = False
if self.change_laser_rate:
self.laser_rate.setEnabled(False)
res = self.laser_device.Freq(self.laser_rate.currentIndex() + 4)
# Repetition rate
# At base frequencies above 100 kHz, the pulse energy linearly decreases.
freq_o = self.laser_device.FreqRead()
freq = re.search(r'[-+]?\d*\.\d+|\d+', freq_o)
if freq:
freq = float(freq.group())
else:
freq = 'Nan'
if freq != 'Nan':
laser_rate = self.get_frequency(int(freq))
self.variables.laser_freq = laser_rate
self.laser_repetion_rate_disp.display(
(self.variables.laser_freq / 1000) / self.laser_divition_factor.value())
else:
self.variables.laser_freq = 0
self.laser_repetion_rate_disp.display('Error')
self.laser_rate.setEnabled(True)
self.change_laser_rate = False
if self.change_laser_divition_factor:
self.laser_divition_factor.setEnabled(False)
res = self.laser_device.Div(self.laser_divition_factor.value())
self.variables.laser_division_factor = self.laser_divition_factor.value()
print('dddddddddddddd', self.variables.laser_freq, self.laser_divition_factor.value())
self.laser_repetion_rate_disp.display(
(self.variables.laser_freq / 1000) / self.laser_divition_factor.value())
self.laser_divition_factor.setEnabled(True)
self.change_laser_divition_factor = False
if self.index == 5:
res_error = self.laser_device.StatusMode()
if "Error" in res_error:
self.listen_mode = True
self.error_message("Error:" + res_error)
#
print('==============================================')
print('laser status is:', databack.strip())
print("status mode is:", res_error)
print("status is:", self.laser_device.StatusRead())
print('Mode is', self.laser_device.ModeRead()) # 2: Internal power 3: External power 8: SPI power
print('status LED is:', self.laser_device.status_led())
print('wavelength is:', self.laser_device.wavelength_read())
print("AMO status is:", self.laser_device.AOMState())
print('pulse energy (mW):', self.laser_device.PowerRead())
print('power W', self.laser_device.power_read_dv_green())
print('avg power (mW):', self.laser_device.read_average_power())
print('amo power:', self.laser_device.AOMRead())
print('freq_o:', self.laser_device.FreqRead())
print('Div:', self.laser_device.DivRead())
# print("avaliable freq:", self.laser_device.freq_avaliable())
print('----------------------------------------------')
self.index = 0
self.index += 1
time.sleep(0.5)
[docs]
def switch_to_nktpbus_mode(self):
""""
Switch to NKTPBUS mode
Args:
None
Return:
None
"""
if self.laser_device is not None:
self.laser_device.InterbusEnable()
self.laser_device.close_port()
self.laser_device = None
self.error_message("Switching to NKTPBUS mode. Back to CLImode with NKT control software")
else:
self.error_message("The laser is already in NKTPBUS mode or other connection error (check terminal)")
[docs]
def error_message(self, message):
"""
Display an error message and start a timer to hide it after 8 seconds
Args:
message (str): Error message to display
Return:
None
"""
_translate = QtCore.QCoreApplication.translate
self.Error.setText(_translate("OXCART",
"<html><head/><body><p><span style=\" color:#ff0000;\">"
+ message + "</span></p></body></html>"))
self.timer_hide_error.start(8000)
[docs]
def hideMessage(self, ):
"""
Hide the message and stop the timer
Args:
None
Return:
None
"""
# Hide the message and stop the timer
_translate = QtCore.QCoreApplication.translate
self.Error.setText(_translate("OXCART",
"<html><head/><body><p><span style=\" "
"color:#ff0000;\"></span></p></body></html>"))
self.timer_hide_error.stop()
[docs]
def stop(self):
"""
Handle the close event of the GatesWindow.
Args:
None
Return:
None
"""
# Stop any background processes, timers, or threads here
pass
[docs]
class Worker(QThread):
def __init__(self, task_function):
super().__init__()
self.task_function = task_function
[docs]
def run(self):
while True: # Run indefinitely
self.task_function()
self.msleep(1000) # Sleep for 1000 milliseconds (1 second)
[docs]
class LaserControlWindow(QtWidgets.QWidget):
closed = QtCore.pyqtSignal() # Define a custom closed signal
def __init__(self, gui_laser_control, *args, **kwargs):
"""
Initialize the LaserControlWindow class.
Args:
gui_laser_control: GUI for laser control.
*args, **kwargs: Additional arguments for QWidget initialization.
"""
super().__init__(*args, **kwargs)
self.gui_laser_control = gui_laser_control
[docs]
def closeEvent(self, event):
"""
Handle the close event of the LaserControlWindow.
Args:
event: Close event.
"""
event.ignore()
self.hide()
self.closed.emit()
[docs]
def setWindowStyleFusion(self):
# Set the Fusion style
QtWidgets.QApplication.setStyle("Fusion")
if __name__ == "__main__":
try:
conf, _ = runtime.load_project_config()
except Exception as exc:
print('Can not load the configuration file')
print(exc)
sys.exit()
shared = runtime.create_shared_context(conf)
app = QtWidgets.QApplication(sys.argv)
app.setStyle('Fusion')
Laser_Control = QtWidgets.QWidget()
ui = Ui_Laser_Control(shared.variables, conf)
ui.setupUi(Laser_Control)
Laser_Control.show()
sys.exit(app.exec())