--- a/ProjectController.py Fri Dec 25 17:12:02 2020 +0000
+++ b/ProjectController.py Mon Jan 18 10:59:28 2021 +0100
@@ -159,6 +159,7 @@
no_stdout=True,
no_stderr=True).spin()
except Exception:
+ self.logger.write_error(_("Couldn't launch IEC compiler to determine compatible options.\n"))
return buildopt
for opt in options:
@@ -254,7 +255,7 @@
# Setup debug information
self.IECdebug_datas = {}
- self.DebugTimer = None
+ self.DebugUpdatePending = False
self.ResetIECProgramsAndVariables()
# In both new or load scenario, no need to save
@@ -276,8 +277,6 @@
self.debug_status = PlcStatus.Stopped
def __del__(self):
- if self.DebugTimer:
- self.DebugTimer.cancel()
self.KillDebugThread()
def LoadLibraries(self):
@@ -1538,7 +1537,6 @@
return debug_status, ticks, buffers
def RegisterDebugVarToConnector(self):
- self.DebugTimer = None
Idxs = []
self.TracedIECPath = []
self.TracedIECTypes = []
@@ -1577,25 +1575,15 @@
self._connector.SetTraceVariablesList([])
self.DebugToken = None
self.debug_status, _debug_ticks, _buffers = self.SnapshotAndResetDebugValuesBuffers()
+ self.DebugUpdatePending = False
def IsPLCStarted(self):
return self.previous_plcstate == PlcStatus.Started
- def ReArmDebugRegisterTimer(self):
- if self.DebugTimer is not None:
- self.DebugTimer.cancel()
-
- # Prevent to call RegisterDebugVarToConnector when PLC is not started
- # If an output location var is forced it's leads to segmentation fault in runtime
- # Links between PLC located variables and real variables are not ready
- if self.IsPLCStarted():
- # Timer to prevent rapid-fire when registering many variables
- # use wx.CallAfter use keep using same thread. TODO : use wx.Timer
- # instead
- self.DebugTimer = Timer(
- 0.5, wx.CallAfter, args=[self.RegisterDebugVarToConnector])
- # Rearm anti-rapid-fire timer
- self.DebugTimer.start()
+ def AppendDebugUpdate(self):
+ if not self.DebugUpdatePending :
+ wx.CallAfter(self.RegisterDebugVarToConnector)
+ self.DebugUpdatePending = True
def GetDebugIECVariableType(self, IECPath):
_Idx, IEC_Type = self._IECPathToIdx.get(IECPath, (None, None))
@@ -1625,7 +1613,7 @@
IECdebug_data[0][callableobj] = buffer_list
- self.ReArmDebugRegisterTimer()
+ self.AppendDebugUpdate()
return IECdebug_data[1]
@@ -1641,12 +1629,12 @@
IECdebug_data[0].itervalues(),
False)
- self.ReArmDebugRegisterTimer()
+ self.AppendDebugUpdate()
def UnsubscribeAllDebugIECVariable(self):
self.IECdebug_datas = {}
- self.ReArmDebugRegisterTimer()
+ self.AppendDebugUpdate()
def ForceDebugIECVariable(self, IECPath, fvalue):
if IECPath not in self.IECdebug_datas:
@@ -1657,7 +1645,7 @@
IECdebug_data[2] = "Forced"
IECdebug_data[3] = fvalue
- self.ReArmDebugRegisterTimer()
+ self.AppendDebugUpdate()
def ReleaseDebugIECVariable(self, IECPath):
if IECPath not in self.IECdebug_datas:
@@ -1668,7 +1656,7 @@
IECdebug_data[2] = "Registered"
IECdebug_data[3] = None
- self.ReArmDebugRegisterTimer()
+ self.AppendDebugUpdate()
def CallWeakcallables(self, IECPath, function_name, *cargs):
data_tuple = self.IECdebug_datas.get(IECPath, None)