runtime/eRPCServer.py
changeset 3905 d47fe28d799a
parent 3898 de4f17d737a9
equal deleted inserted replaced
3904:af48442313d5 3905:d47fe28d799a
    18 
    18 
    19 from runtime import GetPLCObjectSingleton as PLC
    19 from runtime import GetPLCObjectSingleton as PLC
    20 from runtime.loglevels import LogLevelsDict
    20 from runtime.loglevels import LogLevelsDict
    21 from runtime.ServicePublisher import ServicePublisher
    21 from runtime.ServicePublisher import ServicePublisher
    22 
    22 
    23 
       
    24 CRITICAL_LOG_LEVEL = LogLevelsDict["CRITICAL"]
       
    25 
    23 
    26 def ReturnAsLastOutput(method, args_wrapper, *args):
    24 def ReturnAsLastOutput(method, args_wrapper, *args):
    27     args[-1].value = method(*args_wrapper(*args[:-1]))
    25     args[-1].value = method(*args_wrapper(*args[:-1]))
    28     return 0
    26     return 0
    29 
    27 
   105 
   103 
   106     def Loop(self, when_ready):
   104     def Loop(self, when_ready):
   107         if self._to_be_published():
   105         if self._to_be_published():
   108             self.Publish()
   106             self.Publish()
   109 
   107 
       
   108         # service handler calls PLC object though erpc_stubs's wrappers
       
   109         handler = type(
       
   110             "PLCObjectServiceHandlder", 
       
   111             (IBeremizPLCObjectService,),
       
   112             {name: rpc_wrapper(name)              
       
   113                     for name,_func in getmembers(IBeremizPLCObjectService, isfunction)})()
       
   114         
       
   115         service = BeremizPLCObjectServiceService(handler)
       
   116 
       
   117         # TODO initialize Serial transport layer if selected
       
   118         # transport = erpc.transport.SerialTransport(device, baudrate)
       
   119 
       
   120         # initialize TCP transport layer
       
   121         self.transport = erpc.transport.TCPTransport(self.ip_addr, int(self.port), True)
       
   122 
       
   123         self.server = erpc.simple_server.SimpleServer(self.transport, erpc.basic_codec.BasicCodec)
       
   124         self.server.add_service(service)
       
   125 
       
   126         when_ready()
       
   127 
   110         while self.continueloop:
   128         while self.continueloop:
   111 
   129 
   112             # service handler calls PLC object though erpc_stubs's wrappers
   130             try:
   113             handler = type(
   131                 self.server.run()
   114                 "PLCObjectServiceHandlder", 
   132             except erpc.transport.ConnectionClosed:
   115                 (IBeremizPLCObjectService,),
   133                 PLC().LogMessage(LogLevelsDict["DEBUG"], 'eRPC client disconnected')
   116                 {name: rpc_wrapper(name)              
   134             except Exception as e:
   117                         for name,_func in getmembers(IBeremizPLCObjectService, isfunction)})()
   135                 self.Unpublish()
   118             
   136                 #TODO crash better
   119             service = BeremizPLCObjectServiceService(handler)
   137                 raise e
   120 
   138 
   121             # TODO initialize Serial transport layer if selected
       
   122             # transport = erpc.transport.SerialTransport(device, baudrate)
       
   123 
       
   124             # initialize TCP transport layer
       
   125             self.transport = erpc.transport.TCPTransport(self.ip_addr, int(self.port), True)
       
   126 
       
   127             self.server = erpc.simple_server.SimpleServer(self.transport, erpc.basic_codec.BasicCodec)
       
   128             self.server.add_service(service)
       
   129 
       
   130             when_ready()
       
   131 
       
   132             self.server.run()
       
   133 
       
   134         self.Unpublish()
       
   135 
   139 
   136     def Restart(self):
   140     def Restart(self):
   137         self.server.stop()
   141         self.server.stop()
   138         self.transport.stop()
       
   139 
   142 
   140     def Quit(self):
   143     def Quit(self):
   141         self.continueloop = False
   144         self.continueloop = False
   142         self.server.stop()
   145         self.server.stop()
   143         self.transport.stop()
       
   144 
   146 
   145     def Publish(self):
   147     def Publish(self):
   146         self.servicepublisher = ServicePublisher("ERPC")
   148         self.servicepublisher = ServicePublisher("ERPC")
   147         self.servicepublisher.RegisterService(self.servicename,
   149         self.servicepublisher.RegisterService(self.servicename,
   148                                               self.ip_addr, self.port)
   150                                               self.ip_addr, self.port)