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()); + } + +}