ProjectController.py
changeset 978 3290eff761f1
parent 923 6ef6e0b3a908
child 985 cd8dadcef426
--- a/ProjectController.py	Wed Mar 13 12:34:25 2013 +0900
+++ b/ProjectController.py	Wed Mar 13 23:17:30 2013 +0100
@@ -85,9 +85,9 @@
         PLCControler.__init__(self)
 
         self.MandatoryParams = None
-        self.SetAppFrame(frame, logger)
         self._builder = None
         self._connector = None
+        self.SetAppFrame(frame, logger)
         
         self.iec2c_path = os.path.join(base_folder, "matiec", "iec2c"+(".exe" if wx.Platform == '__WXMSW__' else ""))
         self.ieclib_path = os.path.join(base_folder, "matiec", "lib")
@@ -113,7 +113,6 @@
         self.DebugThread = None
         self.debug_break = False
         self.previous_plcstate = None
-        self.previous_log_count = [None]*LogLevelsCount
         # copy ConfNodeMethods so that it can be later customized
         self.StatusMethods = [dic.copy() for dic in self.StatusMethods]
 
@@ -137,6 +136,8 @@
         self.StatusTimer = None
         
         if frame is not None:
+            frame.LogViewer.SetLogSource(self._connector)
+            
             # Timer to pull PLC status
             ID_STATUSTIMER = wx.NewId()
             self.StatusTimer = wx.Timer(self.AppFrame, ID_STATUSTIMER)
@@ -281,7 +282,7 @@
         """
         if os.path.basename(ProjectPath) == "":
             ProjectPath = os.path.dirname(ProjectPath)
-		# Verify that project contains a PLCOpen program
+        # Verify that project contains a PLCOpen program
         plc_file = os.path.join(ProjectPath, "plc.xml")
         if not os.path.isfile(plc_file):
             return _("Chosen folder doesn't contain a program. It's not a valid project!")
@@ -1077,36 +1078,10 @@
         self.CompareLocalAndRemotePLC()
 
     def UpdatePLCLog(self, log_count):
-        if log_count :
-            to_console = []
-            for level, count, prev in zip(xrange(LogLevelsCount), log_count,self.previous_log_count):
-                if count is not None and prev != count:
-                    # XXX replace dump to console with dedicated log panel.
-                    dump_end = max( # request message sent after the last one we already got
-                        prev - 1 if prev is not None else -1,
-                        count - 100) # 100 is purely arbitrary number
-                        # dedicated panel should only ask for a small range, 
-                        # depending on how user navigate in the panel
-                        # and only ask for last one in follow mode
-                    for msgidx in xrange(count-1, dump_end,-1):
-                        answer = self._connector.GetLogMessage(level, msgidx)
-                        if answer is not None :
-                            msg, tick, tv_sec, tv_nsec = answer 
-                            to_console.insert(0,(
-                                (tv_sec, tv_nsec),
-                                '%d|%s.%9.9d|%s(%s)'%(
-                                    int(tick),
-                                    str(datetime.fromtimestamp(tv_sec)),
-                                    tv_nsec,
-                                    msg,
-                                    LogLevels[level])))
-                        else:
-                            break;
-                    self.previous_log_count[level] = count
-            if to_console:
-                to_console.sort()
-                self.logger.write("\n".join(zip(*to_console)[1]+('',)))
-
+        if log_count:
+            if self.AppFrame is not None:
+                self.AppFrame.LogViewer.SetLogCounters(log_count)
+    
     def UpdateMethodsFromPLCStatus(self):
         status = None
         if self._connector is not None:
@@ -1115,7 +1090,7 @@
                 status, log_count = PLCstatus
                 self.UpdatePLCLog(log_count)
         if status is None:
-            self._connector = None
+            self._SetConnector(None)
             status = "Disconnected"
         if(self.previous_plcstate != status):
             for args in {
@@ -1303,6 +1278,7 @@
             else:
                 plc_status = None
             debug_getvar_retry += 1
+            #print [dict.keys() for IECPath, (dict, log, status, fvalue) in self.IECdebug_datas.items()]
             if plc_status == "Started":
                 self.IECdebug_lock.acquire()
                 if len(debug_vars) == len(self.TracedIECPath):
@@ -1341,7 +1317,6 @@
 
     def _connect_debug(self): 
         self.previous_plcstate = None
-        self.previous_log_count = [None]*LogLevelsCount
         if self.AppFrame:
             self.AppFrame.ResetGraphicViewers()
         self.RegisterDebugVarToConnector()
@@ -1373,6 +1348,11 @@
         
         wx.CallAfter(self.UpdateMethodsFromPLCStatus)
 
+    def _SetConnector(self, connector):
+        self._connector = connector
+        if self.AppFrame is not None:
+            self.AppFrame.LogViewer.SetLogSource(connector)
+            
     def _Connect(self):
         # don't accept re-connetion if already connected
         if self._connector is not None:
@@ -1417,7 +1397,7 @@
                            
         # Get connector from uri
         try:
-            self._connector = connectors.ConnectorFactory(uri, self)
+            self._SetConnector(connectors.ConnectorFactory(uri, self))
         except Exception, msg:
             self.logger.write_error(_("Exception while connecting %s!\n")%uri)
             self.logger.write_error(traceback.format_exc())
@@ -1477,7 +1457,7 @@
 
 
     def _Disconnect(self):
-        self._connector = None
+        self._SetConnector(None)
         self.StatusTimer.Stop()
         wx.CallAfter(self.UpdateMethodsFromPLCStatus)
         
@@ -1522,8 +1502,6 @@
             else:
                 self.logger.write_error(_("No PLC to transfer (did build succeed ?)\n"))
 
-        self.previous_log_count = [None]*LogLevelsCount
-
         wx.CallAfter(self.UpdateMethodsFromPLCStatus)
 
     StatusMethods = [