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));
}
@Override
public byte[] constructReadMemoryRange(
Module module, Collection<EcuQuery> queries, int length) {
return protocol.constructReadMemoryRequest(
module, convertToByteAddresses(queries), length);
}
@Override
public byte[] constructReadAddressResponse(Collection<EcuQuery> queries,
PollingState pollState) {
@ -100,6 +108,12 @@ public final class DS2LoggerProtocol implements LoggerProtocolDS2 {
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
public byte[] constructReadGroupResponse(
Collection<EcuQuery> queries, int requestSize) {
@ -133,7 +147,13 @@ public final class DS2LoggerProtocol implements LoggerProtocolDS2 {
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
public void processReadAddressResponses(Collection<EcuQuery> queries, byte[] response, PollingState pollState) {
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
public Protocol getProtocol() {
return protocol;

View File

@ -1,6 +1,6 @@
/*
* 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
* 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.query.EcuInitCallback;
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.Module;
import com.romraider.util.SettingsManager;
@ -106,19 +107,35 @@ public final class DS2LoggerConnection implements LoggerConnection {
}
}
else if (group.equalsIgnoreCase("0x060x00")) {
for (EcuQuery query : querySet) {
final Collection<EcuQuery> queryList = new ArrayList<EcuQuery>();
queryList.add(query);
request = protocol.constructReadMemoryRequest(
module, queryList);
final EcuQueryRangeTest range = new EcuQueryRangeTest(querySet);
final Collection<EcuQuery> newQuery = range.validate();
int length = range.getLength();
if (newQuery != null && length > 0) {
request = protocol.constructReadMemoryRange(
module, newQuery, length);
LOGGER.debug("Mode:" + pollState.getCurrentState() + " " +
module + " Request ---> " + asHex(request));
response = protocol.constructReadAddressResponse(
queryList, request.length);
protocol.processReadAddressResponses(
queryList,
sendRcv(module ,request, response, pollState),
pollState);
response = protocol.constructReadMemoryRangeResponse(
request.length, length);
protocol.processReadMemoryRangeResponse(
querySet,
sendRcv(module, request, response, 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 {

View File

@ -1,6 +1,6 @@
/*
* 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
* it under the terms of the GNU General Public License as published by
@ -39,4 +39,11 @@ public interface LoggerProtocolDS2 extends LoggerProtocol {
byte[] constructReadMemoryRequest(
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);
}