runtime/PLCObject.py
changeset 366 cd90e4c10261
parent 365 a7f58414dea0
child 368 86ecd8374dae
--- a/runtime/PLCObject.py	Wed Jul 29 10:49:31 2009 +0200
+++ b/runtime/PLCObject.py	Wed Jul 29 15:17:10 2009 +0200
@@ -53,6 +53,7 @@
         self.PLCStatus = "Stopped"
         self.PLClibraryHandle = None
         self.PLClibraryLock = Lock()
+        self.DummyIteratorLock = None
         # Creates fake C funcs proxies
         self._FreePLC()
         self.daemon = daemon
@@ -93,10 +94,30 @@
             self._startPLC.restype = ctypes.c_int
             self._startPLC.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_char_p)]
             
-            def StopPLCLock():
-                self.PLClibraryLock.acquire()
-                self.PLClibraryHandle.stopPLC()
-                self.PLClibraryLock.release()
+            self.DummyIteratorLock = Lock()
+            self.DummyIteratorLock.acquire()
+            
+            self._PythonIterator = getattr(self.PLClibraryHandle, "PythonIterator", None)
+            if self._PythonIterator is not None:
+                self._PythonIterator.restype = ctypes.c_char_p
+                self._PythonIterator.argtypes = [ctypes.c_char_p]
+                
+                def StopPLCLock():
+                    self.PLClibraryLock.acquire()
+                    self.PLClibraryHandle.stopPLC()
+                    self.PLClibraryLock.release()
+                
+            else:
+                def DummyIterator(res):
+                    self.DummyIteratorLock.acquire()
+                    return None
+                self._PythonIterator = DummyIterator
+                
+                def StopPLCLock():
+                    self.PLClibraryLock.acquire()
+                    self.PLClibraryHandle.stopPLC()
+                    self.DummyIteratorLock.release()
+                    self.PLClibraryLock.release()
             
             self._stopPLC = StopPLCLock
             self._stopPLC.restype = None
@@ -123,10 +144,6 @@
 
             self._resumeDebug = self.PLClibraryHandle.resumeDebug
             self._resumeDebug.restype = None
-
-            self._PythonIterator = self.PLClibraryHandle.PythonIterator
-            self._PythonIterator.restype = ctypes.c_char_p
-            self._PythonIterator.argtypes = [ctypes.c_char_p]
             
             return True
         except:
@@ -188,59 +205,78 @@
     def PrepareRuntimePy(self):
         self.python_threads_vars = globals().copy()
         self.python_threads_vars["WorkingDir"] = self.workingdir
