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:
kascade 2007-03-06 12:31:09 +00:00
parent 30511ac183
commit b4b664753a
12 changed files with 120 additions and 44 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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);
}

View File

@ -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);

View File

@ -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) {

View File

@ -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();

View File

@ -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);

View File

@ -21,7 +21,7 @@
package enginuity.logger.ecu.comms.query;
public interface RegisteredQuery {
public interface EcuQuery extends Query {
String[] getAddresses();

View File

@ -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() {

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -0,0 +1,4 @@
package enginuity.logger.ecu.comms.query;
public interface Query {
}