branch feature/7459 updated (0388a1f -> a13af77)
This is an automated email from the git hooks/post-receive script. New change to branch feature/7459 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git from 0388a1f creation du module pour le pied à coulisse (caliper) (refs #7459) new f70c0d6 implem de la réception des données du pied a coulisse (refs #7459) new 1a3421d ajout de la conf du port série du pied a coulisse (refs #7459) new a13af77 ajout de la connexion au pied à coulisse depuis l'appli (refs #7459) The 3 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit a13af774f70d53a12bd54e84cb3e5c693c5f5417 Author: Kevin Morin <morin@codelutin.com> Date: Wed Apr 20 16:16:55 2016 +0200 ajout de la connexion au pied à coulisse depuis l'appli (refs #7459) commit 1a3421d787f401b6a68eb636266b49e2ad2f620e Author: Kevin Morin <morin@codelutin.com> Date: Wed Apr 20 15:34:01 2016 +0200 ajout de la conf du port série du pied a coulisse (refs #7459) commit f70c0d60d075f60bb84310445973e1be0dec302e 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) Summary of changes: tutti-caliper/pom.xml | 7 + .../fr/ifremer/tutti/caliper/feed/Caliper.java | 135 ++++++++++++++ .../caliper/feed/CaliperConnectionException.java | 12 ++ .../tutti/caliper/feed/CaliperFeedReader.java | 195 +++++++++------------ .../record/CaliperFeedReaderMeasureRecord.java | 14 +- .../record/CaliperFeedReaderRecordFactory.java | 20 +-- .../record/CaliperFeedReaderRecordSupport.java | 1 + .../CaliperFeedReaderStylusMotionRecord.java | 79 --------- .../java/fr/ifremer/tutti/TuttiConfiguration.java | 29 +-- .../fr/ifremer/tutti/TuttiConfigurationOption.java | 32 ++-- .../java/fr/ifremer/tutti/util/SerialPort.java | 12 ++ .../i18n/tutti-persistence_en_GB.properties | 7 + .../i18n/tutti-persistence_fr_FR.properties | 13 +- tutti-ui-swing/pom.xml | 5 + .../filtered-resources/tutti-help-fr.properties | 28 +-- .../fr/ifremer/tutti/ui/swing/TuttiUIContext.java | 27 +++ .../fr/ifremer/tutti/ui/swing/content/MainUI.jaxx | 3 + .../fr/ifremer/tutti/ui/swing/content/MainUI.jcss | 29 +++ .../tutti/ui/swing/content/MainUIHandler.java | 21 +++ ...ometerAction.java => ConnectCaliperAction.java} | 30 ++-- ...terAction.java => DisconnectCaliperAction.java} | 22 ++- .../swing/content/config/TuttiConfigUIHandler.java | 36 ++-- .../frequency/SpeciesFrequencyUIHandler.java | 95 +++++++++- .../actions/ApplySpeciesFrequencyRafaleAction.java | 2 +- .../ifremer/tutti/ui/swing/util/SoundEngine.java | 18 +- .../resources/i18n/tutti-ui-swing_en_GB.properties | 22 +++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 32 ++-- 27 files changed, 589 insertions(+), 337 deletions(-) create mode 100644 tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/Caliper.java create mode 100644 tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/CaliperConnectionException.java delete mode 100644 tutti-caliper/src/main/java/fr/ifremer/tutti/caliper/feed/record/CaliperFeedReaderStylusMotionRecord.java create mode 100644 tutti-persistence/src/main/java/fr/ifremer/tutti/util/SerialPort.java copy tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/{DisconnectIchtyometerAction.java => ConnectCaliperAction.java} (54%) copy tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/{DisconnectIchtyometerAction.java => DisconnectCaliperAction.java} (64%) -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 f70c0d60d075f60bb84310445973e1be0dec302e 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>.
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 1a3421d787f401b6a68eb636266b49e2ad2f620e Author: Kevin Morin <morin@codelutin.com> Date: Wed Apr 20 15:34:01 2016 +0200 ajout de la conf du port série du pied a coulisse (refs #7459) --- .../java/fr/ifremer/tutti/TuttiConfiguration.java | 29 +++++++++-------- .../fr/ifremer/tutti/TuttiConfigurationOption.java | 32 +++++++++++-------- .../java/fr/ifremer/tutti/util/SerialPort.java | 12 ++++++++ .../i18n/tutti-persistence_en_GB.properties | 7 +++++ .../i18n/tutti-persistence_fr_FR.properties | 7 +++++ .../swing/content/config/TuttiConfigUIHandler.java | 36 +++++++++++++--------- .../ifremer/tutti/ui/swing/util/SoundEngine.java | 14 ++++----- .../resources/i18n/tutti-ui-swing_en_GB.properties | 9 ++++++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 9 ++++++ 9 files changed, 110 insertions(+), 45 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfiguration.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfiguration.java index 45bea6e..613b18c 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfiguration.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfiguration.java @@ -29,6 +29,7 @@ import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.type.CoordinateEditorType; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.util.BeepFrequency; +import fr.ifremer.tutti.util.SerialPort; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.apache.commons.logging.Log; @@ -732,28 +733,32 @@ public class TuttiConfiguration extends ApplicationConfiguration { return applicationConfig.getOptionAsInt(TuttiConfigurationOption.ICHTYOMETER_MAXIMUM_NUMBER_OF_ATTEMPT_TO_CONNECT.getKey()); } - public Boolean isIchtyometerVoiceEnabled() { - return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.ICHTYOMETER_VOICE_ENABLED.getKey()); + public SerialPort getCaliperSerialPort() { + return SerialPort.valueOf(applicationConfig.getOption(TuttiConfigurationOption.CALIPER_SERIAL_PORT.getKey())); } - public Boolean isIchtyometerReadsUnit() { - return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.ICHTYOMETER_READS_UNIT.getKey()); + public Boolean isExternalDevicesVoiceEnabled() { + return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.EXTERNAL_DEVICES_VOICE_ENABLED.getKey()); } - public Boolean isIchtyometerDataReceptionBeepEnabled() { - return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.ICHTYOMETER_DATA_RECEPTION_BEEP_ENABLED.getKey()); + public Boolean isExternalDevicesReadsUnit() { + return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.EXTERNAL_DEVICES_READS_UNIT.getKey()); } - public BeepFrequency getIchtyometerDataReceptionBeepFrequency() { - return BeepFrequency.valueOf(applicationConfig.getOption(TuttiConfigurationOption.ICHTYOMETER_DATA_RECEPTION_BEEP_FREQUENCY.getKey())); + public Boolean isExternalDevicesDataReceptionBeepEnabled() { + return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.EXTERNAL_DEVICES_DATA_RECEPTION_BEEP_ENABLED.getKey()); } - public Boolean isIchtyometerErrorReceptionBeepEnabled() { - return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.ICHTYOMETER_ERROR_RECEPTION_BEEP_ENABLED.getKey()); + public BeepFrequency getExternalDevicesDataReceptionBeepFrequency() { + return BeepFrequency.valueOf(applicationConfig.getOption(TuttiConfigurationOption.EXTERNAL_DEVICES_DATA_RECEPTION_BEEP_FREQUENCY.getKey())); } - public BeepFrequency getIchtyometerErrorReceptionBeepFrequency() { - return BeepFrequency.valueOf(applicationConfig.getOption(TuttiConfigurationOption.ICHTYOMETER_ERROR_RECEPTION_BEEP_FREQUENCY.getKey())); + public Boolean isExternalDevicesErrorReceptionBeepEnabled() { + return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.EXTERNAL_DEVICES_ERROR_RECEPTION_BEEP_ENABLED.getKey()); + } + + public BeepFrequency getExternalDevicesErrorReceptionBeepFrequency() { + return BeepFrequency.valueOf(applicationConfig.getOption(TuttiConfigurationOption.EXTERNAL_DEVICES_ERROR_RECEPTION_BEEP_FREQUENCY.getKey())); } public String getJavaCommandPath() { diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfigurationOption.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfigurationOption.java index e989798..a758b60 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfigurationOption.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfigurationOption.java @@ -26,6 +26,7 @@ import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.type.CoordinateEditorType; import fr.ifremer.tutti.type.WeightUnit; import fr.ifremer.tutti.util.BeepFrequency; +import fr.ifremer.tutti.util.SerialPort; import org.hibernate.dialect.HSQLDialect; import org.hsqldb.jdbcDriver; import org.nuiton.config.ConfigOptionDef; @@ -646,44 +647,51 @@ public enum TuttiConfigurationOption implements ConfigOptionDef { int.class, false ), - ICHTYOMETER_VOICE_ENABLED( + CALIPER_SERIAL_PORT( + "tutti.ichtyometer.caliperSerialPort", + n("tutti.config.option.externalDevices.maximumNumberOfAttemptToConnect.description"), + "COM1", + SerialPort.class, + false + ), + EXTERNAL_DEVICES_VOICE_ENABLED( "tutti.ichtyometer.voice.enabled", - n("tutti.config.option.ichtyometer.voice.enabled.description"), + n("tutti.config.option.externalDevices.voice.enabled.description"), "true", Boolean.class, false ), - ICHTYOMETER_READS_UNIT( + EXTERNAL_DEVICES_READS_UNIT( "tutti.ichtyometer.reads.unit", - n("tutti.config.option.ichtyometer.reads.unit.description"), + n("tutti.config.option.externalDevices.reads.unit.description"), "true", Boolean.class, false ), - ICHTYOMETER_DATA_RECEPTION_BEEP_ENABLED( + EXTERNAL_DEVICES_DATA_RECEPTION_BEEP_ENABLED( "tutti.ichtyometer.beep.data.enabled", - n("tutti.config.option.ichtyometer.beep.data.enabled.description"), + n("tutti.config.option.externalDevices.beep.data.enabled.description"), "true", Boolean.class, false ), - ICHTYOMETER_DATA_RECEPTION_BEEP_FREQUENCY( + EXTERNAL_DEVICES_DATA_RECEPTION_BEEP_FREQUENCY( "tutti.ichtyometer.beep.data.frequency", - n("tutti.config.option.ichtyometer.beep.data.frequency.description"), + n("tutti.config.option.externalDevices.beep.data.frequency.description"), "A2", BeepFrequency.class, false ), - ICHTYOMETER_ERROR_RECEPTION_BEEP_ENABLED( + EXTERNAL_DEVICES_ERROR_RECEPTION_BEEP_ENABLED( "tutti.ichtyometer.beep.error.enabled", - n("tutti.config.option.ichtyometer.beep.error.enabled.description"), + n("tutti.config.option.externalDevices.beep.error.enabled.description"), "true", Boolean.class, false ), - ICHTYOMETER_ERROR_RECEPTION_BEEP_FREQUENCY( + EXTERNAL_DEVICES_ERROR_RECEPTION_BEEP_FREQUENCY( "tutti.ichtyometer.beep.error.frequency", - n("tutti.config.option.ichtyometer.beep.error.frequency.description"), + n("tutti.config.option.externalDevices.beep.error.frequency.description"), "A1", BeepFrequency.class, false diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/util/SerialPort.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/util/SerialPort.java new file mode 100644 index 0000000..6cd4ba7 --- /dev/null +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/util/SerialPort.java @@ -0,0 +1,12 @@ +package fr.ifremer.tutti.util; + +/** + * @author Kevin Morin (Code Lutin) + * @since 4.5 + */ +public enum SerialPort { + + COM1, + COM2, + COM3 +} diff --git a/tutti-persistence/src/main/resources/i18n/tutti-persistence_en_GB.properties b/tutti-persistence/src/main/resources/i18n/tutti-persistence_en_GB.properties index 4878154..e9fd0bc 100644 --- a/tutti-persistence/src/main/resources/i18n/tutti-persistence_en_GB.properties +++ b/tutti-persistence/src/main/resources/i18n/tutti-persistence_en_GB.properties @@ -18,6 +18,13 @@ tutti.config.option.db.import.skipBackup.description= tutti.config.option.errorBeepFrequency.description= tutti.config.option.export.backup.directory.description= tutti.config.option.export.countryId.description= +tutti.config.option.externalDevices.beep.data.enabled.description= +tutti.config.option.externalDevices.beep.data.frequency.description= +tutti.config.option.externalDevices.beep.error.enabled.description= +tutti.config.option.externalDevices.beep.error.frequency.description= +tutti.config.option.externalDevices.maximumNumberOfAttemptToConnect.description= +tutti.config.option.externalDevices.reads.unit.description= +tutti.config.option.externalDevices.voice.enabled.description= tutti.config.option.genericFormat.import.maximumRowsInErrorPerFile.description= tutti.config.option.genericFormat.import.skipBackup.description= tutti.config.option.genericFormat.report.backup.directory.description= diff --git a/tutti-persistence/src/main/resources/i18n/tutti-persistence_fr_FR.properties b/tutti-persistence/src/main/resources/i18n/tutti-persistence_fr_FR.properties index dec1cfb..b64b634 100644 --- a/tutti-persistence/src/main/resources/i18n/tutti-persistence_fr_FR.properties +++ b/tutti-persistence/src/main/resources/i18n/tutti-persistence_fr_FR.properties @@ -11,6 +11,13 @@ tutti.config.option.data.directory.description=Répertoire de données de l'appl tutti.config.option.db.import.skipBackup.description=Pour ne pas effectuer une sauvegarde avant un import de base tutti.config.option.export.backup.directory.description=Répertoire où sont enregistrées les exports génériques tutti.config.option.export.countryId.description=L'id du pays à utiliser pour les exports (il s'agit de la valeur LOCATION.ID). +tutti.config.option.externalDevices.beep.data.enabled.description= +tutti.config.option.externalDevices.beep.data.frequency.description= +tutti.config.option.externalDevices.beep.error.enabled.description= +tutti.config.option.externalDevices.beep.error.frequency.description= +tutti.config.option.externalDevices.maximumNumberOfAttemptToConnect.description= +tutti.config.option.externalDevices.reads.unit.description= +tutti.config.option.externalDevices.voice.enabled.description= tutti.config.option.genericFormat.import.maximumRowsInErrorPerFile.description=Nombre maximum de lignes en erreur possible par fichier lors de la validation de l'import générique tutti.config.option.genericFormat.import.skipBackup.description=Pour ne pas effectuer une sauvegarde avant chaque import générique tutti.config.option.genericFormat.report.backup.directory.description=Répertoire où sont enregistrés les rapports de l'import générique diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/config/TuttiConfigUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/config/TuttiConfigUIHandler.java index d60cb57..a43feaf 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/config/TuttiConfigUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/config/TuttiConfigUIHandler.java @@ -256,8 +256,10 @@ public class TuttiConfigUIHandler extends AbstractTuttiUIHandler<TuttiUIContext, // ichtyometer category - helper.addCategory(n("tutti.config.category.ichtyometer"), - n("tutti.config.category.ichtyometer.description")) + helper.addCategory(n("tutti.config.category.externalDevices"), + n("tutti.config.category.externalDevices.description")) + + // ichtyometer .addOption(TuttiConfigurationOption.FULL_BLUETOOTH_SCAN) .setOptionShortLabel(t("tutti.config.option.ui.fullBluetoothScan.shortLabel")) @@ -265,24 +267,30 @@ public class TuttiConfigUIHandler extends AbstractTuttiUIHandler<TuttiUIContext, .addOption(TuttiConfigurationOption.ICHTYOMETER_MAXIMUM_NUMBER_OF_ATTEMPT_TO_CONNECT) .setOptionShortLabel(t("tutti.config.option.ui.ichtyometerMaximumNumberOfAttemptToConnect.shortLabel")) - .addOption(TuttiConfigurationOption.ICHTYOMETER_VOICE_ENABLED) - .setOptionShortLabel(t("tutti.config.option.ui.ichtyometerVoiceEnabled.shortLabel")) + // caliper + + .addOption(TuttiConfigurationOption.CALIPER_SERIAL_PORT) + .setOptionShortLabel(t("tutti.config.option.ui.caliperSerialPort.shortLabel")) + + // all devices - .addOption(TuttiConfigurationOption.ICHTYOMETER_READS_UNIT) - .setOptionShortLabel(t("tutti.config.option.ui.ichtyometerReadsUnit.shortLabel")) + .addOption(TuttiConfigurationOption.EXTERNAL_DEVICES_VOICE_ENABLED) + .setOptionShortLabel(t("tutti.config.option.ui.externalDevicesVoiceEnabled.shortLabel")) + .addOption(TuttiConfigurationOption.EXTERNAL_DEVICES_READS_UNIT) + .setOptionShortLabel(t("tutti.config.option.ui.externalDevicesReadsUnit.shortLabel")) - .addOption(TuttiConfigurationOption.ICHTYOMETER_DATA_RECEPTION_BEEP_ENABLED) - .setOptionShortLabel(t("tutti.config.option.ui.ichtyometerDataBeepEnabled.shortLabel")) + .addOption(TuttiConfigurationOption.EXTERNAL_DEVICES_DATA_RECEPTION_BEEP_ENABLED) + .setOptionShortLabel(t("tutti.config.option.ui.externalDevicesDataBeepEnabled.shortLabel")) - .addOption(TuttiConfigurationOption.ICHTYOMETER_DATA_RECEPTION_BEEP_FREQUENCY) - .setOptionShortLabel(t("tutti.config.option.ui.ichtyometerDataBeepFrequency.shortLabel")) + .addOption(TuttiConfigurationOption.EXTERNAL_DEVICES_DATA_RECEPTION_BEEP_FREQUENCY) + .setOptionShortLabel(t("tutti.config.option.ui.externalDevicesDataBeepFrequency.shortLabel")) - .addOption(TuttiConfigurationOption.ICHTYOMETER_ERROR_RECEPTION_BEEP_ENABLED) - .setOptionShortLabel(t("tutti.config.option.ui.ichtyometerErrorBeepEnabled.shortLabel")) + .addOption(TuttiConfigurationOption.EXTERNAL_DEVICES_ERROR_RECEPTION_BEEP_ENABLED) + .setOptionShortLabel(t("tutti.config.option.ui.externalDevicesErrorBeepEnabled.shortLabel")) - .addOption(TuttiConfigurationOption.ICHTYOMETER_ERROR_RECEPTION_BEEP_FREQUENCY) - .setOptionShortLabel(t("tutti.config.option.ui.ichtyometerErrorBeepFrequency.shortLabel")); + .addOption(TuttiConfigurationOption.EXTERNAL_DEVICES_ERROR_RECEPTION_BEEP_FREQUENCY) + .setOptionShortLabel(t("tutti.config.option.ui.externalDevicesErrorBeepFrequency.shortLabel")); // Technical category diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SoundEngine.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SoundEngine.java index a3f150a..2edf69d 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SoundEngine.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SoundEngine.java @@ -67,11 +67,11 @@ public class SoundEngine implements Closeable { public synchronized void beepOnIchtyometerDataReception(String unit, float aroundLengthStep) { - if (configuration.isIchtyometerDataReceptionBeepEnabled()) { - soundsToPlay.add(configuration.getIchtyometerDataReceptionBeepFrequency()); + if (configuration.isExternalDevicesDataReceptionBeepEnabled()) { + soundsToPlay.add(configuration.getExternalDevicesDataReceptionBeepFrequency()); } - if (configuration.isIchtyometerVoiceEnabled()) { + if (configuration.isExternalDevicesVoiceEnabled()) { soundsToPlay.add(new Measure(unit, aroundLengthStep)); } @@ -79,9 +79,9 @@ public class SoundEngine implements Closeable { public synchronized void beepOnIchtyometerErrorReception() { - if (configuration.isIchtyometerErrorReceptionBeepEnabled()) { + if (configuration.isExternalDevicesErrorReceptionBeepEnabled()) { for (int i = 0; i < 3; i++) { - soundsToPlay.add(configuration.getIchtyometerDataReceptionBeepFrequency()); + soundsToPlay.add(configuration.getExternalDevicesDataReceptionBeepFrequency()); } } @@ -136,7 +136,7 @@ public class SoundEngine implements Closeable { log.info("New Measure to say: " + measure); } String unit; - if (configuration.isIchtyometerReadsUnit()) { + if (configuration.isExternalDevicesReadsUnit()) { unit = measure.unit; } else { unit = null; @@ -144,7 +144,7 @@ public class SoundEngine implements Closeable { SoundUtil.readNumber(measure.aroundLengthStep, Optional.fromNullable(unit)); } else if (sound instanceof BeepFrequency) { - SoundUtil.beep(configuration.getIchtyometerErrorReceptionBeepFrequency()); + SoundUtil.beep(configuration.getExternalDevicesErrorReceptionBeepFrequency()); } } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index f7e654d..162529f 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -153,6 +153,8 @@ tutti.config.action.reload.application= tutti.config.action.reload.ui= tutti.config.category.applications= tutti.config.category.applications.description= +tutti.config.category.externalDevices= +tutti.config.category.externalDevices.description= tutti.config.category.ichtyometer= tutti.config.category.ichtyometer.description= tutti.config.category.technical= @@ -185,6 +187,7 @@ tutti.config.option.site.url.shortLabel= tutti.config.option.tmp.directory.shortLabel= tutti.config.option.tremieCarousselVessel.shortLabel= tutti.config.option.ui.beepFrequency.shortLabel= +tutti.config.option.ui.caliperSerialPort.shortLabel= tutti.config.option.ui.color.alternateRow.shortLabel= tutti.config.option.ui.color.benthos.shortLabel= tutti.config.option.ui.color.blockingLayer.shortLabel= @@ -205,6 +208,12 @@ tutti.config.option.ui.config.file.shortLabel= tutti.config.option.ui.coordinateEditorType.shortLabel= tutti.config.option.ui.dateFormat.shortLabel= tutti.config.option.ui.db.import.skipBackup.shortLabel= +tutti.config.option.ui.externalDevicesDataBeepEnabled.shortLabel= +tutti.config.option.ui.externalDevicesDataBeepFrequency.shortLabel= +tutti.config.option.ui.externalDevicesErrorBeepEnabled.shortLabel= +tutti.config.option.ui.externalDevicesErrorBeepFrequency.shortLabel= +tutti.config.option.ui.externalDevicesReadsUnit.shortLabel= +tutti.config.option.ui.externalDevicesVoiceEnabled.shortLabel= tutti.config.option.ui.fullBluetoothScan.shortLabel= tutti.config.option.ui.genericFormat.import.maximumRowsInErrorPerFile.shortLabel= tutti.config.option.ui.genericFormat.import.skipBackup.shortLabel= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index a99f983..f855570 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -125,6 +125,8 @@ tutti.config.action.reload.application=Recharger l'application tutti.config.action.reload.ui=Recharger l'interface graphique tutti.config.category.applications=Application tutti.config.category.applications.description=Application +tutti.config.category.externalDevices= +tutti.config.category.externalDevices.description= tutti.config.category.ichtyometer=Ichtyomètre tutti.config.category.ichtyometer.description=Ichtyomètre tutti.config.category.technical=Technique @@ -157,6 +159,7 @@ tutti.config.option.site.url.shortLabel=URL du site technique tutti.config.option.tmp.directory.shortLabel=Répertoire temporaire tutti.config.option.tremieCarousselVessel.shortLabel=Navire ayant un carrousel et une trémie tutti.config.option.ui.beepFrequency.shortLabel=Tonalité du bip +tutti.config.option.ui.caliperSerialPort.shortLabel= tutti.config.option.ui.color.alternateRow.shortLabel=Couleur alternée tutti.config.option.ui.color.benthos.shortLabel=Couleur des libellés de benthos (Écran Capture > Résumé) tutti.config.option.ui.color.blockingLayer.shortLabel=Couleur d'attente @@ -177,6 +180,12 @@ tutti.config.option.ui.config.file.shortLabel=Chemin du fichier de confirmation tutti.config.option.ui.coordinateEditorType.shortLabel=Formateur de coordonnées tutti.config.option.ui.dateFormat.shortLabel=Format des dates tutti.config.option.ui.db.import.skipBackup.shortLabel=Ne pas faire de sauvegarde avant un import de base +tutti.config.option.ui.externalDevicesDataBeepEnabled.shortLabel= +tutti.config.option.ui.externalDevicesDataBeepFrequency.shortLabel= +tutti.config.option.ui.externalDevicesErrorBeepEnabled.shortLabel= +tutti.config.option.ui.externalDevicesErrorBeepFrequency.shortLabel= +tutti.config.option.ui.externalDevicesReadsUnit.shortLabel= +tutti.config.option.ui.externalDevicesVoiceEnabled.shortLabel= tutti.config.option.ui.fullBluetoothScan.shortLabel=Recherche complète des périphériques bluetooth tutti.config.option.ui.genericFormat.import.maximumRowsInErrorPerFile.shortLabel=Nombre maximum de lignes en erreur possible par fichier lors de la validation de l'import générique tutti.config.option.ui.genericFormat.import.skipBackup.shortLabel=Ne pas faire de sauvegarde avant un import au format générique -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
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 a13af774f70d53a12bd54e84cb3e5c693c5f5417 Author: Kevin Morin <morin@codelutin.com> Date: Wed Apr 20 16:16:55 2016 +0200 ajout de la connexion au pied à coulisse depuis l'appli (refs #7459) --- .../tutti/caliper/feed/CaliperFeedReader.java | 3 + .../fr/ifremer/tutti/TuttiConfigurationOption.java | 2 +- .../i18n/tutti-persistence_fr_FR.properties | 20 ++--- tutti-ui-swing/pom.xml | 5 ++ .../filtered-resources/tutti-help-fr.properties | 28 +------ .../fr/ifremer/tutti/ui/swing/TuttiUIContext.java | 27 ++++++ .../fr/ifremer/tutti/ui/swing/content/MainUI.jaxx | 3 + .../fr/ifremer/tutti/ui/swing/content/MainUI.jcss | 29 +++++++ .../tutti/ui/swing/content/MainUIHandler.java | 21 +++++ .../content/actions/ConnectCaliperAction.java | 66 +++++++++++++++ .../content/actions/DisconnectCaliperAction.java | 54 ++++++++++++ .../frequency/SpeciesFrequencyUIHandler.java | 95 ++++++++++++++++++++-- .../actions/ApplySpeciesFrequencyRafaleAction.java | 2 +- .../ifremer/tutti/ui/swing/util/SoundEngine.java | 4 +- .../resources/i18n/tutti-ui-swing_en_GB.properties | 13 +++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 41 +++++----- 16 files changed, 345 insertions(+), 68 deletions(-) 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 f2febd9..6dbec27 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 @@ -130,6 +130,9 @@ public class CaliperFeedReader implements Closeable { } } + public String getSerialPortName() { + return serialPort != null ? serialPort.getName() : null; + } /** * Handles the input coming from the serial port. A new line character diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfigurationOption.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfigurationOption.java index a758b60..97c0413 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfigurationOption.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/TuttiConfigurationOption.java @@ -649,7 +649,7 @@ public enum TuttiConfigurationOption implements ConfigOptionDef { ), CALIPER_SERIAL_PORT( "tutti.ichtyometer.caliperSerialPort", - n("tutti.config.option.externalDevices.maximumNumberOfAttemptToConnect.description"), + n("tutti.config.option.caliper.serialPort.description"), "COM1", SerialPort.class, false diff --git a/tutti-persistence/src/main/resources/i18n/tutti-persistence_fr_FR.properties b/tutti-persistence/src/main/resources/i18n/tutti-persistence_fr_FR.properties index b64b634..713c0cc 100644 --- a/tutti-persistence/src/main/resources/i18n/tutti-persistence_fr_FR.properties +++ b/tutti-persistence/src/main/resources/i18n/tutti-persistence_fr_FR.properties @@ -5,33 +5,27 @@ application.common.unit.short.g=g application.common.unit.short.kg=kg tutti.config=Configuration d'Allegro Campagne tutti.config.option.basedir.description=Répertoire principale +tutti.config.option.caliper.serialPort.description=Port série de connexion au pied à coulisse tutti.config.option.cruiseId.description=Identifiant de la dernière campagne utilisée tutti.config.option.csv.separator.description=Caractère séparateur pour les import / export de fichier au format csv. tutti.config.option.data.directory.description=Répertoire de données de l'application. Vous pouvez utiliser l'expression ${tutti.data.directory} pour le référence dans d'autres propriétés de configuration (ex\: ${tutti.data.directory}/tmp). tutti.config.option.db.import.skipBackup.description=Pour ne pas effectuer une sauvegarde avant un import de base tutti.config.option.export.backup.directory.description=Répertoire où sont enregistrées les exports génériques tutti.config.option.export.countryId.description=L'id du pays à utiliser pour les exports (il s'agit de la valeur LOCATION.ID). -tutti.config.option.externalDevices.beep.data.enabled.description= -tutti.config.option.externalDevices.beep.data.frequency.description= -tutti.config.option.externalDevices.beep.error.enabled.description= -tutti.config.option.externalDevices.beep.error.frequency.description= -tutti.config.option.externalDevices.maximumNumberOfAttemptToConnect.description= -tutti.config.option.externalDevices.reads.unit.description= -tutti.config.option.externalDevices.voice.enabled.description= +tutti.config.option.externalDevices.beep.data.enabled.description=Pour activer ou non le bip à la réception de mesures +tutti.config.option.externalDevices.beep.data.frequency.description=Tonalité du bip lors de la réception de données d'un appareil externe +tutti.config.option.externalDevices.beep.error.enabled.description=Pour activer ou non le bip à la réception d'erreurs +tutti.config.option.externalDevices.beep.error.frequency.description=Tonalité du bip lors de la réception d'une erreur d'un appareil externe +tutti.config.option.externalDevices.reads.unit.description=Pour lire l'unité à la réception d'une mesure +tutti.config.option.externalDevices.voice.enabled.description=Pour activer ou non la lecture vocale des mesures reçues tutti.config.option.genericFormat.import.maximumRowsInErrorPerFile.description=Nombre maximum de lignes en erreur possible par fichier lors de la validation de l'import générique tutti.config.option.genericFormat.import.skipBackup.description=Pour ne pas effectuer une sauvegarde avant chaque import générique tutti.config.option.genericFormat.report.backup.directory.description=Répertoire où sont enregistrés les rapports de l'import générique tutti.config.option.help.directory.description=Répertoire des fichiers d'aide tutti.config.option.i18n.directory.description=Répertoire des fichiers de traductions tutti.config.option.i18n.locale.description=Langue utilisée dans l'application -tutti.config.option.ichtyometer.beep.data.enabled.description=Pour activer ou non le bip à la réception de mesures -tutti.config.option.ichtyometer.beep.data.frequency.description=Tonalité du bip lors de la réception de données de l'ichtyomètre -tutti.config.option.ichtyometer.beep.error.enabled.description=Pour activer ou non le bip à la réception d'erreurs -tutti.config.option.ichtyometer.beep.error.frequency.description=Tonalité du bip lors de la réception d'une erreur de l'ichtyomètre tutti.config.option.ichtyometer.fullBluetoothScan.description=Pour toujours effectuer une recherche complète des périphériques bluetooth lors de la recherche d'un ichtyomètre tutti.config.option.ichtyometer.maximumNumberOfAttemptToConnect.description=Nombre maximum de de tentatives de connection à l'ichtyomètre -tutti.config.option.ichtyometer.reads.unit.description=Pour lire l'unité à la réception d'une mesure -tutti.config.option.ichtyometer.voice.enabled.description=Pour activer ou non la lecture vocale des mesures reçues tutti.config.option.inceptionYear.description=Année de démarrage du projet tutti.config.option.launch.mode.description=Mode de démarrage de l'application tutti.config.option.organizationName.description=Nom de l'organisation dans la licence diff --git a/tutti-ui-swing/pom.xml b/tutti-ui-swing/pom.xml index a9d5671..fa4d30c 100644 --- a/tutti-ui-swing/pom.xml +++ b/tutti-ui-swing/pom.xml @@ -117,6 +117,11 @@ </dependency> <dependency> <groupId>${project.groupId}</groupId> + <artifactId>tutti-caliper</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> <artifactId>tutti-ui-swing-updater</artifactId> <version>${project.version}</version> </dependency> diff --git a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties index b572bae..af6a40a 100644 --- a/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties +++ b/tutti-ui-swing/src/main/filtered-resources/tutti-help-fr.properties @@ -1,28 +1,5 @@ -### -# #%L -# Tutti :: UI -# $Id:$ -# $HeadURL:$ -# %% -# Copyright (C) 2012 - 2016 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% -### #Generated by org.nuiton.jaxx.plugin.GenerateHelpIdsMojo -#Fri Apr 01 23:37:59 CEST 2016 +#Wed Apr 20 15:51:16 CEST 2016 tutti.config.help=config.html tutti.createAccidentalBatch.action.cancel.help=editFishingOperation.html\#captureCapturesAccidentellesActions tutti.createAccidentalBatch.action.saveAndClose.help=editFishingOperation.html\#captureCapturesAccidentellesActions @@ -425,7 +402,9 @@ tutti.main.menu.action.changeLocale.help=menu.html\#menu_aide tutti.main.menu.action.changeLocaleFR.help=menu.html\#menu_aide tutti.main.menu.action.changeLocaleUK.help=menu.html\#menu_aide tutti.main.menu.action.configuration.help=menu.html\#menu_fichier_configuration +tutti.main.menu.action.connectCaliper.help= tutti.main.menu.action.connectIchtyometer.help=menu.html\#menu_fichier +tutti.main.menu.action.disconnectCaliper.help= tutti.main.menu.action.disconnectIchtyometer.help=menu.html\#menu_fichier tutti.main.menu.action.editCatches.help=menu.html\#menu_action tutti.main.menu.action.editCruise.help=menu.html\#menu_action @@ -445,6 +424,7 @@ tutti.main.menu.action.site.help=menu.html\#menu_aide tutti.main.menu.action.updateApplication.help=menu.html\#menu_fichier tutti.main.menu.action.updateReport.help=menu.html\#menu_fichier tutti.main.menu.action.validateCatches.help=menu.html\#menu_action +tutti.main.status.caliper.help= tutti.main.status.ichtyometer.help=menu.html\#status tutti.main.status.validation.help=menu.html\#status tutti.manageTemporaryReferential.action.exportExistingTemporaryGear.help=menu.html\#menu_administration_referentiel diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java index 02a75ca..9dc93a2 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/TuttiUIContext.java @@ -26,6 +26,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import fr.ifremer.tutti.TuttiConfiguration; +import fr.ifremer.tutti.caliper.feed.CaliperFeedReader; import fr.ifremer.tutti.ichtyometer.feed.IchtyometerFeedReader; import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.service.ClosedPersistenceService; @@ -142,6 +143,8 @@ public class TuttiUIContext extends AbstractBean implements Closeable, UIMessage public static final String PROPERTY_ICHTYOMETER_CONNECTED = "ichtyometerConnected"; + public static final String PROPERTY_CALIPER_CONNECTED = "caliperConnected"; + public static final String PROPERTY_BUSY = "busy"; public static final String PROPERTY_HIDE_BODY = "hideBody"; @@ -288,6 +291,13 @@ public class TuttiUIContext extends AbstractBean implements Closeable, UIMessage private IchtyometerFeedReader ichtyometerReader; /** + * Caliper Reader. + * + * @since 4.5 + */ + private CaliperFeedReader caliperFeedReader; + + /** * A file lock to prevent multiple instance. the lock is create in the {@link #init()} method and remove in the * {@link #close()} method. * @@ -1129,6 +1139,23 @@ public class TuttiUIContext extends AbstractBean implements Closeable, UIMessage } //------------------------------------------------------------------------// + //-- Caliper methods --// + //------------------------------------------------------------------------// + + public CaliperFeedReader getCaliperReader() { + return caliperFeedReader; + } + + public void setCaliperReader(CaliperFeedReader caliperFeedReader) { + this.caliperFeedReader = caliperFeedReader; + firePropertyChange(PROPERTY_CALIPER_CONNECTED, null, isCaliperConnected()); + } + + public boolean isCaliperConnected() { + return caliperFeedReader != null; + } + + //------------------------------------------------------------------------// //-- Other methods --// //------------------------------------------------------------------------// diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx index 275ecd6..f49d102 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jaxx @@ -61,6 +61,8 @@ <JSeparator/> <JMenuItem id='menuFileConnectIchtyometer'/> <JMenuItem id='menuFileDisconnectIchtyometer'/> + <JMenuItem id='menuFileConnectCaliper'/> + <JMenuItem id='menuFileDisconnectCaliper'/> <JSeparator/> <JMenuItem id='menuFileManageDb'/> <JSeparator/> @@ -98,6 +100,7 @@ <JToolBar id='bottomBar'> <JLabel id='ichtyometerStatus'/> + <JLabel id='caliperStatus'/> <SwingValidatorMessageWidget id='validatorMessageWidget'/> </JToolBar> diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jcss b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jcss index c57300b..ce1cee1 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jcss +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUI.jcss @@ -109,6 +109,27 @@ JMenu { _help: {"tutti.main.menu.action.disconnectIchtyometer.help"}; } + +#menuFileConnectCaliper { + actionIcon: bluetooth-down; + text: "tutti.main.action.connectCaliper"; + toolTipText: "tutti.main.action.connectCaliper.tip"; + i18nMnemonic: "tutti.main.action.connectCaliper.mnemonic"; + visible: {!model.isCaliperConnected()}; + _applicationAction: {fr.ifremer.tutti.ui.swing.content.actions.ConnectCaliperAction.class}; + _help: {"tutti.main.menu.action.connectCaliper.help"}; +} + +#menuFileDisconnectCaliper { + actionIcon: bluetooth-up; + text: "tutti.main.action.disconnectCaliper"; + toolTipText: "tutti.main.action.disconnectCaliper.tip"; + i18nMnemonic: "tutti.main.action.disconnectCaliper.mnemonic"; + visible: {model.isCaliperConnected()}; + _applicationAction: {fr.ifremer.tutti.ui.swing.content.actions.DisconnectCaliperAction.class}; + _help: {"tutti.main.menu.action.disconnectCaliper.help"}; +} + #menuFileManageDb { actionIcon: manage-db; text: "tutti.main.action.manageDb"; @@ -315,6 +336,14 @@ JMenu { _help: {"tutti.main.status.ichtyometer.help"}; } +#caliperStatus { + actionIcon: "bluetooth-up"; + disabledIcon: {jaxx.runtime.SwingUtil.createActionIcon("bluetooth-down")}; + enabled: {model.isCaliperConnected()}; + toolTipText: {handler.getCaliperStatusLabel(model.isCaliperConnected())}; + _help: {"tutti.main.status.caliper.help"}; +} + #showHelp { actionIcon:"show-help"; toolTipText:"tutti.main.action.showHelp.tip"; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java index 08c7ce2..e6ce5ab 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/MainUIHandler.java @@ -23,6 +23,7 @@ package fr.ifremer.tutti.ui.swing.content; */ import com.google.common.base.Preconditions; +import fr.ifremer.tutti.caliper.feed.CaliperFeedReader; import fr.ifremer.tutti.ichtyometer.feed.IchtyometerFeedReader; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.Program; @@ -103,6 +104,26 @@ public class MainUIHandler extends AbstractTuttiUIHandler<TuttiUIContext, MainUI } return result; } + + public String getCaliperStatusLabel(boolean connected) { + String result = null; + if (connected) { + CaliperFeedReader caliperReader = getModel().getCaliperReader(); + result = caliperReader.getSerialPortName(); + } + return result; + } + + public String getCaliperStatusTip(boolean connected) { + String result; + if (connected) { + CaliperFeedReader caliperReader = getModel().getCaliperReader(); + result = t("tutti.caliper.status.connected.tip", caliperReader.getSerialPortName()); + } else { + result = t("tutti.caliper.status.not.connected.tip"); + } + return result; + } //------------------------------------------------------------------------// //-- AbstractTuttiUIHandler methods --// //------------------------------------------------------------------------// diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/ConnectCaliperAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/ConnectCaliperAction.java new file mode 100644 index 0000000..ddd0584 --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/ConnectCaliperAction.java @@ -0,0 +1,66 @@ +package fr.ifremer.tutti.ui.swing.content.actions; + +/* + * #%L + * Tutti :: UI + * %% + * 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 fr.ifremer.tutti.caliper.feed.CaliperFeedReader; +import fr.ifremer.tutti.ui.swing.content.MainUIHandler; + +import static org.nuiton.i18n.I18n.t; + +/** + * Establish a connection to an ichtyometer. + * + * Created on 1/29/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.1 + */ +public class ConnectCaliperAction extends AbstractMainUITuttiAction { + + public ConnectCaliperAction(MainUIHandler handler) { + super(handler, false); + } + + @Override + public void doAction() throws Exception { + + CaliperFeedReader caliperReader = new CaliperFeedReader(); + caliperReader.start(getConfig().getCaliperSerialPort().name()); + + getContext().setCaliperReader(caliperReader); + } + + @Override + public void postSuccessAction() { + super.postSuccessAction(); + + CaliperFeedReader caliperReader = getContext().getCaliperReader(); + String serialPort = caliperReader.getSerialPortName(); + sendMessage(t("tutti.caliper.connection.establish", serialPort)); + + displayInfoMessage( + t("tutti.caliper.connection.establish.title"), + t("tutti.caliper.connection.establish.message", serialPort) + ); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/DisconnectCaliperAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/DisconnectCaliperAction.java new file mode 100644 index 0000000..487035a --- /dev/null +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/actions/DisconnectCaliperAction.java @@ -0,0 +1,54 @@ +package fr.ifremer.tutti.ui.swing.content.actions; + +/* + * #%L + * Tutti :: UI + * %% + * 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 fr.ifremer.tutti.caliper.feed.CaliperFeedReader; +import fr.ifremer.tutti.ui.swing.content.MainUIHandler; +import org.apache.commons.io.IOUtils; + +import static org.nuiton.i18n.I18n.t; + +/** + * Close the connection to caliper. + * + * @author Kevin Morin (Code Lutin) + * @since 4.6 + */ +public class DisconnectCaliperAction extends AbstractMainUITuttiAction { + + public DisconnectCaliperAction(MainUIHandler handler) { + super(handler, false); + } + + @Override + public void doAction() throws Exception { + + CaliperFeedReader caliperReader = getContext().getCaliperReader(); + + // there is a feed reader, stop it now + IOUtils.closeQuietly(caliperReader); + getContext().setCaliperReader(null); + + sendMessage(t("tutti.caliper.connection.stop", caliperReader.getSerialPortName())); + } +} diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java index ec07c76..41844b0 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/SpeciesFrequencyUIHandler.java @@ -22,6 +22,9 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; * #L% */ +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.ichtyometer.feed.event.IchtyometerFeedReaderEvent; import fr.ifremer.tutti.ichtyometer.feed.event.IchtyometerFeedReaderListener; import fr.ifremer.tutti.ichtyometer.feed.record.IchtyometerFeedReaderMeasureRecord; @@ -127,7 +130,11 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci /** * To consume measures when they arrive from the ichtyometer. */ - protected final IchtyometerFeedReaderListener feedReaderListener; + protected final IchtyometerFeedReaderListener ichtyometerFeedReaderListener; + /** + * To consume measures when they arrive from the caliper. + */ + protected final CaliperFeedReaderListener caliperFeedReaderListener; protected ApplySpeciesFrequencyRafaleAction applySpeciesFrequencyRafaleAction; @@ -147,7 +154,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci SpeciesFrequencyRowModel.PROPERTY_NUMBER, SpeciesFrequencyRowModel.PROPERTY_WEIGHT); - this.feedReaderListener = new IchtyometerFeedReaderListener() { + this.ichtyometerFeedReaderListener = new IchtyometerFeedReaderListener() { @Override public void recordRead(IchtyometerFeedReaderEvent event) { @@ -158,7 +165,25 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (!getModel().isSimpleCountingMode()) { // can try to consume value - consumeFeedRecord(record); + consumeIchtyometerFeedRecord(record); + } + } + ); + } + }; + + this.caliperFeedReaderListener = new CaliperFeedReaderListener() { + + @Override + public void recordRead(CaliperFeedReaderEvent event) { + final CaliperFeedReaderMeasureRecord record = event.getRecord(); + + SwingUtilities.invokeLater( + () -> { + if (!getModel().isSimpleCountingMode()) { + + // can try to consume value + consumeCaliperFeedRecord(record); } } ); @@ -526,7 +551,12 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (context.isIchtyometerConnected()) { - context.getIchtyometerReader().removeFeedModeReaderListener(feedReaderListener); + context.getIchtyometerReader().removeFeedModeReaderListener(ichtyometerFeedReaderListener); + } + + if (context.isCaliperConnected()) { + + context.getCaliperReader().removeFeedModeReaderListener(caliperFeedReaderListener); } EditSpeciesBatchPanelUI parent = getParentContainer(EditSpeciesBatchPanelUI.class); @@ -655,6 +685,13 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } + if (getContext().isCaliperConnected()) { + + // let's listen the caliper + listenCaliper(); + + } + model.setModify(false); } finally { @@ -906,7 +943,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci return col; } - protected void consumeFeedRecord(IchtyometerFeedReaderMeasureRecord record) { + protected void consumeIchtyometerFeedRecord(IchtyometerFeedReaderMeasureRecord record) { if (record.isValid()) { String unit = getModel().getLengthStepCaracteristicUnit(); @@ -932,12 +969,44 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } else { SoundEngine soundEngine = getContext().getSoundEngine(); - soundEngine.beepOnIchtyometerErrorReception(); + soundEngine.beepOnExternalDeviceErrorReception(); throw new ApplicationBusinessException(t("tutti.editSpeciesFrequencies.error.itchyometer.bad.record", record.getRecord())); } } + protected void consumeCaliperFeedRecord(CaliperFeedReaderMeasureRecord record) { + if (record.isValid()) { + + String unit = getModel().getLengthStepCaracteristicUnit(); + + // board measurements are in mm + + float length; + + if ("mm".equals(unit)) { + + // measurement in mm asked + length = record.getMeasure(); + + } else { + + // measurement in cm asked + length = record.getMeasure() / 10f; + + } + + applySpeciesFrequencyRafaleAction.applyRafaleStep(length, true); + + } else { + + SoundEngine soundEngine = getContext().getSoundEngine(); + soundEngine.beepOnExternalDeviceErrorReception(); + + throw new ApplicationBusinessException(t("tutti.editSpeciesFrequencies.error.caliper.bad.record", record.getRecord())); + } + } + protected void listenItchtyometer() { // always remove the listener before adding it to be sure it will not be there twice @@ -945,7 +1014,17 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if (log.isInfoEnabled()) { log.info("Start listen ichtyometer"); } - getContext().getIchtyometerReader().addFeedModeReaderListener(feedReaderListener); + getContext().getIchtyometerReader().addFeedModeReaderListener(ichtyometerFeedReaderListener); + } + + protected void listenCaliper() { + + // always remove the listener before adding it to be sure it will not be there twice + getContext().getCaliperReader().removeAllFeedModeReaderListeners(); + if (log.isInfoEnabled()) { + log.info("Start listen caliper"); + } + getContext().getCaliperReader().addFeedModeReaderListener(caliperFeedReaderListener); } protected JComponent getComponentToFocus(FrequencyConfigurationMode mode) { @@ -995,7 +1074,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci protected void updateLogVisibility() { - boolean logVisible = getModel().isRafaleMode() || getContext().isIchtyometerConnected(); + boolean logVisible = getModel().isRafaleMode() || getContext().isIchtyometerConnected() || getContext().isCaliperConnected(); JSplitPane firstSplitPane = ui.getFirstSplitPane(); JSplitPane secondSplitPane = ui.getSecondSplitPane(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java index 95c61d1..9549035 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java @@ -163,7 +163,7 @@ public class ApplySpeciesFrequencyRafaleAction { String unit = model.getLengthStepCaracteristicUnit(); handler.showInformationMessage(t("tutti.editSpeciesFrequencies.addMeasure", step, aroundLengthStep, unit)); - soundEngine.beepOnIchtyometerDataReception(unit, aroundLengthStep); + soundEngine.beepOnExternalDeviceDataReception(unit, aroundLengthStep); } diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SoundEngine.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SoundEngine.java index 2edf69d..0d0326c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SoundEngine.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SoundEngine.java @@ -65,7 +65,7 @@ public class SoundEngine implements Closeable { thread.start(); } - public synchronized void beepOnIchtyometerDataReception(String unit, float aroundLengthStep) { + public synchronized void beepOnExternalDeviceDataReception(String unit, float aroundLengthStep) { if (configuration.isExternalDevicesDataReceptionBeepEnabled()) { soundsToPlay.add(configuration.getExternalDevicesDataReceptionBeepFrequency()); @@ -77,7 +77,7 @@ public class SoundEngine implements Closeable { } - public synchronized void beepOnIchtyometerErrorReception() { + public synchronized void beepOnExternalDeviceErrorReception() { if (configuration.isExternalDevicesErrorReceptionBeepEnabled()) { for (int i = 0; i < 3; i++) { diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 162529f..9f988e9 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -90,6 +90,12 @@ tutti.attachmentEditor.saveAttachment.title= tutti.attachmentEditor.simpleText= tutti.attachmentEditor.text= tutti.attachmentEditor.title= +tutti.caliper.connection.establish= +tutti.caliper.connection.establish.message= +tutti.caliper.connection.establish.title= +tutti.caliper.connection.stop= +tutti.caliper.status.connected.tip= +tutti.caliper.status.not.connected.tip= tutti.caracteristicMapEditor.none.tip= tutti.caracteristicMapEditorTable.table.header.key= tutti.caracteristicMapEditorTable.table.header.value= @@ -1581,6 +1587,7 @@ tutti.editSpeciesFrequencies.changeCopyMode.confirm.title= tutti.editSpeciesFrequencies.changeCopyRtpWeights.confirm.help= tutti.editSpeciesFrequencies.changeCopyRtpWeights.confirm.message= tutti.editSpeciesFrequencies.changeCopyRtpWeights.confirm.title= +tutti.editSpeciesFrequencies.error.caliper.bad.record= tutti.editSpeciesFrequencies.error.itchyometer.bad.record= tutti.editSpeciesFrequencies.error.length.doublon= tutti.editSpeciesFrequencies.error.notAvailableSamplingCode= @@ -2052,9 +2059,15 @@ tutti.main.action.changeLocaleUK.tip= tutti.main.action.configuration= tutti.main.action.configuration.mnemonic= tutti.main.action.configuration.tip= +tutti.main.action.connectCaliper= +tutti.main.action.connectCaliper.mnemonic= +tutti.main.action.connectCaliper.tip= tutti.main.action.connectIchtyometer= tutti.main.action.connectIchtyometer.mnemonic= tutti.main.action.connectIchtyometer.tip= +tutti.main.action.disconnectCaliper= +tutti.main.action.disconnectCaliper.mnemonic= +tutti.main.action.disconnectCaliper.tip= tutti.main.action.disconnectIchtyometer= tutti.main.action.disconnectIchtyometer.mnemonic= tutti.main.action.disconnectIchtyometer.tip= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index f855570..20e56fb 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -3,7 +3,6 @@ application.error.ui.business.warning= jaxx.application.action.create.error= jaxx.application.common.askBeforeDelete.help= swing.error.cannot.open.file=Aucun programme n'est défini pour ouvrir ce type de fichier. Enregistrez le fichier et ouvrez le en dehors de l'application -test= tutti.about.bottomText=Copyright %s - %s - version %s tutti.about.message=<h3>Allegro Campagne</h3><p><strong>Outil de saisie de données d'opérations et de captures au cours des campagnes halieutiques.</strong></p><br/><p>Ce logiciel permettra la saisie en mer des données d'opération de pêche (positions, environnement, engin, etc) et des captures associées (composition de la capture en espèces scientifiques avec poids, nombres, tailles etc) pour l'ensemble des campagnes halieutiques réalisées par l'Ifremer.</p><p>Ce projet a été initiée en [...] tutti.about.title=À propos d'Allegro Campagne @@ -73,6 +72,12 @@ tutti.attachmentEditor.saveAttachment.title=Enregistrer la pièce-jointe tutti.attachmentEditor.simpleText=Pièce(s) jointe(s) tutti.attachmentEditor.text=(%s) tutti.attachmentEditor.title=Pièces jointes +tutti.caliper.connection.establish=Connexion au pied à coulisse établie sur le port <strong>%s</strong> +tutti.caliper.connection.establish.message=<html><body>La connexion au pied à coulisse est établie sur le port <strong>%s</strong>.</body></html> +tutti.caliper.connection.establish.title=Connexion établie +tutti.caliper.connection.stop=Connexion au pied à coulisse arrêtée +tutti.caliper.status.connected.tip=<html><body>Le pied à coulisse est connecté sur le port <strong>%s</strong>.</body></html> +tutti.caliper.status.not.connected.tip=<html><body>Aucun pied à coulisse connecté.</body></html> tutti.caracteristicMapEditor.none.tip=Pas de caractéristiques tutti.caracteristicMapEditorTable.table.header.key=Caractéristique tutti.caracteristicMapEditorTable.table.header.value=Valeur @@ -125,10 +130,8 @@ tutti.config.action.reload.application=Recharger l'application tutti.config.action.reload.ui=Recharger l'interface graphique tutti.config.category.applications=Application tutti.config.category.applications.description=Application -tutti.config.category.externalDevices= -tutti.config.category.externalDevices.description= -tutti.config.category.ichtyometer=Ichtyomètre -tutti.config.category.ichtyometer.description=Ichtyomètre +tutti.config.category.externalDevices=Apprareils externes +tutti.config.category.externalDevices.description=Appareils de mesure externes (ichtyomètre, pied à coulisse) tutti.config.category.technical=Technique tutti.config.category.technical.description=Informations techniques tutti.config.category.ui=Interface utilisateur @@ -159,7 +162,7 @@ tutti.config.option.site.url.shortLabel=URL du site technique tutti.config.option.tmp.directory.shortLabel=Répertoire temporaire tutti.config.option.tremieCarousselVessel.shortLabel=Navire ayant un carrousel et une trémie tutti.config.option.ui.beepFrequency.shortLabel=Tonalité du bip -tutti.config.option.ui.caliperSerialPort.shortLabel= +tutti.config.option.ui.caliperSerialPort.shortLabel=Port série de connexion au pied à coulisse tutti.config.option.ui.color.alternateRow.shortLabel=Couleur alternée tutti.config.option.ui.color.benthos.shortLabel=Couleur des libellés de benthos (Écran Capture > Résumé) tutti.config.option.ui.color.blockingLayer.shortLabel=Couleur d'attente @@ -180,25 +183,18 @@ tutti.config.option.ui.config.file.shortLabel=Chemin du fichier de confirmation tutti.config.option.ui.coordinateEditorType.shortLabel=Formateur de coordonnées tutti.config.option.ui.dateFormat.shortLabel=Format des dates tutti.config.option.ui.db.import.skipBackup.shortLabel=Ne pas faire de sauvegarde avant un import de base -tutti.config.option.ui.externalDevicesDataBeepEnabled.shortLabel= -tutti.config.option.ui.externalDevicesDataBeepFrequency.shortLabel= -tutti.config.option.ui.externalDevicesErrorBeepEnabled.shortLabel= -tutti.config.option.ui.externalDevicesErrorBeepFrequency.shortLabel= -tutti.config.option.ui.externalDevicesReadsUnit.shortLabel= -tutti.config.option.ui.externalDevicesVoiceEnabled.shortLabel= +tutti.config.option.ui.externalDevicesDataBeepEnabled.shortLabel=Bip à la réception de mesures +tutti.config.option.ui.externalDevicesDataBeepFrequency.shortLabel=Tonalité de réception de données +tutti.config.option.ui.externalDevicesErrorBeepEnabled.shortLabel=Bip à la réception d'erreur +tutti.config.option.ui.externalDevicesErrorBeepFrequency.shortLabel=Tonalité de réception d'erreur +tutti.config.option.ui.externalDevicesReadsUnit.shortLabel=Lire l'unité à la réception d'une mesure (utilisée uniquement si la lecture vocale est active) +tutti.config.option.ui.externalDevicesVoiceEnabled.shortLabel=Lecture vocale des mesures reçues tutti.config.option.ui.fullBluetoothScan.shortLabel=Recherche complète des périphériques bluetooth tutti.config.option.ui.genericFormat.import.maximumRowsInErrorPerFile.shortLabel=Nombre maximum de lignes en erreur possible par fichier lors de la validation de l'import générique tutti.config.option.ui.genericFormat.import.skipBackup.shortLabel=Ne pas faire de sauvegarde avant un import au format générique -tutti.config.option.ui.ichtyometerDataBeepEnabled.shortLabel=Bip à la réception de mesures -tutti.config.option.ui.ichtyometerDataBeepFrequency.shortLabel=Tonalité de réception de données -tutti.config.option.ui.ichtyometerErrorBeepEnabled.shortLabel=Bip à la réception d'erreur -tutti.config.option.ui.ichtyometerErrorBeepFrequency.shortLabel=Tonalité de réception d'erreur tutti.config.option.ui.ichtyometerMaximumNumberOfAttemptToConnect.shortLabel=Nombre maximum de tentatives de connection à l'ichtyomètre -tutti.config.option.ui.ichtyometerReadsUnit.shortLabel=Lire l'unité à la réception d'une mesure (utilisée uniquement si la lecture vocale est active) -tutti.config.option.ui.ichtyometerVoiceEnabled.shortLabel=Lecture vocale des mesures reçues tutti.config.option.ui.individualObservationRowsToCreate.shortLabel=Nombre max de données individuelles tutti.config.option.ui.samplingCodePrefix.shortLabel=Préfixe du code de prélèvement -tutti.config.option.ui.samplingCodeSeparator.shortLabel=Séparator du code de prélèvement tutti.config.option.ui.showBatchLog.shortLabel=Voir la structure des lots dans les logs tutti.config.option.ui.showMemoryUsage.shortLabel=Voir l'utilisation de la mémoire tutti.config.option.update.application.url.shortLabel=URL de mise à jour des applicatifs @@ -1481,6 +1477,7 @@ tutti.editSpeciesFrequencies.changeCopyMode.confirm.title=Changement de mode de tutti.editSpeciesFrequencies.changeCopyRtpWeights.confirm.help=Que voulez-vous faire ?<ul><li><strong>Annuler</strong> pour ne pas copier les poids calculés via les RTP</li><li><strong>OK</strong> pour copier les poids calculés via les RTP et supprimer les données saisies</li></ul> tutti.editSpeciesFrequencies.changeCopyRtpWeights.confirm.message=Vous êtes sur le point de remplacer les poids saisis par les poids calculés via les RTP.<br/>Si vous les remplacez, les données saisies seront perdues. tutti.editSpeciesFrequencies.changeCopyRtpWeights.confirm.title=Copier les poids calculés via les RTP +tutti.editSpeciesFrequencies.error.caliper.bad.record=La mesure provenant du pied à coulisse n'est pas valide (la donnée est peut-être corrompue) \:<br/><ul><li>Enregistrement \: <strong>%s</strong></li><li>CRC \: <strong>%s</strong></li><li>CRC calculé \: <strong>%s</strong></li></ul> tutti.editSpeciesFrequencies.error.itchyometer.bad.record=La mesure provenant de l'ichtyomètre n'est pas valide (la donnée est peut-être corrompue) \:<br/><ul><li>Enregistrement \: <strong>%s</strong></li><li>CRC \: <strong>%s</strong></li><li>CRC calculé \: <strong>%s</strong></li></ul> tutti.editSpeciesFrequencies.error.length.doublon=La classe de taille <strong>%s</strong> est utilisée plusieurs fois (deuxième occurrence trouvée à la ligne <strong>%s</strong>), ce qui n'est pas autorisé.<hr/>Veuillez corriger cela pour pouvoir enregistrer les mensurations. tutti.editSpeciesFrequencies.error.notAvailableSamplingCode=Le code de prélèvement <strong>%s</strong> est déjà utilisé sur cette campagne; veuillez en choisir un autre. @@ -1904,9 +1901,15 @@ tutti.main.action.changeLocaleUK.tip=Passer en anglais tutti.main.action.configuration=Configuration tutti.main.action.configuration.mnemonic=C tutti.main.action.configuration.tip=Configurer l'application +tutti.main.action.connectCaliper=Connexion Pied à coulisse +tutti.main.action.connectCaliper.mnemonic=P +tutti.main.action.connectCaliper.tip=Se connecter à un pied à coulisse sur le port série défini dans la configuration tutti.main.action.connectIchtyometer=Connexion Ichtyomètre tutti.main.action.connectIchtyometer.mnemonic=y tutti.main.action.connectIchtyometer.tip=Se connecter à un ichtyomètre +tutti.main.action.disconnectCaliper=Déconnexion Pied à coulisse +tutti.main.action.disconnectCaliper.mnemonic=P +tutti.main.action.disconnectCaliper.tip=Se déconnecter du pied à coulisse tutti.main.action.disconnectIchtyometer=Déconnexion Ichtyomètre tutti.main.action.disconnectIchtyometer.mnemonic=y tutti.main.action.disconnectIchtyometer.tip=Se déconnecter de l'ichtyomètre -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm