ProjectController.py
changeset 917 401e44bae7c0
parent 914 94436558f0ce
child 918 aa136ef12506
equal deleted inserted replaced
916:697d8b77d716 917:401e44bae7c0
    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)
  1509                 else:
  1511                 else:
  1510                     self.logger.write_error(_("Transfer failed\n"))
  1512                     self.logger.write_error(_("Transfer failed\n"))
  1511             else:
  1513             else:
  1512                 self.logger.write_error(_("No PLC to transfer (did build succeed ?)\n"))
  1514                 self.logger.write_error(_("No PLC to transfer (did build succeed ?)\n"))
  1513 
  1515 
  1514         self.previous_log_count = None
  1516         self.previous_log_count = [None]*LogLevelsCount
  1515 
  1517 
  1516         wx.CallAfter(self.UpdateMethodsFromPLCStatus)
  1518         wx.CallAfter(self.UpdateMethodsFromPLCStatus)
  1517 
  1519 
  1518     StatusMethods = [
  1520     StatusMethods = [
  1519         {"bitmap" : "Build",
  1521         {"bitmap" : "Build",