Bugfix for simulator to prevent GUI crash after first use

This commit is contained in:
2021-04-25 12:44:40 +02:00
parent cda60e119c
commit 3ea43e2931
5 changed files with 1548 additions and 1530 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -153,7 +153,7 @@ class Ui_win_revpicommander(object):
self.act_disconnect.setText(_translate("win_revpicommander", "&Disconnect")) self.act_disconnect.setText(_translate("win_revpicommander", "&Disconnect"))
self.act_disconnect.setShortcut(_translate("win_revpicommander", "Ctrl+X")) self.act_disconnect.setShortcut(_translate("win_revpicommander", "Ctrl+X"))
self.act_reset.setText(_translate("win_revpicommander", "Reset driver...")) self.act_reset.setText(_translate("win_revpicommander", "Reset driver..."))
self.act_simulator.setText(_translate("win_revpicommander", "Start local si&mulator...")) self.act_simulator.setText(_translate("win_revpicommander", "RevPi si&mulator..."))
from . import ressources_rc from . import ressources_rc

View File

@@ -226,7 +226,7 @@
</action> </action>
<action name="act_simulator"> <action name="act_simulator">
<property name="text"> <property name="text">
<string>Start local si&amp;mulator...</string> <string>RevPi si&amp;mulator...</string>
</property> </property>
</action> </action>
</widget> </widget>

View File

@@ -248,6 +248,7 @@ class ConnectionManager(QtCore.QThread):
xml_funcs = sp.system.listMethods() xml_funcs = sp.system.listMethods()
xml_mode = sp.xmlmodus() xml_mode = sp.xmlmodus()
except Exception as e: except Exception as e:
pi.logger.exception(e)
self.connection_error_observed.emit(str(e)) self.connection_error_observed.emit(str(e))
return False return False
@@ -322,11 +323,15 @@ class ConnectionManager(QtCore.QThread):
self.xml_funcs = ["psstart", "psstop", "ps_devices", "ps_inps", "ps_outs", "ps_values", "ps_setvalue"] self.xml_funcs = ["psstart", "psstop", "ps_devices", "ps_inps", "ps_outs", "ps_values", "ps_setvalue"]
self.connection_established.emit()
except Exception as e: except Exception as e:
pi.logger.exception(e) pi.logger.exception(e)
self.connection_error_observed.emit(str(e))
self._revpi_output = None self._revpi_output = None
self._revpi = None self._revpi = None
remove(procimg) if settings.value("simulator/stop_remove", False, bool):
remove(procimg)
return self._revpi is not None return self._revpi is not None
@@ -453,15 +458,23 @@ class ConnectionManager(QtCore.QThread):
return None return None
@property @property
def connected(self): def connected(self) -> bool:
"""True if we have an active connection.""" """True if we have an active connection."""
return self._cli is not None return self._cli is not None
@property @property
def simulating(self): def simulating(self) -> bool:
"""True, if simulating mode is running.""" """True, if simulating mode is running."""
return self._revpi is not None return self._revpi is not None
@property
def simulating_configrsc(self) -> str:
return self._revpi.configrsc if self._revpi else ""
@property
def simulating_procimg(self) -> str:
return self._revpi.procimg if self._revpi else ""
cm = ConnectionManager() cm = ConnectionManager()
"""Clobal connection manager instance.""" """Clobal connection manager instance."""

View File

