Added methods to use new EcuQueryRange class and parse the results

This commit is contained in:
Dale Schultz 2015-01-26 23:38:46 -05:00
parent eb68263d6e
commit a100c6b8e2
3 changed files with 95 additions and 14 deletions

View File

@ -81,6 +81,14 @@ public final class DS2LoggerProtocol implements LoggerProtocolDS2 {
module, convertToByteAddresses(filteredQueries), getDataLength(filteredQueries)); module, convertToByteAddresses(filteredQueries), getDataLength(filteredQueries));
} }
@Override
public byte[] constructReadMemoryRange(
Module module, Collection<EcuQuery> queries, int length) {
return protocol.constructReadMemoryRequest(
module, convertToByteAddresses(queries), length);
}
@Override @Override
public byte[] constructReadAddressResponse(Collection<EcuQuery> queries, public byte[] constructReadAddressResponse(Collection<EcuQuery> queries,
PollingState pollState) { PollingState pollState) {
@ -100,6 +108,12 @@ public final class DS2LoggerProtocol implements LoggerProtocolDS2 {
return new byte[requestSize + RESPONSE_NON_DATA_BYTES + numAddresses]; return new byte[requestSize + RESPONSE_NON_DATA_BYTES + numAddresses];
} }
@Override
public byte[] constructReadMemoryRangeResponse(int requestSize, int length) {
return new byte[requestSize + RESPONSE_NON_DATA_BYTES + length];
}
@Override @Override
public byte[] constructReadGroupResponse( public byte[] constructReadGroupResponse(
Collection<EcuQuery> queries, int requestSize) { Collection<EcuQuery> queries, int requestSize) {
@ -133,7 +147,13 @@ public final class DS2LoggerProtocol implements LoggerProtocolDS2 {
protocol.checkValidEcuResetResponse(response); protocol.checkValidEcuResetResponse(response);
} }
// processes the response bytes and sets individual responses on corresponding query objects /**
* Processes the response bytes and set individual response on corresponding
* query objects.
* If EcuData has a group size value greater than 0 then the response is
* the result of a group read and the address is the index into the response
* array.
**/
@Override @Override
public void processReadAddressResponses(Collection<EcuQuery> queries, byte[] response, PollingState pollState) { public void processReadAddressResponses(Collection<EcuQuery> queries, byte[] response, PollingState pollState) {
checkNotNullOrEmpty(queries, "queries"); checkNotNullOrEmpty(queries, "queries");
@ -157,6 +177,43 @@ public final class DS2LoggerProtocol implements LoggerProtocolDS2 {
} }
} }
/**
* Processes the response bytes and set individual response on corresponding
* query objects.
* The response data is based on the lowest EcuData address and the length
* is the result of the difference between the highest and lowest address.
* The index into the response array is based in the lowest address.
**/
public void processReadMemoryRangeResponse(
Collection<EcuQuery> queries, byte[] response) {
checkNotNullOrEmpty(queries, "queries");
checkNotNullOrEmpty(response, "response");
final byte[] responseData = extractResponseData(response);
final Collection<EcuQuery> filteredQueries = filterDuplicates(queries);
final Map<String, byte[]> addressResults = new HashMap<String, byte[]>();
int lowestAddress = Integer.MAX_VALUE;
for (EcuQuery filteredQuery : filteredQueries) {
final int address = Integer.parseInt(filteredQuery.getHex(), 16);
if (address < lowestAddress) {
lowestAddress = address;
}
}
int srcPos = 0;
for (EcuQuery filteredQuery : filteredQueries) {
final byte[] bytes = new byte[getDataLength(filteredQuery)];
srcPos = Integer.parseInt(filteredQuery.getHex(), 16) - lowestAddress;
arraycopy(responseData, srcPos, bytes, 0, bytes.length);
addressResults.put(filteredQuery.getHex(), bytes);
}
for (EcuQuery query : queries) {
query.setResponse(addressResults.get(query.getHex()));
}
}
@Override @Override
public Protocol getProtocol() { public Protocol getProtocol() {
return protocol; return protocol;

View File

@ -1,6 +1,6 @@
/* /*
* RomRaider Open-Source Tuning, Logging and Reflashing * RomRaider Open-Source Tuning, Logging and Reflashing
* Copyright (C) 2006-2014 RomRaider.com * Copyright (C) 2006-2015 RomRaider.com
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -38,6 +38,7 @@ import com.romraider.logger.ecu.comms.manager.PollingState;
import com.romraider.logger.ecu.comms.manager.PollingStateImpl; import com.romraider.logger.ecu.comms.manager.PollingStateImpl;
import com.romraider.logger.ecu.comms.query.EcuInitCallback; import com.romraider.logger.ecu.comms.query.EcuInitCallback;
import com.romraider.logger.ecu.comms.query.EcuQuery; import com.romraider.logger.ecu.comms.query.EcuQuery;
import com.romraider.logger.ecu.comms.query.EcuQueryRangeTest;
import com.romraider.logger.ecu.definition.EcuData; import com.romraider.logger.ecu.definition.EcuData;
import com.romraider.logger.ecu.definition.Module; import com.romraider.logger.ecu.definition.Module;
import com.romraider.util.SettingsManager; import com.romraider.util.SettingsManager;
@ -106,19 +107,35 @@ public final class DS2LoggerConnection implements LoggerConnection {
} }
} }
else if (group.equalsIgnoreCase("0x060x00")) { else if (group.equalsIgnoreCase("0x060x00")) {
for (EcuQuery query : querySet) { final EcuQueryRangeTest range = new EcuQueryRangeTest(querySet);
final Collection<EcuQuery> queryList = new ArrayList<EcuQuery>(); final Collection<EcuQuery> newQuery = range.validate();
queryList.add(query); int length = range.getLength();
request = protocol.constructReadMemoryRequest( if (newQuery != null && length > 0) {
module, queryList); request = protocol.constructReadMemoryRange(
module, newQuery, length);
LOGGER.debug("Mode:" + pollState.getCurrentState() + " " + LOGGER.debug("Mode:" + pollState.getCurrentState() + " " +
module + " Request ---> " + asHex(request)); module + " Request ---> " + asHex(request));
response = protocol.constructReadAddressResponse( response = protocol.constructReadMemoryRangeResponse(
queryList, request.length); request.length, length);
protocol.processReadAddressResponses( protocol.processReadMemoryRangeResponse(
queryList, querySet,
sendRcv(module ,request, response, pollState), sendRcv(module, request, response, pollState));
pollState); }
else {
for (EcuQuery query : querySet) {
final Collection<EcuQuery> queryList = new ArrayList<EcuQuery>();
queryList.add(query);
request = protocol.constructReadMemoryRequest(
module, queryList);
LOGGER.debug("Mode:" + pollState.getCurrentState() + " " +
module + " Request ---> " + asHex(request));
response = protocol.constructReadAddressResponse(
queryList, request.length);
protocol.processReadAddressResponses(
queryList,
sendRcv(module, request, response, pollState),
pollState);
}
} }
} }
else { else {

View File

@ -1,6 +1,6 @@
/* /*
* RomRaider Open-Source Tuning, Logging and Reflashing * RomRaider Open-Source Tuning, Logging and Reflashing
* Copyright (C) 2006-2014 RomRaider.com * Copyright (C) 2006-2015 RomRaider.com
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -39,4 +39,11 @@ public interface LoggerProtocolDS2 extends LoggerProtocol {
byte[] constructReadMemoryRequest( byte[] constructReadMemoryRequest(
Module module, Collection<EcuQuery> queryList); Module module, Collection<EcuQuery> queryList);
byte[] constructReadMemoryRange(Module module,
Collection<EcuQuery> queries, int length);
public byte[] constructReadMemoryRangeResponse(int requestSize, int length);
void processReadMemoryRangeResponse(Collection<EcuQuery> queries, byte[] response);
} }