From a100c6b8e25f3c0f4897e8a5856e97c7a165080d Mon Sep 17 00:00:00 2001 From: Dale Schultz Date: Mon, 26 Jan 2015 23:38:46 -0500 Subject: [PATCH] Added methods to use new EcuQueryRange class and parse the results --- .../ds2/iso9141/DS2LoggerProtocol.java | 59 ++++++++++++++++++- .../io/connection/DS2LoggerConnection.java | 41 +++++++++---- .../comms/io/protocol/LoggerProtocolDS2.java | 9 ++- 3 files changed, 95 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/romraider/io/protocol/ds2/iso9141/DS2LoggerProtocol.java b/src/main/java/com/romraider/io/protocol/ds2/iso9141/DS2LoggerProtocol.java index e83b5f6d..beb23de0 100644 --- a/src/main/java/com/romraider/io/protocol/ds2/iso9141/DS2LoggerProtocol.java +++ b/src/main/java/com/romraider/io/protocol/ds2/iso9141/DS2LoggerProtocol.java @@ -81,6 +81,14 @@ public final class DS2LoggerProtocol implements LoggerProtocolDS2 { module, convertToByteAddresses(filteredQueries), getDataLength(filteredQueries)); } + @Override + public byte[] constructReadMemoryRange( + Module module, Collection queries, int length) { + + return protocol.constructReadMemoryRequest( + module, convertToByteAddresses(queries), length); + } + @Override public byte[] constructReadAddressResponse(Collection 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 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 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 queries, byte[] response) { + + checkNotNullOrEmpty(queries, "queries"); + checkNotNullOrEmpty(response, "response"); + final byte[] responseData = extractResponseData(response); + final Collection filteredQueries = filterDuplicates(queries); + final Map addressResults = new HashMap(); + + 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; diff --git a/src/main/java/com/romraider/logger/ecu/comms/io/connection/DS2LoggerConnection.java b/src/main/java/com/romraider/logger/ecu/comms/io/connection/DS2LoggerConnection.java index 3d547ab5..a0263aa8 100644 --- a/src/main/java/com/romraider/logger/ecu/comms/io/connection/DS2LoggerConnection.java +++ b/src/main/java/com/romraider/logger/ecu/comms/io/connection/DS2LoggerConnection.java @@ -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 queryList = new ArrayList(); - queryList.add(query); - request = protocol.constructReadMemoryRequest( - module, queryList); + final EcuQueryRangeTest range = new EcuQueryRangeTest(querySet); + final Collection 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 queryList = new ArrayList(); + 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 { diff --git a/src/main/java/com/romraider/logger/ecu/comms/io/protocol/LoggerProtocolDS2.java b/src/main/java/com/romraider/logger/ecu/comms/io/protocol/LoggerProtocolDS2.java index 5effcb97..4b1d12a2 100644 --- a/src/main/java/com/romraider/logger/ecu/comms/io/protocol/LoggerProtocolDS2.java +++ b/src/main/java/com/romraider/logger/ecu/comms/io/protocol/LoggerProtocolDS2.java @@ -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 queryList); + + byte[] constructReadMemoryRange(Module module, + Collection queries, int length); + + public byte[] constructReadMemoryRangeResponse(int requestSize, int length); + + void processReadMemoryRangeResponse(Collection queries, byte[] response); }