@@ -70,20 +70,26 @@ class RevPiCommander(QtWidgets.QMainWindow, Ui_win_revpicommander):
def _set_gui_control_states(self): def _set_gui_control_states(self):
"""Setup states of actions and buttons.""" """Setup states of actions and buttons."""
connected = helper.cm.connected if helper.cm.simulating:
self.men_plc.setEnabled(connected) self.btn_plc_stop.setEnabled(True) # Stop simulator
self.act_logs.setEnabled(connected) self.btn_plc_restart.setEnabled(True) # Reset simulator values
self.act_options.setEnabled(connected and helper.cm.xml_mode >= 2) self.btn_plc_debug.setEnabled(True)
self.act_program.setEnabled(connected and helper.cm.xml_mode >= 2)
self.act_developer.setEnabled(connected and helper.cm.xml_mode >= 3) else:
self.act_pictory.setEnabled(connected) connected = helper.cm.connected
self.act_reset.setEnabled(connected and helper.cm.xml_mode >= 3) self.men_plc.setEnabled(connected)
self.act_disconnect.setEnabled(connected) self.act_logs.setEnabled(connected)
self.btn_plc_start.setEnabled(connected) self.act_options.setEnabled(connected and helper.cm.xml_mode >= 2)
self.btn_plc_stop.setEnabled(connected) self.act_program.setEnabled(connected and helper.cm.xml_mode >= 2)
self.btn_plc_restart.setEnabled(connected) self.act_developer.setEnabled(connected and helper.cm.xml_mode >= 3)
self.btn_plc_logs.setEnabled(connected) self.act_pictory.setEnabled(connected)
self.btn_plc_debug.setEnabled(connected and helper.cm.xml_mode >= 1) self.act_reset.setEnabled(connected and helper.cm.xml_mode >= 3)
self.act_disconnect.setEnabled(connected)
self.btn_plc_start.setEnabled(connected)
self.btn_plc_stop.setEnabled(connected)
self.btn_plc_restart.setEnabled(connected)
self.btn_plc_logs.setEnabled(connected)
self.btn_plc_debug.setEnabled(connected and helper.cm.xml_mode >= 1)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# region # REGION: Connection management # region # REGION: Connection management
@@ -128,11 +134,17 @@ class RevPiCommander(QtWidgets.QMainWindow, Ui_win_revpicommander):
pi.logger.debug("RevPiCommander.on_cm_connection_established") pi.logger.debug("RevPiCommander.on_cm_connection_established")
self._set_gui_control_states() self._set_gui_control_states()
self.txt_connection.setText("{0} - {1}:{2}".format( if helper.cm.simulating:
helper.cm.name, self.txt_connection.setText("configrsc=\"{0}\", procimg=\"{1}\"".format(
helper.cm.address, helper.cm.simulating_configrsc,
helper.cm.port helper.cm.simulating_procimg,
)) ))
else:
self.txt_connection.setText("{0} - {1}:{2}".format(
helper.cm.name,
helper.cm.address,
helper.cm.port
))
self.win_files = RevPiFiles(self) self.win_files = RevPiFiles(self)
@QtCore.pyqtSlot(str, str) @QtCore.pyqtSlot(str, str)
@@ -194,13 +206,12 @@ class RevPiCommander(QtWidgets.QMainWindow, Ui_win_revpicommander):
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def on_act_simulator_triggered(self): def on_act_simulator_triggered(self):
"""Start the simulator function.""" """Start the simulator function."""
helper.cm.pyload_disconnect()
diag = Simulator(self) diag = Simulator(self)
if diag.exec() != QtWidgets.QDialog.Accepted: if diag.exec() != QtWidgets.QDialog.Accepted:
diag.deleteLater() diag.deleteLater()
return return
helper.cm.pyload_disconnect()
configrsc_file = helper.settings.value("simulator/configrsc", "", str) configrsc_file = helper.settings.value("simulator/configrsc", "", str)
procimg_file = helper.settings.value("simulator/procimg", "", str) procimg_file = helper.settings.value("simulator/procimg", "", str)
@@ -212,12 +223,6 @@ class RevPiCommander(QtWidgets.QMainWindow, Ui_win_revpicommander):
"You can copy that from header textbox." "You can copy that from header textbox."
).format(procimg_file, configrsc_file) ).format(procimg_file, configrsc_file)
) )
self.txt_connection.setText("configrsc=\"{0}\", procimg=\"{1}\"".format(configrsc_file, procimg_file))
# Stop button will disable simulating
self.btn_plc_stop.setEnabled(True)
self.btn_plc_restart.setEnabled(True)
self.btn_plc_debug.setEnabled(True)
else: else:
pi.logger.error("Can not start simulator") pi.logger.error("Can not start simulator")
QtWidgets.QMessageBox.critical( QtWidgets.QMessageBox.critical(