This is an automated email from the git hooks/post-receive script. New commit to branch feature/7459 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 5c79f17385017c8b0614fdd48ef3059d7f6ff4da Author: Kevin Morin <morin@codelutin.com> Date: Wed Apr 20 15:21:16 2016 +0200 implem de la réception des données du pied a coulisse (refs #7459) --- tutti-caliper/pom.xml | 7 + .../fr/ifremer/tutti/caliper/feed/Caliper.java | 135 +++++++++++++++ .../caliper/feed/CaliperConnectionException.java | 12 ++ .../tutti/caliper/feed/CaliperFeedReader.java | 192 +++++++++------------ .../record/CaliperFeedReaderMeasureRecord.java | 14 +- .../record/CaliperFeedReaderRecordFactory.java | 20 +-- .../record/CaliperFeedReaderRecordSupport.java | 1 + .../CaliperFeedReaderStylusMotionRecord.java | 79 --------- 8 files changed, 241 insertions(+), 219 deletions(-) diff --git a/tutti-caliper/pom.xml b/tutti-caliper/pom.xml index 23755dd..8c4fced 100644 --- a/tutti-caliper/pom.xml +++ b/tutti-caliper/pom.xml @@ -75,6 +75,13 @@ <scope>test</scope> </dependency> + <dependency> + <groupId>com.neuronrobotics</groupId> + <artifactId>nrjavaserial</artifactId> + <version>3.7.5.1</version> + </dependency> + + </dependencies> <profiles> diff --git a/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/Caliper.java b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/Caliper.java new file mode 100644 index 0000000..b63acb5 --- /dev/null +++ b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/Caliper.java @@ -0,0 +1,135 @@ +package fr.ifremer.tutti.caliper.feed; + +import gnu.io.CommPort; +import gnu.io.CommPortIdentifier; +import gnu.io.SerialPort; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class Caliper { + public Caliper() + { + super(); + } + + void connect ( String portName ) throws Exception + { + CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); + if ( portIdentifier.isCurrentlyOwned() ) + { + System.out.println("Error: Port is currently in use"); + } + else + { + CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000); + + if ( commPort instanceof SerialPort ) + { + SerialPort serialPort = (SerialPort) commPort; + serialPort.setSerialPortParams(4800,SerialPort.DATABITS_7,SerialPort.STOPBITS_1,SerialPort.PARITY_EVEN); + + InputStream in = serialPort.getInputStream(); + OutputStream out = serialPort.getOutputStream(); + + (new Thread(new SerialWriter(out))).start(); + + serialPort.addEventListener(new SerialReader(in)); + serialPort.notifyOnDataAvailable(true); + + } + else + { + System.out.println("Error: Only serial ports are handled by this example."); + } + } + } + + /** + * Handles the input coming from the serial port. A new line character + * is treated as the end of a block in this example. + */ + public static class SerialReader implements SerialPortEventListener + { + private InputStream in; + private byte[] buffer = new byte[1024]; + + public SerialReader ( InputStream in ) + { + this.in = in; + } + + public void serialEvent(SerialPortEvent arg0) { + int data; + + try + { + int len = 0; + while ( ( data = in.read()) > -1 ) + { + if ( data == '\n' ) { + break; + } + buffer[len++] = (byte) data; + } + System.out.print(new String(buffer,0,len)); + } + catch ( IOException e ) + { + e.printStackTrace(); + System.exit(-1); + } + } + + } + + /** */ + public static class SerialWriter implements Runnable + { + OutputStream out; + + public SerialWriter ( OutputStream out ) + { + this.out = out; + } + + public void run () + { + try + { + int c = 0; + while ( ( c = System.in.read()) > -1 ) + { + this.out.write(c); + } + } + catch ( IOException e ) + { + e.printStackTrace(); + System.exit(-1); + } + } + } + + + + public static void main ( String[] args ) + { + try + { + (new Caliper()).connect("COM1"); + } + catch ( Exception e ) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} diff --git a/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/CaliperConnectionException.java b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/CaliperConnectionException.java new file mode 100644 index 0000000..fb9a0f6 --- /dev/null +++ b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/CaliperConnectionException.java @@ -0,0 +1,12 @@ +package fr.ifremer.tutti.caliper.feed; + +/** + * @author Kevin Morin (Code Lutin) + * @since 4.5 + */ +public class CaliperConnectionException extends Exception { + + public CaliperConnectionException(Throwable cause) { + super(cause); + } +} diff --git a/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/CaliperFeedReader.java b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/CaliperFeedReader.java index e50d9c7..f2febd9 100644 --- a/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/CaliperFeedReader.java +++ b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/CaliperFeedReader.java @@ -22,18 +22,28 @@ package fr.ifremer.tutti.caliper.feed; * #L% */ +import com.google.common.base.Preconditions; import fr.ifremer.tutti.caliper.feed.event.CaliperFeedReaderEvent; import fr.ifremer.tutti.caliper.feed.event.CaliperFeedReaderListener; import fr.ifremer.tutti.caliper.feed.record.CaliperFeedReaderMeasureRecord; import fr.ifremer.tutti.caliper.feed.record.CaliperFeedReaderRecordFactory; import fr.ifremer.tutti.caliper.feed.record.CaliperFeedReaderRecordSupport; +import gnu.io.CommPortIdentifier; +import gnu.io.NoSuchPortException; +import gnu.io.PortInUseException; +import gnu.io.SerialPort; +import gnu.io.SerialPortEvent; +import gnu.io.SerialPortEventListener; +import gnu.io.UnsupportedCommOperationException; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.swing.event.EventListenerList; import java.io.Closeable; -import java.io.DataInputStream; import java.io.IOException; +import java.io.InputStream; +import java.util.TooManyListenersException; /** * To read some records from a caliper in feed mode. @@ -47,14 +57,9 @@ public class CaliperFeedReader implements Closeable { private static final Log log = LogFactory.getLog(CaliperFeedReader.class); /** - * Ichtyometer client given in the {@code start} method. + * Serial port open in the {@code start} method. */ -// protected CaliperClient client; - - /** - * Reader runnable code (to be used in a thread). - */ - protected ReadingRunnable readingRunnable; + protected SerialPort serialPort; /** * To keep list of {@link CaliperFeedReaderListener} listeners. @@ -73,48 +78,44 @@ public class CaliperFeedReader implements Closeable { recordFactory = new CaliperFeedReaderRecordFactory(); } -// public void start(CaliperClient client) throws IOException { -// -// Preconditions.checkNotNull(client, "client can not be null"); -// Preconditions.checkState(client.isOpen(), "client must be opened"); -// this.client = client; -// -// // get connection -// StreamConnection connection = client.openConnection(); -// -// // get input stream -// DataInputStream dataInputStream = connection.openDataInputStream(); -// -// // create the reader runnable -// readingRunnable = new ReadingRunnable(dataInputStream); -// -// // start the reader thread -// new Thread(readingRunnable).start(); -// -// if (log.isDebugEnabled()) { -// log.debug("Ready to read remote device..."); -// } -// } + public void start(String portName) throws CaliperConnectionException { + + Preconditions.checkArgument(StringUtils.isNotEmpty(portName), "serial port can not be null or empty"); + + try { + CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); + + serialPort = portIdentifier.open(this.getClass().getName(), 2000); + serialPort.setSerialPortParams(4800, SerialPort.DATABITS_7, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN); + + InputStream inputStream = serialPort.getInputStream(); + + serialPort.addEventListener(new SerialReader(inputStream)); + serialPort.notifyOnDataAvailable(true); + + if (log.isDebugEnabled()) { + log.debug("Ready to read remote device..."); + } + + } catch (IOException | TooManyListenersException | PortInUseException | NoSuchPortException | UnsupportedCommOperationException e) { + if (log.isErrorEnabled()) { + log.error("Error while connecting to the serial port " + portName, e); + } + throw new CaliperConnectionException(e); + } + } @Override public void close() throws IOException { -// Preconditions.checkNotNull(client, "client can not be null"); -// Preconditions.checkState(client.isOpen(), "client must be opened"); - try { - readingRunnable.stop(); + serialPort.close(); } finally { - -// Closeables.close(client, true); + // do nothing if the close fails } } -// public String getClientName() { -// return client.getName(); -// } - public void addFeedModeReaderListener(CaliperFeedReaderListener listener) { listenerList.add(CaliperFeedReaderListener.class, listener); } @@ -129,104 +130,69 @@ public class CaliperFeedReader implements Closeable { } } - protected class ReadingRunnable implements Runnable { - /** - * Input stream to read new record. - */ - protected final DataInputStream dataInputStream; - - /** - * Flag to stop the runnable. - */ - protected boolean stop; + /** + * Handles the input coming from the serial port. A new line character + * is treated as the end of a block in this example. + */ + public class SerialReader implements SerialPortEventListener { - protected ReadingRunnable(DataInputStream dataInputStream) { - this.dataInputStream = dataInputStream; - } + private InputStream in; + private byte[] buffer = new byte[1024]; - protected void stop() { - this.stop = true; + public SerialReader(InputStream in) + { + this.in = in; } - @Override - public void run() { - - if (log.isInfoEnabled()) { - log.info("Reader thread start... " + this); - } - - while (!stop) { + public void serialEvent(SerialPortEvent arg0) { - try { - // get a new record - CaliperFeedReaderRecordSupport readerRecord = readRecord(dataInputStream); + try { + CaliperFeedReaderRecordSupport readerRecord = readRecord(); - if (!stop && readerRecord != null && readerRecord instanceof CaliperFeedReaderMeasureRecord) { + if (readerRecord != null && readerRecord instanceof CaliperFeedReaderMeasureRecord) { - // send new record to listeners - CaliperFeedReaderEvent e = new CaliperFeedReaderEvent(CaliperFeedReader.this, (CaliperFeedReaderMeasureRecord) readerRecord); - for (CaliperFeedReaderListener listener : listenerList.getListeners(CaliperFeedReaderListener.class)) { - listener.recordRead(e); - } - - } - } catch (IOException e) { - if (log.isErrorEnabled()) { - log.error("Could not read record", e); + // send new record to listeners + CaliperFeedReaderEvent e = new CaliperFeedReaderEvent(CaliperFeedReader.this, (CaliperFeedReaderMeasureRecord) readerRecord); + for (CaliperFeedReaderListener listener : listenerList.getListeners(CaliperFeedReaderListener.class)) { + listener.recordRead(e); } + } - } - if (log.isInfoEnabled()) { - log.info("Reader thread stop..." + this); + } catch (IOException e) { + if (log.isErrorEnabled()) { + log.error("Could not read record", e); + } } } - protected CaliperFeedReaderRecordSupport readRecord(DataInputStream dataInputStream) throws IOException { - - String result = ""; - - // wait until got a # + private CaliperFeedReaderRecordSupport readRecord() throws IOException { - boolean complete = false; + int len = 0; + int data; - while (!complete) { - - if (stop) { + while (( data = in.read()) > -1) { + if (data == '\n') { break; } - while (dataInputStream.available() > 0) { - if (complete || stop) { - break; - } - int c = dataInputStream.read(); - - result += (char) c; - - if ('#' == (char) c) { - - complete = true; - } - } + buffer[len++] = (byte) data; } - CaliperFeedReaderRecordSupport readerRecord = null; - - if (!stop) { - - if (log.isInfoEnabled()) { - log.info("New raw record: " + result); - } - readerRecord = recordFactory.newRecord(result); + String result = new String(buffer,0,len); - if (log.isDebugEnabled()) { - log.debug("New feed record: " + readerRecord); - } + if (log.isInfoEnabled()) { + log.info("New raw record: " + result); + } + CaliperFeedReaderRecordSupport readerRecord = recordFactory.newRecord(result); + if (log.isDebugEnabled()) { + log.debug("New feed record: " + readerRecord); } return readerRecord; } + } + } diff --git a/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderMeasureRecord.java b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderMeasureRecord.java index fc0ed28..5fbb8dd 100644 --- a/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderMeasureRecord.java +++ b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderMeasureRecord.java @@ -25,9 +25,7 @@ package fr.ifremer.tutti.caliper.feed.record; */ import org.apache.commons.lang3.builder.ToStringBuilder; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import org.apache.commons.lang3.math.NumberUtils; /** * A measure record. @@ -41,12 +39,9 @@ public class CaliperFeedReaderMeasureRecord extends CaliperFeedReaderRecordSuppo private static final long serialVersionUID = 1L; - protected static final Pattern RECORD_PATTERN = Pattern.compile("%l\\,(\\w+)?#"); - public static boolean acceptRecord(String record) { - Matcher matcher = RECORD_PATTERN.matcher(record); - return matcher.matches(); + return NumberUtils.isNumber(record); } @@ -54,10 +49,7 @@ public class CaliperFeedReaderMeasureRecord extends CaliperFeedReaderRecordSuppo CaliperFeedReaderMeasureRecord(String record) { super(record); - Matcher matcher = RECORD_PATTERN.matcher(record); - matcher.find(); - String measureStr = matcher.group(1); - measure = Integer.valueOf(measureStr); + measure = Integer.valueOf(record); } public int getMeasure() { diff --git a/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderRecordFactory.java b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderRecordFactory.java index 14d361f..a6fea28 100644 --- a/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderRecordFactory.java +++ b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderRecordFactory.java @@ -33,22 +33,11 @@ import java.util.Set; */ public class CaliperFeedReaderRecordFactory { - protected final Set<FeedReaderRecordAceptor> acceptors; + protected final Set<CaliperFeedReaderRecordAceptor> acceptors; public CaliperFeedReaderRecordFactory() { acceptors = new LinkedHashSet<>(); - acceptors.add(new FeedReaderRecordAceptor<CaliperFeedReaderStylusMotionRecord>() { - @Override - public boolean accept(String record) { - return CaliperFeedReaderStylusMotionRecord.acceptRecord(record); - } - - @Override - public CaliperFeedReaderStylusMotionRecord newRecord(String record) { - return new CaliperFeedReaderStylusMotionRecord(record); - } - }); - acceptors.add(new FeedReaderRecordAceptor<CaliperFeedReaderMeasureRecord>() { + acceptors.add(new CaliperFeedReaderRecordAceptor<CaliperFeedReaderMeasureRecord>() { @Override public boolean accept(String record) { return CaliperFeedReaderMeasureRecord.acceptRecord(record); @@ -66,7 +55,7 @@ public class CaliperFeedReaderRecordFactory { CaliperFeedReaderRecordSupport feedRecord = null; - for (FeedReaderRecordAceptor acceptor : acceptors) { + for (CaliperFeedReaderRecordAceptor acceptor : acceptors) { boolean accept = acceptor.accept(record); if (accept) { @@ -82,11 +71,10 @@ public class CaliperFeedReaderRecordFactory { } - protected static interface FeedReaderRecordAceptor<F extends CaliperFeedReaderRecordSupport> { + protected static interface CaliperFeedReaderRecordAceptor<F extends CaliperFeedReaderRecordSupport> { boolean accept(String record); - F newRecord(String record); } diff --git a/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderRecordSupport.java b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderRecordSupport.java index da21f1e..01ffbd9 100644 --- a/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderRecordSupport.java +++ b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderRecordSupport.java @@ -30,6 +30,7 @@ import org.apache.commons.lang3.builder.ToStringBuilder; import java.io.Serializable; /** + * TODO à mettre en commun entre l'ichtyo et le pied à coulisse ? * @author Kevin Morin (Code Lutin) * @since 4.5 */ diff --git a/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderStylusMotionRecord.java b/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderStylusMotionRecord.java deleted file mode 100644 index 5beef21..0000000 --- a/tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderStylusMotionRecord.java +++ /dev/null @@ -1,79 +0,0 @@ -package fr.ifremer.tutti.caliper.feed.record; - -/* - * #%L - * Tutti :: Ichtyometer API - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2012 - 2014 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import org.apache.commons.lang3.builder.ToStringBuilder; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * A measure record. - * - * Format is <pre>%l,v#</pre>. - * - * @author Kevin Morin (Code Lutin) - * @since 4.5 - */ -public class CaliperFeedReaderStylusMotionRecord extends CaliperFeedReaderRecordSupport { - - private static final long serialVersionUID = 1L; - - protected static final Pattern RECORD_PATTERN = Pattern.compile("%t:(\\w)?#"); - - public static boolean acceptRecord(String record) { - - Matcher matcher = RECORD_PATTERN.matcher(record); - return matcher.matches(); - - } - - protected final int motion; - - CaliperFeedReaderStylusMotionRecord(String record) { - super(record); - Matcher matcher = RECORD_PATTERN.matcher(record); - matcher.find(); - String measureStr = matcher.group(1); - motion = Integer.valueOf(measureStr); - } - - public int getMotion() { - return motion; - } - - @Override - public boolean isValid() { - return acceptRecord(record); - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("record", record) - .append("motion", motion) - .toString(); - } -} -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.