# HG changeset patch # User Edouard Tisserant # Date 1709825822 -3600 # Node ID d47fe28d799a4c0684b7f4fb67f34a8df576cc24 # Parent af48442313d5931258314bc56ec56af5765e99e3 eRPC Server: fix exception at disconnect and reconnecting diff -r af48442313d5 -r d47fe28d799a runtime/eRPCServer.py --- a/runtime/eRPCServer.py Thu Feb 29 17:35:03 2024 +0100 +++ b/runtime/eRPCServer.py Thu Mar 07 16:37:02 2024 +0100 @@ -21,8 +21,6 @@ from runtime.ServicePublisher import ServicePublisher -CRITICAL_LOG_LEVEL = LogLevelsDict["CRITICAL"] - def ReturnAsLastOutput(method, args_wrapper, *args): args[-1].value = method(*args_wrapper(*args[:-1])) return 0 @@ -107,40 +105,44 @@ if self._to_be_published(): self.Publish() + # service handler calls PLC object though erpc_stubs's wrappers + handler = type( + "PLCObjectServiceHandlder", + (IBeremizPLCObjectService,), + {name: rpc_wrapper(name) + for name,_func in getmembers(IBeremizPLCObjectService, isfunction)})() + + service = BeremizPLCObjectServiceService(handler) + + # TODO initialize Serial transport layer if selected + # transport = erpc.transport.SerialTransport(device, baudrate) + + # initialize TCP transport layer + self.transport = erpc.transport.TCPTransport(self.ip_addr, int(self.port), True) + + self.server = erpc.simple_server.SimpleServer(self.transport, erpc.basic_codec.BasicCodec) + self.server.add_service(service) + + when_ready() + while self.continueloop: - # service handler calls PLC object though erpc_stubs's wrappers - handler = type( - "PLCObjectServiceHandlder", - (IBeremizPLCObjectService,), - {name: rpc_wrapper(name) - for name,_func in getmembers(IBeremizPLCObjectService, isfunction)})() - - service = BeremizPLCObjectServiceService(handler) + try: + self.server.run() + except erpc.transport.ConnectionClosed: + PLC().LogMessage(LogLevelsDict["DEBUG"], 'eRPC client disconnected') + except Exception as e: + self.Unpublish() + #TODO crash better + raise e - # TODO initialize Serial transport layer if selected - # transport = erpc.transport.SerialTransport(device, baudrate) - - # initialize TCP transport layer - self.transport = erpc.transport.TCPTransport(self.ip_addr, int(self.port), True) - - self.server = erpc.simple_server.SimpleServer(self.transport, erpc.basic_codec.BasicCodec) - self.server.add_service(service) - - when_ready() - - self.server.run() - - self.Unpublish() def Restart(self): self.server.stop() - self.transport.stop() def Quit(self): self.continueloop = False self.server.stop() - self.transport.stop() def Publish(self): self.servicepublisher = ServicePublisher("ERPC")