runtime/PLCObject.py
changeset 917 401e44bae7c0
parent 914 94436558f0ce
child 921 a8db48ec2c31
--- a/runtime/PLCObject.py	Tue Jan 29 23:41:00 2013 +0100
+++ b/runtime/PLCObject.py	Wed Jan 30 18:54:12 2013 +1100
@@ -25,7 +25,8 @@
 import Pyro.core as pyro
 from threading import Timer, Thread, Lock, Semaphore
 import ctypes, os, commands, types, sys
-from targets.typemapping import SameEndianessTypeTranslator as TypeTranslator
+from targets.typemapping import LogLevelsDefault, LogLevelsCount, SameEndianessTypeTranslator as TypeTranslator
+
 
 if os.name in ("nt", "ce"):
     from _ctypes import LoadLibrary as dlopen
@@ -80,25 +81,29 @@
         if self.statuschange is not None:
             self.statuschange(self.PLCStatus)
 
-    def LogMessage(self, msg):
-        return self._LogMessage(msg, len(msg))
-
-
-    def GetLogCount(self):
+    def LogMessage(self, *args):
+        if len(args) == 2:
+            level, msg = args
+        else:
+            level = LogLevelsDefault
+            msg, = args
+        return self._LogMessage(level, msg, len(msg))
+
+
+    def GetLogCount(self, level):
         if self._GetLogCount is not None :
-            return int(self._GetLogCount())
-        elif self._loading_error is not None:
+            return int(self._GetLogCount(level))
+        elif self._loading_error is not None and level==0:
             return 1;
 
-
-    def GetLogMessage(self, msgid):
+    def GetLogMessage(self, level, msgid):
         if self._GetLogMessage is not None:
             maxsz = len(self._log_read_buffer)-1
-            sz = self._GetLogMessage(msgid, self._log_read_buffer, maxsz)
+            sz = self._GetLogMessage(level, msgid, self._log_read_buffer, maxsz)
             if sz and sz <= maxsz:
                 self._log_read_buffer[sz] = '\x00'
                 return self._log_read_buffer.value
-        elif self._loading_error is not None :
+        elif self._loading_error is not None and level==0:
             return self._loading_error
         return None
 
@@ -171,15 +176,16 @@
 
             self._GetLogCount = self.PLClibraryHandle.GetLogCount
             self._GetLogCount.restype = ctypes.c_uint32
+            self._GetLogCount.argtypes = [ctypes.c_uint8]
 
             self._LogMessage = self.PLClibraryHandle.LogMessage
             self._LogMessage.restype = ctypes.c_int
-            self._LogMessage.argtypes = [ctypes.c_char_p, ctypes.c_uint32]
+            self._LogMessage.argtypes = [ctypes.c_uint8, ctypes.c_char_p, ctypes.c_uint32]
             
             self._log_read_buffer = ctypes.create_string_buffer(1<<14) #16K
             self._GetLogMessage = self.PLClibraryHandle.GetLogMessage
             self._GetLogMessage.restype = ctypes.c_uint32
-            self._GetLogMessage.argtypes = [ctypes.c_uint32, ctypes.c_char_p, ctypes.c_uint32]
+            self._GetLogMessage.argtypes = [ctypes.c_uint8, ctypes.c_uint32, ctypes.c_char_p, ctypes.c_uint32]
 
             self._loading_error = None
             return True
@@ -206,7 +212,7 @@
         self._resumeDebug = lambda:None
         self._PythonIterator = lambda:""
         self._GetLogCount = None 
-        self._LogMessage = lambda m,s:PLCprint("OFF LOG :"+m)
+        self._LogMessage = lambda l,m,s:PLCprint("OFF LOG :"+m)
         self._GetLogMessage = None
         self.PLClibraryHandle = None
         # Unload library explicitely
@@ -293,8 +299,6 @@
         self.evaluator(self.FinishRuntimePy)
     
     def StartPLC(self):
-        PLCprint("StartPLC")
-        self.LogMessage("Hello Log")
         if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped":
             c_argv = ctypes.c_char_p * len(self.argv)
             error = None
@@ -304,14 +308,15 @@
                 self.PythonThread = Thread(target=self.PythonThreadProc)
                 self.PythonThread.start()
                 self.StartSem.acquire()
+                self.LogMessage("PLC started")
             else:
-                PLCprint(_("Problem starting PLC : error %d" % res))
+                self.LogMessage(_("Problem starting PLC : error %d" % res))
                 self.PLCStatus = "Broken"
                 self.StatusChange()
             
     def StopPLC(self):
-        PLCprint("StopPLC")
         if self.PLCStatus == "Started":
+            self.LogMessage("PLC stopped")
             self._stopPLC()
             self.PythonThread.join()
             return True
@@ -330,10 +335,10 @@
         return True
 
     def GetPLCstatus(self):
-        return self.PLCStatus, self.GetLogCount()
+        return self.PLCStatus, map(self.GetLogCount,xrange(LogLevelsCount))
     
     def NewPLC(self, md5sum, data, extrafiles):
-        PLCprint("NewPLC (%s)"%md5sum)
+        self.LogMessage("NewPLC (%s)"%md5sum)
         if self.PLCStatus in ["Stopped", "Empty", "Broken"]:
             NewFileName = md5sum + lib_ext
             extra_files_log = os.path.join(self.workingdir,"extra_files.txt")
@@ -451,10 +456,10 @@
                     self._FreeDebugData()
                 self.PLClibraryLock.release()
             if offset and offset == size.value:
-                return self.PLCStatus, self.GetLogCount(), tick.value, res
+                return self.PLCStatus, tick.value, res
             #elif size.value:
                 #PLCprint("Debug error - wrong buffer unpack ! %d != %d"%(offset, size.value))
-        return self.PLCStatus, self.GetLogCount(), None, []
+        return self.PLCStatus, None, []
 
     def RemoteExec(self, script, **kwargs):
         try: