diff -r edd7a3a06d86 -r 081265cda5b1 Beremiz_service.py --- a/Beremiz_service.py Thu Apr 12 16:38:09 2018 +0200 +++ b/Beremiz_service.py Thu Apr 12 22:20:38 2018 +0200 @@ -35,7 +35,7 @@ import __builtin__ import Pyro.core as pyro -from runtime import PLCObject, ServicePublisher +from runtime import PLCObject, ServicePublisher, MainWorker import util.paths as paths @@ -401,7 +401,7 @@ class Server(object): def __init__(self, servicename, ip_addr, port, - workdir, argv, autostart=False, + workdir, argv, statuschange=None, evaluator=default_evaluator, pyruntimevars=None): self.continueloop = True @@ -413,12 +413,11 @@ self.argv = argv self.plcobj = None self.servicepublisher = None - self.autostart = autostart self.statuschange = statuschange self.evaluator = evaluator self.pyruntimevars = pyruntimevars - def Loop(self): + def PyroLoop(self): while self.continueloop: pyro.initServer() self.daemon = pyro.Daemon(host=self.ip_addr, port=self.port) @@ -426,7 +425,27 @@ # taking too small timeout value may cause # unwanted diconnection when IDE is kept busy for long periods self.daemon.setTimeout(60) - self.Start() + + uri = self.daemon.connect(self.plcobj, "PLCObject") + + print(_("Pyro port :"), self.port) + print(_("Pyro object's uri :"), uri) + + # Beremiz IDE detects daemon start by looking + # for self.workdir in the daemon's stdout. + # Therefore don't delete the following line + print(_("Current working directory :"), self.workdir) + + # Configure and publish service + # Not publish service if localhost in address params + if self.servicename is not None and \ + self.ip_addr is not None and \ + self.ip_addr != "localhost" and \ + self.ip_addr != "127.0.0.1": + print(_("Publishing service on local network")) + self.servicepublisher = ServicePublisher.ServicePublisher() + self.servicepublisher.RegisterService(self.servicename, self.ip_addr, self.port) + self.daemon.requestLoop() self.daemon.sock.close() @@ -440,38 +459,8 @@ self.plcobj.UnLoadPLC() self._stop() - def Start(self): - self.plcobj = PLCObject(self.workdir, self.daemon, self.argv, - self.statuschange, self.evaluator, - self.pyruntimevars) - - uri = self.daemon.connect(self.plcobj, "PLCObject") - - print(_("Pyro port :"), self.port) - print(_("Pyro object's uri :"), uri) - - # Beremiz IDE detects daemon start by looking - # for self.workdir in the daemon's stdout. - # Therefore don't delete the following line - print(_("Current working directory :"), self.workdir) - - # Configure and publish service - # Not publish service if localhost in address params - if self.servicename is not None and \ - self.ip_addr is not None and \ - self.ip_addr != "localhost" and \ - self.ip_addr != "127.0.0.1": - print(_("Publishing service on local network")) - self.servicepublisher = ServicePublisher.ServicePublisher() - self.servicepublisher.RegisterService(self.servicename, self.ip_addr, self.port) - - self.plcobj.AutoLoad() - if self.plcobj.GetPLCstatus()[0] != "Empty": - if self.autostart: - self.plcobj.StartPLC() - self.plcobj.StatusChange() - - sys.stdout.flush() + def RegisterPLCObject(self, plcobj): + self.plcobj = plcobj def _stop(self): if self.plcobj is not None: @@ -529,13 +518,13 @@ return o.res pyroserver = Server(servicename, given_ip, port, - WorkingDir, argv, autostart, + WorkingDir, argv, statuschange, evaluator, pyruntimevars) taskbar_instance = BeremizTaskBarIcon(pyroserver, enablewx) else: pyroserver = Server(servicename, given_ip, port, - WorkingDir, argv, autostart, + WorkingDir, argv, statuschange, pyruntimevars=pyruntimevars) @@ -631,19 +620,36 @@ except Exception: LogMessageAndException(_("WAMP client startup failed. ")) +plcobj = PLCObject(pyroserver) + +plcobj.AutoLoad() +if plcobj.GetPLCstatus()[0] == "Stopped": + if autostart: + plcobj.StartPLC() +plcobj.StatusChange() + +pyro_thread = Thread(target=pyroserver.PyroLoop) +pyro_thread.start() + +sys.stdout.flush() if havetwisted or havewx: - pyro_thread = Thread(target=pyroserver.Loop) - pyro_thread.start() - if havetwisted: - reactor.run() - elif havewx: - app.MainLoop() -else: - try: - pyroserver.Loop() - except KeyboardInterrupt: - pass + # reactor._installSignalHandlersAgain() + def ui_thread_target(): + # FIXME: had to disable SignaHandlers install because + # signal not working in non-main thread + reactor.run(installSignalHandlers=False) + else : + ui_thread_target = app.MainLoop + + ui_thread = Thread(target = ui_thread_target) + ui_thread.start() + +try: + MainWorker.runloop() +except KeyboardInterrupt: + pass + pyroserver.Quit() sys.exit(0)