diff -r a7f58414dea0 -r cd90e4c10261 runtime/PLCObject.py --- 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):