-        pyfile = os.path.join(self.workingdir, "runtime.py")
-        hmifile = os.path.join(self.workingdir, "hmi.py")
-        if os.path.exists(hmifile):
-            try:
-                execfile(hmifile, self.python_threads_vars)
-                if os.path.exists(pyfile):
-                    try:
-                        # TODO handle exceptions in runtime.py
-                        # pyfile may redefine _runtime_cleanup
-                        # or even call _PythonThreadProc itself.
-                        execfile(pyfile, self.python_threads_vars)
-                    except:
-                        PLCprint(traceback.format_exc())
-                if self.python_threads_vars.has_key('wx'):
-                    wx = self.python_threads_vars['wx']
-                    # try to instanciate the first frame found.
-                    for name, obj in self.python_threads_vars.iteritems():
-                        # obj is a class
-                        if type(obj)==type(type) and issubclass(obj,wx.Frame):
-                            def create_frame():
-                                self.hmi_frame = obj(None)
-                                self.python_threads_vars[name] = self.hmi_frame
-                                # keep track of class... never know
-                                self.python_threads_vars['Class_'+name] = obj
-                                self.hmi_frame.Bind(wx.EVT_CLOSE, OnCloseFrame)
-                                self.hmi_frame.Show()
-                            
-                            def OnCloseFrame(evt):
-                                wx.MessageBox(_("Please stop PLC to close"))
-                            create_frame()
-                            break
-            except:
-                PLCprint(traceback.format_exc())
-        elif os.path.exists(pyfile):
-            try:
-                # TODO handle exceptions in runtime.py
-                # pyfile may redefine _runtime_cleanup
-                # or even call _PythonThreadProc itself.
-                execfile(pyfile, self.python_threads_vars)
-            except:
-                PLCprint(traceback.format_exc())
-        runtime_begin = self.python_threads_vars.get("_runtime_begin",None)
-        if runtime_begin is not None:
+        self.python_threads_vars["_runtime_begin"] = []
+        self.python_threads_vars["_runtime_cleanup"] = []
+#        pyfile = os.path.join(self.workingdir, "runtime.py")
+#        hmifile = os.path.join(self.workingdir, "hmi.py")
+#        if os.path.exists(hmifile):
+#            try:
+#                execfile(hmifile, self.python_threads_vars)
+#                if os.path.exists(pyfile):
+#                    try:
+#                        # TODO handle exceptions in runtime.py
+#                        # pyfile may redefine _runtime_cleanup
+#                        # or even call _PythonThreadProc itself.
+#                        execfile(pyfile, self.python_threads_vars)
+#                    except:
+#                        PLCprint(traceback.format_exc())
+#                if self.python_threads_vars.has_key('wx'):
+#                    wx = self.python_threads_vars['wx']
+#                    # try to instanciate the first frame found.
+#                    for name, obj in self.python_threads_vars.iteritems():
+#                        # obj is a class
+#                        if type(obj)==type(type) and issubclass(obj,wx.Frame):
+#                            def create_frame():
+#                                self.hmi_frame = obj(None)
+#                                self.python_threads_vars[name] = self.hmi_frame
+#                                # keep track of class... never know
+#                                self.python_threads_vars['Class_'+name] = obj
+#                                self.hmi_frame.Bind(wx.EVT_CLOSE, OnCloseFrame)
+#                                self.hmi_frame.Show()
+#                            
+#                            def OnCloseFrame(evt):
+#                                wx.MessageBox(_("Please stop PLC to close"))
+#                            create_frame()
+#                            break
+#            except:
+#                PLCprint(traceback.format_exc())
+#        elif os.path.exists(pyfile):
+#            try:
+#                # TODO handle exceptions in runtime.py
+#                # pyfile may redefine _runtime_cleanup
+#                # or even call _PythonThreadProc itself.
+#                execfile(pyfile, self.python_threads_vars)
+#            except:
+#                PLCprint(traceback.format_exc())
+        for filename in os.listdir(self.workingdir):
+            name, ext = os.path.splitext(filename)
+            if name.startswith("runtime") and ext == ".py":
+                try:
+                    # TODO handle exceptions in runtime.py
+                    # pyfile may redefine _runtime_cleanup
+                    # or even call _PythonThreadProc itself.
+                    execfile(os.path.join(self.workingdir, filename), self.python_threads_vars)
+                except:
+                    PLCprint(traceback.format_exc())
+                runtime_begin = self.python_threads_vars.get("_%s_begin" % name, None)
+                if runtime_begin is not None:
+                    self.python_threads_vars["_runtime_begin"].append(runtime_begin)
+                runtime_cleanup = self.python_threads_vars.get("_%s_cleanup" % name, None)
+                if runtime_cleanup is not None:
+                    self.python_threads_vars["_runtime_cleanup"].append(runtime_cleanup)
+        
+        for runtime_begin in self.python_threads_vars.get("_runtime_begin", []):
             runtime_begin()
 
     def FinishRuntimePy(self):
-        runtime_cleanup = None
-        if self.python_threads_vars is not None:
-            runtime_cleanup = self.python_threads_vars.get("_runtime_cleanup",None)
-        if runtime_cleanup is not None:
-            runtime_cleanup()
-        if self.hmi_frame is not None:
-            self.hmi_frame.Destroy()
+        for runtime_cleanup in self.python_threads_vars.get("_runtime_cleanup", []):
+            runtime_cleanup()    
+#        if self.python_threads_vars is not None:
+#            runtime_cleanup = self.python_threads_vars.get("_runtime_cleanup",None)
+#        if runtime_cleanup is not None:
+#            runtime_cleanup()
+#        if self.hmi_frame is not None:
+#            self.hmi_frame.Destroy()
         self.python_threads_vars = None
 
     def PythonThreadProc(self, debug):