RLPark 1.0.0
Reinforcement Learning Framework in Java

SerialPortToCreate.java

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