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 0ad86dc1263c7303e33d2f5c90bbb226effef4f3 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 | 92 ++++++++++++++++++++-- .../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, 342 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 748691b..99cf0a8 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 f05ea82..2558ac3 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 @@ -128,7 +128,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; @@ -149,7 +153,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) { @@ -160,7 +164,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); } } ); @@ -524,7 +546,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); @@ -609,6 +636,13 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci } + if (getContext().isCaliperConnected()) { + + // let's listen the caliper + listenCaliper(); + + } + model.setModify(false); } @@ -914,7 +948,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(); @@ -940,12 +974,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 @@ -953,7 +1019,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) { @@ -992,7 +1068,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 d10a1f5..a77cd37 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 @@ -114,7 +114,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 1038958..9722252 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= @@ -2053,9 +2060,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 b18f4c2..dcb5904 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>.