# HG changeset patch # User lbessard # Date 1220631318 -7200 # Node ID 90db933fe9560cb341e21ae720708bf472b2e173 # Parent fc6d1988e4daba717c1f8ef3ae8b389cfe7138f2 Adding support for Debugging with PLCOpenEditor Bug with unsubscribe IEC_path start to be fixed diff -r fc6d1988e4da -r 90db933fe956 plugger.py --- a/plugger.py Fri Sep 05 18:13:55 2008 +0200 +++ b/plugger.py Fri Sep 05 18:15:18 2008 +0200 @@ -683,6 +683,7 @@ # After __init__ root plugin is not valid self.ProjectPath = None self.PLCEditor = None + self.PLCDebug = None # copy PluginMethods so that it can be later customized self.PluginMethods = [dic.copy() for dic in self.PluginMethods] @@ -1308,6 +1309,20 @@ self._connector.SetTraceVariablesList(Idxs) self.IECdebug_lock.release() + + #for IEC_path, IECdebug_data in self.IECdebug_datas.iteritems(): + # print IEC_path, IECdebug_data[0].keys() + + def ReArmDebugRegisterTimer(self): + if self.DebugTimer is not None: + self.DebugTimer.cancel() + + # 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 SubscribeDebugIECVariable(self, IECPath, callableobj, *args, **kwargs): """ @@ -1328,22 +1343,20 @@ IECdebug_data[0][callableobj]=(args, kwargs) self.IECdebug_lock.release() - - if self.DebugTimer is not None: - self.DebugTimer.cancel() - - # 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() - + + self.ReArmDebugRegisterTimer() + return IECdebug_data[1] def UnsubscribeDebugIECVariable(self, IECPath, callableobj): + #print "Unsubscribe", IECPath, callableobj + self.IECdebug_lock.acquire() IECdebug_data = self.IECdebug_datas.get(IECPath, None) - if IECdebug_data is None: + if IECdebug_data is not None: IECdebug_data[0].pop(callableobj,None) + self.IECdebug_lock.release() + + self.ReArmDebugRegisterTimer() def DebugCallerFunc(self, weakcallable, value, *args, **kwargs): # do the call @@ -1360,6 +1373,7 @@ while self._connector is not None: debug_tick, debug_vars = self._connector.GetTraceVariables() #print debug_tick, debug_vars + self.IECdebug_lock.acquire() if debug_vars is not None and \ len(debug_vars) == len(self.TracedIECPath): for IECPath,value in zip(self.TracedIECPath, debug_vars): @@ -1375,12 +1389,13 @@ elif debug_vars is not None: wx.CallAfter(self.logger.write_warning, "debug data not coherent %d != %d"%(len(debug_vars), len(self.TracedIECPath))) - #elif debug_tick == -1: + elif debug_tick == -1: #wx.CallAfter(self.logger.write, "Debugger unavailable\n") - # pass + pass else: wx.CallAfter(self.logger.write, "Debugger disabled\n") break + self.IECdebug_lock.release() def _Debug(self): """ @@ -1390,7 +1405,13 @@ self._connector.StartPLC(debug=True): self.logger.write("Starting PLC (debug mode)\n") self.TracedIECPath = [] - # TODO : laucnch PLCOpenEditor in Debug Mode + if self.PLCDebug is None: + self.RefreshPluginsBlockLists() + def _onclose(): + self.PLCDebug = None + self.PLCDebug = PLCOpenEditor(self.AppFrame, self, debug=True) + self.PLCDebug._onclose = _onclose + self.PLCDebug.Show() self.DebugThread = Thread(target=self.DebugThreadProc) self.DebugThread.start() else: