1 package eu.javaexperience.electronic.uartbus.rpc.client;
3 import java.io.Closeable;
4 import java.io.IOException;
5 import java.util.Arrays;
6 import java.util.LinkedList;
7 import java.util.concurrent.TimeUnit;
32 protected static final Logger LOG = JavaExperienceLoggingFacility.getLogger(
new Loggable(
"UartBus"));
37 protected Closeable connResource;
38 protected int fromAddress;
40 protected SimplePublish1<byte[]> sendPacket;
42 protected final EventMediator<ParsedUartBusPacket> onNewValidPackageReceived =
new EventMediator<>();
44 protected final LinkedList<UartbusTransaction> pendingRequests =
new LinkedList<>();
46 protected final EventMediator<byte[]> invalidPackets =
new EventMediator<>();
48 protected final EventMediator<byte[]> unrelatedPackets =
new EventMediator<>();
52 @MayNull Closeable resource,
53 SimplePublish1<byte[]> sendPacket,
57 this.connResource = resource;
58 this.sendPacket = sendPacket;
59 this.fromAddress = fromAddress;
61 onNewValidPackageReceived.addEventListener
65 synchronized(pendingRequests)
69 if(pr.tryAcceptResponse(a))
71 pendingRequests.remove(pr);
77 unrelatedPackets.dispatchEvent(a.rawPacket);
82 public EventMediator<byte[]> getInvalidPacketListener()
84 return invalidPackets;
87 public EventMediator<byte[]> getUnrelatedPacketListener()
89 return unrelatedPackets;
92 public void processPacket(byte[] packet)
111 LoggingTools.tryLogFormatException(LOG, LogLevel.NOTICE, e,
"Exception while parsing packet ");
116 onNewValidPackageReceived.dispatchEvent(p);
121 invalidPackets.dispatchEvent(packet);
127 synchronized(pendingRequests)
129 if(pendingRequests.contains(req))
131 throw new IllegalOperationException(
"Transaction already added to pending requests.");
133 pendingRequests.add(req);
139 synchronized(pendingRequests)
141 return pendingRequests.remove(req);
150 boolean zeroNamespaceAnswer
155 req.from = fromAddress;
158 req.payload = payloadData;
159 req.zeroNamespaceAnswer = zeroNamespaceAnswer;
164 public UartbusTransaction subscribeResponse(
int from,
int to, byte[] path,
boolean zeroNamespace)
170 ret.zeroNamespaceAnswer = zeroNamespace;
171 addPendingRequest(ret);
175 public static UartBus fromTcp(String ip,
int port,
int fromAddress)
throws IOException
179 conn.getPacketStreamer().addEventListener(ret::processPacket);
180 conn.startStreaming();
185 public void close()
throws IOException
187 IOTools.silentClose(connResource);
190 public int getFromAddress()
200 public void sendRawPacket(byte[] data)
202 sendPacket.publish(data);
207 return fromConnection
212 IOTools.silentClose(srv);
215 IOTools.silentClose(srv);
222 public static UartBus fromConnection(SimpleGet<UartbusConnection> gSrv, Closeable onClose,
int busFromAddress)
232 stream.getPacketStreamer().addEventListener(bus::processPacket);
233 stream.startStreaming();