forked from M-Labs/kirdy
gui: patch the GUI code
This commit is contained in:
parent
5166bb7ba8
commit
f2ad06ecae
|
@ -20,7 +20,7 @@ import logging
|
||||||
import asyncio
|
import asyncio
|
||||||
from driver.kirdy import Kirdy as Kirdy_Driver
|
from driver.kirdy import Kirdy as Kirdy_Driver
|
||||||
import qasync
|
import qasync
|
||||||
from qasync import asyncClose
|
from qasync import asyncClose, asyncSlot
|
||||||
from collections import deque
|
from collections import deque
|
||||||
from datetime import datetime, timezone, timedelta
|
from datetime import datetime, timezone, timedelta
|
||||||
from time import time
|
from time import time
|
||||||
|
@ -96,15 +96,16 @@ class Kirdy(QObject):
|
||||||
def end_session(self):
|
def end_session(self):
|
||||||
if self._timer.isActive():
|
if self._timer.isActive():
|
||||||
self._timer.stop()
|
self._timer.stop()
|
||||||
self._kirdy.end_session()
|
asyncio.get_running_loop().create_task(self._kirdy.end_session())
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def connected_setup(self, connected):
|
def connected_setup(self, connected):
|
||||||
if connected:
|
if connected:
|
||||||
self._kirdy.device.set_active_report_mode(True)
|
self._kirdy.task_dispatcher(self._kirdy.device.set_active_report_mode(True))
|
||||||
|
self._kirdy._report_mode_on = True
|
||||||
|
|
||||||
def timerEvent(self, event):
|
def timerEvent(self, event):
|
||||||
self._kirdy.device.get_settings_summary(sig=self.setting_update_sig)
|
self._kirdy.task_dispatcher(self._kirdy.device.get_settings_summary(sig=self.setting_update_sig))
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def start_polling(self, start):
|
def start_polling(self, start):
|
||||||
|
@ -548,19 +549,19 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def dfu_mode(_):
|
def dfu_mode(_):
|
||||||
self.kirdy.device.dfu()
|
self.kirdy.task_dispatcher(self.kirdy.device.dfu())
|
||||||
self.kirdy_handler.end_session()
|
self.kirdy_handler.end_session()
|
||||||
self.menu_action_dfu_mode.triggered.connect(dfu_mode)
|
self.menu_action_dfu_mode.triggered.connect(dfu_mode)
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def reset_kirdy(_):
|
def reset_kirdy(_):
|
||||||
self.kirdy.device.hard_reset()
|
self.kirdy.task_dispatcher(self.kirdy.device.hard_reset())
|
||||||
self.kirdy_handler.end_session()
|
self.kirdy_handler.end_session()
|
||||||
self.menu_action_hard_reset.triggered.connect(reset_kirdy)
|
self.menu_action_hard_reset.triggered.connect(reset_kirdy)
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def save_settings(_):
|
def save_settings(_):
|
||||||
self.kirdy.device.save_current_settings_to_flash()
|
self.kirdy.task_dispatcher(self.kirdy.device.save_current_settings_to_flash())
|
||||||
saved = QtWidgets.QMessageBox(self)
|
saved = QtWidgets.QMessageBox(self)
|
||||||
saved.setWindowTitle("Config saved")
|
saved.setWindowTitle("Config saved")
|
||||||
saved.setText(f"Laser diode and thermostat configs have been saved into flash.")
|
saved.setText(f"Laser diode and thermostat configs have been saved into flash.")
|
||||||
|
@ -570,7 +571,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def load_settings(_):
|
def load_settings(_):
|
||||||
self.kirdy.device.restore_settings_from_flash()
|
self.kirdy.task_dispatcher(self.kirdy.device.restore_settings_from_flash())
|
||||||
loaded = QtWidgets.QMessageBox(self)
|
loaded = QtWidgets.QMessageBox(self)
|
||||||
loaded.setWindowTitle("Config loaded")
|
loaded.setWindowTitle("Config loaded")
|
||||||
loaded.setText(f"Laser Diode and Thermostat configs have been loaded from flash.")
|
loaded.setText(f"Laser Diode and Thermostat configs have been loaded from flash.")
|
||||||
|
@ -596,32 +597,32 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
def _set_up_ctrl_btns(self):
|
def _set_up_ctrl_btns(self):
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def ld_pwr_on(_):
|
def ld_pwr_on(_):
|
||||||
self.kirdy.laser.set_power_on(True)
|
self.kirdy.task_dispatcher(self.kirdy.laser.set_power_on(True))
|
||||||
self.ld_pwr_on_btn.clicked.connect(ld_pwr_on)
|
self.ld_pwr_on_btn.clicked.connect(ld_pwr_on)
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def ld_pwr_off(_):
|
def ld_pwr_off(_):
|
||||||
self.kirdy.laser.set_power_on(False)
|
self.kirdy.task_dispatcher(self.kirdy.laser.set_power_on(False))
|
||||||
self.ld_pwr_off_btn.clicked.connect(ld_pwr_off)
|
self.ld_pwr_off_btn.clicked.connect(ld_pwr_off)
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def ld_clear_alarm(_):
|
def ld_clear_alarm(_):
|
||||||
self.kirdy.laser.clear_alarm()
|
self.kirdy.task_dispatcher(self.kirdy.laser.clear_alarm())
|
||||||
self.ld_clear_alarm_btn.clicked.connect(ld_clear_alarm)
|
self.ld_clear_alarm_btn.clicked.connect(ld_clear_alarm)
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def tec_pwr_on(_):
|
def tec_pwr_on(_):
|
||||||
self.kirdy.thermostat.set_power_on(True)
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_power_on(True))
|
||||||
self.tec_pwr_on_btn.clicked.connect(tec_pwr_on)
|
self.tec_pwr_on_btn.clicked.connect(tec_pwr_on)
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def tec_pwr_off(_):
|
def tec_pwr_off(_):
|
||||||
self.kirdy.thermostat.set_power_on(False)
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_power_on(False))
|
||||||
self.tec_pwr_off_btn.clicked.connect(tec_pwr_off)
|
self.tec_pwr_off_btn.clicked.connect(tec_pwr_off)
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def tec_clear_alarm(_):
|
def tec_clear_alarm(_):
|
||||||
self.kirdy.thermostat.clear_alarm()
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.clear_alarm())
|
||||||
self.tec_clear_alarm_btn.clicked.connect(tec_clear_alarm)
|
self.tec_clear_alarm_btn.clicked.connect(tec_clear_alarm)
|
||||||
|
|
||||||
def _set_up_plot_menu(self):
|
def _set_up_plot_menu(self):
|
||||||
|
@ -665,11 +666,11 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
tree.setParameters(self.params[3], showTop=False)
|
tree.setParameters(self.params[3], showTop=False)
|
||||||
self.params[3].sigTreeStateChanged.connect(self.send_command)
|
self.params[3].sigTreeStateChanged.connect(self.send_command)
|
||||||
|
|
||||||
@pyqtSlot()
|
@asyncSlot()
|
||||||
def autotune(param):
|
async def autotune(param):
|
||||||
match self.autotuner.state():
|
match self.autotuner.state():
|
||||||
case PIDAutotuneState.STATE_OFF:
|
case PIDAutotuneState.STATE_OFF:
|
||||||
settings = self.kirdy.device.get_settings_summary()
|
settings = await self.kirdy.device.get_settings_summary()
|
||||||
self.autotuner.setParam(
|
self.autotuner.setParam(
|
||||||
param.parent().child('Target Temperature').value(),
|
param.parent().child('Target Temperature').value(),
|
||||||
param.parent().child('Test Current').value() / 1000,
|
param.parent().child('Test Current').value() / 1000,
|
||||||
|
@ -678,7 +679,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
param.parent().child('Lookback').value())
|
param.parent().child('Lookback').value())
|
||||||
self.autotuner.setReady()
|
self.autotuner.setReady()
|
||||||
param.setOpts(title="Stop")
|
param.setOpts(title="Stop")
|
||||||
self.kirdy.thermostat.set_constant_current_control_mode()
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_constant_current_control_mode())
|
||||||
self.kirdy_handler.report_update_sig.connect(self.autotune_tick)
|
self.kirdy_handler.report_update_sig.connect(self.autotune_tick)
|
||||||
self.loading_spinner.show()
|
self.loading_spinner.show()
|
||||||
self.loading_spinner.start()
|
self.loading_spinner.start()
|
||||||
|
@ -686,7 +687,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN:
|
case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN:
|
||||||
self.autotuner.setOff()
|
self.autotuner.setOff()
|
||||||
param.setOpts(title="Run")
|
param.setOpts(title="Run")
|
||||||
self.kirdy.thermostat.set_tec_i_out(0.0)
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_tec_i_out(0.0))
|
||||||
self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick)
|
self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick)
|
||||||
self.background_task_lbl.setText("Ready.")
|
self.background_task_lbl.setText("Ready.")
|
||||||
self.loading_spinner.stop()
|
self.loading_spinner.stop()
|
||||||
|
@ -698,16 +699,16 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
match self.autotuner.state():
|
match self.autotuner.state():
|
||||||
case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN:
|
case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN:
|
||||||
self.autotuner.run(report['thermostat']['temperature'], report['ts']/1000)
|
self.autotuner.run(report['thermostat']['temperature'], report['ts']/1000)
|
||||||
self.kirdy.thermostat.set_tec_i_out(self.autotuner.output())
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_tec_i_out(self.autotuner.output()))
|
||||||
case PIDAutotuneState.STATE_SUCCEEDED:
|
case PIDAutotuneState.STATE_SUCCEEDED:
|
||||||
kp, ki, kd = self.autotuner.get_tec_pid()
|
kp, ki, kd = self.autotuner.get_tec_pid()
|
||||||
self.autotuner.setOff()
|
self.autotuner.setOff()
|
||||||
self.params[3].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run")
|
self.params[3].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run")
|
||||||
self.kirdy.thermostat.set_pid_kp(kp)
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_kp(kp))
|
||||||
self.kirdy.thermostat.set_pid_ki(ki)
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_ki(ki))
|
||||||
self.kirdy.thermostat.set_pid_kd(kd)
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_kd(kd))
|
||||||
self.kirdy.thermostat.set_pid_control_mode()
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_control_mode())
|
||||||
self.kirdy.thermostat.set_temperature_setpoint(self.params[3].child('PID Config', 'PID Auto Tune', 'Target Temperature').value())
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_temperature_setpoint(self.params[3].child('PID Config', 'PID Auto Tune', 'Target Temperature').value()))
|
||||||
self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick)
|
self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick)
|
||||||
self.background_task_lbl.setText("Ready.")
|
self.background_task_lbl.setText("Ready.")
|
||||||
self.loading_spinner.stop()
|
self.loading_spinner.stop()
|
||||||
|
@ -719,7 +720,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
case PIDAutotuneState.STATE_FAILED:
|
case PIDAutotuneState.STATE_FAILED:
|
||||||
self.autotuner.setOff()
|
self.autotuner.setOff()
|
||||||
self.params[3].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run")
|
self.params[3].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run")
|
||||||
self.kirdy.thermostat.set_tec_i_out(0.0)
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_tec_i_out(0.0))
|
||||||
self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick)
|
self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick)
|
||||||
self.background_task_lbl.setText("Ready.")
|
self.background_task_lbl.setText("Ready.")
|
||||||
self.loading_spinner.stop()
|
self.loading_spinner.stop()
|
||||||
|
@ -899,7 +900,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
port = net_settings["port"]
|
port = net_settings["port"]
|
||||||
prefix_len = net_settings["prefix_len"]
|
prefix_len = net_settings["prefix_len"]
|
||||||
gateway = net_settings["gateway_addr"]
|
gateway = net_settings["gateway_addr"]
|
||||||
self.kirdy.device.set_ip_settings(addr, port, prefix_len, gateway)
|
self.kirdy.task_dispatcher(self.kirdy.device.set_ip_settings(addr, port, prefix_len, gateway))
|
||||||
self.status_lbl.setText("IP Settings is Updated")
|
self.status_lbl.setText("IP Settings is Updated")
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
|
@ -931,7 +932,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
target, action = inner_param.opts['target_action_pair'][inner_param.opts['limits'].index(data)]
|
target, action = inner_param.opts['target_action_pair'][inner_param.opts['limits'].index(data)]
|
||||||
cmd = getattr(getattr(self.kirdy, target), action)
|
cmd = getattr(getattr(self.kirdy, target), action)
|
||||||
param.child(*param.childPath(inner_param)).setOpts(lock=True)
|
param.child(*param.childPath(inner_param)).setOpts(lock=True)
|
||||||
cmd()
|
self.kirdy.task_dispatcher(cmd())
|
||||||
param.child(*param.childPath(inner_param)).setOpts(lock=False)
|
param.child(*param.childPath(inner_param)).setOpts(lock=False)
|
||||||
continue
|
continue
|
||||||
""" cmd translation from non-mutex type parameter"""
|
""" cmd translation from non-mutex type parameter"""
|
||||||
|
@ -942,25 +943,27 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
data = siEval(str(data)+inner_param.opts["unit"], regex=FLOAT_REGEX, suffix=suffix)
|
data = siEval(str(data)+inner_param.opts["unit"], regex=FLOAT_REGEX, suffix=suffix)
|
||||||
cmd = getattr(getattr(self.kirdy, inner_param.opts["target"]), inner_param.opts["action"])
|
cmd = getattr(getattr(self.kirdy, inner_param.opts["target"]), inner_param.opts["action"])
|
||||||
param.child(*param.childPath(inner_param)).setOpts(lock=True)
|
param.child(*param.childPath(inner_param)).setOpts(lock=True)
|
||||||
cmd(data)
|
self.kirdy.task_dispatcher(cmd(data))
|
||||||
param.child(*param.childPath(inner_param)).setOpts(lock=False)
|
param.child(*param.childPath(inner_param)).setOpts(lock=False)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
def coro_main():
|
async def coro_main():
|
||||||
args = get_argparser().parse_args()
|
args = get_argparser().parse_args()
|
||||||
if args.logLevel:
|
if args.logLevel:
|
||||||
logging.basicConfig(level=getattr(logging, args.logLevel))
|
logging.basicConfig(level=getattr(logging, args.logLevel))
|
||||||
|
|
||||||
app = QtWidgets.QApplication(sys.argv)
|
app_quit_event = asyncio.Event()
|
||||||
|
|
||||||
|
app = QtWidgets.QApplication.instance()
|
||||||
|
app.aboutToQuit.connect(app_quit_event.set)
|
||||||
|
|
||||||
main_window = MainWindow(args)
|
main_window = MainWindow(args)
|
||||||
main_window.show()
|
main_window.show()
|
||||||
|
|
||||||
app.aboutToQuit.connect(main_window.kirdy_handler.end_session)
|
await app_quit_event.wait()
|
||||||
app.exec()
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
coro_main()
|
qasync.run(coro_main())
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
Loading…
Reference in New Issue