54 def __init__(self, workingdir, daemon, argv, statuschange, evaluator, pyruntimevars): |
54 def __init__(self, workingdir, daemon, argv, statuschange, evaluator, pyruntimevars): |
55 pyro.ObjBase.__init__(self) |
55 pyro.ObjBase.__init__(self) |
56 self.evaluator = evaluator |
56 self.evaluator = evaluator |
57 self.argv = [workingdir] + argv # force argv[0] to be "path" to exec... |
57 self.argv = [workingdir] + argv # force argv[0] to be "path" to exec... |
58 self.workingdir = workingdir |
58 self.workingdir = workingdir |
59 self.PLCStatus = "Stopped" |
59 self.PLCStatus = "Empty" |
60 self.PLClibraryHandle = None |
60 self.PLClibraryHandle = None |
61 self.PLClibraryLock = Lock() |
61 self.PLClibraryLock = Lock() |
62 self.DummyIteratorLock = None |
62 self.DummyIteratorLock = None |
63 # Creates fake C funcs proxies |
63 # Creates fake C funcs proxies |
64 self._FreePLC() |
64 self._FreePLC() |
71 self.TraceThread = None |
71 self.TraceThread = None |
72 self.TraceLock = Lock() |
72 self.TraceLock = Lock() |
73 self.TraceWakeup = Event() |
73 self.TraceWakeup = Event() |
74 self.Traces = [] |
74 self.Traces = [] |
75 |
75 |
|
76 def AutoLoad(self): |
76 # Get the last transfered PLC if connector must be restart |
77 # Get the last transfered PLC if connector must be restart |
77 try: |
78 try: |
78 self.CurrentPLCFilename=open( |
79 self.CurrentPLCFilename=open( |
79 self._GetMD5FileName(), |
80 self._GetMD5FileName(), |
80 "r").read().strip() + lib_ext |
81 "r").read().strip() + lib_ext |
262 def PythonRuntimeInit(self): |
263 def PythonRuntimeInit(self): |
263 MethodNames = ["init", "start", "stop", "cleanup"] |
264 MethodNames = ["init", "start", "stop", "cleanup"] |
264 self.python_runtime_vars = globals().copy() |
265 self.python_runtime_vars = globals().copy() |
265 self.python_runtime_vars.update(self.pyruntimevars) |
266 self.python_runtime_vars.update(self.pyruntimevars) |
266 |
267 |
267 self.python_runtime_vars["WorkingDir"] = self.workingdir |
|
268 for methodname in MethodNames : |
|
269 self.python_runtime_vars["_runtime_%s"%methodname] = [] |
|
270 self.python_runtime_vars["PLCObject"] = self |
|
271 self.python_runtime_vars["PLCBinary"] = self.PLClibraryHandle |
|
272 class PLCSafeGlobals: |
268 class PLCSafeGlobals: |
273 def __getattr__(_self, name): |
269 def __getattr__(_self, name): |
274 try : |
270 try : |
275 t = self.python_runtime_vars["_"+name+"_ctype"] |
271 t = self.python_runtime_vars["_"+name+"_ctype"] |
276 except KeyError: |
272 except KeyError: |
283 t = self.python_runtime_vars["_"+name+"_ctype"] |
279 t = self.python_runtime_vars["_"+name+"_ctype"] |
284 except KeyError: |
280 except KeyError: |
285 raise KeyError("Try to set unknown shared global variable : %s"%name) |
281 raise KeyError("Try to set unknown shared global variable : %s"%name) |
286 v = self.python_runtime_vars["_"+name+"_pack"](t,value) |
282 v = self.python_runtime_vars["_"+name+"_pack"](t,value) |
287 self.python_runtime_vars["_PySafeSetPLCGlob_"+name](ctypes.byref(v)) |
283 self.python_runtime_vars["_PySafeSetPLCGlob_"+name](ctypes.byref(v)) |
288 self.python_runtime_vars["PLCGlobals"] = PLCSafeGlobals() |
284 |
|
285 self.python_runtime_vars.update({ |
|
286 "PLCGlobals" : PLCSafeGlobals(), |
|
287 "WorkingDir" : self.workingdir, |
|
288 "PLCObject" : self, |
|
289 "PLCBinary" : self.PLClibraryHandle, |
|
290 "PLCGlobalsDesc" : []}) |
|
291 |
|
292 for methodname in MethodNames : |
|
293 self.python_runtime_vars["_runtime_%s"%methodname] = [] |
|
294 |
289 try: |
295 try: |
290 for filename in os.listdir(self.workingdir): |
296 filenames = os.listdir(self.workingdir) |
|
297 filenames.sort() |
|
298 for filename in filenames: |
291 name, ext = os.path.splitext(filename) |
299 name, ext = os.path.splitext(filename) |
292 if name.upper().startswith("RUNTIME") and ext.upper() == ".PY": |
300 if name.upper().startswith("RUNTIME") and ext.upper() == ".PY": |
293 execfile(os.path.join(self.workingdir, filename), self.python_runtime_vars) |
301 execfile(os.path.join(self.workingdir, filename), self.python_runtime_vars) |
294 for methodname in MethodNames: |
302 for methodname in MethodNames: |
295 method = self.python_runtime_vars.get("_%s_%s" % (name, methodname), None) |
303 method = self.python_runtime_vars.get("_%s_%s" % (name, methodname), None) |