143 self._suspendDebug.restype = ctypes.c_int |
143 self._suspendDebug.restype = ctypes.c_int |
144 self._suspendDebug.argtypes = [ctypes.c_int] |
144 self._suspendDebug.argtypes = [ctypes.c_int] |
145 |
145 |
146 self._resumeDebug = self.PLClibraryHandle.resumeDebug |
146 self._resumeDebug = self.PLClibraryHandle.resumeDebug |
147 self._resumeDebug.restype = None |
147 self._resumeDebug.restype = None |
148 |
148 |
|
149 self._GetLogCount = self.PLClibraryHandle.GetLogCount |
|
150 self._GetLogCount.restype = ctypes.c_uint32 |
|
151 |
149 return True |
152 return True |
150 except: |
153 except: |
151 PLCprint(traceback.format_exc()) |
154 PLCprint(traceback.format_exc()) |
152 return False |
155 return False |
153 |
156 |
166 self._FreeDebugData = lambda:None |
169 self._FreeDebugData = lambda:None |
167 self._GetDebugData = lambda:-1 |
170 self._GetDebugData = lambda:-1 |
168 self._suspendDebug = lambda x:-1 |
171 self._suspendDebug = lambda x:-1 |
169 self._resumeDebug = lambda:None |
172 self._resumeDebug = lambda:None |
170 self._PythonIterator = lambda:"" |
173 self._PythonIterator = lambda:"" |
|
174 self._GetLogCount = lambda:-1 |
171 self.PLClibraryHandle = None |
175 self.PLClibraryHandle = None |
172 # Unload library explicitely |
176 # Unload library explicitely |
173 if getattr(self,"_PLClibraryHandle",None) is not None: |
177 if getattr(self,"_PLClibraryHandle",None) is not None: |
174 dlclose(self._PLClibraryHandle) |
178 dlclose(self._PLClibraryHandle) |
175 self._PLClibraryHandle = None |
179 self._PLClibraryHandle = None |
255 def StartPLC(self): |
259 def StartPLC(self): |
256 PLCprint("StartPLC") |
260 PLCprint("StartPLC") |
257 if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped": |
261 if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped": |
258 c_argv = ctypes.c_char_p * len(self.argv) |
262 c_argv = ctypes.c_char_p * len(self.argv) |
259 error = None |
263 error = None |
260 if self._LoadNewPLC(): |
264 res = self._startPLC(len(self.argv),c_argv(*self.argv)) |
261 if self._startPLC(len(self.argv),c_argv(*self.argv)) == 0: |
265 if res == 0: |
262 self.StartSem=Semaphore(0) |
266 self.StartSem=Semaphore(0) |
263 self.PythonThread = Thread(target=self.PythonThreadProc) |
267 self.PythonThread = Thread(target=self.PythonThreadProc) |
264 self.PythonThread.start() |
268 self.PythonThread.start() |
265 self.StartSem.acquire() |
269 self.StartSem.acquire() |
266 else: |
|
267 error = "starting" |
|
268 else: |
270 else: |
269 error = "loading" |
271 PLCprint(_("Problem starting PLC : error %d" % res)) |
270 if error is not None: |
|
271 PLCprint("Problem %s PLC"%error) |
|
272 self.PLCStatus = "Broken" |
272 self.PLCStatus = "Broken" |
273 self.StatusChange() |
273 self.StatusChange() |
274 self._FreePLC() |
|
275 |
274 |
276 def StopPLC(self): |
275 def StopPLC(self): |
277 PLCprint("StopPLC") |
276 PLCprint("StopPLC") |
278 if self.PLCStatus == "Started": |
277 if self.PLCStatus == "Started": |
279 self._stopPLC() |
278 self._stopPLC() |
280 self.PythonThread.join() |
279 self.PythonThread.join() |
281 self._FreePLC() |
|
282 return True |
280 return True |
283 return False |
281 return False |
284 |
282 |
285 def _Reload(self): |
283 def _Reload(self): |
286 self.daemon.shutdown(True) |
284 self.daemon.shutdown(True) |
293 # respawn python interpreter |
291 # respawn python interpreter |
294 Timer(0.1,self._Reload).start() |
292 Timer(0.1,self._Reload).start() |
295 return True |
293 return True |
296 |
294 |
297 def GetPLCstatus(self): |
295 def GetPLCstatus(self): |
298 return self.PLCStatus |
296 return self.PLCStatus, self._GetLogCount() |
299 |
297 |
300 def NewPLC(self, md5sum, data, extrafiles): |
298 def NewPLC(self, md5sum, data, extrafiles): |
301 PLCprint("NewPLC (%s)"%md5sum) |
299 PLCprint("NewPLC (%s)"%md5sum) |
302 if self.PLCStatus in ["Stopped", "Empty", "Broken"]: |
300 if self.PLCStatus in ["Stopped", "Empty", "Broken"]: |
303 NewFileName = md5sum + lib_ext |
301 NewFileName = md5sum + lib_ext |
304 extra_files_log = os.path.join(self.workingdir,"extra_files.txt") |
302 extra_files_log = os.path.join(self.workingdir,"extra_files.txt") |
|
303 |
|
304 self._FreePLC() |
|
305 self.PLCStatus = "Empty" |
|
306 |
305 try: |
307 try: |
306 os.remove(os.path.join(self.workingdir, |
308 os.remove(os.path.join(self.workingdir, |
307 self.CurrentPLCFilename)) |
309 self.CurrentPLCFilename)) |
308 for filename in file(extra_files_log, "r").readlines() + [extra_files_log]: |
310 for filename in file(extra_files_log, "r").readlines() + [extra_files_log]: |
309 try: |
311 try: |
329 log.write(fname+'\n') |
331 log.write(fname+'\n') |
330 |
332 |
331 # Store new PLC filename |
333 # Store new PLC filename |
332 self.CurrentPLCFilename = NewFileName |
334 self.CurrentPLCFilename = NewFileName |
333 except: |
335 except: |
|
336 self.PLCStatus = "Broken" |
|
337 self.StatusChange() |
334 PLCprint(traceback.format_exc()) |
338 PLCprint(traceback.format_exc()) |
335 return False |
339 return False |
336 if self.PLCStatus == "Empty": |
340 |
|
341 if self._LoadNewPLC(): |
337 self.PLCStatus = "Stopped" |
342 self.PLCStatus = "Stopped" |
338 return True |
343 else: |
|
344 self._FreePLC() |
|
345 self.StatusChange() |
|
346 |
|
347 return self.PLCStatus == "Stopped" |
339 return False |
348 return False |
340 |
349 |
341 def MatchMD5(self, MD5): |
350 def MatchMD5(self, MD5): |
342 try: |
351 try: |
343 last_md5 = open(self._GetMD5FileName(), "r").read() |
352 last_md5 = open(self._GetMD5FileName(), "r").read() |
403 #PLCprint("Debug error - buffer too small ! %d != %d"%(offset, size.value)) |
412 #PLCprint("Debug error - buffer too small ! %d != %d"%(offset, size.value)) |
404 break |
413 break |
405 self._FreeDebugData() |
414 self._FreeDebugData() |
406 self.PLClibraryLock.release() |
415 self.PLClibraryLock.release() |
407 if offset and offset == size.value: |
416 if offset and offset == size.value: |
408 return self.PLCStatus, tick.value, res |
417 return self.PLCStatus, self._GetLogCount(), tick.value, res |
409 #elif size.value: |
418 #elif size.value: |
410 #PLCprint("Debug error - wrong buffer unpack ! %d != %d"%(offset, size.value)) |
419 #PLCprint("Debug error - wrong buffer unpack ! %d != %d"%(offset, size.value)) |
411 return self.PLCStatus, None, [] |
420 return self.PLCStatus, self._GetLogCount(), None, [] |
412 |
421 |
413 def RemoteExec(self, script, **kwargs): |
422 def RemoteExec(self, script, **kwargs): |
414 try: |
423 try: |
415 exec script in kwargs |
424 exec script in kwargs |
416 except: |
425 except: |