Beremiz_service.py
changeset 301 87c925eaaa3a
parent 294 39b3d4a2195b
child 303 453487dba0a6
equal deleted inserted replaced
300:7f7912ae5ee8 301:87c925eaaa3a
    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)
    71         enablewx = int(a)
    71         enablewx = int(a)
    72     else:
    72     else:
    73         usage()
    73         usage()
    74         sys.exit()
    74         sys.exit()
    75 
    75 
    76 if len(args) > 1:
    76 if len(argv) > 1:
    77     usage()
    77     usage()
    78     sys.exit()
    78     sys.exit()
    79 elif len(args) == 1:
    79 elif len(argv) == 1:
    80     WorkingDir = args[0]
    80     WorkingDir = argv[0]
    81 elif len(args) == 0:
    81 elif len(argv) == 0:
    82     WorkingDir = os.getcwd()
    82     WorkingDir = os.getcwd()
    83     args=[WorkingDir]
    83     argv=[WorkingDir]
    84 
    84 
    85 if enablewx:
    85 if enablewx:
    86     try:
    86     try:
    87         import wx, re
    87         import wx, re
    88         from threading import Thread
    88         from threading import Thread
   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()