RLPark 1.0.0
Reinforcement Learning Framework in Java
|
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 }