--- 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):