RLPark 1.0.0
Reinforcement Learning Framework in Java
|
00001 package rlpark.plugin.irobot.internal.descriptors; 00002 00003 import gnu.io.PortInUseException; 00004 import gnu.io.SerialPortEvent; 00005 import gnu.io.UnsupportedCommOperationException; 00006 00007 import java.io.IOException; 00008 import java.util.ArrayList; 00009 import java.util.List; 00010 import java.util.TooManyListenersException; 00011 00012 import rlpark.plugin.irobot.internal.descriptors.SerialListeners.AlwaysWakeUpThread; 00013 import rlpark.plugin.irobot.internal.descriptors.SerialListeners.WakeUpThread; 00014 import rlpark.plugin.irobot.internal.serial.SerialPortToRobot; 00015 import rlpark.plugin.robot.internal.disco.drops.DropByteArray; 00016 import zephyr.plugin.core.api.signals.Signal; 00017 00018 public class SerialPortToCreate extends SerialPortToRobot { 00019 private List<Byte> buffer = new ArrayList<Byte>(); 00020 public final Signal<SerialPortToRobot> onClosed = new Signal<SerialPortToRobot>(); 00021 00022 public SerialPortToCreate(String fileName, SerialPortInfo portInfo) throws PortInUseException, 00023 UnsupportedCommOperationException, TooManyListenersException, IOException { 00024 super(fileName, portInfo); 00025 } 00026 00027 @Override 00028 synchronized public void serialEvent(SerialPortEvent event) { 00029 if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) 00030 updateAvailable(); 00031 super.serialEvent(event); 00032 } 00033 00034 @Override 00035 public void send(char[] chars) throws IOException { 00036 send(DropByteArray.toBytes(chars)); 00037 } 00038 00039 @Override 00040 public void send(String command) throws IOException { 00041 send(command.getBytes()); 00042 } 00043 00044 synchronized public void sendAndExpect(String command, final String returnExpected) throws IOException { 00045 SerialListeners.ReadWhenArriveAndWakeUp listener = new SerialListeners.ReadWhenArriveAndWakeUp(); 00046 register(SerialPortEvent.DATA_AVAILABLE, listener); 00047 send(command); 00048 waitForSignal(); 00049 unregister(SerialPortEvent.DATA_AVAILABLE, listener); 00050 if (!ExpectedIgnored && !returnExpected.equals(listener.message())) 00051 throw new IOException(String.format("Return incorrect: expected <%s> was <%s>", returnExpected, 00052 listener.message())); 00053 } 00054 00055 private void updateAvailable() { 00056 buffer = new ArrayList<Byte>(); 00057 try { 00058 while (serialStreams.available() > 0) 00059 buffer.add((byte) serialStreams.read()); 00060 } catch (IOException e) { 00061 e.printStackTrace(); 00062 } 00063 } 00064 00065 @Override 00066 public void sendAndWait(char[] chars) throws IOException { 00067 sendAndWait(DropByteArray.toBytes(chars)); 00068 } 00069 00070 @Override 00071 synchronized public void sendAndWait(byte[] chars) throws IOException { 00072 AlwaysWakeUpThread listener = new AlwaysWakeUpThread(); 00073 register(SerialPortEvent.OUTPUT_BUFFER_EMPTY, listener); 00074 send(chars); 00075 waitForSignal(); 00076 unregister(SerialPortEvent.OUTPUT_BUFFER_EMPTY, listener); 00077 } 00078 00079 private void waitForSignal() { 00080 try { 00081 wait(10000); 00082 } catch (InterruptedException e) { 00083 e.printStackTrace(); 00084 } 00085 } 00086 00087 public int sendAndWaitForData(char[] chars, final int dataSizeToWaitFor) throws IOException { 00088 return sendAndWaitForData(DropByteArray.toBytes(chars), dataSizeToWaitFor); 00089 } 00090 00091 synchronized public int sendAndWaitForData(byte[] bytes, final int dataSizeToWaitFor) throws IOException { 00092 WakeUpThread listener = new WakeUpThread(new SerialListeners.SerialInputCondition() { 00093 private int remainingData = dataSizeToWaitFor; 00094 00095 @Override 00096 public boolean isSatisfied(SerialPortToRobot serialPort) { 00097 remainingData -= available(); 00098 return remainingData <= 0; 00099 } 00100 }); 00101 register(SerialPortEvent.DATA_AVAILABLE, listener); 00102 send(bytes); 00103 waitForSignal(); 00104 unregister(SerialPortEvent.DATA_AVAILABLE, listener); 00105 return listener.nbDataAvailable(); 00106 } 00107 00108 public String getAvailableAsString() { 00109 StringBuilder result = new StringBuilder(); 00110 for (Byte b : buffer) 00111 result.append((char) (byte) b); 00112 return result.toString(); 00113 } 00114 00115 public byte[] getAvailable() { 00116 byte[] result = new byte[buffer.size()]; 00117 for (int i = 0; i < result.length; i++) 00118 result[i] = buffer.get(i); 00119 return result; 00120 } 00121 00122 public int available() { 00123 return buffer.size(); 00124 } 00125 00126 @Override 00127 public void close() { 00128 super.close(); 00129 onClosed.fire(this); 00130 } 00131 }