|
|
|
@ -196,14 +196,16 @@ class Graphs:
|
|
|
|
|
ld_i_set_graph.setAxisItems({'left': ld_i_set_axis})
|
|
|
|
|
ld_i_set_graph.addItem(self._ld_i_set_plot)
|
|
|
|
|
ld_i_set_graph.y_range_controller = LiveAxisRange(fixed_range=[0.0, 0.4])
|
|
|
|
|
self.ld_i_set_connector = DataConnector(self._ld_i_set_plot, max_points=self.max_samples)
|
|
|
|
|
self.ld_i_set_connector = DataConnector(self._ld_i_set_plot, plot_rate=10.0, update_rate=10.0, max_points=self.max_samples)
|
|
|
|
|
self.connectors += [self.ld_i_set_connector]
|
|
|
|
|
|
|
|
|
|
pd_mon_pwr_axis = LiveAxis('left', text="Power", units="W")
|
|
|
|
|
pd_mon_pwr_axis.showLabel()
|
|
|
|
|
|
|
|
|
|
pd_mon_pwr_graph.y_range_controller = LiveAxisRange(min_y_range_span=[0.0, 100 / 1000 / 1000])
|
|
|
|
|
pd_mon_pwr_graph.setAxisItems({'left': pd_mon_pwr_axis})
|
|
|
|
|
pd_mon_pwr_graph.addItem(self._pd_mon_pwr_plot)
|
|
|
|
|
self.pd_mon_pwr_connector = DataConnector(self._pd_mon_pwr_plot, max_points=self.max_samples)
|
|
|
|
|
self.pd_mon_pwr_connector = DataConnector(self._pd_mon_pwr_plot, plot_rate=10.0, update_rate=10.0, max_points=self.max_samples)
|
|
|
|
|
self.connectors += [self.pd_mon_pwr_connector]
|
|
|
|
|
|
|
|
|
|
tec_temp_axis = LiveAxis('left', text="Temperature", units="℃")
|
|
|
|
@ -211,8 +213,8 @@ class Graphs:
|
|
|
|
|
tec_temp_graph.setAxisItems({'left': tec_temp_axis})
|
|
|
|
|
tec_temp_graph.addItem(self._tec_setpoint_plot)
|
|
|
|
|
tec_temp_graph.addItem(self._tec_temp_plot)
|
|
|
|
|
self.tec_setpoint_connector = DataConnector(self._tec_setpoint_plot, max_points=1)
|
|
|
|
|
self.tec_temp_connector = DataConnector(self._tec_temp_plot, max_points=self.max_samples)
|
|
|
|
|
self.tec_setpoint_connector = DataConnector(self._tec_setpoint_plot, plot_rate=10.0, update_rate=10.0, max_points=1)
|
|
|
|
|
self.tec_temp_connector = DataConnector(self._tec_temp_plot, plot_rate=10.0, update_rate=10.0, max_points=self.max_samples)
|
|
|
|
|
self.connectors += [self.tec_temp_connector, self.tec_setpoint_connector]
|
|
|
|
|
|
|
|
|
|
tec_i_axis = LiveAxis('left', text="Current", units="A")
|
|
|
|
@ -221,8 +223,8 @@ class Graphs:
|
|
|
|
|
tec_i_graph.addLegend(brush=(50, 50, 200, 150))
|
|
|
|
|
tec_i_graph.addItem(self._tec_i_target_plot)
|
|
|
|
|
tec_i_graph.addItem(self._tec_i_measure_plot)
|
|
|
|
|
self.tec_i_target_connector = DataConnector(self._tec_i_target_plot, max_points=self.max_samples)
|
|
|
|
|
self.tec_i_measure_connector = DataConnector(self._tec_i_measure_plot, max_points=self.max_samples)
|
|
|
|
|
self.tec_i_target_connector = DataConnector(self._tec_i_target_plot, plot_rate=10.0, update_rate=10.0, max_points=self.max_samples)
|
|
|
|
|
self.tec_i_measure_connector = DataConnector(self._tec_i_measure_plot, plot_rate=10.0, update_rate=10.0, max_points=self.max_samples)
|
|
|
|
|
self.connectors += [self.tec_i_target_connector, self.tec_i_measure_connector]
|
|
|
|
|
|
|
|
|
|
def set_max_samples(self, max_samples):
|
|
|
|
@ -403,7 +405,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
|
|
LASER_DIODE_PARAMETERS = [
|
|
|
|
|
{'name': 'Readings', 'expanded': True, 'type': 'group', 'children': [
|
|
|
|
|
{'name': 'LD Current Set', 'type': 'float', 'unit': 'mA', 'readonly': True, "compactHeight": False},
|
|
|
|
|
{'name': 'PD Current', 'type': 'float', 'unit': 'uA', 'siPrefix': True, 'readonly': True, "compactHeight": False},
|
|
|
|
|
{'name': 'PD Current', 'type': 'float', 'unit': 'uA', 'readonly': True, "compactHeight": False},
|
|
|
|
|
{'name': 'PD Power', 'type': 'float', 'unit': 'mW', 'readonly': True, "compactHeight": False},
|
|
|
|
|
{'name': 'LF Mod Termination (50 Ohm)', 'type': 'list', 'limits': ['On', 'Off'], 'readonly': True, "compactHeight": False}
|
|
|
|
|
]},
|
|
|
|
@ -814,8 +816,10 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
|
|
tree.setParameters(self.params[1], showTop=False)
|
|
|
|
|
self.params[1].sigTreeStateChanged.connect(self.send_command)
|
|
|
|
|
|
|
|
|
|
self.prev_autotuner_state = None
|
|
|
|
|
@asyncSlot()
|
|
|
|
|
async def autotune(param):
|
|
|
|
|
self.prev_autotuner_state = None
|
|
|
|
|
match self.autotuner.state():
|
|
|
|
|
case PIDAutotuneState.STATE_OFF:
|
|
|
|
|
settings = await self.kirdy.device.get_settings_summary()
|
|
|
|
@ -825,6 +829,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
|
|
param.parent().child('Temperature Swing').value(),
|
|
|
|
|
1.0 / settings['thermostat']['temp_adc_settings']['rate'],
|
|
|
|
|
param.parent().child('Lookback').value())
|
|
|
|
|
print(param.parent().child('Lookback').value())
|
|
|
|
|
self.autotuner.setReady()
|
|
|
|
|
param.setOpts(title="Stop")
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_constant_current_control_mode())
|
|
|
|
@ -878,40 +883,43 @@ class MainWindow(QtWidgets.QMainWindow):
|
|
|
|
|
self.info_box.setWindowTitle("Command fails to execute")
|
|
|
|
|
self.info_box.show()
|
|
|
|
|
|
|
|
|
|
@pyqtSlot(dict)
|
|
|
|
|
def autotune_tick(self, report):
|
|
|
|
|
match self.autotuner.state():
|
|
|
|
|
case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN:
|
|
|
|
|
self.autotuner.run(report['thermostat']['temperature'], report['ts']/1000)
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_tec_i_out(self.autotuner.output()))
|
|
|
|
|
case PIDAutotuneState.STATE_SUCCEEDED:
|
|
|
|
|
kp, ki, kd = self.autotuner.get_tec_pid()
|
|
|
|
|
self.autotuner.setOff()
|
|
|
|
|
self.params[1].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run")
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_kp(kp))
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_ki(ki))
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_kd(kd))
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_control_mode())
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_temperature_setpoint(self.params[1].child('PID Config', 'PID Auto Tune', 'Target Temperature').value()))
|
|
|
|
|
self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick)
|
|
|
|
|
self.background_task_lbl.setText("Ready.")
|
|
|
|
|
self.loading_spinner.stop()
|
|
|
|
|
self.loading_spinner.hide()
|
|
|
|
|
self.info_box.setWindowTitle("PID AutoTune Success")
|
|
|
|
|
self.info_box.setText("PID Config has been loaded to Thermostat.\nRegulating temperature.")
|
|
|
|
|
self.info_box.show()
|
|
|
|
|
|
|
|
|
|
case PIDAutotuneState.STATE_FAILED:
|
|
|
|
|
self.autotuner.setOff()
|
|
|
|
|
self.params[1].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run")
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_tec_i_out(0.0))
|
|
|
|
|
self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick)
|
|
|
|
|
self.background_task_lbl.setText("Ready.")
|
|
|
|
|
self.loading_spinner.stop()
|
|
|
|
|
self.loading_spinner.hide()
|
|
|
|
|
self.info_box.setWindowTitle("PID Autotune Failed")
|
|
|
|
|
self.info_box.setText("PID Autotune is failed.")
|
|
|
|
|
self.info_box.show()
|
|
|
|
|
@asyncSlot(dict)
|
|
|
|
|
async def autotune_tick(self, report):
|
|
|
|
|
self.autotuner.run(report['thermostat']['temperature'], report['ts']/1000)
|
|
|
|
|
if self.prev_autotuner_state != self.autotuner.state():
|
|
|
|
|
match self.autotuner.state():
|
|
|
|
|
case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN:
|
|
|
|
|
await self.kirdy.thermostat.set_tec_i_out(self.autotuner.output())
|
|
|
|
|
self.prev_autotuner_state = self.autotuner.state()
|
|
|
|
|
case PIDAutotuneState.STATE_SUCCEEDED:
|
|
|
|
|
kp, ki, kd = self.autotuner.get_tec_pid()
|
|
|
|
|
self.autotuner.setOff()
|
|
|
|
|
self.params[1].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run")
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_kp(kp))
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_ki(ki))
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_kd(kd))
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_control_mode())
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_temperature_setpoint(self.params[1].child('PID Config', 'PID Auto Tune', 'Target Temperature').value()))
|
|
|
|
|
self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick)
|
|
|
|
|
self.background_task_lbl.setText("Ready.")
|
|
|
|
|
self.loading_spinner.stop()
|
|
|
|
|
self.loading_spinner.hide()
|
|
|
|
|
self.info_box.setWindowTitle("PID AutoTune Success")
|
|
|
|
|
self.info_box.setText("PID Config has been loaded to Thermostat.\nRegulating temperature.")
|
|
|
|
|
self.info_box.show()
|
|
|
|
|
self.prev_autotuner_state = None
|
|
|
|
|
case PIDAutotuneState.STATE_FAILED:
|
|
|
|
|
self.autotuner.setOff()
|
|
|
|
|
self.params[1].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run")
|
|
|
|
|
self.kirdy.task_dispatcher(self.kirdy.thermostat.set_tec_i_out(0.0))
|
|
|
|
|
self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick)
|
|
|
|
|
self.background_task_lbl.setText("Ready.")
|
|
|
|
|
self.loading_spinner.stop()
|
|
|
|
|
self.loading_spinner.hide()
|
|
|
|
|
self.info_box.setWindowTitle("PID Autotune Failed")
|
|
|
|
|
self.info_box.setText("PID Autotune is failed.")
|
|
|
|
|
self.info_box.show()
|
|
|
|
|
self.prev_autotuner_state = None
|
|
|
|
|
|
|
|
|
|
@pyqtSlot(bool)
|
|
|
|
|
def _on_connection_changed(self, result):
|
|
|
|
|