RLPark 1.0.0
Reinforcement Learning Framework in Java

DiscoConnection.java

Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Enumerations
Zephyr
RLPark