Beremiz_service.py
changeset 301 87c925eaaa3a
parent 294 39b3d4a2195b
child 303 453487dba0a6
--- a/Beremiz_service.py	Sat Jan 17 02:34:45 2009 +0100
+++ b/Beremiz_service.py	Sat Jan 17 02:36:46 2009 +0100
@@ -38,7 +38,7 @@
 """%sys.argv[0]
 
 try:
-    opts, args = getopt.getopt(sys.argv[1:], "i:p:n:x:h")
+    opts, argv = getopt.getopt(sys.argv[1:], "i:p:n:x:h")
 except getopt.GetoptError, err:
     # print help information and exit:
     print str(err) # will print something like "option -a not recognized"
@@ -73,14 +73,14 @@
         usage()
         sys.exit()
 
-if len(args) > 1:
+if len(argv) > 1:
     usage()
     sys.exit()
-elif len(args) == 1:
-    WorkingDir = args[0]
-elif len(args) == 0:
+elif len(argv) == 1:
+    WorkingDir = argv[0]
+elif len(argv) == 0:
     WorkingDir = os.getcwd()
-    args=[WorkingDir]
+    argv=[WorkingDir]
 
 if enablewx:
     try:
@@ -351,20 +351,20 @@
     os.mkdir(WorkingDir)
 
 class Server():
-    def __init__(self, name, ip, port, workdir, args):
+    def __init__(self, name, ip, port, workdir, argv, statuschange=None, evaluator=eval):
         self.continueloop = True
         self.daemon = None
         self.name = name
         self.ip = ip
         self.port = port
         self.workdir = workdir
-        self.args = args
+        self.argv = argv
         self.plcobj = None
         self.servicepublisher = None
-        self.statuschange = None
-    
-    def Loop(self, statuschange=None):
         self.statuschange = statuschange
+        self.evaluator = evaluator
+    
+    def Loop(self):
         while self.continueloop:
             self.Start()
         
@@ -378,7 +378,7 @@
     def Start(self):
         pyro.initServer()
         self.daemon=pyro.Daemon(host=self.ip, port=self.port)
-        self.plcobj = PLCObject(self.workdir, self.daemon, self.args, self.statuschange)
+        self.plcobj = PLCObject(self.workdir, self.daemon, self.argv, self.statuschange, self.evaluator)
         uri = self.daemon.connect(self.plcobj,"PLCObject")
     
         print "The daemon runs on port :",self.port
@@ -402,15 +402,32 @@
             del self.servicepublisher
         self.daemon.shutdown(True)
         
-pyroserver = Server(name, ip, port, WorkingDir, args)
 
 if havewx:
+    from threading import Semaphore
+    wx_eval_lock = Semaphore(0)
     app=wx.App(redirect=False)
-    taskbar_instance = BeremizTaskBarIcon(pyroserver)
     def statuschange(status):
         wx.CallAfter(taskbar_instance.UpdateIcon,status)
-    pyro_thread=Thread(target=pyroserver.Loop, args=[statuschange])
+        
+    eval_res = None
+    def wx_evaluator(callable, *args, **kwargs):
+        global eval_res
+        eval_res=callable(*args,**kwargs)
+        #print eval_res
+        wx_eval_lock.release()
+        
+    def evaluator(callable, *args, **kwargs):
+        wx.CallAfter(wx_evaluator,callable,*args,**kwargs)
+        wx_eval_lock.acquire()
+        return eval_res
+
+    pyroserver = Server(name, ip, port, WorkingDir, argv, statuschange, evaluator)
+    taskbar_instance = BeremizTaskBarIcon(pyroserver)
+    
+    pyro_thread=Thread(target=pyroserver.Loop)
     pyro_thread.start()
     app.MainLoop()
 else:
+    pyroserver = Server(name, ip, port, WorkingDir, argv)
     pyroserver.Loop()