72 def __init__(self, session): |
76 def __init__(self, session): |
73 self.session = session |
77 self.session = session |
74 log = Log() |
78 log = Log() |
75 LocalRuntimeMixin.__init__(self, log, use_gui=False) |
79 LocalRuntimeMixin.__init__(self, log, use_gui=False) |
76 ProjectController.__init__(self, None, log) |
80 ProjectController.__init__(self, None, log) |
|
81 self.CLIStatusTimer = None |
|
82 self.KillCLIStatusTimer = False |
|
83 |
|
84 |
|
85 def StartCLIStatusTimer(self): |
|
86 if self.CLIStatusTimer is not None: |
|
87 return |
|
88 self.CLIStatusTimer = Timer(0.5, self.CLIStatusTimerProc) |
|
89 self.KillCLIStatusTimer = False |
|
90 self.CLIStatusTimer.start() |
|
91 |
|
92 def StopCLIStatusTimer(self): |
|
93 if self.CLIStatusTimer is None: |
|
94 return |
|
95 self.KillCLIStatusTimer = True |
|
96 self.CLIStatusTimer.cancel() |
|
97 self.CLIStatusTimer = None |
|
98 |
|
99 def CLIStatusTimerProc(self): |
|
100 self.CLIStatusTimer = None |
|
101 if not self.KillCLIStatusTimer: |
|
102 self.PullPLCStatusProc(None) |
|
103 self.StartCLIStatusTimer() |
|
104 |
|
105 def _SetConnector(self, connector, update_status=True): |
|
106 self._connector = connector |
|
107 self.previous_log_count = [None]*LogLevelsCount |
|
108 if connector is not None: |
|
109 self.StartCLIStatusTimer() |
|
110 else: |
|
111 self.StopCLIStatusTimer() |
|
112 if update_status: |
|
113 self.UpdateMethodsFromPLCStatus() |
|
114 |
|
115 def UpdatePLCLog(self, log_count): |
|
116 connector = self._connector |
|
117 new_messages = [] |
|
118 if connector: |
|
119 for level, count, prev in zip( |
|
120 xrange(LogLevelsCount), log_count, self.previous_log_count): |
|
121 if count is not None and prev != count: |
|
122 if prev is None: |
|
123 dump_end = max(-1, count - 10) |
|
124 else: |
|
125 dump_end = prev - 1 |
|
126 for msgidx in range(count-1, dump_end, -1): |
|
127 message = connector.GetLogMessage(level, msgidx) |
|
128 if message is not None: |
|
129 msg, _tick, tv_sec, tv_nsec = message |
|
130 date = datetime.utcfromtimestamp(tv_sec + tv_nsec * 1e-9) |
|
131 txt = "%s at %s: %s\n" % (LogLevels[level], date.isoformat(' '), msg) |
|
132 new_messages.append((date,txt)) |
|
133 else: |
|
134 break |
|
135 self.previous_log_count[level] = count |
|
136 new_messages.sort() |
|
137 for date, txt in new_messages: |
|
138 self.logger.write(txt) |
77 |
139 |
78 def check_and_load_project(self): |
140 def check_and_load_project(self): |
79 if not os.path.isdir(self.session.project_home): |
141 if not os.path.isdir(self.session.project_home): |
80 self.logger.write_error( |
142 self.logger.write_error( |
81 _("\"%s\" is not a valid Beremiz project\n") % self.session.project_home) |
143 _("\"%s\" is not a valid Beremiz project\n") % self.session.project_home) |