RLPark 1.0.0
Reinforcement Learning Framework in Java
|
00001 package rlpark.plugin.robot.internal.disco; 00002 00003 import java.io.IOException; 00004 import java.net.UnknownHostException; 00005 import java.nio.ByteOrder; 00006 import java.util.ArrayList; 00007 import java.util.List; 00008 00009 import rlpark.plugin.rltoys.envio.observations.Legend; 00010 import rlpark.plugin.robot.internal.disco.datagroup.DropScalarGroup; 00011 import rlpark.plugin.robot.internal.disco.drops.Drop; 00012 import rlpark.plugin.robot.internal.disco.io.DiscoPacket; 00013 import rlpark.plugin.robot.internal.disco.io.DiscoSocket; 00014 import rlpark.plugin.robot.internal.sync.Syncs; 00015 import rlpark.plugin.robot.observations.ObservationReceiver; 00016 import rlpark.plugin.robot.observations.ObservationVersatile; 00017 import zephyr.plugin.core.api.signals.Listener; 00018 00019 00020 public class DiscoConnection implements ObservationReceiver { 00021 protected final Drop sensorDrop; 00022 protected final DropScalarGroup sensorGroup; 00023 protected final String hostname; 00024 protected final int port; 00025 protected DiscoSocket socket; 00026 private final ByteOrder byteOrdering; 00027 private final List<Listener<DiscoPacket>> packetListeners = new ArrayList<Listener<DiscoPacket>>(); 00028 00029 public DiscoConnection(String hostname, int port, Drop sensorDrop) { 00030 this(hostname, port, sensorDrop, ByteOrder.BIG_ENDIAN); 00031 } 00032 00033 public DiscoConnection(String hostname, int port, Drop sensorDrop, ByteOrder order) { 00034 this.hostname = hostname; 00035 this.port = port; 00036 this.sensorDrop = sensorDrop; 00037 sensorGroup = new DropScalarGroup(sensorDrop); 00038 byteOrdering = order; 00039 } 00040 00041 @Override 00042 public void initialize() { 00043 try { 00044 socket = new DiscoSocket(hostname, port, byteOrdering); 00045 for (Listener<DiscoPacket> listener : packetListeners) 00046 socket.onPacket.connect(listener); 00047 } catch (UnknownHostException e) { 00048 e.printStackTrace(); 00049 } catch (IOException e) { 00050 e.printStackTrace(); 00051 } 00052 } 00053 00054 public void addPacketListener(Listener<DiscoPacket> listener) { 00055 packetListeners.add(listener); 00056 if (socket != null) 00057 socket.onPacket.connect(listener); 00058 } 00059 00060 @Override 00061 synchronized public ObservationVersatile waitForData() { 00062 if (isClosed()) 00063 return null; 00064 DiscoPacket packet = null; 00065 try { 00066 packet = socket.recv(); 00067 } catch (Throwable e) { 00068 e.printStackTrace(); 00069 close(); 00070 } 00071 return packet != null ? Syncs.createObservation(System.currentTimeMillis(), packet.byteBuffer(), sensorGroup) 00072 : null; 00073 } 00074 00075 @Override 00076 public boolean isClosed() { 00077 return socket == null || socket.isSocketClosed(); 00078 } 00079 00080 public DiscoSocket socket() { 00081 return socket; 00082 } 00083 00084 @Override 00085 synchronized public void close() { 00086 socket.close(); 00087 notifyAll(); 00088 } 00089 00090 public Legend legend() { 00091 return sensorGroup.legend(); 00092 } 00093 00094 public Drop sensorDrop() { 00095 return sensorDrop; 00096 } 00097 00098 @Override 00099 public int packetSize() { 00100 return sensorDrop.dataSize(); 00101 } 00102 }