23 from editors.IECCodeViewer import IECCodeViewer |
23 from editors.IECCodeViewer import IECCodeViewer |
24 from graphics import DebugViewer |
24 from graphics import DebugViewer |
25 from dialogs import DiscoveryDialog |
25 from dialogs import DiscoveryDialog |
26 from PLCControler import PLCControler |
26 from PLCControler import PLCControler |
27 from plcopen.structures import IEC_KEYWORDS |
27 from plcopen.structures import IEC_KEYWORDS |
28 from targets.typemapping import DebugTypesSize |
28 from targets.typemapping import DebugTypesSize, LogLevelsCount, LogLevels |
29 from ConfigTreeNode import ConfigTreeNode |
29 from ConfigTreeNode import ConfigTreeNode |
30 |
30 |
31 base_folder = os.path.split(sys.path[0])[0] |
31 base_folder = os.path.split(sys.path[0])[0] |
32 |
32 |
33 MATIEC_ERROR_MODEL = re.compile(".*\.st:(\d+)-(\d+)\.\.(\d+)-(\d+): (?:error)|(?:warning) : (.*)$") |
33 MATIEC_ERROR_MODEL = re.compile(".*\.st:(\d+)-(\d+)\.\.(\d+)-(\d+): (?:error)|(?:warning) : (.*)$") |
111 self.ProjectPath = None |
111 self.ProjectPath = None |
112 self._setBuildPath(None) |
112 self._setBuildPath(None) |
113 self.DebugThread = None |
113 self.DebugThread = None |
114 self.debug_break = False |
114 self.debug_break = False |
115 self.previous_plcstate = None |
115 self.previous_plcstate = None |
116 self.previous_log_count = None |
116 self.previous_log_count = [None]*LogLevelsCount |
117 # copy ConfNodeMethods so that it can be later customized |
117 # copy ConfNodeMethods so that it can be later customized |
118 self.StatusMethods = [dic.copy() for dic in self.StatusMethods] |
118 self.StatusMethods = [dic.copy() for dic in self.StatusMethods] |
119 |
119 |
120 def LoadLibraries(self): |
120 def LoadLibraries(self): |
121 self.Libraries = [] |
121 self.Libraries = [] |
1075 # kill the builder |
1075 # kill the builder |
1076 self._builder = None |
1076 self._builder = None |
1077 self.CompareLocalAndRemotePLC() |
1077 self.CompareLocalAndRemotePLC() |
1078 |
1078 |
1079 def UpdatePLCLog(self, log_count): |
1079 def UpdatePLCLog(self, log_count): |
1080 if log_count and self.previous_log_count != log_count: |
1080 if log_count : |
1081 # XXX replace dump to console with dedicated log panel. |
1081 for level, count, prev in zip(xrange(LogLevelsCount), log_count,self.previous_log_count): |
1082 to_console = [''] |
1082 if count is not None and prev != count: |
1083 dump_end = max( # request message sent after the last one we already got |
1083 # XXX replace dump to console with dedicated log panel. |
1084 self.previous_log_count - 1 if self.previous_log_count is not None else -1, |
1084 to_console = [''] |
1085 log_count - 100) # 100 is purely arbitrary number |
1085 dump_end = max( # request message sent after the last one we already got |
1086 # dedicated panel should only ask for a small range, |
1086 prev - 1 if prev is not None else -1, |
1087 # depending on how user navigate in the panel |
1087 count - 100) # 100 is purely arbitrary number |
1088 # and only ask for last one in follow mode |
1088 # dedicated panel should only ask for a small range, |
1089 for msgidx in xrange(log_count-1, dump_end,-1): |
1089 # depending on how user navigate in the panel |
1090 msg = self._connector.GetLogMessage(msgidx) |
1090 # and only ask for last one in follow mode |
1091 if msg is not None : |
1091 for msgidx in xrange(count-1, dump_end,-1): |
1092 to_console.insert(0, '#' + repr(msgidx) + ": " + msg) |
1092 msg = self._connector.GetLogMessage(level, msgidx) |
1093 else: |
1093 if msg is not None : |
1094 to_console.insert(0, 'No log before #'+repr(msgidx)) |
1094 to_console.insert(0, LogLevels[level]+ ':#' + repr(msgidx) + ": " + msg) |
1095 break; |
1095 else: |
1096 self.logger.write("\n".join(to_console)) |
1096 to_console.insert(0, LogLevels[level]+ ': No log before #'+repr(msgidx)) |
1097 self.previous_log_count = log_count |
1097 break; |
|
1098 self.logger.write("\n".join(to_console)) |
|
1099 self.previous_log_count[level] = count |
1098 |
1100 |
1099 def UpdateMethodsFromPLCStatus(self): |
1101 def UpdateMethodsFromPLCStatus(self): |
1100 status = None |
1102 status = None |
1101 if self._connector is not None: |
1103 if self._connector is not None: |
1102 status, log_count = self._connector.GetPLCstatus() |
1104 status, log_count = self._connector.GetPLCstatus() |
1287 self.debug_break = False |
1289 self.debug_break = False |
1288 debug_getvar_retry = 0 |
1290 debug_getvar_retry = 0 |
1289 while (not self.debug_break) and (self._connector is not None): |
1291 while (not self.debug_break) and (self._connector is not None): |
1290 Trace = self._connector.GetTraceVariables() |
1292 Trace = self._connector.GetTraceVariables() |
1291 if(Trace): |
1293 if(Trace): |
1292 plc_status, log_count, debug_tick, debug_vars = Trace |
1294 plc_status, debug_tick, debug_vars = Trace |
1293 else: |
1295 else: |
1294 plc_status = None |
1296 plc_status = None |
1295 debug_getvar_retry += 1 |
1297 debug_getvar_retry += 1 |
1296 if plc_status == "Started": |
1298 if plc_status == "Started": |
1297 self.IECdebug_lock.acquire() |
1299 self.IECdebug_lock.acquire() |
1329 self.logger.write(_("Debugger stopped.\n")) |
1331 self.logger.write(_("Debugger stopped.\n")) |
1330 self.DebugThread = None |
1332 self.DebugThread = None |
1331 |
1333 |
1332 def _connect_debug(self): |
1334 def _connect_debug(self): |
1333 self.previous_plcstate = None |
1335 self.previous_plcstate = None |
1334 self.previous_log_count = None |
1336 self.previous_log_count = [None]*LogLevelsCount |
1335 if self.AppFrame: |
1337 if self.AppFrame: |
1336 self.AppFrame.ResetGraphicViewers() |
1338 self.AppFrame.ResetGraphicViewers() |
1337 self.RegisterDebugVarToConnector() |
1339 self.RegisterDebugVarToConnector() |
1338 if self.DebugThread is None: |
1340 if self.DebugThread is None: |
1339 self.DebugThread = Thread(target=self.DebugThreadProc) |
1341 self.DebugThread = Thread(target=self.DebugThreadProc) |