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) |