mirror of https://github.com/rusefi/RomRaider.git
started external data source stuff
git-svn-id: http://svn.3splooges.com/romraider-arch/trunk@562 d2e2e1cd-ba16-0410-be16-b7c4453c7c2d
This commit is contained in:
parent
30511ac183
commit
b4b664753a
|
@ -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<RegisteredQuery> queries);
|
||||
void sendAddressReads(Collection<EcuQuery> queries);
|
||||
|
||||
void close();
|
||||
|
||||
|
|
|
@ -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<RegisteredQuery> queries) {
|
||||
public void sendAddressReads(Collection<EcuQuery> queries) {
|
||||
try {
|
||||
byte[] request = protocol.constructReadAddressRequest(queries);
|
||||
byte[] response = protocol.constructReadAddressResponse(queries);
|
||||
|
|
|
@ -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<RegisteredQuery> queries);
|
||||
byte[] constructReadAddressRequest(Collection<EcuQuery> queries);
|
||||
|
||||
byte[] constructReadAddressResponse(Collection<RegisteredQuery> queries);
|
||||
byte[] constructReadAddressResponse(Collection<EcuQuery> queries);
|
||||
|
||||
byte[] preprocessResponse(byte[] request, byte[] response);
|
||||
|
||||
void processReadAddressResponses(Collection<RegisteredQuery> queries, byte[] response);
|
||||
void processReadAddressResponses(Collection<EcuQuery> queries, byte[] response);
|
||||
}
|
||||
|
|
|
@ -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<RegisteredQuery> queries) {
|
||||
Collection<RegisteredQuery> filteredQueries = filterDuplicates(queries);
|
||||
public byte[] constructReadAddressRequest(Collection<EcuQuery> queries) {
|
||||
Collection<EcuQuery> filteredQueries = filterDuplicates(queries);
|
||||
return protocol.constructReadAddressRequest(convertToByteAddresses(filteredQueries));
|
||||
}
|
||||
|
||||
@SuppressWarnings({"PointlessArithmeticExpression"})
|
||||
public byte[] constructReadAddressResponse(Collection<RegisteredQuery> queries) {
|
||||
public byte[] constructReadAddressResponse(Collection<EcuQuery> queries) {
|
||||
checkNotNullOrEmpty(queries, "queries");
|
||||
// 0x80 0xF0 0x10 data_length 0xE8 value1 value2 ... valueN checksum
|
||||
Collection<RegisteredQuery> filteredQueries = filterDuplicates(queries);
|
||||
Collection<EcuQuery> 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<RegisteredQuery> queries, byte[] response) {
|
||||
public void processReadAddressResponses(Collection<EcuQuery> queries, byte[] response) {
|
||||
checkNotNullOrEmpty(queries, "queries");
|
||||
checkNotNullOrEmpty(response, "response");
|
||||
byte[] responseData = extractResponseData(response);
|
||||
Collection<RegisteredQuery> filteredQueries = filterDuplicates(queries);
|
||||
Collection<EcuQuery> filteredQueries = filterDuplicates(queries);
|
||||
Map<String, byte[]> addressResults = new HashMap<String, byte[]>();
|
||||
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<RegisteredQuery> filterDuplicates(Collection<RegisteredQuery> queries) {
|
||||
Collection<RegisteredQuery> filteredQueries = new ArrayList<RegisteredQuery>();
|
||||
for (RegisteredQuery query : queries) {
|
||||
private Collection<EcuQuery> filterDuplicates(Collection<EcuQuery> queries) {
|
||||
Collection<EcuQuery> filteredQueries = new ArrayList<EcuQuery>();
|
||||
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<RegisteredQuery> queries) {
|
||||
private byte[][] convertToByteAddresses(Collection<EcuQuery> 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);
|
||||
|
|
|
@ -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<StatusChangeListener> listeners = synchronizedList(new ArrayList<StatusChangeListener>());
|
||||
private final Map<String, RegisteredQuery> queryMap = synchronizedMap(new HashMap<String, RegisteredQuery>());
|
||||
private final Map<String, RegisteredQuery> addList = new HashMap<String, RegisteredQuery>();
|
||||
private final Map<String, Query> queryMap = synchronizedMap(new HashMap<String, Query>());
|
||||
private final Map<String, Query> addList = new HashMap<String, Query>();
|
||||
private final List<String> removeList = new ArrayList<String>();
|
||||
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<RegisteredQuery> queries = new ArrayList<RegisteredQuery>(queryMap.values());
|
||||
List<EcuQuery> ecuQueries = filterEcuQueries(queryMap.values());
|
||||
if (fileLoggerQuery != null) {
|
||||
queries.add(fileLoggerQuery);
|
||||
ecuQueries.add(fileLoggerQuery);
|
||||
}
|
||||
txManager.sendQueries(ecuQueries);
|
||||
List<ExternalQuery> 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<EcuQuery> filterEcuQueries(Collection<Query> queries) {
|
||||
List<EcuQuery> filtered = new ArrayList<EcuQuery>();
|
||||
for (Query query : queries) {
|
||||
if (EcuQuery.class.isAssignableFrom(query.getClass())) {
|
||||
filtered.add((EcuQuery) query);
|
||||
}
|
||||
}
|
||||
return filtered;
|
||||
}
|
||||
|
||||
//FIXME: This is a hack!!
|
||||
private List<ExternalQuery> filterExternalQueries(Collection<Query> queries) {
|
||||
List<ExternalQuery> filtered = new ArrayList<ExternalQuery>();
|
||||
for (Query query : queries) {
|
||||
if (ExternalQuery.class.isAssignableFrom(query.getClass())) {
|
||||
filtered.add((ExternalQuery) query);
|
||||
}
|
||||
}
|
||||
return filtered;
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
stop = true;
|
||||
if (queryManagerThread != null) {
|
||||
|
|
|
@ -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<RegisteredQuery> query);
|
||||
void sendQueries(Collection<EcuQuery> queries);
|
||||
|
||||
void stop();
|
||||
|
||||
|
|
|
@ -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<RegisteredQuery> queries) {
|
||||
public void sendQueries(Collection<EcuQuery> queries) {
|
||||
checkNotNull(queries, "queries");
|
||||
if (connection != null) {
|
||||
connection.sendAddressReads(queries);
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
package enginuity.logger.ecu.comms.query;
|
||||
|
||||
public interface RegisteredQuery {
|
||||
public interface EcuQuery extends Query {
|
||||
|
||||
String[] getAddresses();
|
||||
|
|
@ -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() {
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
package enginuity.logger.ecu.comms.query;
|
||||
|
||||
public interface Query {
|
||||
}
|
Loading…
Reference in New Issue