ProjectController.py
changeset 922 60fafd828a30
parent 921 a8db48ec2c31
child 923 6ef6e0b3a908
equal deleted inserted replaced
921:a8db48ec2c31 922:60fafd828a30
  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 :
  1080         if log_count :
       
  1081             to_console = []
  1081             for level, count, prev in zip(xrange(LogLevelsCount), log_count,self.previous_log_count):
  1082             for level, count, prev in zip(xrange(LogLevelsCount), log_count,self.previous_log_count):
  1082                 if count is not None and prev != count:
  1083                 if count is not None and prev != count:
  1083                     # XXX replace dump to console with dedicated log panel.
  1084                     # XXX replace dump to console with dedicated log panel.
  1084                     to_console = ['']
       
  1085                     dump_end = max( # request message sent after the last one we already got
  1085                     dump_end = max( # request message sent after the last one we already got
  1086                         prev - 1 if prev is not None else -1,
  1086                         prev - 1 if prev is not None else -1,
  1087                         count - 100) # 100 is purely arbitrary number
  1087                         count - 100) # 100 is purely arbitrary number
  1088                         # dedicated panel should only ask for a small range, 
  1088                         # dedicated panel should only ask for a small range, 
  1089                         # depending on how user navigate in the panel
  1089                         # depending on how user navigate in the panel
  1090                         # and only ask for last one in follow mode
  1090                         # and only ask for last one in follow mode
  1091                     for msgidx in xrange(count-1, dump_end,-1):
  1091                     for msgidx in xrange(count-1, dump_end,-1):
  1092                         answer = self._connector.GetLogMessage(level, msgidx)
  1092                         answer = self._connector.GetLogMessage(level, msgidx)
  1093                         if answer is not None :
  1093                         if answer is not None :
  1094                             msg, tick, tv_sec, tv_nsec = answer 
  1094                             msg, tick, tv_sec, tv_nsec = answer 
  1095                             to_console.insert(0, LogLevels[level]+ ':#' + repr(msgidx) + ":\"" + msg + "\"" + str(map(int, (tick, tv_sec, tv_nsec))))
  1095                             to_console.insert(0,(
       
  1096                                 (tv_sec, tv_nsec),
       
  1097                                 '%d|%s.%9.9d|%s(%s)'%(
       
  1098                                     int(tick),
       
  1099                                     str(datetime.fromtimestamp(tv_sec)),
       
  1100                                     tv_nsec,
       
  1101                                     msg,
       
  1102                                     LogLevels[level])))
  1096                         else:
  1103                         else:
  1097                             to_console.insert(0, LogLevels[level]+ ': No log before #'+repr(msgidx))
       
  1098                             break;
  1104                             break;
  1099                     self.logger.write("\n".join(to_console))
       
  1100                     self.previous_log_count[level] = count
  1105                     self.previous_log_count[level] = count
       
  1106             if to_console:
       
  1107                 to_console.sort()
       
  1108                 self.logger.write("\n".join(zip(*to_console)[1]+('',)))
  1101 
  1109 
  1102     def UpdateMethodsFromPLCStatus(self):
  1110     def UpdateMethodsFromPLCStatus(self):
  1103         status = None
  1111         status = None
  1104         if self._connector is not None:
  1112         if self._connector is not None:
  1105             status, log_count = self._connector.GetPLCstatus()
  1113             status, log_count = self._connector.GetPLCstatus()
  1121                                       ("_Transfer", False),
  1129                                       ("_Transfer", False),
  1122                                       ("_Connect", True),
  1130                                       ("_Connect", True),
  1123                                       ("_Disconnect", False)],
  1131                                       ("_Disconnect", False)],
  1124                    }.get(status,[]):
  1132                    }.get(status,[]):
  1125                 self.ShowMethod(*args)
  1133                 self.ShowMethod(*args)
  1126             self.previous_plcstate = status
       
  1127             {"Broken": self.logger.write_error,
  1134             {"Broken": self.logger.write_error,
  1128              None: lambda x: None}.get(
  1135              None: lambda x: None}.get(
  1129                 status, self.logger.write)(_("PLC is %s\n")%_(status))
  1136                 status, self.logger.write)(_("PLC state is \"%s\"\n")%_(status))
       
  1137             self.previous_plcstate = status
  1130             if self.AppFrame is not None:
  1138             if self.AppFrame is not None:
  1131                 self.AppFrame.RefreshStatusToolBar()
  1139                 self.AppFrame.RefreshStatusToolBar()
  1132     
  1140     
  1133     def PullPLCStatusProc(self, event):
  1141     def PullPLCStatusProc(self, event):
  1134         if self._connector is None:
  1142         if self._connector is None:
  1362         #self.KillDebugThread()
  1370         #self.KillDebugThread()
  1363         
  1371         
  1364         wx.CallAfter(self.UpdateMethodsFromPLCStatus)
  1372         wx.CallAfter(self.UpdateMethodsFromPLCStatus)
  1365 
  1373 
  1366     def _Connect(self):
  1374     def _Connect(self):
  1367         # don't accept re-connetion is already connected
  1375         # don't accept re-connetion if already connected
  1368         if self._connector is not None:
  1376         if self._connector is not None:
  1369             self.logger.write_error(_("Already connected. Please disconnect\n"))
  1377             self.logger.write_error(_("Already connected. Please disconnect\n"))
  1370             return
  1378             return
  1371         
  1379         
  1372         # Get connector uri
  1380         # Get connector uri
  1427             self.UpdateMethodsFromPLCStatus()
  1435             self.UpdateMethodsFromPLCStatus()
  1428             if self.previous_plcstate is not None:
  1436             if self.previous_plcstate is not None:
  1429                 status = _(self.previous_plcstate)
  1437                 status = _(self.previous_plcstate)
  1430             else:
  1438             else:
  1431                 status = ""
  1439                 status = ""
  1432             self.logger.write(_("PLC is %s\n")%status)
  1440 
       
  1441             #self.logger.write(_("PLC is %s\n")%status)
  1433             
  1442             
  1434             # Start the status Timer
  1443             # Start the status Timer
  1435             self.StatusTimer.Start(milliseconds=500, oneShot=False)
  1444             self.StatusTimer.Start(milliseconds=500, oneShot=False)
  1436             
  1445             
  1437             if self.previous_plcstate=="Started":
  1446             if self.previous_plcstate in ["Started","Stopped"]:
  1438                 if self.DebugAvailable() and self.GetIECProgramsAndVariables():
  1447                 if self.DebugAvailable() and self.GetIECProgramsAndVariables():
  1439                     self.logger.write(_("Debug connect matching running PLC\n"))
  1448                     self.logger.write(_("Debugger ready\n"))
  1440                     self._connect_debug()
  1449                     self._connect_debug()
  1441                 else:
  1450                 else:
  1442                     self.logger.write_warning(_("Debug do not match PLC - stop/transfert/start to re-enable\n"))
  1451                     self.logger.write_warning(_("Debug does not match PLC - stop/transfert/start to re-enable\n"))
  1443 
  1452 
  1444     def CompareLocalAndRemotePLC(self):
  1453     def CompareLocalAndRemotePLC(self):
  1445         if self._connector is None:
  1454         if self._connector is None:
  1446             return
  1455             return
  1447         # We are now connected. Update button status
  1456         # We are now connected. Update button status