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: |
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 |