--- a/LPCBeremiz.py Tue Feb 22 14:11:50 2011 +0100
+++ b/LPCBeremiz.py Wed Feb 23 16:54:29 2011 +0100
@@ -1122,8 +1122,11 @@
""" Base class for file like objects to facilitate StdOut for the Shell."""
def write(self, s, style = None):
+ self.socket.send(s.encode('utf8')) + def writeyield(self, s): def write_warning(self, s):
--- a/connectors/LPC/LPCAppObject.py Tue Feb 22 14:11:50 2011 +0100
+++ b/connectors/LPC/LPCAppObject.py Wed Feb 23 16:54:29 2011 +0100
@@ -106,11 +106,12 @@
buff += idxstr + forced_type_size_str + forcestr
- data = self.HandleSerialTransaction(
- SET_TRACE_VARIABLETransaction(buff))
+ self.HandleSerialTransaction(SET_TRACE_VARIABLETransaction(buff)) def GetTraceVariables(self):
Return a list of variables, corresponding to the list of required idx
@@ -143,5 +144,5 @@
if offset and offset == size:
return self.PLCStatus, tick.value, res
#PLCprint("Debug error - wrong buffer unpack !")
- return self.PLCStatus, None, None
+ return self.PLCStatus, None, [] --- a/connectors/LPC/LPCObject.py Tue Feb 22 14:11:50 2011 +0100
+++ b/connectors/LPC/LPCObject.py Wed Feb 23 16:54:29 2011 +0100
@@ -45,12 +45,15 @@
self.PLCStatus, res = self.SerialConnection.HandleTransaction(transaction)
+ except LPCProtoError,e: + self.pluginsroot.logger.write(_("PLC disconnected\n")) + if self.SerialConnection is not None: + self.SerialConnection.close() + self.SerialConnection = None + self.PLCStatus = "Disconnected" self.pluginsroot.logger.write_warning(str(e)+"\n")
- self.SerialConnection.close()
- self.SerialConnection = None
- self.PLCStatus = "Disconnected"
def StartPLC(self, debug=False):
raise LPCProtoError("Not implemented")
--- a/plugger.py Tue Feb 22 14:11:50 2011 +0100
+++ b/plugger.py Wed Feb 23 16:54:29 2011 +0100
@@ -709,6 +709,9 @@
MATIEC_ERROR_MODEL = re.compile(".*\.st:(\d+)-(\d+)\.\.(\d+)-(\d+): error : (.*)$")
+DEBUG_RETRIES_REREGISTER = 4 class PluginsRoot(PlugTemplate, PLCControler):
This class define Root object of the plugin tree.
@@ -1731,52 +1734,55 @@
This thread waid PLC debug data, and dispatch them to subscribers
- # This lock is used to avoid flooding wx event stack calling callafter
while (not self.debug_break) and (self._connector is not None):
plc_status, debug_tick, debug_vars = self._connector.GetTraceVariables()
+ debug_getvar_retry += 1 #print debug_tick, debug_vars
- self.IECdebug_lock.acquire()
- if debug_vars is not None:
+ if plc_status == "Started": + self.IECdebug_lock.acquire() if len(debug_vars) == len(self.TracedIECPath):
+ if debug_getvar_retry > DEBUG_RETRIES_WARN: + wx.CallAfter(self.logger.write, + _("... debugger recovered\n")) for IECPath,value in zip(self.TracedIECPath, debug_vars):
self.CallWeakcallables(IECPath, "NewValue", debug_tick, value)
self.CallWeakcallables("__tick__", "NewDataAvailable")
- wx.CallAfter(self.logger.write_warning,
- _("Debug data do not match requested variable count %d != %d\n")%(len(debug_vars), len(self.TracedIECPath)))
- if plc_status == "Started":
- # Just in case, re-register debug registry to PLC
- if debug_getvar_retry == 0:
- wx.CallAfter(self.RegisterDebugVarToConnector)
- wx.CallAfter(self.logger.write_warning,
- _("Waiting debugger to recover...\n"))
- debug_getvar_retry += 1
+ self.IECdebug_lock.release() + if debug_getvar_retry == DEBUG_RETRIES_WARN: + wx.CallAfter(self.logger.write, + _("Waiting debugger to recover...\n")) + if debug_getvar_retry == DEBUG_RETRIES_REREGISTER: + # re-register debug registry to PLC + wx.CallAfter(self.RegisterDebugVarToConnector) + if debug_getvar_retry != 0: # Be patient, tollerate PLC to come up before debugging
- wx.CallAfter(self.logger.write, _("Debugger disabled\n"))
- self.debug_break = True
- self.IECdebug_lock.release()
+ self.debug_break = True + wx.CallAfter(self.logger.write, _("Debugger disabled\n")) def KillDebugThread(self):
if self.DebugThread is not None:
- self.DebugThread.join(timeout=1)
+ self.logger.writeyield(_("Stopping debug ... ")) + self.DebugThread.join(timeout=5) if self.DebugThread.isAlive() and self.logger:
self.logger.write_warning(_("Debug Thread couldn't be killed"))
+ self.logger.write(_("success\n")) def _connect_debug(self):
self.AppFrame.ResetGraphicViewers()
self.RegisterDebugVarToConnector()
- self.DebugThread = Thread(target=self.DebugThreadProc)
- self.DebugThread.start()
+ if self.DebugThread is None: + self.DebugThread = Thread(target=self.DebugThreadProc) + self.DebugThread.start() @@ -1815,9 +1821,7 @@
if self._connector is not None and not self._connector.StopPLC():
self.logger.write_error(_("Couldn't stop PLC !\n"))
- if self.DebugThread is not None:
- self.logger.write(_("Stopping debug\n"))
self.UpdateMethodsFromPLCStatus()