diff --git a/src/enginuity/logger/ecu/comms/io/connection/LoggerConnection.java b/src/enginuity/logger/ecu/comms/io/connection/LoggerConnection.java index 90352837..2b9f18b6 100644 --- a/src/enginuity/logger/ecu/comms/io/connection/LoggerConnection.java +++ b/src/enginuity/logger/ecu/comms/io/connection/LoggerConnection.java @@ -21,13 +21,13 @@ package enginuity.logger.ecu.comms.io.connection; -import enginuity.logger.ecu.comms.query.RegisteredQuery; +import enginuity.logger.ecu.comms.query.EcuQuery; import java.util.Collection; public interface LoggerConnection { - void sendAddressReads(Collection queries); + void sendAddressReads(Collection queries); void close(); diff --git a/src/enginuity/logger/ecu/comms/io/connection/SSMLoggerConnection.java b/src/enginuity/logger/ecu/comms/io/connection/SSMLoggerConnection.java index 735fbe1e..fbf1ad7e 100644 --- a/src/enginuity/logger/ecu/comms/io/connection/SSMLoggerConnection.java +++ b/src/enginuity/logger/ecu/comms/io/connection/SSMLoggerConnection.java @@ -26,7 +26,7 @@ import enginuity.io.connection.SerialConnection; import enginuity.io.connection.TestSSMConnectionImpl; import enginuity.logger.ecu.comms.io.protocol.LoggerProtocol; import enginuity.logger.ecu.comms.io.protocol.SSMLoggerProtocol; -import enginuity.logger.ecu.comms.query.RegisteredQuery; +import enginuity.logger.ecu.comms.query.EcuQuery; import enginuity.logger.ecu.exception.SerialCommunicationException; import static enginuity.util.HexUtil.asHex; import static enginuity.util.ParamChecker.checkNotNull; @@ -49,7 +49,7 @@ public final class SSMLoggerConnection implements LoggerConnection { serialConnection = new TestSSMConnectionImpl(connectionProperties, portName); } - public void sendAddressReads(Collection queries) { + public void sendAddressReads(Collection queries) { try { byte[] request = protocol.constructReadAddressRequest(queries); byte[] response = protocol.constructReadAddressResponse(queries); diff --git a/src/enginuity/logger/ecu/comms/io/protocol/LoggerProtocol.java b/src/enginuity/logger/ecu/comms/io/protocol/LoggerProtocol.java index 0a4a424a..f2d19652 100644 --- a/src/enginuity/logger/ecu/comms/io/protocol/LoggerProtocol.java +++ b/src/enginuity/logger/ecu/comms/io/protocol/LoggerProtocol.java @@ -21,17 +21,17 @@ package enginuity.logger.ecu.comms.io.protocol; -import enginuity.logger.ecu.comms.query.RegisteredQuery; +import enginuity.logger.ecu.comms.query.EcuQuery; import java.util.Collection; public interface LoggerProtocol { - byte[] constructReadAddressRequest(Collection queries); + byte[] constructReadAddressRequest(Collection queries); - byte[] constructReadAddressResponse(Collection queries); + byte[] constructReadAddressResponse(Collection queries); byte[] preprocessResponse(byte[] request, byte[] response); - void processReadAddressResponses(Collection queries, byte[] response); + void processReadAddressResponses(Collection queries, byte[] response); } diff --git a/src/enginuity/logger/ecu/comms/io/protocol/SSMLoggerProtocol.java b/src/enginuity/logger/ecu/comms/io/protocol/SSMLoggerProtocol.java index f373d39c..7407c5c8 100644 --- a/src/enginuity/logger/ecu/comms/io/protocol/SSMLoggerProtocol.java +++ b/src/enginuity/logger/ecu/comms/io/protocol/SSMLoggerProtocol.java @@ -29,7 +29,7 @@ import static enginuity.io.protocol.SSMProtocol.REQUEST_NON_DATA_BYTES; import static enginuity.io.protocol.SSMProtocol.RESPONSE_NON_DATA_BYTES; import static enginuity.io.protocol.SSMResponseProcessor.extractResponseData; import static enginuity.io.protocol.SSMResponseProcessor.filterRequestFromResponse; -import enginuity.logger.ecu.comms.query.RegisteredQuery; +import enginuity.logger.ecu.comms.query.EcuQuery; import static enginuity.util.ParamChecker.checkNotNullOrEmpty; import java.util.ArrayList; @@ -40,19 +40,19 @@ import java.util.Map; public final class SSMLoggerProtocol implements LoggerProtocol { private final Protocol protocol = new SSMProtocol(); - public byte[] constructReadAddressRequest(Collection queries) { - Collection filteredQueries = filterDuplicates(queries); + public byte[] constructReadAddressRequest(Collection queries) { + Collection filteredQueries = filterDuplicates(queries); return protocol.constructReadAddressRequest(convertToByteAddresses(filteredQueries)); } @SuppressWarnings({"PointlessArithmeticExpression"}) - public byte[] constructReadAddressResponse(Collection queries) { + public byte[] constructReadAddressResponse(Collection queries) { checkNotNullOrEmpty(queries, "queries"); // 0x80 0xF0 0x10 data_length 0xE8 value1 value2 ... valueN checksum - Collection filteredQueries = filterDuplicates(queries); + Collection filteredQueries = filterDuplicates(queries); int numAddresses = 0; - for (RegisteredQuery registeredQuery : filteredQueries) { - numAddresses += (registeredQuery.getBytes().length / ADDRESS_SIZE); + for (EcuQuery ecuQuery : filteredQueries) { + numAddresses += (ecuQuery.getBytes().length / ADDRESS_SIZE); } return new byte[(numAddresses * DATA_SIZE + RESPONSE_NON_DATA_BYTES) + (numAddresses * ADDRESS_SIZE + REQUEST_NON_DATA_BYTES)]; } @@ -63,27 +63,27 @@ public final class SSMLoggerProtocol implements LoggerProtocol { // processes the response bytes and sets individual responses on corresponding query objects @SuppressWarnings({"PointlessArithmeticExpression"}) - public void processReadAddressResponses(Collection queries, byte[] response) { + public void processReadAddressResponses(Collection queries, byte[] response) { checkNotNullOrEmpty(queries, "queries"); checkNotNullOrEmpty(response, "response"); byte[] responseData = extractResponseData(response); - Collection filteredQueries = filterDuplicates(queries); + Collection filteredQueries = filterDuplicates(queries); Map addressResults = new HashMap(); int i = 0; - for (RegisteredQuery filteredQuery : filteredQueries) { + for (EcuQuery filteredQuery : filteredQueries) { byte[] bytes = new byte[DATA_SIZE * (filteredQuery.getBytes().length / ADDRESS_SIZE)]; System.arraycopy(responseData, i, bytes, 0, bytes.length); addressResults.put(filteredQuery.getHex(), bytes); i += bytes.length; } - for (RegisteredQuery query : queries) { + for (EcuQuery query : queries) { query.setResponse(addressResults.get(query.getHex())); } } - private Collection filterDuplicates(Collection queries) { - Collection filteredQueries = new ArrayList(); - for (RegisteredQuery query : queries) { + private Collection filterDuplicates(Collection queries) { + Collection filteredQueries = new ArrayList(); + for (EcuQuery query : queries) { if (!filteredQueries.contains(query)) { filteredQueries.add(query); } @@ -91,14 +91,14 @@ public final class SSMLoggerProtocol implements LoggerProtocol { return filteredQueries; } - private byte[][] convertToByteAddresses(Collection queries) { + private byte[][] convertToByteAddresses(Collection queries) { int byteCount = 0; - for (RegisteredQuery query : queries) { + for (EcuQuery query : queries) { byteCount += query.getAddresses().length; } byte[][] addresses = new byte[byteCount][ADDRESS_SIZE]; int i = 0; - for (RegisteredQuery query : queries) { + for (EcuQuery query : queries) { byte[] bytes = query.getBytes(); for (int j = 0; j < bytes.length / ADDRESS_SIZE; j++) { System.arraycopy(bytes, j * ADDRESS_SIZE, addresses[i++], 0, ADDRESS_SIZE); diff --git a/src/enginuity/logger/ecu/comms/manager/QueryManagerImpl.java b/src/enginuity/logger/ecu/comms/manager/QueryManagerImpl.java index 7c0086b5..b043c0fc 100644 --- a/src/enginuity/logger/ecu/comms/manager/QueryManagerImpl.java +++ b/src/enginuity/logger/ecu/comms/manager/QueryManagerImpl.java @@ -27,10 +27,16 @@ import enginuity.io.connection.EcuConnectionImpl; import enginuity.io.protocol.Protocol; import enginuity.io.protocol.ProtocolFactory; import enginuity.logger.ecu.comms.query.EcuInitCallback; +import enginuity.logger.ecu.comms.query.EcuQuery; +import enginuity.logger.ecu.comms.query.EcuQueryImpl; +import enginuity.logger.ecu.comms.query.ExternalQuery; +import enginuity.logger.ecu.comms.query.ExternalQueryImpl; import enginuity.logger.ecu.comms.query.LoggerCallback; -import enginuity.logger.ecu.comms.query.RegisteredQuery; -import enginuity.logger.ecu.comms.query.RegisteredQueryImpl; +import enginuity.logger.ecu.comms.query.Query; +import enginuity.logger.ecu.definition.EcuData; +import static enginuity.logger.ecu.definition.EcuDataType.EXTERNAL; import enginuity.logger.ecu.definition.EcuSwitch; +import enginuity.logger.ecu.definition.ExternalData; import enginuity.logger.ecu.definition.LoggerData; import enginuity.logger.ecu.ui.MessageListener; import enginuity.logger.ecu.ui.StatusChangeListener; @@ -41,6 +47,7 @@ import static enginuity.util.ThreadUtil.sleep; import javax.swing.SwingUtilities; import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Collection; import static java.util.Collections.synchronizedList; import static java.util.Collections.synchronizedMap; import java.util.HashMap; @@ -50,13 +57,13 @@ import java.util.Map; public final class QueryManagerImpl implements QueryManager { private final DecimalFormat format = new DecimalFormat("0.00"); private final List listeners = synchronizedList(new ArrayList()); - private final Map queryMap = synchronizedMap(new HashMap()); - private final Map addList = new HashMap(); + private final Map queryMap = synchronizedMap(new HashMap()); + private final Map addList = new HashMap(); private final List removeList = new ArrayList(); private final Settings settings; private final EcuInitCallback ecuInitCallback; private final MessageListener messageListener; - private RegisteredQuery fileLoggerQuery; + private EcuQuery fileLoggerQuery; private Thread queryManagerThread; private boolean started; private boolean stop; @@ -75,13 +82,18 @@ public final class QueryManagerImpl implements QueryManager { public void setFileLoggerQuery(EcuSwitch ecuSwitch, LoggerCallback callback) { checkNotNull(ecuSwitch, callback); - fileLoggerQuery = new RegisteredQueryImpl(ecuSwitch, callback); + fileLoggerQuery = new EcuQueryImpl(ecuSwitch, callback); } public synchronized void addQuery(String callerId, LoggerData loggerData, LoggerCallback callback) { checkNotNull(callerId, loggerData, callback); - //FIXME: Integrate LoggerData here!!! Cater for ecu and external data items - //addList.put(buildQueryId(callerId, loggerData), new RegisteredQueryImpl(loggerData, callback)); + //FIXME: This is a hack!! + String queryId = buildQueryId(callerId, loggerData); + if (loggerData.getDataType() == EXTERNAL) { + addList.put(queryId, new ExternalQueryImpl((ExternalData) loggerData, callback)); + } else { + addList.put(queryId, new EcuQueryImpl((EcuData) loggerData, callback)); + } } public synchronized void removeQuery(String callerId, LoggerData loggerData) { @@ -156,11 +168,16 @@ public final class QueryManagerImpl implements QueryManager { messageListener.reportMessage("Select parameters to be logged..."); sleep(1000L); } else { - List queries = new ArrayList(queryMap.values()); + List ecuQueries = filterEcuQueries(queryMap.values()); if (fileLoggerQuery != null) { - queries.add(fileLoggerQuery); + ecuQueries.add(fileLoggerQuery); + } + txManager.sendQueries(ecuQueries); + List externalQueries = filterExternalQueries(queryMap.values()); + for (ExternalQuery externalQuery : externalQueries) { + //FIXME: This is a hack!! + externalQuery.setResponse(externalQuery.getExternalData().getSelectedConvertor().convert(null)); } - txManager.sendQueries(queries); count++; messageListener.reportMessage("Querying ECU..."); messageListener.reportStats(buildStatsMessage(start, count)); @@ -173,6 +190,28 @@ public final class QueryManagerImpl implements QueryManager { } } + //FIXME: This is a hack!! + private List filterEcuQueries(Collection queries) { + List filtered = new ArrayList(); + for (Query query : queries) { + if (EcuQuery.class.isAssignableFrom(query.getClass())) { + filtered.add((EcuQuery) query); + } + } + return filtered; + } + + //FIXME: This is a hack!! + private List filterExternalQueries(Collection queries) { + List filtered = new ArrayList(); + for (Query query : queries) { + if (ExternalQuery.class.isAssignableFrom(query.getClass())) { + filtered.add((ExternalQuery) query); + } + } + return filtered; + } + public void stop() { stop = true; if (queryManagerThread != null) { diff --git a/src/enginuity/logger/ecu/comms/manager/TransmissionManager.java b/src/enginuity/logger/ecu/comms/manager/TransmissionManager.java index 666f3ad9..ee3cb5b8 100644 --- a/src/enginuity/logger/ecu/comms/manager/TransmissionManager.java +++ b/src/enginuity/logger/ecu/comms/manager/TransmissionManager.java @@ -21,7 +21,7 @@ package enginuity.logger.ecu.comms.manager; -import enginuity.logger.ecu.comms.query.RegisteredQuery; +import enginuity.logger.ecu.comms.query.EcuQuery; import java.util.Collection; @@ -29,7 +29,7 @@ public interface TransmissionManager { void start(); - void sendQueries(Collection query); + void sendQueries(Collection queries); void stop(); diff --git a/src/enginuity/logger/ecu/comms/manager/TransmissionManagerImpl.java b/src/enginuity/logger/ecu/comms/manager/TransmissionManagerImpl.java index 718b36d5..c07901e8 100644 --- a/src/enginuity/logger/ecu/comms/manager/TransmissionManagerImpl.java +++ b/src/enginuity/logger/ecu/comms/manager/TransmissionManagerImpl.java @@ -24,7 +24,7 @@ package enginuity.logger.ecu.comms.manager; import enginuity.Settings; import enginuity.logger.ecu.comms.io.connection.LoggerConnection; import enginuity.logger.ecu.comms.io.connection.LoggerConnectionFactory; -import enginuity.logger.ecu.comms.query.RegisteredQuery; +import enginuity.logger.ecu.comms.query.EcuQuery; import enginuity.logger.ecu.exception.NotConnectedException; import enginuity.logger.ecu.exception.SerialCommunicationException; import static enginuity.util.ParamChecker.checkNotNull; @@ -53,7 +53,7 @@ public final class TransmissionManagerImpl implements TransmissionManager { } } - public void sendQueries(Collection queries) { + public void sendQueries(Collection queries) { checkNotNull(queries, "queries"); if (connection != null) { connection.sendAddressReads(queries); diff --git a/src/enginuity/logger/ecu/comms/query/RegisteredQuery.java b/src/enginuity/logger/ecu/comms/query/EcuQuery.java similarity index 92% rename from src/enginuity/logger/ecu/comms/query/RegisteredQuery.java rename to src/enginuity/logger/ecu/comms/query/EcuQuery.java index 40a480fe..82633e35 100644 --- a/src/enginuity/logger/ecu/comms/query/RegisteredQuery.java +++ b/src/enginuity/logger/ecu/comms/query/EcuQuery.java @@ -21,7 +21,7 @@ package enginuity.logger.ecu.comms.query; -public interface RegisteredQuery { +public interface EcuQuery extends Query { String[] getAddresses(); diff --git a/src/enginuity/logger/ecu/comms/query/RegisteredQueryImpl.java b/src/enginuity/logger/ecu/comms/query/EcuQueryImpl.java similarity index 87% rename from src/enginuity/logger/ecu/comms/query/RegisteredQueryImpl.java rename to src/enginuity/logger/ecu/comms/query/EcuQueryImpl.java index c1bd0b21..2ad05d69 100644 --- a/src/enginuity/logger/ecu/comms/query/RegisteredQueryImpl.java +++ b/src/enginuity/logger/ecu/comms/query/EcuQueryImpl.java @@ -26,13 +26,13 @@ import static enginuity.util.HexUtil.asBytes; import static enginuity.util.HexUtil.asHex; import static enginuity.util.ParamChecker.checkNotNull; -public final class RegisteredQueryImpl implements RegisteredQuery { +public final class EcuQueryImpl implements EcuQuery { private final EcuData ecuData; private final LoggerCallback callback; private final byte[] bytes; private final String hex; - public RegisteredQueryImpl(EcuData ecuData, LoggerCallback callback) { + public EcuQueryImpl(EcuData ecuData, LoggerCallback callback) { checkNotNull(ecuData, callback); this.ecuData = ecuData; this.callback = callback; @@ -57,7 +57,7 @@ public final class RegisteredQueryImpl implements RegisteredQuery { } public boolean equals(Object object) { - return object instanceof RegisteredQueryImpl && getHex().equals(((RegisteredQueryImpl) object).getHex()); + return object instanceof EcuQueryImpl && getHex().equals(((EcuQueryImpl) object).getHex()); } public int hashCode() { diff --git a/src/enginuity/logger/ecu/comms/query/ExternalQuery.java b/src/enginuity/logger/ecu/comms/query/ExternalQuery.java new file mode 100644 index 00000000..5fd18bcc --- /dev/null +++ b/src/enginuity/logger/ecu/comms/query/ExternalQuery.java @@ -0,0 +1,10 @@ +package enginuity.logger.ecu.comms.query; + +import enginuity.logger.ecu.definition.ExternalData; + +public interface ExternalQuery extends Query { + + ExternalData getExternalData(); + + void setResponse(double response); +} diff --git a/src/enginuity/logger/ecu/comms/query/ExternalQueryImpl.java b/src/enginuity/logger/ecu/comms/query/ExternalQueryImpl.java new file mode 100644 index 00000000..020adf4d --- /dev/null +++ b/src/enginuity/logger/ecu/comms/query/ExternalQueryImpl.java @@ -0,0 +1,23 @@ +package enginuity.logger.ecu.comms.query; + +import enginuity.logger.ecu.definition.ExternalData; +import static enginuity.util.ParamChecker.checkNotNull; + +public final class ExternalQueryImpl implements ExternalQuery { + private final ExternalData externalData; + private final LoggerCallback callback; + + public ExternalQueryImpl(ExternalData externalData, LoggerCallback callback) { + checkNotNull(externalData, callback); + this.externalData = externalData; + this.callback = callback; + } + + public ExternalData getExternalData() { + return externalData; + } + + public void setResponse(double response) { + callback.callback(response); + } +} diff --git a/src/enginuity/logger/ecu/comms/query/Query.java b/src/enginuity/logger/ecu/comms/query/Query.java new file mode 100644 index 00000000..33dfbd80 --- /dev/null +++ b/src/enginuity/logger/ecu/comms/query/Query.java @@ -0,0 +1,4 @@ +package enginuity.logger.ecu.comms.query; + +public interface Query { +}