RLPark 1.0.0
Reinforcement Learning Framework in Java

IRobotDiscoServer.java

Go to the documentation of this file.
00001 package rlpark.plugin.irobot.internal.server;
00002 
00003 import java.io.IOException;
00004 import java.util.Collections;
00005 import java.util.LinkedList;
00006 import java.util.List;
00007 
00008 import rlpark.plugin.irobot.data.IRobotLabels;
00009 import rlpark.plugin.irobot.internal.descriptors.IRobotCreateSerialConnection;
00010 import rlpark.plugin.irobot.internal.descriptors.IRobotSerialDescriptor;
00011 import rlpark.plugin.robot.internal.disco.Server;
00012 import rlpark.plugin.robot.internal.disco.io.DiscoSocket;
00013 import zephyr.plugin.core.api.signals.Listener;
00014 
00015 public class IRobotDiscoServer {
00016   final KeepAliveConnection keepAliveConnection;
00017   private final IRobotCreateSerialConnection serialConnection;
00018   private final int port;
00019   final List<ClientSocket> clients = Collections.synchronizedList(new LinkedList<ClientSocket>());
00020   private final Listener<IRobotCreateSerialConnection> serialClosedListener = new Listener<IRobotCreateSerialConnection>() {
00021     @Override
00022     public void listen(IRobotCreateSerialConnection eventInfo) {
00023       close();
00024     }
00025   };
00026   private Server server;
00027   private final Listener<ClientSocket> clientSocketClosedListener = new Listener<ClientSocket>() {
00028     @Override
00029     public void listen(ClientSocket clientSocket) {
00030       clients.remove(clientSocket);
00031       if (clientSocket.wasSendingAction())
00032         keepAliveConnection.sendNoClientMessage();
00033     }
00034   };
00035 
00036   public IRobotDiscoServer(int port, IRobotCreateSerialConnection serialConnection) {
00037     this.serialConnection = serialConnection;
00038     serialConnection.onClosed.connect(serialClosedListener);
00039     this.port = port;
00040     keepAliveConnection = new KeepAliveConnection(this);
00041   }
00042 
00043   public void start() throws IOException {
00044     server = new Server(port);
00045     while (server != null && !serialConnection.isClosed()) {
00046       DiscoSocket discoSocket = server.accept();
00047       if (discoSocket == null)
00048         continue;
00049       ClientSocket clientSocket = new ClientSocket(serialConnection, discoSocket);
00050       clientSocket.onTerminating.connect(clientSocketClosedListener);
00051       clients.add(clientSocket);
00052       new Thread(clientSocket).start();
00053     }
00054   }
00055 
00056   public boolean initializeSerialLinkCommunication() {
00057     for (int trial = 0; trial < 10; trial++) {
00058       serialConnection.initialize();
00059       if (!serialConnection.isClosed()) {
00060         keepAliveConnection.watchdog().start();
00061         return true;
00062       }
00063       try {
00064         Thread.sleep(4000);
00065       } catch (InterruptedException e) {
00066         e.printStackTrace();
00067       }
00068     }
00069     return false;
00070   }
00071 
00072   public static void runServer(String path, IRobotSerialDescriptor descriptor) {
00073     boolean result = runServer(IRobotLabels.DiscoDefaultPort, path, descriptor);
00074     System.exit(result ? 0 : 1);
00075   }
00076 
00077   public static boolean runServer(int port, String path, IRobotSerialDescriptor descriptor) {
00078     IRobotCreateSerialConnection serialConnection = new IRobotCreateSerialConnection(path, descriptor);
00079     IRobotDiscoServer server = new IRobotDiscoServer(port, serialConnection);
00080     if (server.initializeSerialLinkCommunication())
00081       try {
00082         server.start();
00083         return true;
00084       } catch (IOException e) {
00085         e.printStackTrace();
00086       }
00087     return false;
00088   }
00089 
00090   public IRobotCreateSerialConnection connection() {
00091     return serialConnection;
00092   }
00093 
00094   public int nbClients() {
00095     return clients.size();
00096   }
00097 
00098   public void close() {
00099     try {
00100       server.close();
00101     } catch (IOException e) {
00102       e.printStackTrace();
00103     }
00104     server = null;
00105   }
00106 
00107   public int port() {
00108     return port;
00109   }
00110 }
 All Classes Namespaces Files Functions Variables Enumerations
Zephyr
RLPark