From fc5a2de4b335ace4698822bda030147584fe698f Mon Sep 17 00:00:00 2001 From: Dale Schultz Date: Wed, 21 Jan 2015 22:56:14 -0500 Subject: [PATCH] Implement endian processing for ECU data converter defined in logger definition --- .../tableaxis/TableAxisQueryParameterSet.java | 7 +- .../definition/EcuParameterConvertorImpl.java | 73 +++++++++++++------ .../xml/LoggerDefinitionHandler.java | 16 +++- 3 files changed, 71 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/romraider/logger/ecu/comms/learning/tableaxis/TableAxisQueryParameterSet.java b/src/main/java/com/romraider/logger/ecu/comms/learning/tableaxis/TableAxisQueryParameterSet.java index a08bc0b4..7025b35a 100644 --- a/src/main/java/com/romraider/logger/ecu/comms/learning/tableaxis/TableAxisQueryParameterSet.java +++ b/src/main/java/com/romraider/logger/ecu/comms/learning/tableaxis/TableAxisQueryParameterSet.java @@ -1,6 +1,6 @@ /* * RomRaider Open-Source Tuning, Logging and Reflashing - * Copyright (C) 2006-2014 RomRaider.com + * Copyright (C) 2006-2015 RomRaider.com * * 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 @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import com.romraider.Settings; import com.romraider.logger.ecu.comms.query.EcuQuery; import com.romraider.logger.ecu.comms.query.EcuQueryImpl; import com.romraider.logger.ecu.definition.EcuAddress; @@ -50,6 +51,7 @@ public class TableAxisQueryParameterSet { * @param expression - the equation to convert byte data to a real number. * @param units - the value's unit of measure. * @param size - the length of the Table's axis. + * @param endian - the data endian. * @return a List of ECU Query items. */ public static final List build( @@ -82,7 +84,8 @@ public class TableAxisQueryParameterSet { new EcuDataConvertor[] { new EcuParameterConvertorImpl( units, expression, "0.000", -1, storageType, - new HashMap(), getDefault() + Settings.ENDIAN_BIG, new HashMap(), + getDefault() ) } ); diff --git a/src/main/java/com/romraider/logger/ecu/definition/EcuParameterConvertorImpl.java b/src/main/java/com/romraider/logger/ecu/definition/EcuParameterConvertorImpl.java index 24a03218..94b9079e 100644 --- a/src/main/java/com/romraider/logger/ecu/definition/EcuParameterConvertorImpl.java +++ b/src/main/java/com/romraider/logger/ecu/definition/EcuParameterConvertorImpl.java @@ -1,6 +1,6 @@ /* * RomRaider Open-Source Tuning, Logging and Reflashing - * Copyright (C) 2006-2014 RomRaider.com + * Copyright (C) 2006-2015 RomRaider.com * * 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 @@ -20,36 +20,41 @@ package com.romraider.logger.ecu.definition; import static com.romraider.logger.ecu.definition.xml.ConverterMaxMinDefaults.getDefault; -import static com.romraider.util.ByteUtil.asFloat; -import static com.romraider.util.ByteUtil.asSignedInt; import static com.romraider.util.ByteUtil.asUnsignedInt; import static com.romraider.util.JEPUtil.evaluate; import static com.romraider.util.ParamChecker.checkNotNull; import static com.romraider.util.ParamChecker.checkNotNullOrEmpty; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.text.DecimalFormat; import java.util.HashMap; import java.util.Map; +import com.romraider.Settings; import com.romraider.logger.ecu.ui.handler.dash.GaugeMinMax; public final class EcuParameterConvertorImpl implements EcuDataConvertor { - private final String FLOAT = "float"; - private final String INT = "int"; + private static final String FLOAT = "float"; + private static final String UINT = "uint"; private final String units; private final String expression; private final DecimalFormat format; private final int bit; private final String dataType; + private final int endian; private final Map replaceMap; private final GaugeMinMax gaugeMinMax; public EcuParameterConvertorImpl() { - this("Raw data", "x", "0", -1, "uint", new HashMap(), getDefault()); + this("Raw data", "x", "0", -1, "uint", Settings.ENDIAN_BIG, + new HashMap(), getDefault()); } - public EcuParameterConvertorImpl(String units, String expression, String format, int bit, String dataType, Map replaceMap, - GaugeMinMax gaugeMinMax) { + public EcuParameterConvertorImpl(String units, String expression, + String format, int bit, String dataType, int endian, + Map replaceMap, GaugeMinMax gaugeMinMax) { + checkNotNullOrEmpty(units, "units"); checkNotNullOrEmpty(expression, "expression"); checkNotNullOrEmpty(format, "format"); @@ -59,27 +64,53 @@ public final class EcuParameterConvertorImpl implements EcuDataConvertor { this.format = new DecimalFormat(format); this.bit = bit; this.dataType = (dataType == null ? "uint8" : dataType); + this.endian = endian; this.replaceMap = replaceMap; this.gaugeMinMax = gaugeMinMax; } public double convert(byte[] bytes) { + final ByteBuffer bb = ByteBuffer.wrap(bytes); + if (endian == Settings.ENDIAN_LITTLE) { + bb.order(ByteOrder.LITTLE_ENDIAN); + } + + double result = 0; if (bit >= 0 && bit <= 31) { return (asUnsignedInt(bytes) & (1 << bit)) != 0 ? 1 : 0; - } else { - double value = 0; - if (dataType.equalsIgnoreCase(FLOAT)) { - value = (double) asFloat(bytes, 0 , bytes.length); - } - else if (dataType.toLowerCase().startsWith(INT)) { - value = (double) asSignedInt(bytes); - } - else { - value = (double) asUnsignedInt(bytes); - } - double result = evaluate(expression, value); - return Double.isNaN(result) || Double.isInfinite(result) ? 0.0 : result; } + else if (dataType.equalsIgnoreCase(FLOAT)) { + result = evaluate(expression, bb.getFloat()); + } + else { + long value = 0; + switch (bb.capacity()) { + case 1: + value = bb.get(); + break; + case 2: + value = bb.getShort(); + break; + case 4: + value = bb.getInt(); + break; + } + if (dataType.toLowerCase().startsWith(UINT)) { + switch (bb.capacity()) { + case 1: + value = value & 0xff; + break; + case 2: + value = value & 0xffff; + break; + case 4: + value = value & 0xffffffffL; + break; + } + } + result = evaluate(expression, value); + } + return Double.isNaN(result) || Double.isInfinite(result) ? 0.0 : result; } public String getUnits() { diff --git a/src/main/java/com/romraider/logger/ecu/definition/xml/LoggerDefinitionHandler.java b/src/main/java/com/romraider/logger/ecu/definition/xml/LoggerDefinitionHandler.java index 766a1c37..fb692f95 100644 --- a/src/main/java/com/romraider/logger/ecu/definition/xml/LoggerDefinitionHandler.java +++ b/src/main/java/com/romraider/logger/ecu/definition/xml/LoggerDefinitionHandler.java @@ -39,6 +39,7 @@ import java.util.Set; import org.xml.sax.Attributes; import org.xml.sax.helpers.DefaultHandler; +import com.romraider.Settings; import com.romraider.io.connection.ConnectionProperties; import com.romraider.io.connection.ConnectionPropertiesImpl; import com.romraider.logger.ecu.comms.query.EcuInit; @@ -92,6 +93,7 @@ public final class LoggerDefinitionHandler extends DefaultHandler { private static final String ATTR_BIT = "bit"; private static final String ATTR_PARAMETER = "parameter"; private static final String ATTR_STORAGETYPE = "storagetype"; + private static final String ATTR_ENDIAN = "endian"; private static final String ATTR_BAUD = "baud"; private static final String ATTR_DATABITS = "databits"; private static final String ATTR_STOPBITS = "stopbits"; @@ -144,6 +146,7 @@ public final class LoggerDefinitionHandler extends DefaultHandler { private String conversionExpression; private String conversionFormat; private String conversionStorageType; + private int conversionEndian; private GaugeMinMax conversionGauge; private String target; private String version; @@ -229,6 +232,13 @@ public final class LoggerDefinitionHandler extends DefaultHandler { conversionExpression = attributes.getValue(ATTR_EXPRESSION); conversionFormat = attributes.getValue(ATTR_FORMAT); conversionStorageType = attributes.getValue(ATTR_STORAGETYPE); + String endian = attributes.getValue(ATTR_ENDIAN); + if (endian != null) { + conversionEndian = endian.equalsIgnoreCase("little") ? Settings.ENDIAN_LITTLE : Settings.ENDIAN_BIG; + } + else { + conversionEndian = Settings.ENDIAN_BIG; + } double gaugeMin = getConversionMin(attributes, conversionUnits); double gaugeMax = getConversionMax(attributes, conversionUnits); double gaugeStep = getConversionStep(attributes, conversionUnits); @@ -329,8 +339,10 @@ public final class LoggerDefinitionHandler extends DefaultHandler { derivedConvertorList.add(new EcuDerivedParameterConvertorImpl(conversionUnits, conversionExpression, conversionFormat, replaceMap, conversionGauge)); } else { - convertorList.add(new EcuParameterConvertorImpl(conversionUnits, conversionExpression, conversionFormat, address.getBit(), - conversionStorageType, replaceMap, conversionGauge)); + convertorList.add(new EcuParameterConvertorImpl( + conversionUnits, conversionExpression, conversionFormat, + address.getBit(), conversionStorageType, conversionEndian, + replaceMap, conversionGauge)); } } else if (TAG_ECUPARAM.equals(qName)) { if (ecuInit != null && ecuAddressMap.containsKey(ecuInit.getEcuId())) {