Add autoreconnect after power on
This commit is contained in:
parent
acdbb7beb1
commit
2395d89206
@ -136,8 +136,10 @@ class MainWindow(QMainWindow):
|
|||||||
self.power_switch = ClewareSwitch(exe)
|
self.power_switch = ClewareSwitch(exe)
|
||||||
self.vmdev = None
|
self.vmdev = None
|
||||||
self.leddev = None
|
self.leddev = None
|
||||||
self.vmdev_autoconnect()
|
if AppConfig.MAIN_CFG.get_or("voltage_measurement_device_auto_reconnect", False):
|
||||||
self.leddev_autoconnect()
|
self.vmdev_autoconnect()
|
||||||
|
if AppConfig.MAIN_CFG.get_or("led_device_auto_reconnect", False):
|
||||||
|
self.leddev_autoconnect()
|
||||||
|
|
||||||
# Measurement
|
# Measurement
|
||||||
self.idle_timer = None
|
self.idle_timer = None
|
||||||
@ -206,8 +208,11 @@ class MainWindow(QMainWindow):
|
|||||||
try:
|
try:
|
||||||
self.leddev = ledd.connect_device(leddev_type, leddev_name)
|
self.leddev = ledd.connect_device(leddev_type, leddev_name)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if not fail_silently:
|
if fail_silently:
|
||||||
QMessageBox.critical(self, "Connection failed", f"Failed to connect to '{leddev_name}', the following error occured: \n{e}")
|
raise e
|
||||||
|
else:
|
||||||
|
QMessageBox.critical(self, "Connection failed", f"Failed to connect to '{leddev_name}', the following error occurred: \n{e}")
|
||||||
|
log.error(f"Failed to connect to '{leddev_name}', the following error occured: \n{e}")
|
||||||
return
|
return
|
||||||
AppConfig.MAIN_CFG.set("led_device_last.type", leddev_type)
|
AppConfig.MAIN_CFG.set("led_device_last.type", leddev_type)
|
||||||
AppConfig.MAIN_CFG.set("led_device_last.name", leddev_name)
|
AppConfig.MAIN_CFG.set("led_device_last.name", leddev_name)
|
||||||
@ -224,15 +229,14 @@ class MainWindow(QMainWindow):
|
|||||||
self.w_measurement_settings.set_value("device_led", led_name)
|
self.w_measurement_settings.set_value("device_led", led_name)
|
||||||
|
|
||||||
def leddev_autoconnect(self):
|
def leddev_autoconnect(self):
|
||||||
if AppConfig.MAIN_CFG.get_or("led_device_auto_reconnect", False):
|
try:
|
||||||
try:
|
leddev_type = AppConfig.MAIN_CFG.get("led_device_last.type")
|
||||||
leddev_type = AppConfig.MAIN_CFG.get("led_device_last.type")
|
leddev_name = AppConfig.MAIN_CFG.get("led_device_last.name")
|
||||||
leddev_name = AppConfig.MAIN_CFG.get("led_device_last.name")
|
self.leddev_connect(leddev_type, leddev_name, fail_silently=True)
|
||||||
self.leddev_connect(leddev_type, leddev_name, fail_silently=True)
|
except KeyError:
|
||||||
except KeyError:
|
pass
|
||||||
pass
|
except Exception as e:
|
||||||
except Exception as e:
|
log.error(f"Failed to auto-connect to LED device: {e}")
|
||||||
log.error(f"Failed to auto-connect to LED device: {e}")
|
|
||||||
|
|
||||||
def leddev_connect_from_dialog(self):
|
def leddev_connect_from_dialog(self):
|
||||||
"""
|
"""
|
||||||
@ -245,13 +249,13 @@ class MainWindow(QMainWindow):
|
|||||||
leddev_type, leddev_name = device_dialog.get_selected()
|
leddev_type, leddev_name = device_dialog.get_selected()
|
||||||
self.leddev_connect(leddev_type, leddev_name)
|
self.leddev_connect(leddev_type, leddev_name)
|
||||||
|
|
||||||
def leddev_test_connection(self) -> bool:
|
def leddev_test_connection(self, silent=False) -> bool:
|
||||||
if self.leddev is not None:
|
if self.leddev is not None:
|
||||||
try:
|
try:
|
||||||
self.leddev.test_connection()
|
self.leddev.test_connection()
|
||||||
return True
|
return True
|
||||||
except ConnectionError as e:
|
except ConnectionError as e:
|
||||||
QMessageBox.warning(self, "LED Controller Disconnected", f"Lost connection to the LED controller '{self.leddev}'")
|
if not silent: QMessageBox.warning(self, "LED Controller Disconnected", f"Lost connection to the LED controller '{self.leddev}'")
|
||||||
self.leddev = None
|
self.leddev = None
|
||||||
self.leddev_connected()
|
self.leddev_connected()
|
||||||
return False
|
return False
|
||||||
@ -262,8 +266,11 @@ class MainWindow(QMainWindow):
|
|||||||
try:
|
try:
|
||||||
self.vmdev = vmd.connect_device(vmdev_type, vmdev_name)
|
self.vmdev = vmd.connect_device(vmdev_type, vmdev_name)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if not fail_silently:
|
if fail_silently:
|
||||||
QMessageBox.critical(self, "Connection failed", f"Failed to connect to '{leddev_name}', the following error occured: \n{e}")
|
raise e
|
||||||
|
else:
|
||||||
|
QMessageBox.critical(self, "Connection failed", f"Failed to connect to '{vmdev_name}', the following error occured: \n{e}")
|
||||||
|
log.error(f"Failed to connect to '{vmdev_name}', the following error occured: \n{e}")
|
||||||
return
|
return
|
||||||
AppConfig.MAIN_CFG.set("voltage_measurement_device_last.type", vmdev_type)
|
AppConfig.MAIN_CFG.set("voltage_measurement_device_last.type", vmdev_type)
|
||||||
AppConfig.MAIN_CFG.set("voltage_measurement_device_last.name", vmdev_name)
|
AppConfig.MAIN_CFG.set("voltage_measurement_device_last.name", vmdev_name)
|
||||||
@ -274,15 +281,14 @@ class MainWindow(QMainWindow):
|
|||||||
self.w_measurement_settings.set_value("device_voltage_measurement", self.vmdev)
|
self.w_measurement_settings.set_value("device_voltage_measurement", self.vmdev)
|
||||||
|
|
||||||
def vmdev_autoconnect(self):
|
def vmdev_autoconnect(self):
|
||||||
if AppConfig.MAIN_CFG.get_or("voltage_measurement_device_auto_reconnect", False):
|
try:
|
||||||
try:
|
vmdev_type = AppConfig.MAIN_CFG.get("voltage_measurement_device_last.type")
|
||||||
vmdev_type = AppConfig.MAIN_CFG.get("voltage_measurement_device_last.type")
|
vmdev_name = AppConfig.MAIN_CFG.get("voltage_measurement_device_last.name")
|
||||||
vmdev_name = AppConfig.MAIN_CFG.get("voltage_measurement_device_last.name")
|
self.vmdev_connect(vmdev_type, vmdev_name, fail_silently=True)
|
||||||
self.vmdev_connect(vmdev_type, vmdev_name, fail_silently=True)
|
except KeyError:
|
||||||
except KeyError:
|
pass
|
||||||
pass
|
except Exception as e:
|
||||||
except Exception as e:
|
log.error(f"Failed to auto-connect to voltage measurement device: {e}")
|
||||||
log.error(f"Failed to auto-connect to voltage measurement device: {e}")
|
|
||||||
def vmdev_connect_from_dialog(self):
|
def vmdev_connect_from_dialog(self):
|
||||||
"""
|
"""
|
||||||
Open a dialog that lets the user choose a voltage measurement device,
|
Open a dialog that lets the user choose a voltage measurement device,
|
||||||
@ -294,13 +300,13 @@ class MainWindow(QMainWindow):
|
|||||||
vmdev_type, vmdev_name = device_dialog.get_selected()
|
vmdev_type, vmdev_name = device_dialog.get_selected()
|
||||||
self.vmdev_connect(vmdev_type, vmdev_name)
|
self.vmdev_connect(vmdev_type, vmdev_name)
|
||||||
|
|
||||||
def vmdev_test_connection(self) -> bool:
|
def vmdev_test_connection(self, silent=False) -> bool:
|
||||||
if self.vmdev is not None:
|
if self.vmdev is not None:
|
||||||
try:
|
try:
|
||||||
self.vmdev.test_connection()
|
self.vmdev.test_connection()
|
||||||
return True
|
return True
|
||||||
except ConnectionError as e:
|
except ConnectionError as e:
|
||||||
QMessageBox.warning(self, "Voltage Measurement Device Disconnected", f"Lost connection to the voltage measurement device '{self.vmdev}'")
|
if not silent: QMessageBox.warning(self, "Voltage Measurement Device Disconnected", f"Lost connection to the voltage measurement device '{self.vmdev}'")
|
||||||
self.vmdev = None
|
self.vmdev = None
|
||||||
self.vmdev_connected()
|
self.vmdev_connected()
|
||||||
return False
|
return False
|
||||||
@ -460,6 +466,10 @@ class MainWindow(QMainWindow):
|
|||||||
self.w_plot.update_plot(tval, vval, led_val)
|
self.w_plot.update_plot(tval, vval, led_val)
|
||||||
else: # measurement might have stopped after max N or script end
|
else: # measurement might have stopped after max N or script end
|
||||||
self.measure_stop()
|
self.measure_stop()
|
||||||
|
# this should only be run when the measurement is stopped automatically
|
||||||
|
# and is therefore not part of measure_stop()
|
||||||
|
if AppConfig.MAIN_CFG.get_or("power_switch_turn_off_when_measurement_ends", False):
|
||||||
|
self.power_off()
|
||||||
|
|
||||||
def measurement_is_running(self):
|
def measurement_is_running(self):
|
||||||
return self.proc_measure is not None
|
return self.proc_measure is not None
|
||||||
@ -595,14 +605,59 @@ class MainWindow(QMainWindow):
|
|||||||
self.command_queue.put(("metadata", metadata))
|
self.command_queue.put(("metadata", metadata))
|
||||||
|
|
||||||
def power_on(self):
|
def power_on(self):
|
||||||
|
"""
|
||||||
|
Send power on command to the power switch.
|
||||||
|
If configured, wait for a while and then try to reconnect to unconnected devices.
|
||||||
|
"""
|
||||||
if self.power_switch is None:
|
if self.power_switch is None:
|
||||||
raise RuntimeError("No power switch configured")
|
raise RuntimeError("No power switch configured")
|
||||||
|
log.info("Powering on")
|
||||||
self.power_switch.on()
|
self.power_switch.on()
|
||||||
|
# TODO: change to zero
|
||||||
|
timeout = AppConfig.MAIN_CFG.get_or("power_switch_autoconnect_devices_timeout_s", 20)
|
||||||
|
if not timeout > 0: return
|
||||||
|
if self.vmdev and self.leddev: return
|
||||||
|
dialog = QDialog()
|
||||||
|
dialog.setWindowTitle("Autoconnect devices")
|
||||||
|
buttons = QDialogButtonBox(QDialogButtonBox.StandardButton.Cancel)
|
||||||
|
buttons.accepted.connect(dialog.accept)
|
||||||
|
buttons.rejected.connect(dialog.reject)
|
||||||
|
dialog.setLayout(QVBoxLayout())
|
||||||
|
dialog.l_time = QLabel(f"{timeout} s")
|
||||||
|
dialog.time_left = timeout
|
||||||
|
dialog.layout().addWidget(QLabel(f"Trying to reconnect to devices in"))
|
||||||
|
dialog.layout().addWidget(dialog.l_time)
|
||||||
|
dialog.layout().addWidget(buttons)
|
||||||
|
dialog.time_left = timeout
|
||||||
|
def update_time_left(dialog):
|
||||||
|
dialog.time_left -= 1
|
||||||
|
dialog.l_time.setText(f"{dialog.time_left} s")
|
||||||
|
if dialog.time_left <= 0:
|
||||||
|
dialog.accept()
|
||||||
|
dialog.update_time_left = update_time_left
|
||||||
|
dialog.timer = QTimer()
|
||||||
|
dialog.timer.timeout.connect(lambda: dialog.update_time_left(dialog))
|
||||||
|
dialog.timer.start(1000)
|
||||||
|
ret = dialog.exec()
|
||||||
|
dialog.timer.stop()
|
||||||
|
if ret == QDialog.DialogCode.Accepted:
|
||||||
|
log.info("Trying to autoconnect last devices")
|
||||||
|
if self.vmdev is None:
|
||||||
|
self.vmdev_autoconnect()
|
||||||
|
if self.leddev is None:
|
||||||
|
self.leddev_autoconnect()
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
def power_off(self):
|
def power_off(self):
|
||||||
if self.power_switch is None:
|
if self.power_switch is None:
|
||||||
raise RuntimeError("No power switch configured")
|
raise RuntimeError("No power switch configured")
|
||||||
|
log.info("Powering off")
|
||||||
self.power_switch.off()
|
self.power_switch.off()
|
||||||
|
silent = True
|
||||||
|
self.leddev_test_connection(silent=silent)
|
||||||
|
self.vmdev_test_connection(silent=silent)
|
||||||
|
|
||||||
|
|
||||||
def app_exit(self) -> None:
|
def app_exit(self) -> None:
|
||||||
"""
|
"""
|
||||||
|
@ -49,6 +49,11 @@ class AppSettings(QWidget):
|
|||||||
# power_switch
|
# power_switch
|
||||||
w_usb_switch_exe = FileSelection(filemode=QFileDialog.FileMode.ExistingFile)
|
w_usb_switch_exe = FileSelection(filemode=QFileDialog.FileMode.ExistingFile)
|
||||||
self.w_form.add_form_row("power_switch_exe", "Power Switch Executable", "", w_usb_switch_exe, "Path to the USBSwitchCmd executable for the Cleware USB switch\nRequires a relaunch to take effect", group="power_switch")
|
self.w_form.add_form_row("power_switch_exe", "Power Switch Executable", "", w_usb_switch_exe, "Path to the USBSwitchCmd executable for the Cleware USB switch\nRequires a relaunch to take effect", group="power_switch")
|
||||||
|
w_power_on_reconnect_dt = QSpinBox()
|
||||||
|
w_power_on_reconnect_dt.setMinimum(0)
|
||||||
|
w_power_on_reconnect_dt.setMaximum(60)
|
||||||
|
w_power_on_reconnect_dt.setSingleStep(1)
|
||||||
|
self.w_form.add_form_row("power_switch_autoconnect_devices_timeout_s", "Autoconnect devices after (s)", 15, w_power_on_reconnect_dt, "After switching on, wait x seconds before trying to reconnect to the last devices\nSet to 0 to disable the auto-connection attempt.", group="power_switch")
|
||||||
|
|
||||||
self.w_form.update_alignment()
|
self.w_form.update_alignment()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user