This is an automated email from the git hooks/post-receive script. New commit to branch feature/6157 in repository tutti. See http://git.codelutin.com/tutti.git commit c1b24dcbb33bd7bc30ca44b3fb110867ce6945fc Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Dec 9 17:49:59 2014 +0100 fixes #6157: [BIGFIN] modifier le code pour s'adapter au DFS2 (new BigFin) --- .../tutti/ichtyometer/IchtyometerClient.java | 26 +++- .../RemoteDeviceCantGetNameException.java | 22 +++ .../ifremer/tutti/ichtyometer/feed/FeedReader.java | 50 ++++--- .../tutti/ichtyometer/feed/FeedReaderRecord.java | 166 --------------------- .../feed/{ => event}/FeedReaderEvent.java | 11 +- .../feed/{ => event}/FeedReaderListener.java | 2 +- .../feed/record/FeedReaderMeasureRecord.java | 57 +++++++ .../feed/record/FeedReaderRecordFactory.java | 72 +++++++++ .../feed/record/FeedReaderRecordSupport.java | 40 +++++ .../feed/record/FeedReaderStylusMotionRecord.java | 57 +++++++ .../tutti/ichtyometer/interactive/Command.java | 10 +- .../ichtyometer/interactive/CommandEngine.java | 16 +- .../tutti/ichtyometer/tool/CRCBuilderTool.java | 58 ------- .../tutti/ichtyometer/tool/FeedReaderTool.java | 6 +- .../tutti/ichtyometer/tool/SendCommandTool.java | 4 +- .../java/fr/ifremer/tutti/ichtyometer/BigFins.java | 43 ++++++ .../tutti/ichtyometer/IchtyometerClientTest.java | 17 +-- .../ichtyometer/feed/FeedReaderRecordTest.java | 64 -------- .../tutti/ichtyometer/feed/FeedReaderTest.java | 26 +--- .../ichtyometer/interactive/CommandEngineTest.java | 80 ++++++---- .../src/test/resources/log4j.properties | 2 +- .../frequency/SpeciesFrequencyUIHandler.java | 28 ++-- 22 files changed, 451 insertions(+), 406 deletions(-) diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/IchtyometerClient.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/IchtyometerClient.java index ee6465d..cfd45da 100644 --- a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/IchtyometerClient.java +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/IchtyometerClient.java @@ -310,17 +310,35 @@ public class IchtyometerClient implements Closeable { log.info("Device " + btDevice.getBluetoothAddress() + " found"); } + String friendlyName = getName(btDevice); + if (friendlyName == null) { + + // retry + friendlyName = getName(btDevice); + + } + + if (friendlyName == null) { + throw new RemoteDeviceCantGetNameException(btDevice.getBluetoothAddress()); + } + + devices.put(friendlyName, btDevice); + } + + protected String getName(RemoteDevice btDevice) { + String friendlyName = null; try { - String friendlyName = btDevice.getFriendlyName(false); + friendlyName = btDevice.getFriendlyName(false); if (log.isInfoEnabled()) { log.info("Name: " + friendlyName); } - devices.put(friendlyName, btDevice); } catch (IOException e) { - if (log.isErrorEnabled()) { - log.error("Can't get name of remote", e); + if (log.isDebugEnabled()) { + log.debug("Can't get name of remote", e); } + } + return friendlyName; } @Override diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/RemoteDeviceCantGetNameException.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/RemoteDeviceCantGetNameException.java new file mode 100644 index 0000000..08e3e9d --- /dev/null +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/RemoteDeviceCantGetNameException.java @@ -0,0 +1,22 @@ +package fr.ifremer.tutti.ichtyometer; + +/** + * Created on 12/9/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.9 + */ +public class RemoteDeviceCantGetNameException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + private final String deviceId; + + public RemoteDeviceCantGetNameException(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceId() { + return deviceId; + } +} diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReader.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReader.java index 10340ae..2ed61ee 100644 --- a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReader.java +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReader.java @@ -25,6 +25,11 @@ package fr.ifremer.tutti.ichtyometer.feed; import com.google.common.base.Preconditions; import com.google.common.io.Closeables; import fr.ifremer.tutti.ichtyometer.IchtyometerClient; +import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderEvent; +import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderListener; +import fr.ifremer.tutti.ichtyometer.feed.record.FeedReaderMeasureRecord; +import fr.ifremer.tutti.ichtyometer.feed.record.FeedReaderRecordFactory; +import fr.ifremer.tutti.ichtyometer.feed.record.FeedReaderRecordSupport; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -62,8 +67,16 @@ public class FeedReader implements Closeable { */ protected final EventListenerList listenerList; + /** + * To generate some feed record from the rax record send by the board. + * + * @since 3.10 + */ + protected final FeedReaderRecordFactory recordFactory; + public FeedReader() { listenerList = new EventListenerList(); + recordFactory = new FeedReaderRecordFactory(); } public void start(IchtyometerClient client) throws IOException { @@ -147,15 +160,16 @@ public class FeedReader implements Closeable { try { // get a new record - FeedReaderRecord readerRecord = readRecord(dataInputStream); + FeedReaderRecordSupport readerRecord = readRecord(dataInputStream); - if (!stop) { + if (!stop && readerRecord != null && readerRecord instanceof FeedReaderMeasureRecord) { // send new record to listeners - FeedReaderEvent e = new FeedReaderEvent(FeedReader.this, readerRecord); + FeedReaderEvent e = new FeedReaderEvent(FeedReader.this, (FeedReaderMeasureRecord) readerRecord); for (FeedReaderListener listener : listenerList.getListeners(FeedReaderListener.class)) { listener.recordRead(e); } + } } catch (IOException e) { if (log.isErrorEnabled()) { @@ -169,10 +183,11 @@ public class FeedReader implements Closeable { } } - protected FeedReaderRecord readRecord(DataInputStream dataInputStream) throws IOException { + protected FeedReaderRecordSupport readRecord(DataInputStream dataInputStream) throws IOException { + String result = ""; - // wait until got a @ + // wait until got a # boolean complete = false; @@ -182,36 +197,35 @@ public class FeedReader implements Closeable { break; } while (dataInputStream.available() > 0) { - if (stop) { + if (complete || stop) { break; } int c = dataInputStream.read(); - if (c == '@') { + result += (char) c; - complete = true; - } else { + if ('#' == (char) c) { - result += (char) c; + complete = true; } } } - FeedReaderRecord readerRecord = null; + FeedReaderRecordSupport readerRecord = null; if (!stop) { - int lastComma = result.lastIndexOf(','); - result = result.substring(0, lastComma); - lastComma = result.lastIndexOf(',')+1; - String record = result.substring(0, lastComma); - String crc = result.substring(lastComma); + if (log.isInfoEnabled()) { + log.info("New raw record: " + result); + } + readerRecord = recordFactory.newRecord(result); if (log.isDebugEnabled()) { - log.debug(String.format("Record: %s / %s", record, crc)); + log.debug("New feed record: " + readerRecord); } - readerRecord = new FeedReaderRecord(record, crc); + } + return readerRecord; } } diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecord.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecord.java deleted file mode 100644 index edee1f3..0000000 --- a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecord.java +++ /dev/null @@ -1,166 +0,0 @@ -package fr.ifremer.tutti.ichtyometer.feed; - -/* - * #%L - * Tutti :: Ichtyometer API - * %% - * 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 org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * Record_id,length(mm),weight(g),species,cruise,station,pan,Dt,sz class,gender,text, - * <p/> - * Created on 1/24/14. - * - * @author Tony Chemit <chemit@codelutin.com> - * @since 3.1 - */ -public class FeedReaderRecord { - - /** Logger. */ - private static final Log log = LogFactory.getLog(FeedReaderRecord.class); - - /** - * Incoming raw record. - */ - protected final String record; - - /** - * Incoming crc. - */ - protected final String crc; - - /** - * Our computed crc. - */ - protected final String computedCrc; - - /** - * Extracted length (the first data of the record). - */ - protected final Float length; - - /** - * Computed valid flag (if crc == computedCrc and length != null). - */ - protected final boolean valid; - - public FeedReaderRecord(String record, String crc) { - this.record = record; - this.crc = crc; - this.computedCrc = computeCRC(record); - this.length = computeLength(record); - - //FIXME Uncomment when computedCrc will be ok - this.valid = length != null; /*&& crc.equals(computedCrc);*/ - } - - public boolean isValid() { - return valid; - } - - public String getRecord() { - return record; - } - - public String getCrc() { - return crc; - } - - public String getComputedCrc() { - return computedCrc; - } - - public Float getLength() { - return length; - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("record", record) - .append("crc", crc) - .append("computedCrc", computedCrc) - .append("valid", valid) - .append("length", length) - .toString(); - } - - public static String computeCRC(String record) { - - // use long because int are signed and add doesn't work correctly - long checksum = 0; - - // to keep using 4 octets (32bites) - long mask = 0b0000000000000000000000000000000011111111111111111111111111111111L; - - for (int i = 0, recordLength = record.length(); i < recordLength; i++) { - - // keep only the first 32 bites - checksum = checksum & mask; - - // get msb bite value - long msb = checksum >> 31; - - log.debug(String.format("i=%4d char=%s(int:%3d) incoming checksum=%10d msb=%d bits=%33s", i, record.charAt(i), (int) record.charAt(i), checksum, msb, Long.toBinaryString(checksum))); - - // logical shift left - checksum <<= 1; - log.debug(String.format("After lef shift : %33s", Long.toBinaryString(checksum))); - - // rotates msb to lsb - checksum += msb; - log.debug(String.format("After add smb : %33s", Long.toBinaryString(checksum))); - - // add new caracter - checksum += record.charAt(i); - log.debug(String.format("After add car : %33s", Long.toBinaryString(checksum))); - } - - // get a hexadecimal on 32bites -> 8 hexadecimal caracters - String hex = Long.toHexString(checksum).toUpperCase(); - log.debug("checksum= " + checksum); - return hex; - } - - protected Float computeLength(String record) { - Float length; - try { - String[] cells = record.split("\\s*,\\s*"); - // first cell is the record number, second one is the length - String lengthCell = cells[1]; - // remove any spaces - lengthCell = lengthCell.replaceAll("\\s*", ""); - - // remove any starting 0 - lengthCell = lengthCell.replaceAll("^0*", ""); - - length = Float.valueOf(lengthCell); - } catch (Exception e) { - if (log.isErrorEnabled()) { - log.error("Could not get length from " + record, e); - } - length = null; - } - return length; - } -} diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderEvent.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/event/FeedReaderEvent.java similarity index 76% rename from tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderEvent.java rename to tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/event/FeedReaderEvent.java index b4161b6..21f61d3 100644 --- a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderEvent.java +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/event/FeedReaderEvent.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.ichtyometer.feed; +package fr.ifremer.tutti.ichtyometer.feed.event; /* * #%L @@ -22,6 +22,9 @@ package fr.ifremer.tutti.ichtyometer.feed; * #L% */ +import fr.ifremer.tutti.ichtyometer.feed.FeedReader; +import fr.ifremer.tutti.ichtyometer.feed.record.FeedReaderMeasureRecord; + import java.util.EventObject; /** @@ -34,9 +37,9 @@ public class FeedReaderEvent extends EventObject { private static final long serialVersionUID = 1L; - protected final FeedReaderRecord record; + protected final FeedReaderMeasureRecord record; - public FeedReaderEvent(FeedReader source, FeedReaderRecord record) { + public FeedReaderEvent(FeedReader source, FeedReaderMeasureRecord record) { super(source); this.record = record; } @@ -46,7 +49,7 @@ public class FeedReaderEvent extends EventObject { return (FeedReader) super.getSource(); } - public FeedReaderRecord getRecord() { + public FeedReaderMeasureRecord getRecord() { return record; } } diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderListener.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/event/FeedReaderListener.java similarity index 95% rename from tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderListener.java rename to tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/event/FeedReaderListener.java index c1313dd..8bbdae2 100644 --- a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderListener.java +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/event/FeedReaderListener.java @@ -1,4 +1,4 @@ -package fr.ifremer.tutti.ichtyometer.feed; +package fr.ifremer.tutti.ichtyometer.feed.event; /* * #%L diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/record/FeedReaderMeasureRecord.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/record/FeedReaderMeasureRecord.java new file mode 100644 index 0000000..8f1f225 --- /dev/null +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/record/FeedReaderMeasureRecord.java @@ -0,0 +1,57 @@ +package fr.ifremer.tutti.ichtyometer.feed.record; + +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>. + * + * Created on 12/9/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public class FeedReaderMeasureRecord extends FeedReaderRecordSupport { + + 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(); + + } + + protected final int measure; + + FeedReaderMeasureRecord(String record) { + super(record); + Matcher matcher = RECORD_PATTERN.matcher(record); + matcher.find(); + String measureStr = matcher.group(1); + measure = Integer.valueOf(measureStr); + } + + public int getMeasure() { + return measure; + } + + @Override + public boolean isValid() { + return acceptRecord(record); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("record", measure) + .append("measure", measure) + .toString(); + } +} diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/record/FeedReaderRecordFactory.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/record/FeedReaderRecordFactory.java new file mode 100644 index 0000000..cf07f47 --- /dev/null +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/record/FeedReaderRecordFactory.java @@ -0,0 +1,72 @@ +package fr.ifremer.tutti.ichtyometer.feed.record; + +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Created on 12/9/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public class FeedReaderRecordFactory { + + protected final Set<FeedReaderRecordAceptor> acceptors; + + public FeedReaderRecordFactory() { + acceptors = new LinkedHashSet<>(); + acceptors.add(new FeedReaderRecordAceptor<FeedReaderStylusMotionRecord>() { + @Override + public boolean accept(String record) { + return FeedReaderStylusMotionRecord.acceptRecord(record); + } + + @Override + public FeedReaderStylusMotionRecord newRecord(String record) { + return new FeedReaderStylusMotionRecord(record); + } + }); + acceptors.add(new FeedReaderRecordAceptor<FeedReaderMeasureRecord>() { + @Override + public boolean accept(String record) { + return FeedReaderMeasureRecord.acceptRecord(record); + } + + @Override + public FeedReaderMeasureRecord newRecord(String record) { + return new FeedReaderMeasureRecord(record); + } + }); + + } + + public FeedReaderRecordSupport newRecord(String record) { + + FeedReaderRecordSupport feedRecord = null; + + for (FeedReaderRecordAceptor acceptor : acceptors) { + + boolean accept = acceptor.accept(record); + if (accept) { + + feedRecord = acceptor.newRecord(record); + break; + + } + + } + + return feedRecord; + + } + + protected static interface FeedReaderRecordAceptor<F extends FeedReaderRecordSupport> { + + boolean accept(String record); + + + F newRecord(String record); + + } + +} diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/record/FeedReaderRecordSupport.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/record/FeedReaderRecordSupport.java new file mode 100644 index 0000000..93134d9 --- /dev/null +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/record/FeedReaderRecordSupport.java @@ -0,0 +1,40 @@ +package fr.ifremer.tutti.ichtyometer.feed.record; + +import com.google.common.base.Preconditions; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import java.io.Serializable; + +/** + * Created on 12/9/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public abstract class FeedReaderRecordSupport implements Serializable{ + + private static final long serialVersionUID = 1L; + + /** + * Incoming raw record. + */ + protected final String record; + + protected FeedReaderRecordSupport(String record) { + this.record = record; + Preconditions.checkState(isValid()); + } + + public abstract boolean isValid(); + + public String getRecord() { + return record; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("record", record) + .toString(); + } +} diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/record/FeedReaderStylusMotionRecord.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/record/FeedReaderStylusMotionRecord.java new file mode 100644 index 0000000..7674bf0 --- /dev/null +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/feed/record/FeedReaderStylusMotionRecord.java @@ -0,0 +1,57 @@ +package fr.ifremer.tutti.ichtyometer.feed.record; + +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>. + * + * Created on 12/9/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.10 + */ +public class FeedReaderStylusMotionRecord extends FeedReaderRecordSupport { + + 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; + + FeedReaderStylusMotionRecord(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(); + } +} diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/interactive/Command.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/interactive/Command.java index e1bc964..6afe372 100644 --- a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/interactive/Command.java +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/interactive/Command.java @@ -36,19 +36,19 @@ public class Command implements Serializable { private static final long serialVersionUID = 1L; - protected final char question; + protected final String question; protected final String response; protected final String crc; - public Command(char question, String response, String crc) { + public Command(String question, String response, String crc) { this.question = question; this.response = response; this.crc = crc; } - public char getQuestion() { + public String getQuestion() { return question; } @@ -76,14 +76,14 @@ public class Command implements Serializable { Command command = (Command) o; - return question == command.question && response.equals(command.response) && + return question.equals(command.question) && response.equals(command.response) && !(crc != null ? !crc.equals(command.crc) : command.crc != null); } @Override public int hashCode() { - int result = (int) question; + int result = question.hashCode(); result = 31 * result + response.hashCode(); result = 31 * result + (crc != null ? crc.hashCode() : 0); return result; diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/interactive/CommandEngine.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/interactive/CommandEngine.java index 2db220f..ad8564d 100644 --- a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/interactive/CommandEngine.java +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/interactive/CommandEngine.java @@ -94,7 +94,8 @@ public class CommandEngine { Closeables.close(client, true); } - public Command sendCommand(char question) throws IOException { + public Command sendCommand(String question) throws IOException { + Preconditions.checkNotNull(question, "command can not be null"); Callable<Command> call = new CommandCallable(question, dataInputStream, dataOutputStream); @@ -113,13 +114,13 @@ public class CommandEngine { protected static class CommandCallable implements Callable<Command> { - protected char question; + protected String question; protected DataInputStream dataInputStream; protected DataOutputStream dataOutputStream; - protected CommandCallable(char question, + protected CommandCallable(String question, DataInputStream dataInputStream, DataOutputStream dataOutputStream) { @@ -132,11 +133,11 @@ public class CommandEngine { public Command call() throws Exception { // send question - dataOutputStream.writeChar(question); + dataOutputStream.writeChars(question); StringBuilder responseBuilder = new StringBuilder(); - boolean responseComplete = question == 'g'; + boolean responseComplete = false; while (!responseComplete) { @@ -150,10 +151,13 @@ public class CommandEngine { // end of line responseBuilder.append('\n'); break; - case '@': + case '#': // sentinel car responseComplete = true; + + // still add the sentinel char to response + responseBuilder.append((char) c); break; default: // add caracter to response diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/tool/CRCBuilderTool.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/tool/CRCBuilderTool.java deleted file mode 100644 index c9edf05..0000000 --- a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/tool/CRCBuilderTool.java +++ /dev/null @@ -1,58 +0,0 @@ -package fr.ifremer.tutti.ichtyometer.tool; - -/* - * #%L - * Tutti :: Ichtyometer API - * %% - * 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.ichtyometer.feed.FeedReaderRecord; - -import java.io.Console; -import java.io.PrintWriter; - -/** - * Created on 1/30/14. - * - * @author Tony Chemit <chemit@codelutin.com> - * @since 3.2 - */ -public class CRCBuilderTool { - - public static void main(String[] args) { - - Console console = System.console(); - PrintWriter writer = console.writer(); - writer.println("CRCBuilderTool: to build CRC code v1.0"); - - while (true) { - - writer.print("Enter new record (or q to quit): "); - writer.flush(); - String command = console.readLine(); - - if ("q".equals(command)) { - break; - } - - String crc = FeedReaderRecord.computeCRC(command); - writer.println("CRC= " + crc); - } - } -} diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/tool/FeedReaderTool.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/tool/FeedReaderTool.java index a71280e..901dc4a 100644 --- a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/tool/FeedReaderTool.java +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/tool/FeedReaderTool.java @@ -26,8 +26,8 @@ import com.google.common.collect.Lists; import fr.ifremer.tutti.ichtyometer.IchtyometerClient; import fr.ifremer.tutti.ichtyometer.RemoteDeviceChooser; import fr.ifremer.tutti.ichtyometer.feed.FeedReader; -import fr.ifremer.tutti.ichtyometer.feed.FeedReaderEvent; -import fr.ifremer.tutti.ichtyometer.feed.FeedReaderListener; +import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderEvent; +import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderListener; import java.io.Console; import java.io.IOException; @@ -43,7 +43,7 @@ import java.util.Set; */ public class FeedReaderTool { - public static void main(String[] args) throws IOException { + public static void main(String... args) throws IOException { final PrintWriter writer = System.console().writer(); writer.println("FeedReaderTool: to display record in feed mode v1.0"); diff --git a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/tool/SendCommandTool.java b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/tool/SendCommandTool.java index 95c745a..8983978 100644 --- a/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/tool/SendCommandTool.java +++ b/tutti-ichtyometer/src/main/java/fr/ifremer/tutti/ichtyometer/tool/SendCommandTool.java @@ -51,7 +51,7 @@ public class SendCommandTool { a, b, c, d, e, g, q } - public static void main(String[] args) throws IOException { + public static void main(String... args) throws IOException { final Console console = System.console(); final PrintWriter writer = console.writer(); @@ -112,7 +112,7 @@ public class SendCommandTool { break; default: try { - Command sendCommand = reader.sendCommand(checkCommand.name().charAt(0)); + Command sendCommand = reader.sendCommand(checkCommand.name()); writer.println(String.format( "------------------------------------------------------------------------------\n%s" + "\n------------------------------------------------------------------------------", sendCommand.getResponse())); diff --git a/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/BigFins.java b/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/BigFins.java new file mode 100644 index 0000000..3f71f9f --- /dev/null +++ b/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/BigFins.java @@ -0,0 +1,43 @@ +package fr.ifremer.tutti.ichtyometer; + +import org.junit.Assume; + +import java.util.Set; + +/** + * Created on 12/9/14. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 3.9 + */ +public class BigFins { + + private static final String BIG_FIN_V2_NAME_PREFIX = "BigFin DFS/2-"; + + public static void open(IchtyometerClient client) { + + RemoteDeviceChooser remoteDeviceChooser = new RemoteDeviceChooser() { + @Override + public String chooseRemoteDevice(Set<String> remoteDeviceNames) { + String result = null; + for (String remoteDeviceName : remoteDeviceNames) { + if (remoteDeviceName.startsWith(BIG_FIN_V2_NAME_PREFIX)) { + result = remoteDeviceName; + break; + } + } + return result; + } + }; + + try { + client.open(remoteDeviceChooser, true); + + } catch (Exception e) { + Assume.assumeTrue("Could not connect to remote device", true); + } + + Assume.assumeTrue("No device found!", client.isOpen()); + + } +} diff --git a/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/IchtyometerClientTest.java b/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/IchtyometerClientTest.java index bcbdc18..aeb93cb 100644 --- a/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/IchtyometerClientTest.java +++ b/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/IchtyometerClientTest.java @@ -22,11 +22,9 @@ package fr.ifremer.tutti.ichtyometer; * #L% */ -import org.junit.Assume; import org.junit.Test; import java.io.IOException; -import java.util.Set; /** * To test {@link IchtyometerClient}. @@ -41,19 +39,10 @@ public class IchtyometerClientTest { @Test public void connect() throws IOException, InterruptedException { - RemoteDeviceChooser remoteDeviceChooser = new RemoteDeviceChooser() { - @Override - public String chooseRemoteDevice(Set<String> remoteDeviceNames) { - return remoteDeviceNames.contains("10MF1-E651") ? "10MF1-E651" : null; - } - }; - IchtyometerClient client = new IchtyometerClient(); - try { - client.open(remoteDeviceChooser, true); - client.close(); - } catch (IOException e) { - Assume.assumeTrue("Could not connect to remote device", true); + try (IchtyometerClient client = new IchtyometerClient()) { + BigFins.open(client); } + } diff --git a/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecordTest.java b/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecordTest.java deleted file mode 100644 index e459351..0000000 --- a/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderRecordTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package fr.ifremer.tutti.ichtyometer.feed; - -/* - * #%L - * Tutti :: Ichtyometer API - * %% - * 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.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.junit.Assert; -import org.junit.Test; - -import java.math.BigInteger; - -/** - * Created on 1/24/14. - * - * @author Tony Chemit <chemit@codelutin.com> - * @since 3.1 - */ -public class FeedReaderRecordTest { - - /** Logger. */ - private static final Log log = LogFactory.getLog(FeedReaderRecordTest.class); - - @Test - public void testComputeCRC() throws Exception { - - testRecord("000050, 00167, 000000,3D,TED,150,DON,02/05/14 10:01, 02,Not set,,", "A4F4F841", 167f); - testRecord(" 000050, 00167, 000000,3D,TED,150,DON,02/05/14 10:01, 02,Not set,,", "A4F4F841", 167f); - testRecord("000051, 00665, 000000,3D,TED,150,DON,02/05/14 10:01, 02,Not set,,", "C974F841", 665f); - testRecord("000052, 00548, 000000,3D,TED,150,DON,02/05/14 10:01, 02,Not set,,", "E834F841", 548f); - } - - protected void testRecord(String record, String expectedCRC, Float expectedLength) { - - FeedReaderRecord feedReaderRecord = new FeedReaderRecord(record, expectedCRC); - String actualCRC = feedReaderRecord.getComputedCrc(); - if (log.isInfoEnabled()) { - log.info("incoming CRC: " + expectedCRC + " (" + new BigInteger(expectedCRC, 16) + ") -- computed CRC: " + actualCRC + " (" + new BigInteger(actualCRC, 16) + ")"); - } - Assert.assertEquals("Bad computed length for " + record, expectedLength, feedReaderRecord.getLength()); - //FIXME Uncommnet this when computed CRC will be ok -// Assert.assertEquals("Bad computed CRC for "+record, expectedCRC, feedReaderRecord.getComputedCrc()); - Assert.assertTrue("Bad valid flag for " + record, feedReaderRecord.isValid()); - } -} diff --git a/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderTest.java b/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderTest.java index b504b59..73c88c6 100644 --- a/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderTest.java +++ b/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/feed/FeedReaderTest.java @@ -22,18 +22,18 @@ package fr.ifremer.tutti.ichtyometer.feed; * #L% */ +import fr.ifremer.tutti.ichtyometer.BigFins; import fr.ifremer.tutti.ichtyometer.IchtyometerClient; -import fr.ifremer.tutti.ichtyometer.RemoteDeviceChooser; +import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderEvent; +import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; -import org.junit.Assume; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import java.io.IOException; -import java.util.Set; /** * Created on 1/24/14. @@ -47,30 +47,14 @@ public class FeedReaderTest { /** Logger. */ private static final Log log = LogFactory.getLog(FeedReaderTest.class); - private static final String BIG_FIN_V1_NAME = "10MF1-E651"; - - private static final String BIG_FIN_V2_NAME = "BigFin DFS/2-9F20"; - - private final String BIG_FIN_NAME = BIG_FIN_V2_NAME; - protected IchtyometerClient client; @Before public void setUp() throws Exception { - RemoteDeviceChooser remoteDeviceChooser = new RemoteDeviceChooser() { - @Override - public String chooseRemoteDevice(Set<String> remoteDeviceNames) { - return remoteDeviceNames.contains(BIG_FIN_NAME) ? BIG_FIN_NAME : null; - } - }; - client = new IchtyometerClient(); - try { - client.open(remoteDeviceChooser, true); - } catch (IOException e) { - Assume.assumeTrue("Could not connect to remote device", false); - } + BigFins.open(client); + } @After diff --git a/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/interactive/CommandEngineTest.java b/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/interactive/CommandEngineTest.java index 6aee00f..95db3dd 100644 --- a/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/interactive/CommandEngineTest.java +++ b/tutti-ichtyometer/src/test/java/fr/ifremer/tutti/ichtyometer/interactive/CommandEngineTest.java @@ -22,19 +22,17 @@ package fr.ifremer.tutti.ichtyometer.interactive; * #L% */ +import fr.ifremer.tutti.ichtyometer.BigFins; import fr.ifremer.tutti.ichtyometer.IchtyometerClient; -import fr.ifremer.tutti.ichtyometer.RemoteDeviceChooser; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; import org.junit.Assert; -import org.junit.Assume; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import java.io.IOException; -import java.util.Set; /** * Created on 1/28/14. @@ -45,31 +43,59 @@ import java.util.Set; @Ignore public class CommandEngineTest { + /* + Commands to all Fishboards +a# (presence check)- Response: %a:e# +b# (board identify) - Response: %b:T,V,rU,rT# where + T is board type: 10MF1, 10MF2, DFS/2 + V is firmware version numeric, lowest 2 digits are minor (i.e. 102 = v1.02) + rU is fish records used + rT is fish records total +e# (environmental data) - + Response: %e:fn1,fn2,..<cr> e1f1,e1f2,...<cr>e2f1,e2f2,...,<cr>#<cr> + Where + fn1 is environmental field name 1, etc. + e1f1 is environmental record 1 field 1 value + e1f2 is environmental record 1 field 2 value, etc. +%h,ver (download firmware) + This begins an interactive series of transactions between the host and board. + +Commands to DFS/2 and 10MF1-Dolphin Only + + +&1mm,v# (specify cal point 1 location) (no response) +&2mm,v# (specify cal point 2 location) (no response) + These commands send the calibration positions (v, in mm)to the board +&1r# (request raw cal point 1 value) - Response: &1c,v# +&2r# (request raw cal point 2 value) - Response &2c,v# + These commands request a raw measurement value from the board. The board waits for the user to touch the stylus, yielding "v" - the raw sensor value, which is then communicated to the host. +&ca# (request cal mode) (no response) - this doesn't cause any behavior on the board +&cr,m1,m2,raw1,raw2# (restore calibration) (no response) + This causes the board to internally calibrate based on the points (m1, raw1) and (m2, raw2) specified by the host. The board is then internally in the "calibrated" state, allowing it to transmit length messages (see next section). + +Messages from DFS/2 and 10MF1-Dolphin to host + +These messages are sent on a user-triggered basis; the host does not poll for them, but must be ready to receive them. +%t,v# (stylus up/down) - no response expected from host + If v is 0, then the board is saying that the stylus is "down" on the sensor + If v is 1, then the board is saying that the stylus is "up" off of the sensor +%l,v# (sensor position taken) - no response expected from host + v is the position in mm where the stylus was touched. Delays and multiple samples (selected for by the &m command above) are applied before the reading is taken and the message is sent. This message is usually sandwiched between%t messages. + + */ + /** Logger. */ private static final Log log = LogFactory.getLog(CommandEngineTest.class); - IchtyometerClient client; + protected IchtyometerClient client; @Before public void setUp() throws Exception { - RemoteDeviceChooser remoteDeviceChooser = new RemoteDeviceChooser() { + client = new IchtyometerClient(); - @Override - public String chooseRemoteDevice(Set<String> remoteDeviceNames) { - return remoteDeviceNames.contains("10MF1-E651") ? "10MF1-E651" : null; - } - }; + BigFins.open(client); - client = new IchtyometerClient(); - try { - client.open(remoteDeviceChooser, true); - } catch (IOException e) { - if (log.isErrorEnabled()) { - log.error("Could not connect to bigfin", e); - } - Assume.assumeTrue("Could not connect to remote device", false); - } } @After @@ -78,6 +104,7 @@ public class CommandEngineTest { if (client != null) { client.close(); } + } @Test @@ -90,18 +117,16 @@ public class CommandEngineTest { if (log.isInfoEnabled()) { log.info("Engine is ready let's ask some questions now..."); } - assertCommand(commandEngine.sendCommand('a'), 'a', "e"); - assertCommand(commandEngine.sendCommand('b'), 'b', "10MF1,153,31,13824"); - assertCommand(commandEngine.sendCommand('c'), 'c', "Record_id,length(mm),weight(g),species,cruise,station,pan,Dt,sz class,gender,text,"); - assertCommand(commandEngine.sendCommand('d'), 'd', "b"); - assertCommand(commandEngine.sendCommand('e'), 'e', "b"); - assertCommand(commandEngine.sendCommand('g'), 'g', "b"); -// assertCommand(commandEngine.sendCommand('f'), 'f', "b"); + assertCommand(commandEngine, "a#", "%a:e#"); + assertCommand(commandEngine, "b#", "%b:DFS/2,212,0,13824,26270#"); + assertCommand(commandEngine, "e#", "%e:time,tempC,relHumid,..."); commandEngine.stop(); } - protected void assertCommand(Command actual, char question, String response) { + protected void assertCommand(CommandEngine commandEngine, String question, String response) throws IOException { + + Command actual = commandEngine.sendCommand(question); if (log.isInfoEnabled()) { log.info("Actual command: " + actual); @@ -109,7 +134,6 @@ public class CommandEngineTest { } Assert.assertEquals("Expect question " + question + ", but had " + actual.getQuestion(), question, actual.getQuestion()); -// Assert.assertEquals("Expect " + response + ", but had " + actual.getResponse(), response, actual.getResponse()); } diff --git a/tutti-ichtyometer/src/test/resources/log4j.properties b/tutti-ichtyometer/src/test/resources/log4j.properties index 1dd9159..bf20f12 100644 --- a/tutti-ichtyometer/src/test/resources/log4j.properties +++ b/tutti-ichtyometer/src/test/resources/log4j.properties @@ -28,4 +28,4 @@ log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d %-4r [%t] %-5p %c %x - %m%n log4j.logger.javax.bluetooth=DEBUG -#log4j.logger.fr.ifremer.tutti.ichtyometer.feed.FeedReaderRecord=DEBUG +#log4j.logger.fr.ifremer.tutti.ichtyometer.feed=DEBUG 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 2c264ee..782a1ed 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 @@ -25,9 +25,9 @@ package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import fr.ifremer.tutti.ichtyometer.feed.FeedReaderEvent; -import fr.ifremer.tutti.ichtyometer.feed.FeedReaderListener; -import fr.ifremer.tutti.ichtyometer.feed.FeedReaderRecord; +import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderEvent; +import fr.ifremer.tutti.ichtyometer.feed.event.FeedReaderListener; +import fr.ifremer.tutti.ichtyometer.feed.record.FeedReaderMeasureRecord; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol; @@ -63,8 +63,13 @@ import org.jfree.data.xy.XYSeriesCollection; import org.nuiton.jaxx.application.ApplicationBusinessException; import org.nuiton.jaxx.application.swing.util.Cancelable; -import javax.swing.*; -import java.awt.*; +import javax.swing.JComponent; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JSplitPane; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; +import java.awt.BorderLayout; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; @@ -109,6 +114,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci protected final FeedReaderListener feedReaderListener; public SpeciesFrequencyUIHandler() { + super(SpeciesFrequencyRowModel.PROPERTY_LENGTH_STEP, SpeciesFrequencyRowModel.PROPERTY_NUMBER, SpeciesFrequencyRowModel.PROPERTY_WEIGHT); @@ -118,7 +124,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci @Override public void recordRead(FeedReaderEvent event) { - final FeedReaderRecord record = event.getRecord(); + final FeedReaderMeasureRecord record = event.getRecord(); SwingUtilities.invokeLater( new Runnable() { @@ -845,6 +851,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci /** * Decrement the frequency of the lengthstep of the row + * * @param logRow */ public void decrementLengthStep(SpeciesFrequencyLogRowModel logRow) { @@ -869,7 +876,7 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci //-- Internal methods --// //------------------------------------------------------------------------// - protected void consumeFeedRecord(FeedReaderRecord record) { + protected void consumeFeedRecord(FeedReaderMeasureRecord record) { if (record.isValid()) { String unit = getModel().getLengthStepCaracteristicUnit(); @@ -881,20 +888,19 @@ public class SpeciesFrequencyUIHandler extends AbstractTuttiTableUIHandler<Speci if ("mm".equals(unit)) { // measurement in mm asked - length = record.getLength(); + length = record.getMeasure(); } else { // measurement in cm asked - length = record.getLength() / 10; + length = record.getMeasure() / 10; } applyRafaleStep(length, true); } else { throw new ApplicationBusinessException( - t("tutti.editSpeciesFrequencies.error.itchyometer.bad.record", - record.getRecord(), record.getCrc(), record.getComputedCrc())); + t("tutti.editSpeciesFrequencies.error.itchyometer.bad.record", record.getRecord())); } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.