multi convertor support added to derived parameters

git-svn-id: http://svn.3splooges.com/romraider-arch/trunk@304 d2e2e1cd-ba16-0410-be16-b7c4453c7c2d
This commit is contained in:
kascade 2006-10-16 12:33:59 +00:00
parent 77f62b4a51
commit 89356d9a53
8 changed files with 114 additions and 22 deletions

View File

@ -843,6 +843,17 @@
</conversions>
</parameter>
<parameter id="P91" name="Manifold Relative Pressure (Corrected)" desc="Difference between Manifold Absolute Pressure and Atmospheric Pressure">
<depends>
<ref id="P7"/>
<ref id="P24"/>
</depends>
<conversions>
<conversion units="psi" expr="[P7:psi]-[P24:psi]" format="0.00"/>
<conversion units="bar" expr="[P7:bar]-[P24:bar]" format="0.00"/>
</conversions>
</parameter>
</parameters>
<switches>

View File

@ -6,6 +6,7 @@ import enginuity.logger.definition.EcuDataLoaderImpl;
import enginuity.logger.definition.EcuParameter;
import enginuity.logger.definition.EcuSwitch;
import enginuity.logger.io.serial.SerialPortRefresher;
import enginuity.logger.ui.EcuDataComparator;
import enginuity.logger.ui.EcuLoggerMenuBar;
import enginuity.logger.ui.LoggerDataTableModel;
import enginuity.logger.ui.MessageListener;
@ -46,6 +47,7 @@ import java.awt.event.WindowListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import static java.util.Collections.sort;
import java.util.List;
/*
@ -153,28 +155,36 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
try {
EcuDataLoader dataLoader = new EcuDataLoaderImpl();
dataLoader.loadFromXml(settings.getLoggerConfigFilePath(), settings.getLoggerProtocol());
List<EcuParameter> ecuParams = dataLoader.getEcuParameters();
for (EcuParameter ecuParam : ecuParams) {
dataTabParamListTableModel.addParam(ecuParam);
graphTabParamListTableModel.addParam(ecuParam);
dashboardTabParamListTableModel.addParam(ecuParam);
ecuParam.addConvertorUpdateListener(fileUpdateHandler);
ecuParam.addConvertorUpdateListener(liveDataUpdateHandler);
ecuParam.addConvertorUpdateListener(graphUpdateHandler);
ecuParam.addConvertorUpdateListener(dashboardUpdateHandler);
}
List<EcuSwitch> ecuSwitches = dataLoader.getEcuSwitches();
for (EcuSwitch ecuSwitch : ecuSwitches) {
dataTabSwitchListTableModel.addParam(ecuSwitch);
graphTabSwitchListTableModel.addParam(ecuSwitch);
dashboardTabSwitchListTableModel.addParam(ecuSwitch);
}
loadEcuParams(dataLoader.getEcuParameters());
loadEcuSwitches(dataLoader.getEcuSwitches());
} catch (Exception e) {
e.printStackTrace();
reportError(e);
}
}
private void loadEcuParams(List<EcuParameter> ecuParams) {
sort(ecuParams, new EcuDataComparator());
for (EcuParameter ecuParam : ecuParams) {
dataTabParamListTableModel.addParam(ecuParam);
graphTabParamListTableModel.addParam(ecuParam);
dashboardTabParamListTableModel.addParam(ecuParam);
ecuParam.addConvertorUpdateListener(fileUpdateHandler);
ecuParam.addConvertorUpdateListener(liveDataUpdateHandler);
ecuParam.addConvertorUpdateListener(graphUpdateHandler);
ecuParam.addConvertorUpdateListener(dashboardUpdateHandler);
}
}
private void loadEcuSwitches(List<EcuSwitch> ecuSwitches) {
sort(ecuSwitches, new EcuDataComparator());
for (EcuSwitch ecuSwitch : ecuSwitches) {
dataTabSwitchListTableModel.addParam(ecuSwitch);
graphTabSwitchListTableModel.addParam(ecuSwitch);
dashboardTabSwitchListTableModel.addParam(ecuSwitch);
}
}
private void initParameterUpdateHandlers() {
DataUpdateHandler threadedFileUpdateHandler = startHandlerInThread(fileUpdateHandler);
dataHandlerManager.addHandler(startHandlerInThread(liveDataUpdateHandler));

View File

@ -1,8 +1,5 @@
package enginuity.logger.definition;
//TODO: add addListener() method so parameters can notify listeners when the selected convertor is updated
//TODO: create corresponding ConvertorUpdateListener interface (to be implemented by handlers?)
public interface EcuData {
String getId();

View File

@ -1,9 +1,11 @@
package enginuity.logger.definition;
import static enginuity.util.JEPUtil.evaluate;
import static enginuity.util.ParamChecker.checkNotNull;
import static enginuity.util.ParamChecker.checkNotNullOrEmpty;
import java.text.DecimalFormat;
import static java.util.Collections.synchronizedMap;
import java.util.HashMap;
import java.util.Map;
@ -12,6 +14,7 @@ public final class EcuDerivedParameterConvertorImpl implements EcuDerivedParamet
private final String units;
private final String expression;
private final DecimalFormat format;
private final Map<String, ExpressionInfo> expressionInfoMap = synchronizedMap(new HashMap<String, ExpressionInfo>());
public EcuDerivedParameterConvertorImpl(String units, String expression, String format) {
checkNotNullOrEmpty(units, "units");
@ -29,7 +32,8 @@ public final class EcuDerivedParameterConvertorImpl implements EcuDerivedParamet
int length = ecuData.getAddresses().length;
byte[] tmp = new byte[length];
System.arraycopy(bytes, index, tmp, 0, length);
valueMap.put(ecuData.getId(), ecuData.getSelectedConvertor().convert(tmp));
ExpressionInfo expressionInfo = expressionInfoMap.get(ecuData.getId());
valueMap.put(expressionInfo.getReplacementKey(), expressionInfo.getConvertor().convert(tmp));
index += length;
}
double result = evaluate(expression, valueMap);
@ -47,9 +51,66 @@ public final class EcuDerivedParameterConvertorImpl implements EcuDerivedParamet
public void setEcuDatas(EcuData[] ecuDatas) {
checkNotNullOrEmpty(ecuDatas, "ecuDatas");
this.ecuDatas = ecuDatas;
for (EcuData ecuData : ecuDatas) {
addExpressionInfo(ecuData);
}
}
public String toString() {
return getUnits();
}
private void addExpressionInfo(EcuData ecuData) {
String id = ecuData.getId();
String lookup = '[' + id + ':';
int i = expression.indexOf(lookup);
if (i >= 0) {
int start = i + lookup.length();
int end = expression.indexOf("]", start);
String units = expression.substring(start, end);
EcuDataConvertor selectedConvertor = null;
EcuDataConvertor[] convertors = ecuData.getConvertors();
for (EcuDataConvertor convertor : convertors) {
if (units.equals(convertor.getUnits())) {
selectedConvertor = convertor;
}
}
expressionInfoMap.put(id, new ExpressionInfo(id, selectedConvertor, true));
} else {
expressionInfoMap.put(id, new ExpressionInfo(id, ecuData.getSelectedConvertor(), false));
}
}
private static final class ExpressionInfo {
private final String ecuDataId;
private final EcuDataConvertor convertor;
private final String replacementKey;
public ExpressionInfo(String ecuDataId, EcuDataConvertor convertor, boolean compositeKey) {
checkNotNull(ecuDataId, convertor);
this.ecuDataId = ecuDataId;
this.convertor = convertor;
this.replacementKey = compositeKey ? buildCompositeKey(ecuDataId, convertor.getUnits()) : ecuDataId;
}
public String getEcuDataId() {
return ecuDataId;
}
public String getReplacementKey() {
return replacementKey;
}
public EcuDataConvertor getConvertor() {
return convertor;
}
private String buildCompositeKey(String ecuDataId, String convertorUnits) {
if (convertorUnits == null || convertorUnits.length() == 0) {
return ecuDataId;
} else {
return '[' + ecuDataId + ':' + convertorUnits + ']';
}
}
}
}

View File

@ -12,8 +12,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
//TODO: Add support for parsing of multiple convertors (already in xml)
public final class LoggerDefinitionHandler extends DefaultHandler {
private static final String YES = "yes";
private static final String TAG_PROTOCOL = "protocol";

View File

@ -0,0 +1,15 @@
package enginuity.logger.ui;
import enginuity.logger.definition.EcuData;
import java.util.Comparator;
public final class EcuDataComparator implements Comparator {
public int compare(Object o1, Object o2) {
EcuData ecuData1 = (EcuData) o1;
EcuData ecuData2 = (EcuData) o2;
return ecuData1.getName().compareTo(ecuData2.getName());
}
}