diff --git a/src/enginuity/logger/log_defs.xml b/docs/logger/log_defs.xml
similarity index 100%
rename from src/enginuity/logger/log_defs.xml
rename to docs/logger/log_defs.xml
diff --git a/src/enginuity/logger/ssm_info.txt b/docs/logger/ssm_info.txt
similarity index 100%
rename from src/enginuity/logger/ssm_info.txt
rename to docs/logger/ssm_info.txt
diff --git a/logger.xml b/logger.xml
index d3a51b29..c8bb3b67 100644
--- a/logger.xml
+++ b/logger.xml
@@ -843,6 +843,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/enginuity/logger/EcuLogger.java b/src/enginuity/logger/EcuLogger.java
index 30fc842e..cd1be260 100644
--- a/src/enginuity/logger/EcuLogger.java
+++ b/src/enginuity/logger/EcuLogger.java
@@ -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 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 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 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 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));
diff --git a/src/enginuity/logger/definition/EcuData.java b/src/enginuity/logger/definition/EcuData.java
index f600d932..caa6a35d 100644
--- a/src/enginuity/logger/definition/EcuData.java
+++ b/src/enginuity/logger/definition/EcuData.java
@@ -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();
diff --git a/src/enginuity/logger/definition/EcuDerivedParameterConvertorImpl.java b/src/enginuity/logger/definition/EcuDerivedParameterConvertorImpl.java
index ff0db10e..45e1706d 100644
--- a/src/enginuity/logger/definition/EcuDerivedParameterConvertorImpl.java
+++ b/src/enginuity/logger/definition/EcuDerivedParameterConvertorImpl.java
@@ -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 expressionInfoMap = synchronizedMap(new HashMap());
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 + ']';
+ }
+ }
+ }
}
diff --git a/src/enginuity/logger/definition/LoggerDefinitionHandler.java b/src/enginuity/logger/definition/LoggerDefinitionHandler.java
index a520c15a..bd139303 100644
--- a/src/enginuity/logger/definition/LoggerDefinitionHandler.java
+++ b/src/enginuity/logger/definition/LoggerDefinitionHandler.java
@@ -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";
diff --git a/src/enginuity/logger/ui/EcuDataComparator.java b/src/enginuity/logger/ui/EcuDataComparator.java
new file mode 100644
index 00000000..1f2afee0
--- /dev/null
+++ b/src/enginuity/logger/ui/EcuDataComparator.java
@@ -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());
+ }
+
+}