CLIController.py
branchwxPython4
changeset 3619 f75b11506fb2
parent 3548 da7b461f54b7
child 3750 f62625418bff
equal deleted inserted replaced
3618:f08b59f7c00a 3619:f75b11506fb2
     2 # -*- coding: utf-8 -*-
     2 # -*- coding: utf-8 -*-
     3 
     3 
     4 import os
     4 import os
     5 import sys
     5 import sys
     6 from functools import wraps
     6 from functools import wraps
       
     7 from threading import Timer
       
     8 from datetime import datetime
     7 
     9 
     8 import click
    10 import click
     9 
    11 
    10 import fake_wx
    12 import fake_wx
    11 
    13 
    12 from ProjectController import ProjectController
    14 from ProjectController import ProjectController
    13 from LocalRuntimeMixin import LocalRuntimeMixin
    15 from LocalRuntimeMixin import LocalRuntimeMixin
       
    16 from runtime.loglevels import LogLevelsCount, LogLevels
       
    17 
    14 
    18 
    15 class Log:
    19 class Log:
    16 
    20 
    17     def __init__(self):
    21     def __init__(self):
    18         self.crlfpending = False
    22         self.crlfpending = False
    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)