36 |
36 |
37 working_dir - directory where are stored PLC files |
37 working_dir - directory where are stored PLC files |
38 """%sys.argv[0] |
38 """%sys.argv[0] |
39 |
39 |
40 try: |
40 try: |
41 opts, args = getopt.getopt(sys.argv[1:], "i:p:n:x:h") |
41 opts, argv = getopt.getopt(sys.argv[1:], "i:p:n:x:h") |
42 except getopt.GetoptError, err: |
42 except getopt.GetoptError, err: |
43 # print help information and exit: |
43 # print help information and exit: |
44 print str(err) # will print something like "option -a not recognized" |
44 print str(err) # will print something like "option -a not recognized" |
45 usage() |
45 usage() |
46 sys.exit(2) |
46 sys.exit(2) |
349 |
349 |
350 if not os.path.isdir(WorkingDir): |
350 if not os.path.isdir(WorkingDir): |
351 os.mkdir(WorkingDir) |
351 os.mkdir(WorkingDir) |
352 |
352 |
353 class Server(): |
353 class Server(): |
354 def __init__(self, name, ip, port, workdir, args): |
354 def __init__(self, name, ip, port, workdir, argv, statuschange=None, evaluator=eval): |
355 self.continueloop = True |
355 self.continueloop = True |
356 self.daemon = None |
356 self.daemon = None |
357 self.name = name |
357 self.name = name |
358 self.ip = ip |
358 self.ip = ip |
359 self.port = port |
359 self.port = port |
360 self.workdir = workdir |
360 self.workdir = workdir |
361 self.args = args |
361 self.argv = argv |
362 self.plcobj = None |
362 self.plcobj = None |
363 self.servicepublisher = None |
363 self.servicepublisher = None |
364 self.statuschange = None |
|
365 |
|
366 def Loop(self, statuschange=None): |
|
367 self.statuschange = statuschange |
364 self.statuschange = statuschange |
|
365 self.evaluator = evaluator |
|
366 |
|
367 def Loop(self): |
368 while self.continueloop: |
368 while self.continueloop: |
369 self.Start() |
369 self.Start() |
370 |
370 |
371 def Restart(self): |
371 def Restart(self): |
372 self.Stop() |
372 self.Stop() |
376 self.Stop() |
376 self.Stop() |
377 |
377 |
378 def Start(self): |
378 def Start(self): |
379 pyro.initServer() |
379 pyro.initServer() |
380 self.daemon=pyro.Daemon(host=self.ip, port=self.port) |
380 self.daemon=pyro.Daemon(host=self.ip, port=self.port) |
381 self.plcobj = PLCObject(self.workdir, self.daemon, self.args, self.statuschange) |
381 self.plcobj = PLCObject(self.workdir, self.daemon, self.argv, self.statuschange, self.evaluator) |
382 uri = self.daemon.connect(self.plcobj,"PLCObject") |
382 uri = self.daemon.connect(self.plcobj,"PLCObject") |
383 |
383 |
384 print "The daemon runs on port :",self.port |
384 print "The daemon runs on port :",self.port |
385 print "The object's uri is :",uri |
385 print "The object's uri is :",uri |
386 print "The working directory :",self.workdir |
386 print "The working directory :",self.workdir |
400 if self.servicepublisher is not None: |
400 if self.servicepublisher is not None: |
401 self.servicepublisher.UnRegisterService() |
401 self.servicepublisher.UnRegisterService() |
402 del self.servicepublisher |
402 del self.servicepublisher |
403 self.daemon.shutdown(True) |
403 self.daemon.shutdown(True) |
404 |
404 |
405 pyroserver = Server(name, ip, port, WorkingDir, args) |
|
406 |
405 |
407 if havewx: |
406 if havewx: |
|
407 from threading import Semaphore |
|
408 wx_eval_lock = Semaphore(0) |
408 app=wx.App(redirect=False) |
409 app=wx.App(redirect=False) |
409 taskbar_instance = BeremizTaskBarIcon(pyroserver) |
|
410 def statuschange(status): |
410 def statuschange(status): |
411 wx.CallAfter(taskbar_instance.UpdateIcon,status) |
411 wx.CallAfter(taskbar_instance.UpdateIcon,status) |
412 pyro_thread=Thread(target=pyroserver.Loop, args=[statuschange]) |
412 |
|
413 eval_res = None |
|
414 def wx_evaluator(callable, *args, **kwargs): |
|
415 global eval_res |
|
416 eval_res=callable(*args,**kwargs) |
|
417 #print eval_res |
|
418 wx_eval_lock.release() |
|
419 |
|
420 def evaluator(callable, *args, **kwargs): |
|
421 wx.CallAfter(wx_evaluator,callable,*args,**kwargs) |
|
422 wx_eval_lock.acquire() |
|
423 return eval_res |
|
424 |
|
425 pyroserver = Server(name, ip, port, WorkingDir, argv, statuschange, evaluator) |
|
426 taskbar_instance = BeremizTaskBarIcon(pyroserver) |
|
427 |
|
428 pyro_thread=Thread(target=pyroserver.Loop) |
413 pyro_thread.start() |
429 pyro_thread.start() |
414 app.MainLoop() |
430 app.MainLoop() |
415 else: |
431 else: |
|
432 pyroserver = Server(name, ip, port, WorkingDir, argv) |
416 pyroserver.Loop() |
433 pyroserver.Loop() |