added some lm2 stuff - unfinished

git-svn-id: https://svn2.assembla.com/svn/romraider/trunk@232 38686702-15cf-42e4-a595-3071df8bf5ea
This commit is contained in:
kascade 2009-05-13 22:45:38 +00:00
parent 4e5f6ba81f
commit 7ec16ec5a8
4 changed files with 182 additions and 0 deletions

1
plugins/lm2.plugin Normal file
View File

@ -0,0 +1 @@
datasource.class=com.romraider.logger.innovate.lm2.plugin.Lm2DataSource

View File

@ -0,0 +1,83 @@
/*
* Copyright (c) 2009. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.romraider.logger.innovate.lm2.plugin;
import com.romraider.logger.innovate.generic.plugin.DataConvertor;
import static com.romraider.util.ByteUtil.matchOnes;
import static com.romraider.util.ByteUtil.matchZeroes;
import static com.romraider.util.HexUtil.asBytes;
import static com.romraider.util.HexUtil.asHex;
import org.apache.log4j.Logger;
//TODO: Remove dupe with Lc1DataConvertor
public final class Lm2DataConvertor implements DataConvertor {
private static final Logger LOGGER = Logger.getLogger(Lm2DataConvertor.class);
private static final double MAX_AFR = 20.33;
public double convert(byte[] bytes) {
LOGGER.trace("Converting LM-2 bytes: " + asHex(bytes));
if (isLm2(bytes) && isHeaderValid(bytes)) {
if (isError(bytes)) {
int error = -1 * getLambda(bytes);
LOGGER.error("LM-2 error: " + asHex(bytes) + " --> " + error);
return error;
}
if (isOk(bytes)) {
double afr = getAfr(bytes);
LOGGER.trace("LM-2 AFR: " + afr);
return afr > MAX_AFR ? MAX_AFR : afr;
}
// out of range value seen on overrun...
LOGGER.trace("LM-2 response out of range (overrun?): " + asHex(bytes));
return MAX_AFR;
}
LOGGER.error("LM-2 unrecognized response: " + asHex(bytes));
return 0;
}
private double getAfr(byte[] bytes) {
return (getLambda(bytes) + 500) * getAf(bytes) / 10000.0;
}
private int getAf(byte[] bytes) {
return ((bytes[2] & 1) << 7) | bytes[3];
}
// 1x0xxx0x
private boolean isLm2(byte[] bytes) {
return bytes.length >= 6 && matchOnes(bytes[2], 128) && matchZeroes(bytes[2], 34);
}
// 1x11xx1x 1xxxxxxx
private boolean isHeaderValid(byte[] bytes) {
return matchOnes(bytes[0], 178) && matchOnes(bytes[1], 128);
}
// 1x00000x
private boolean isOk(byte[] bytes) {
return matchOnes(bytes[2], 128) && matchZeroes(bytes[2], 62);
}
// 1x01100x
private boolean isError(byte[] bytes) {
return matchOnes(bytes[2], 152) && matchZeroes(bytes[2], 38);
}
// 00xxxxxx 0xxxxxxx
private int getLambda(byte[] bytes) {
return (bytes[4] << 7) | bytes[5];
}
public static void main(String[] args) {
byte[] bytes = asBytes("0xB2808113036F1E650124007000470039003A");
DataConvertor convertor = new Lm2DataConvertor();
double result = convertor.convert(bytes);
System.out.println("result = " + result);
}
}

View File

@ -0,0 +1,39 @@
/*
* Copyright (c) 2009. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.romraider.logger.innovate.lm2.plugin;
import com.romraider.logger.ecu.external.ExternalDataItem;
import com.romraider.logger.innovate.generic.plugin.DataConvertor;
import com.romraider.logger.innovate.generic.plugin.DataListener;
public final class Lm2DataItem implements ExternalDataItem, DataListener {
private final DataConvertor convertor = new Lm2DataConvertor();
private byte[] bytes;
public String getName() {
return "Innovate LM-2";
}
public String getDescription() {
return "Innovate LM-2 AFR data";
}
public String getUnits() {
return "AFR";
}
public double getData() {
if (bytes == null) return 0.0;
return convertor.convert(bytes);
}
public void setBytes(byte[] bytes) {
this.bytes = bytes;
}
}

View File

@ -0,0 +1,59 @@
/*
* Copyright (c) 2009. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.romraider.logger.innovate.lm2.plugin;
import com.romraider.logger.ecu.EcuLogger;
import com.romraider.logger.ecu.external.ExternalDataItem;
import com.romraider.logger.ecu.external.ExternalDataSource;
import com.romraider.logger.innovate.generic.io.InnovateRunnerImpl;
import com.romraider.logger.innovate.generic.plugin.InnovateSettings;
import com.romraider.logger.innovate.generic.plugin.InnovateSettingsImpl;
import static com.romraider.util.ThreadUtil.runAsDaemon;
import javax.swing.Action;
import static java.util.Arrays.asList;
import java.util.List;
public final class Lm2DataSource implements ExternalDataSource {
private InnovateSettings settings = new InnovateSettingsImpl();
private Lm2DataItem dataItem = new Lm2DataItem();
private InnovateRunnerImpl runner;
public String getName() {
return "Innovate LM-2";
}
public String getVersion() {
return "0.01";
}
public List<? extends ExternalDataItem> getDataItems() {
return asList(dataItem);
}
public Action getMenuAction(EcuLogger logger) {
return null;
}
public void setPort(String port) {
settings.setPort(port);
}
public String getPort() {
return settings.getPort();
}
public void connect() {
runner = new InnovateRunnerImpl("LM-2", settings, dataItem, 18);
runAsDaemon(runner);
}
public void disconnect() {
if (runner != null) runner.stop();
}
}