--- a/CLIController.py Wed Oct 05 20:15:28 2022 +0200
+++ b/CLIController.py Wed Oct 05 20:25:58 2022 +0200
@@ -4,6 +4,8 @@
from functools import wraps
+from threading import Timer +from datetime import datetime @@ -11,6 +13,8 @@
from ProjectController import ProjectController
from LocalRuntimeMixin import LocalRuntimeMixin
+from runtime.loglevels import LogLevelsCount, LogLevels @@ -74,6 +78,64 @@
LocalRuntimeMixin.__init__(self, log, use_gui=False)
ProjectController.__init__(self, None, log)
+ self.CLIStatusTimer = None + self.KillCLIStatusTimer = False + def StartCLIStatusTimer(self): + if self.CLIStatusTimer is not None: + self.CLIStatusTimer = Timer(0.5, self.CLIStatusTimerProc) + self.KillCLIStatusTimer = False + self.CLIStatusTimer.start() + def StopCLIStatusTimer(self): + if self.CLIStatusTimer is None: + self.KillCLIStatusTimer = True + self.CLIStatusTimer.cancel() + self.CLIStatusTimer = None + def CLIStatusTimerProc(self): + self.CLIStatusTimer = None + if not self.KillCLIStatusTimer: + self.PullPLCStatusProc(None) + self.StartCLIStatusTimer() + def _SetConnector(self, connector, update_status=True): + self._connector = connector + self.previous_log_count = [None]*LogLevelsCount + if connector is not None: + self.StartCLIStatusTimer() + self.StopCLIStatusTimer() + self.UpdateMethodsFromPLCStatus() + def UpdatePLCLog(self, log_count): + connector = self._connector + for level, count, prev in zip( + xrange(LogLevelsCount), log_count, self.previous_log_count): + if count is not None and prev != count: + dump_end = max(-1, count - 10) + for msgidx in range(count-1, dump_end, -1): + message = connector.GetLogMessage(level, msgidx) + if message is not None: + msg, _tick, tv_sec, tv_nsec = message + date = datetime.utcfromtimestamp(tv_sec + tv_nsec * 1e-9) + txt = "%s at %s: %s\n" % (LogLevels[level], date.isoformat(' '), msg) + new_messages.append((date,txt)) + self.previous_log_count[level] = count + for date, txt in new_messages: def check_and_load_project(self):
if not os.path.isdir(self.session.project_home):