From 35a860ad0851e92d639e342bc383423ac571b9b0 Mon Sep 17 00:00:00 2001 From: Dale Schultz Date: Wed, 28 Sep 2011 04:50:42 +0000 Subject: [PATCH] LM-2 MTS refactoring. Now plugin loads sensor inputs dynamically. This should be functional enough to test MTS service. git-svn-id: https://svn2.assembla.com/svn/romraider/trunk@347 38686702-15cf-42e4-a595-3071df8bf5ea --- .../innovate/generic/mts/io/MTSConnector.java | 111 ++++++++++++++++++ .../innovate/generic/mts/io/MTSRunner.java | 93 +++++++++------ .../lm2/mts/plugin/Lm2MtsDataItem.java | 19 ++- .../lm2/mts/plugin/Lm2MtsDataSource.java | 36 +++--- .../innovate/lm2/mts/plugin/Lm2Sensor.java | 89 ++++++++++++++ .../lm2/mts/plugin/Lm2SensorType.java | 33 ++---- 6 files changed, 295 insertions(+), 86 deletions(-) create mode 100644 src/com/romraider/logger/external/innovate/generic/mts/io/MTSConnector.java create mode 100644 src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2Sensor.java diff --git a/src/com/romraider/logger/external/innovate/generic/mts/io/MTSConnector.java b/src/com/romraider/logger/external/innovate/generic/mts/io/MTSConnector.java new file mode 100644 index 00000000..b53337a9 --- /dev/null +++ b/src/com/romraider/logger/external/innovate/generic/mts/io/MTSConnector.java @@ -0,0 +1,111 @@ +/* + * RomRaider Open-Source Tuning, Logging and Reflashing + * Copyright (C) 2006-2010 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 + * the Free Software Foundation; either version 2 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package com.romraider.logger.external.innovate.generic.mts.io; + +import static com.romraider.logger.external.innovate.generic.mts.io.MTSFactory.createMTS; +import static org.apache.log4j.Logger.getLogger; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.log4j.Logger; + +import com.romraider.logger.external.innovate.lm2.mts.plugin.Lm2Sensor; + +public final class MTSConnector { + private static final Logger LOGGER = getLogger(MTSConnector.class); + private final MTS mts; + + public MTSConnector(int mtsPort) { + this.mts = mts(mtsPort); + } + + public MTS getMts() { + return mts; + } + + private MTS mts(int mtsPort) { + // bail out early if we know specified mts port is invalid + if (mtsPort < 0) throw new IllegalArgumentException("Bad MTS port: " + mtsPort); + + // create mts interface + MTS mts = createMTS(); + mts.disconnect(); + + try { + // check there are ports available + int portCount = mts.portCount(); + if (portCount <= 0) throw new IllegalStateException("No MTS ports found"); + LOGGER.info("MTS: found " + portCount + " ports."); + + // select the specified port + mts.currentPort(mtsPort); + String portName = mts.portName(); + LOGGER.info("MTS: current port [" + mtsPort + "]: " + portName); + + return mts; + } catch (RuntimeException t) { + // cleanup mts and rethrow exception + if (mts != null) mts.dispose(); + throw t; + } + } + + public Set getSensors() { + Set sensors = new HashSet(); + try { + // attempt to connect to the specified device + mts.connect(); + + try { + // get a count of available inputs + int inputCount = mts.inputCount(); + LOGGER.info("MTS: found " + inputCount + " inputs."); + + if (inputCount > 0) { + for (int i = 0; i < inputCount; i++) { + // report each input found + mts.currentInput(i); + Lm2Sensor sensor = new Lm2Sensor(); + sensor.setInputNumber(i); + sensor.setInputName(mts.inputName()); + sensor.setDeviceName(mts.inputDeviceName()); + sensor.setDeviceChannel(mts.inputDeviceChannel()); + sensor.setUnits(mts.inputUnit()); + sensor.setMinValue(mts.inputMinValue()); + sensor.setMaxValue(mts.inputMaxValue()); + sensors.add(sensor); + LOGGER.debug(String.format( + "MTS: InputNo: %02d, InputName: %s, InputType: %d, DeviceName: %s, DeviceType: %d, DeviceChannel: %d, Units: %s, Multiplier: %f, MinValue: %f, MaxValue: %f", + i, mts.inputName(), mts.inputType(), mts.inputDeviceName(), mts.inputDeviceType(), mts.inputDeviceChannel(), mts.inputUnit(), mts.inputAFRMultiplier(), mts.inputMinValue(), mts.inputMaxValue())); + } + } + else { + LOGGER.error("MTS: Error - no input channels found to log from!"); + } + } finally { + mts.disconnect(); + } + } finally { + mts.dispose(); + } + return sensors; + } +} \ No newline at end of file diff --git a/src/com/romraider/logger/external/innovate/generic/mts/io/MTSRunner.java b/src/com/romraider/logger/external/innovate/generic/mts/io/MTSRunner.java index e4402d18..f58132b9 100644 --- a/src/com/romraider/logger/external/innovate/generic/mts/io/MTSRunner.java +++ b/src/com/romraider/logger/external/innovate/generic/mts/io/MTSRunner.java @@ -30,17 +30,18 @@ import org.apache.log4j.Logger; import com.romraider.logger.external.core.Stoppable; import com.romraider.logger.external.innovate.lm2.mts.plugin.Lm2MtsDataItem; -import com.romraider.logger.external.innovate.lm2.mts.plugin.Lm2SensorType; public final class MTSRunner implements Stoppable { private static final Logger LOGGER = getLogger(MTSRunner.class); - private final Map dataItems; + private final Map dataItems; private final MTS mts; private boolean running; private boolean stop; - public MTSRunner(int mtsPort, Map dataItems) { - this.mts = mts(mtsPort); + public MTSRunner(int mtsPort, Map dataItems) { +// this.mts = mts(mtsPort); + MTSConnector connection = new MTSConnector(mtsPort); + this.mts = connection.getMts(); this.dataItems = dataItems; } @@ -63,31 +64,32 @@ public final class MTSRunner implements Stoppable { while (running && currentTimeMillis() < timeout) sleep(100L); } - private MTS mts(int mtsPort) { - // bail out early if we know specified mts port is invalid - if (mtsPort < 0) throw new IllegalArgumentException("Bad MTS port: " + mtsPort); - - // create mts interface - MTS mts = createMTS(); - - try { - // check there are ports available - int portCount = mts.portCount(); - if (portCount <= 0) throw new IllegalStateException("No MTS ports found"); - LOGGER.info("MTS: found " + portCount + " ports."); - - // select the specified port - mts.currentPort(mtsPort); - String portName = mts.portName(); - LOGGER.info("MTS: current port [" + mtsPort + "]: " + portName); - - return mts; - } catch (RuntimeException t) { - // cleanup mts and rethrow exception - if (mts != null) mts.dispose(); - throw t; - } - } +// private MTS mts(int mtsPort) { +// // bail out early if we know specified mts port is invalid +// if (mtsPort < 0) throw new IllegalArgumentException("Bad MTS port: " + mtsPort); +// +// // create mts interface +// MTS mts = createMTS(); +// mts.disconnect(); +// +// try { +// // check there are ports available +// int portCount = mts.portCount(); +// if (portCount <= 0) throw new IllegalStateException("No MTS ports found"); +// //LOGGER.info("MTS: found " + portCount + " ports."); +// +// // select the specified port +// mts.currentPort(mtsPort); +// String portName = mts.portName(); +// //LOGGER.info("MTS: current port [" + mtsPort + "]: " + portName); +// +// return mts; +// } catch (RuntimeException t) { +// // cleanup mts and rethrow exception +// if (mts != null) mts.dispose(); +// throw t; +// } +// } private void doRun() { try { @@ -97,13 +99,13 @@ public final class MTSRunner implements Stoppable { try { // get a count of available inputs int inputCount = mts.inputCount(); - LOGGER.info("MTS: found " + inputCount + " inputs."); + //LOGGER.info("MTS: found " + inputCount + " inputs."); if (inputCount > 0) { for (int i = 0; i < inputCount; i++) { // report each input found mts.currentInput(i); - LOGGER.info(String.format( + LOGGER.debug(String.format( "MTS: InputNo: %02d, InputName: %s, InputType: %d, DeviceName: %s, DeviceType: %d, DeviceChannel: %d, Units: %s, Multiplier: %f, MinValue: %f, MaxValue: %f, MinVolts: %f, MaxVolts: %f", i, mts.inputName(), mts.inputType(), mts.inputDeviceName(), mts.inputDeviceType(), mts.inputDeviceChannel(), mts.inputUnit(), mts.inputAFRMultiplier(), mts.inputMinValue(), mts.inputMaxValue(), mts.inputMinVolt(), mts.inputMaxVolt())); } @@ -118,7 +120,7 @@ public final class MTSRunner implements Stoppable { int function = mts.inputFunction(); int sample = mts.inputSample(); - LOGGER.trace("MTS: type = " + type + ", function = " + function + ", sample = " + sample); + LOGGER.trace("MTS input: " + i + ", type = " + type + ", function = " + function + ", sample = " + sample); float data = 0f; @@ -136,7 +138,12 @@ public final class MTSRunner implements Stoppable { if (function == 9) { float min = mts.inputMinValue(); float max = mts.inputMaxValue(); - data = ((max - min) * ((float) sample / 1024f)) + min; + float range = max - min; + data = (((float) sample / 1024f) * range) + min; + if (mts.inputDeviceChannel() == -1) + LOGGER.debug(String.format( + "MTS: InputNo: %02d, InputName: %s, InputType: %d, DeviceName: %s, DeviceType: %d, DeviceChannel: %d, Units: %s, Multiplier: %f, MinValue: %f, MaxValue: %f, MinVolts: %f, MaxVolts: %f, Function: %d, data: %f", + i, mts.inputName(), mts.inputType(), mts.inputDeviceName(), mts.inputDeviceType(), mts.inputDeviceChannel(), mts.inputUnit(), mts.inputAFRMultiplier(), mts.inputMinValue(), mts.inputMaxValue(), mts.inputMinVolt(), mts.inputMaxVolt(), mts.inputFunction(), data)); } } @@ -144,20 +151,28 @@ public final class MTSRunner implements Stoppable { // Take each sample step as .001 Lambda, // add 0.5 (so our range is 0.5 to 1.523 for our 1024 steps), // then multiply by the AFR multiplier - if (type == 0 || type == 1) { + if (type == 1) { // MTS_FUNC_LAMBDA if (function == 0) { - //float multiplier = mts.inputAFRMultiplier(); - //data = ((float) sample / 1000f + 0.5f) * multiplier; - data = ((float) sample / 1000f + 0.5f); + float multiplier = mts.inputAFRMultiplier(); + data = ((float) sample / 1000f + 0.5f) * multiplier; } // MTS_FUNC_O2 if (function == 1) { data = ((float) sample / 10f); } } - Lm2SensorType sensor = Lm2SensorType.valueOf(function, mts.inputDeviceChannel()); - Lm2MtsDataItem dataItem = dataItems.get(sensor); + + // Lambda + // Identical to AFR, except we do not multiply for AFR. + if (type == 0) { + // MTS_FUNC_LAMBDA + if (function == 0) { + data = (float) sample / 1000f + 0.5f; + } + } + // set data for this sensor based on inputNumber + Lm2MtsDataItem dataItem = dataItems.get(i); if (dataItem != null) dataItem.setData(data); } sleep(10L); diff --git a/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2MtsDataItem.java b/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2MtsDataItem.java index 54bf6137..e12a7be5 100644 --- a/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2MtsDataItem.java +++ b/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2MtsDataItem.java @@ -22,22 +22,25 @@ package com.romraider.logger.external.innovate.lm2.mts.plugin; import static com.romraider.logger.external.core.ExternalDataConvertorLoader.loadConvertors; import com.romraider.logger.ecu.definition.EcuDataConvertor; +import com.romraider.logger.ecu.definition.ExternalDataConvertorImpl; import com.romraider.logger.external.core.DataListener; import com.romraider.logger.external.core.ExternalDataItem; import com.romraider.logger.external.core.ExternalSensorConversions; public final class Lm2MtsDataItem implements ExternalDataItem, DataListener { - private EcuDataConvertor[] convertors; + //private EcuDataConvertor[] convertors; private final String name; private int channel; private double data; + private String units; - public Lm2MtsDataItem(String name, int channel, ExternalSensorConversions... convertorList) { + public Lm2MtsDataItem(String name, int channel, String units) { super(); this.name = name; this.channel = channel; - convertors = new EcuDataConvertor[convertorList.length]; - convertors = loadConvertors(this, convertors, convertorList); + this.units = units; +// convertors = new EcuDataConvertor[convertorList.length]; +// convertors = loadConvertors(this, convertors, convertorList); } public String getName() { @@ -56,11 +59,15 @@ public final class Lm2MtsDataItem implements ExternalDataItem, DataListener { return data; } + public String getUnits() { + return units; + } + public void setData(double data) { this.data = data; } public EcuDataConvertor[] getConvertors() { - return convertors; - } + EcuDataConvertor[] convertors = {new ExternalDataConvertorImpl(this, units, "x", "0.00")}; + return convertors; } } \ No newline at end of file diff --git a/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2MtsDataSource.java b/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2MtsDataSource.java index fbaee30c..c648ab14 100644 --- a/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2MtsDataSource.java +++ b/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2MtsDataSource.java @@ -19,20 +19,6 @@ package com.romraider.logger.external.innovate.lm2.mts.plugin; -import static com.romraider.logger.external.core.SensorConversionsLambda.AFR_146; -import static com.romraider.logger.external.core.SensorConversionsLambda.AFR_147; -import static com.romraider.logger.external.core.SensorConversionsLambda.AFR_155; -import static com.romraider.logger.external.core.SensorConversionsLambda.AFR_172; -import static com.romraider.logger.external.core.SensorConversionsLambda.AFR_34; -import static com.romraider.logger.external.core.SensorConversionsLambda.AFR_64; -import static com.romraider.logger.external.core.SensorConversionsLambda.AFR_90; -import static com.romraider.logger.external.core.SensorConversionsLambda.LAMBDA; -import static com.romraider.logger.external.core.SensorConversionsOther.VOLTS_DC; -import static com.romraider.logger.external.innovate.lm2.mts.plugin.Lm2SensorType.THERMALCOUPLE1; -import static com.romraider.logger.external.innovate.lm2.mts.plugin.Lm2SensorType.THERMALCOUPLE2; -import static com.romraider.logger.external.innovate.lm2.mts.plugin.Lm2SensorType.THERMALCOUPLE3; -import static com.romraider.logger.external.innovate.lm2.mts.plugin.Lm2SensorType.THERMALCOUPLE4; -import static com.romraider.logger.external.innovate.lm2.mts.plugin.Lm2SensorType.WIDEBAND0; import static com.romraider.util.ThreadUtil.runAsDaemon; import static java.lang.Integer.parseInt; import static java.util.Collections.unmodifiableList; @@ -42,6 +28,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import javax.swing.Action; @@ -50,20 +37,27 @@ import org.apache.log4j.Logger; import com.romraider.logger.ecu.EcuLogger; import com.romraider.logger.external.core.ExternalDataItem; import com.romraider.logger.external.core.ExternalDataSource; +import com.romraider.logger.external.innovate.generic.mts.io.MTSConnector; import com.romraider.logger.external.innovate.generic.mts.io.MTSRunner; public final class Lm2MtsDataSource implements ExternalDataSource { private static final Logger LOGGER = getLogger(Lm2MtsDataSource.class); - private final Map dataItems = new HashMap(); + private final Map dataItems = new HashMap(); private MTSRunner runner; - private int mtsPort = -1; + private int mtsPort = 0; { - dataItems.put(WIDEBAND0, new Lm2MtsDataItem("LM-2", 0, LAMBDA, AFR_147, AFR_90, AFR_146, AFR_64, AFR_155, AFR_172, AFR_34)); - dataItems.put(THERMALCOUPLE1, new Lm2MtsDataItem("TC-4", 1, VOLTS_DC)); - dataItems.put(THERMALCOUPLE2, new Lm2MtsDataItem("TC-4", 2, VOLTS_DC)); - dataItems.put(THERMALCOUPLE3, new Lm2MtsDataItem("TC-4", 3, VOLTS_DC)); - dataItems.put(THERMALCOUPLE4, new Lm2MtsDataItem("TC-4", 4, VOLTS_DC)); + MTSConnector mts = new MTSConnector(mtsPort); + Set sensors = mts.getSensors(); + dataItems.put(0, new Lm2MtsDataItem("LM-2", 0, "AFR")); // a default entry + for (Lm2Sensor sensor : sensors) { + dataItems.put(sensor.getInputNumber(), new Lm2MtsDataItem(sensor.getDeviceName(), sensor.getDeviceChannel(), sensor.getUnits())); + } +// dataItems.put(LC_1_0, new Lm2MtsDataItem("LM-2", 0, LAMBDA, AFR_147, AFR_90, AFR_146, AFR_64, AFR_155, AFR_172, AFR_34)); +// dataItems.put(TC_4_1, new Lm2MtsDataItem("TC-4", 1, DEG_F)); +// dataItems.put(TC_4_2, new Lm2MtsDataItem("TC-4", 2, DEG_C)); +// dataItems.put(TC_4_3, new Lm2MtsDataItem("TC-4", 3, DEG_C)); +// dataItems.put(TC_4_4, new Lm2MtsDataItem("TC-4", 4, DEG_C)); } public String getId() { diff --git a/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2Sensor.java b/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2Sensor.java new file mode 100644 index 00000000..a9a019ae --- /dev/null +++ b/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2Sensor.java @@ -0,0 +1,89 @@ +/* + * RomRaider Open-Source Tuning, Logging and Reflashing + * Copyright (C) 2006-2010 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 + * the Free Software Foundation; either version 2 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package com.romraider.logger.external.innovate.lm2.mts.plugin; + +public class Lm2Sensor { + private int inputNumber = 0; + private String inputName = ""; + private String deviceName = ""; + private int deviceChannel = 0; + private String units = ""; + private float minValue = 0f; + private float maxValue = 0f; + + public Lm2Sensor() { + } + + public int getInputNumber() { + return inputNumber; + } + + public void setInputNumber(int input) { + inputNumber = input; + } + + public String getInputName() { + return inputName; + } + + public void setInputName(String name) { + inputName = name; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String name) { + deviceName = name; + } + + public int getDeviceChannel() { + return deviceChannel; + } + + public void setDeviceChannel(int channel) { + deviceChannel = channel; + } + + public String getUnits() { + return units; + } + + public void setUnits(String unit) { + units = unit; + } + + public float getMinValue() { + return minValue; + } + + public void setMinValue(float value) { + minValue = value; + } + + public float getMaxValue() { + return maxValue; + } + + public void setMaxValue(float value) { + maxValue = value; + } +} diff --git a/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2SensorType.java b/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2SensorType.java index f02e0bb4..73138a76 100644 --- a/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2SensorType.java +++ b/src/com/romraider/logger/external/innovate/lm2/mts/plugin/Lm2SensorType.java @@ -20,33 +20,26 @@ package com.romraider.logger.external.innovate.lm2.mts.plugin; public enum Lm2SensorType { - //(function, channel) - WIDEBAND0(0, 0), - THERMALCOUPLE1(9, 1), - THERMALCOUPLE2(9, 2), - THERMALCOUPLE3(9, 3), - THERMALCOUPLE4(9, 4); + //SENSOR_NAME(InputNumber) + LC_1_0(0), + TC_4_1(17), + TC_4_2(18), + TC_4_3(19), + TC_4_4(20); - private final int value; - private final int channel; + private final int inputNumber; - private Lm2SensorType(int value, int channel) { - this.value = value; - this.channel = channel; + private Lm2SensorType(int inputNumber) { + this.inputNumber = inputNumber; } - public int getValue() { - return value; + public int getInputNumber() { + return inputNumber; } - public int getChannel() { - return channel; - } - - public static Lm2SensorType valueOf(int value, int channel) { + public static Lm2SensorType valueOf(int inputNumber) { for (Lm2SensorType type : values()) { - if (type.getValue() == value && - type.getChannel() == channel) + if (type.getInputNumber() == inputNumber) return type; } return null;