# HG changeset patch # User ed # Date 1259671289 -3600 # Node ID 1edde533db1958c397a51faef0bb29d0df7cb764 # Parent 379c66468cf6082aab938bcd576e0ecc6b1c706d Some cleanup in PLC status - removed that \"Starting\" state ... diff -r 379c66468cf6 -r 1edde533db19 Beremiz.py --- a/Beremiz.py Sun Nov 29 18:57:49 2009 +0100 +++ b/Beremiz.py Tue Dec 01 13:41:29 2009 +0100 @@ -28,6 +28,7 @@ import tempfile import shutil import random +import time CWD = os.path.split(os.path.realpath(__file__))[0] @@ -252,6 +253,8 @@ self.black_white = wx.TextAttr("BLACK", "WHITE") self.default_style = None self.output = output + # to prevent rapid fire on rising log panel + self.rising_timer = 0 def write(self, s, style = None): if style is None : style=self.black_white @@ -263,6 +266,10 @@ self.output.ScrollLines(s.count('\n')+1) self.output.ShowPosition(self.output.GetLastPosition()) self.output.Thaw() + newtime = time.time() + if newtime - self.rising_timer > 1: + self.output.Rise() + self.rising_timer = newtime def write_warning(self, s): self.write(s,self.red_white) @@ -376,6 +383,7 @@ self.LogConsole = wx.TextCtrl(id=ID_BEREMIZLOGCONSOLE, value='', name='LogConsole', parent=self.BottomNoteBook, pos=wx.Point(0, 0), size=wx.Size(0, 0), style=wx.TE_MULTILINE|wx.TE_RICH2) + self.LogConsole.Rise = self.RiseLogConsole self.LogConsole.Bind(wx.EVT_LEFT_DCLICK, self.OnLogConsoleDClick) self.BottomNoteBook.AddPage(self.LogConsole, _("Log Console")) @@ -422,6 +430,13 @@ self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) + def RiseLogConsole(self): + for idx in xrange(self.BottomNoteBook.GetPageCount()): + window = self.BottomNoteBook.GetPage(idx) + if window == self.LogConsole: + self.BottomNoteBook.SetSelection(idx) + break + def RefreshTitle(self): name = _("Beremiz") if self.PluginRoot is not None: diff -r 379c66468cf6 -r 1edde533db19 Beremiz_service.py --- a/Beremiz_service.py Sun Nov 29 18:57:49 2009 +0100 +++ b/Beremiz_service.py Tue Dec 01 13:41:29 2009 +0100 @@ -415,7 +415,7 @@ def UpdateIcon(self, plcstatus): if plcstatus is "Started" : currenticon = self.MakeIcon(starticon.GetImage()) - elif plcstatus is "Stopped" or plcstatus is "Starting": + elif plcstatus is "Stopped": currenticon = self.MakeIcon(stopicon.GetImage()) else: currenticon = self.MakeIcon(defaulticon.GetImage()) diff -r 379c66468cf6 -r 1edde533db19 connectors/PYRO/__init__.py --- a/connectors/PYRO/__init__.py Sun Nov 29 18:57:49 2009 +0100 +++ b/connectors/PYRO/__init__.py Tue Dec 01 13:41:29 2009 +0100 @@ -112,19 +112,13 @@ """ for safe use in from debug thread, must use the copy """ - if self.RemotePLCObjectProxyCopy is not None and self.RemotePLCObjectProxyCopy.GetPLCstatus() == "Started": - return self.RemotePLCObjectProxyCopy.GetTraceVariables() - else: - return None,None - GetTraceVariables = PyroCatcher(_PyroGetTraceVariables,(None,None)) + return self.RemotePLCObjectProxyCopy.GetTraceVariables() + GetTraceVariables = PyroCatcher(_PyroGetTraceVariables,("Broken",None,None)) - def _PyroPLCIsStarting(self): - """ - for safe use in from debug thread, must use the copy - """ - return self.RemotePLCObjectProxyCopy is not None and self.RemotePLCObjectProxyCopy.GetPLCstatus() == "Starting" - PLCIsStarting = PyroCatcher(_PyroPLCIsStarting,False) - + def _PyroGetPLCstatus(self): + return RemotePLCObjectProxy.GetPLCstatus() + GetPLCstatus = PyroCatcher(_PyroGetPLCstatus, "Broken") + def __getattr__(self, attrName): member = self.__dict__.get(attrName, None) if member is None: diff -r 379c66468cf6 -r 1edde533db19 plugger.py --- a/plugger.py Sun Nov 29 18:57:49 2009 +0100 +++ b/plugger.py Tue Dec 01 13:41:29 2009 +0100 @@ -779,8 +779,6 @@ self.DebugThread = None self.debug_break = False self.previous_plcstate = None - self.StatusPrint = {"Broken": self.logger.write_error, - None: lambda x: None} # copy PluginMethods so that it can be later customized self.PluginMethods = [dic.copy() for dic in self.PluginMethods] self.LoadSTLibrary() @@ -1529,43 +1527,38 @@ status = self._connector.GetPLCstatus() else: status = "Disconnected" - for args in { - "Starting" : [("_Run", True), - ("_Debug", True), - ("_Stop", False)], - "Started" : [("_Run", False), - ("_Debug", False), - ("_Stop", True)], - "Stopped" : [("_Run", True), - ("_Debug", True), - ("_Stop", False)], - "Empty" : [("_Run", False), - ("_Debug", False), - ("_Stop", False)], - "Broken" : [("_Run", True), - ("_Debug", True), - ("_Stop", False)], - "Disconnected" :[("_Run", False), - ("_Debug", False), - ("_Stop", False), - ("_Transfer", False), - ("_Connect", True), - ("_Disconnect", False)], - }.get(status,[]): - self.ShowMethod(*args) - return status - - def PullPLCStatusProc(self, event): + if(self.previous_plcstate != status): + for args in { + "Started" : [("_Run", False), + ("_Debug", False), + ("_Stop", True)], + "Stopped" : [("_Run", True), + ("_Debug", True), + ("_Stop", False)], + "Empty" : [("_Run", False), + ("_Debug", False), + ("_Stop", False)], + "Broken" : [], + "Disconnected" :[("_Run", False), + ("_Debug", False), + ("_Stop", False), + ("_Transfer", False), + ("_Connect", True), + ("_Disconnect", False)], + }.get(status,[]): + self.ShowMethod(*args) + self.previous_plcstate = status + return True + return False + + def PullPLCStatusProc(self, event): if self._connector is None: self.StatusTimer.Stop() - current_status = self.UpdateMethodsFromPLCStatus() - if current_status != self.previous_plcstate: - self.previous_plcstate = current_status - if current_status is not None: - status = _(current_status) - else: - status = "" - self.StatusPrint.get(current_status, self.logger.write)(_("PLC is %s\n")%status) + if self.UpdateMethodsFromPLCStatus(): + status = _(self.previous_plcstate) + {"Broken": self.logger.write_error, + None: lambda x: None}.get( + self.previous_plcstate, self.logger.write)(_("PLC is %s\n")%status) self.AppFrame.RefreshAll() def _Run(self): @@ -1681,23 +1674,21 @@ # This lock is used to avoid flooding wx event stack calling callafter self.debug_break = False while (not self.debug_break) and (self._connector is not None): - debug_tick, debug_vars = self._connector.GetTraceVariables() + plc_status, 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): - if value is not None: - self.CallWeakcallables(IECPath, "NewValue", debug_tick, value) - self.CallWeakcallables("__tick__", "NewDataAvailable") - elif debug_vars is not None: - wx.CallAfter(self.logger.write_warning, - _("Debug data not coherent %d != %d\n")%(len(debug_vars), len(self.TracedIECPath))) - elif debug_tick == -1: - #wx.CallAfter(self.logger.write, "Debugger unavailable\n") - pass + if debug_vars is not None: + if len(debug_vars) == len(self.TracedIECPath): + for IECPath,value in zip(self.TracedIECPath, debug_vars): + if value is not None: + self.CallWeakcallables(IECPath, "NewValue", debug_tick, value) + self.CallWeakcallables("__tick__", "NewDataAvailable") + else : + wx.CallAfter(self.logger.write_warning, + _("Debug data do not match requested variable count %d != %d\n")%(len(debug_vars), len(self.TracedIECPath))) else: - if self._connector.PLCIsStarting(): + if plc_status == "Started": + # Be patient, tollerate PLC to come up before debugging time.sleep(0.01) else: wx.CallAfter(self.logger.write, _("Debugger disabled\n")) @@ -1804,7 +1795,7 @@ self.CompareLocalAndRemotePLC() # Init with actual PLC status and print it - self.previous_plcstate = self.UpdateMethodsFromPLCStatus() + self.UpdateMethodsFromPLCStatus() if self.previous_plcstate is not None: status = _(self.previous_plcstate) else: diff -r 379c66468cf6 -r 1edde533db19 runtime/PLCObject.py --- a/runtime/PLCObject.py Sun Nov 29 18:57:49 2009 +0100 +++ b/runtime/PLCObject.py Tue Dec 01 13:41:29 2009 +0100 @@ -256,7 +256,7 @@ def StartPLC(self, debug=False): PLCprint("StartPLC") if self.CurrentPLCFilename is not None: - self.PLCStatus = "Starting" + self.PLCStatus = "Started" self.PythonThread = Thread(target=self.PythonThreadProc, args=[debug]) self.PythonThread.start() @@ -378,16 +378,12 @@ """ if self.PLCStatus == "Started": self.PLClibraryLock.acquire() - tick = self._WaitDebugData() + tick = ctypes.c_int() #PLCprint("Debug tick : %d"%tick) - if tick == 2**32 - 1: - tick = -1 - res = None - else: + if self._WaitDebugData(ctypes.byref(tick)) != 0: idx = ctypes.c_int() typename = ctypes.c_char_p() res = [] - for given_idx in self._Idxs: buffer=self._IterDebugData(ctypes.byref(idx), ctypes.byref(typename)) c_type,unpack_func = self.TypeTranslator.get(typename.value, (None,None)) @@ -399,6 +395,6 @@ res.append(None) self._FreeDebugData() self.PLClibraryLock.release() - return tick, res - return -1, None - + return self.PLCStatus, tick, res + return self.PLCStatus, None, None + diff -r 379c66468cf6 -r 1edde533db19 targets/Linux/plc_Linux_main.c --- a/targets/Linux/plc_Linux_main.c Sun Nov 29 18:57:49 2009 +0100 +++ b/targets/Linux/plc_Linux_main.c Tue Dec 01 13:41:29 2009 +0100 @@ -131,12 +131,12 @@ } extern unsigned long __tick; -/* from plc_debugger.c */ -unsigned long WaitDebugData() + +int WaitDebugData(unsigned long *tick) { + *tick = __debug_tick; /* Wait signal from PLC thread */ - if(pthread_mutex_lock(&debug_wait_mutex)) return -1; - return __debug_tick; + return pthread_mutex_lock(&debug_wait_mutex); } /* Called by PLC thread when debug_publish finished diff -r 379c66468cf6 -r 1edde533db19 targets/Win32/plc_Win32_main.c --- a/targets/Win32/plc_Win32_main.c Sun Nov 29 18:57:49 2009 +0100 +++ b/targets/Win32/plc_Win32_main.c Tue Dec 01 13:41:29 2009 +0100 @@ -170,10 +170,12 @@ } /* from plc_debugger.c */ +int WaitDebugData(unsigned long *tick) unsigned long WaitDebugData() { - if(WaitForSingleObject(debug_wait_sem, INFINITE) != WAIT_OBJECT_0) return -1; - return __debug_tick; + *tick = __debug_tick; + /* Wait signal from PLC thread */ + return WaitForSingleObject(debug_wait_sem, INFINITE) != WAIT_OBJECT_0; } /* Called by PLC thread when debug_publish finished diff -r 379c66468cf6 -r 1edde533db19 targets/Xenomai/plc_Xenomai_main.c --- a/targets/Xenomai/plc_Xenomai_main.c Sun Nov 29 18:57:49 2009 +0100 +++ b/targets/Xenomai/plc_Xenomai_main.c Tue Dec 01 13:41:29 2009 +0100 @@ -205,15 +205,16 @@ extern unsigned long __tick; /* from plc_debugger.c */ -unsigned long WaitDebugData() +int WaitDebugData(unsigned long *tick) { char message; int res; + *tick = __debug_tick; /* Wait signal from PLC thread */ if (PLC_state & PLC_STATE_DEBUG_FILE_OPENED) { res = read(WaitDebug_pipe_fd, &message, sizeof(char)); if (res == sizeof(char)) - return __debug_tick; + return 0; } return -1; } diff -r 379c66468cf6 -r 1edde533db19 targets/plc_common_main.c --- a/targets/plc_common_main.c Sun Nov 29 18:57:49 2009 +0100 +++ b/targets/plc_common_main.c Tue Dec 01 13:41:29 2009 +0100 @@ -23,7 +23,7 @@ **/ IEC_TIME __CURRENT_TIME; IEC_BOOL __DEBUG = 0; -unsigned long __tick = -1; +unsigned long __tick = 0; /* * Variable generated by C softPLC and plugins