add j2534 support

git-svn-id: https://svn2.assembla.com/svn/romraider/trunk@151 38686702-15cf-42e4-a595-3071df8bf5ea
This commit is contained in:
kascade 2008-09-21 02:16:25 +00:00
parent 93f91364fc
commit 806eb3be09
9 changed files with 193 additions and 102 deletions

View File

@ -0,0 +1,31 @@
/*
*
* RomRaider Open-Source Tuning, Logging and Reflashing
* Copyright (C) 2006-2008 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
package com.romraider.io.connection;
public interface ConnectionManager {
void send(byte[] request, byte[] response, long sendTimeout);
byte[] send(byte[] bytes, long maxWait);
void close();
}

View File

@ -0,0 +1,89 @@
/*
*
* RomRaider Open-Source Tuning, Logging and Reflashing
* Copyright (C) 2006-2008 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
package com.romraider.io.j2534.api;
import com.romraider.io.connection.ConnectionManager;
import com.romraider.io.connection.ConnectionProperties;
import com.romraider.io.j2534.op20.J2534OpenPort20;
import static com.romraider.io.j2534.op20.OpenPort20.CONFIG_P1_MAX;
import static com.romraider.io.j2534.op20.OpenPort20.CONFIG_P3_MIN;
import static com.romraider.io.j2534.op20.OpenPort20.CONFIG_P4_MIN;
import static com.romraider.io.j2534.op20.OpenPort20.FLAG_ISO9141_NO_CHECKSUM;
import static com.romraider.io.j2534.op20.OpenPort20.PROTOCOL_ISO9141;
import static com.romraider.util.ParamChecker.checkNotNull;
import org.apache.log4j.Logger;
import static org.apache.log4j.Logger.getLogger;
public final class J2534ConnectionManager implements ConnectionManager {
private static final Logger LOGGER = getLogger(J2534ConnectionManager.class);
private final J2534 api = new J2534OpenPort20(PROTOCOL_ISO9141);
private final ConnectionProperties connectionProperties;
private int channelId;
private int deviceId;
private int msgId;
public J2534ConnectionManager(ConnectionProperties connectionProperties) {
checkNotNull(connectionProperties, "connectionProperties");
this.connectionProperties = connectionProperties;
initJ2534(connectionProperties);
}
private void initJ2534(ConnectionProperties connectionProperties) {
this.deviceId = api.open();
version(deviceId);
this.channelId = api.connect(deviceId, FLAG_ISO9141_NO_CHECKSUM, connectionProperties.getBaudRate());
setConfig(channelId);
this.msgId = api.startPassMsgFilter(channelId, (byte) 0x00, (byte) 0x00);
}
// Send request and wait for response with known length
public void send(byte[] request, byte[] response, long timeout) {
checkNotNull(request, "request");
checkNotNull(request, "response");
// FIX - Complete!
}
// Send request and wait specified time for response with unknown length
public byte[] send(byte[] bytes, long maxWait) {
checkNotNull(bytes, "bytes");
api.writeMsg(channelId, bytes, connectionProperties.getSendTimeout());
return api.readMsg(channelId, maxWait);
}
public void close() {
api.stopMsgFilter(channelId, msgId);
api.disconnect(channelId);
api.close(deviceId);
}
private void version(int deviceId) {
Version version = api.readVersion(deviceId);
System.out.println("Version => firmware: " + version.firmware + ", dll: " + version.dll + ", api: " + version.api);
}
private void setConfig(int channelId) {
ConfigItem p1Max = new ConfigItem(CONFIG_P1_MAX, 2);
ConfigItem p3Min = new ConfigItem(CONFIG_P3_MIN, 0);
ConfigItem p4Min = new ConfigItem(CONFIG_P4_MIN, 0);
api.setConfig(channelId, p1Max, p3Min, p4Min);
}
}

View File

@ -131,7 +131,7 @@ public final class J2534OpenPort20 implements J2534 {
private boolean isResponse(PassThruMessage msg) {
if (msg.RxStatus != 0x00) return false;
return msg.Timestamp > 0;
return msg.Timestamp != 0;
}
private PassThruMessage doReadMsg(int channelId) {

View File

@ -21,11 +21,67 @@
package com.romraider.io.serial.connection;
public interface SerialConnectionManager {
import com.romraider.io.connection.ConnectionManager;
import com.romraider.io.connection.ConnectionProperties;
import static com.romraider.util.HexUtil.asHex;
import static com.romraider.util.ParamChecker.checkNotNull;
import static com.romraider.util.ParamChecker.checkNotNullOrEmpty;
import static com.romraider.util.ThreadUtil.sleep;
import org.apache.log4j.Logger;
import static org.apache.log4j.Logger.getLogger;
import static java.lang.System.currentTimeMillis;
void send(byte[] request, byte[] response, long sendTimeout);
public final class SerialConnectionManager implements ConnectionManager {
private static final Logger LOGGER = getLogger(SerialConnectionManager.class);
private final SerialConnection connection;
byte[] send(byte[] bytes, long maxWait);
void close();
public SerialConnectionManager(String portName, ConnectionProperties connectionProperties) {
checkNotNullOrEmpty(portName, "portName");
checkNotNull(connectionProperties, "connectionProperties");
// Use TestSerialConnection for testing!!
connection = new SerialConnectionImpl(portName, connectionProperties);
// connection = new TestSerialConnection(portName, connectionProperties);
}
// Send request and wait for response with known length
public void send(byte[] request, byte[] response, long timeout) {
checkNotNull(request, "request");
checkNotNull(request, "response");
connection.readStaleData();
connection.write(request);
while (connection.available() < response.length) {
sleep(1);
timeout -= 1;
if (timeout <= 0) {
byte[] badBytes = new byte[connection.available()];
connection.read(badBytes);
LOGGER.debug("Bad response (read timeout): " + asHex(badBytes));
break;
}
}
connection.read(response);
}
// Send request and wait specified time for response with unknown length
public byte[] send(byte[] bytes, long maxWait) {
checkNotNull(bytes, "bytes");
connection.readStaleData();
connection.write(bytes);
int available = 0;
boolean keepLooking = true;
long lastChange = currentTimeMillis();
while (keepLooking) {
sleep(2);
if (connection.available() != available) {
available = connection.available();
lastChange = currentTimeMillis();
}
keepLooking = (currentTimeMillis() - lastChange) < maxWait;
}
return connection.readAvailable();
}
public void close() {
connection.close();
}
}

View File

@ -1,86 +0,0 @@
/*
*
* RomRaider Open-Source Tuning, Logging and Reflashing
* Copyright (C) 2006-2008 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
package com.romraider.io.serial.connection;
import com.romraider.io.connection.ConnectionProperties;
import static com.romraider.util.HexUtil.asHex;
import static com.romraider.util.ParamChecker.checkNotNull;
import static com.romraider.util.ParamChecker.checkNotNullOrEmpty;
import static com.romraider.util.ThreadUtil.sleep;
import org.apache.log4j.Logger;
import static org.apache.log4j.Logger.getLogger;
import static java.lang.System.currentTimeMillis;
public final class SerialConnectionManagerImpl implements SerialConnectionManager {
private static final Logger LOGGER = getLogger(SerialConnectionManagerImpl.class);
private final SerialConnection connection;
public SerialConnectionManagerImpl(String portName, ConnectionProperties connectionProperties) {
checkNotNullOrEmpty(portName, "portName");
checkNotNull(connectionProperties, "connectionProperties");
// Use TestSerialConnection for testing!!
connection = new SerialConnectionImpl(portName, connectionProperties);
// connection = new TestSerialConnection(portName, connectionProperties);
}
// Send request and wait for response with known length
public void send(byte[] request, byte[] response, long timeout) {
checkNotNull(request, "request");
checkNotNull(request, "response");
connection.readStaleData();
connection.write(request);
while (connection.available() < response.length) {
sleep(1);
timeout -= 1;
if (timeout <= 0) {
byte[] badBytes = new byte[connection.available()];
connection.read(badBytes);
LOGGER.debug("Bad response (read timeout): " + asHex(badBytes));
break;
}
}
connection.read(response);
}
// Send request and wait specified time for response with unknown length
public byte[] send(byte[] bytes, long maxWait) {
checkNotNull(bytes, "bytes");
connection.readStaleData();
connection.write(bytes);
int available = 0;
boolean keepLooking = true;
long lastChange = currentTimeMillis();
while (keepLooking) {
sleep(2);
if (connection.available() != available) {
available = connection.available();
lastChange = currentTimeMillis();
}
keepLooking = (currentTimeMillis() - lastChange) < maxWait;
}
return connection.readAvailable();
}
public void close() {
connection.close();
}
}

View File

@ -21,9 +21,9 @@
package com.romraider.logger.ecu.comms.io.connection;
import com.romraider.io.connection.ConnectionManager;
import com.romraider.io.connection.ConnectionProperties;
import com.romraider.io.serial.connection.SerialConnectionManager;
import com.romraider.io.serial.connection.SerialConnectionManagerImpl;
import com.romraider.logger.ecu.comms.io.protocol.LoggerProtocol;
import com.romraider.logger.ecu.comms.io.protocol.SSMLoggerProtocol;
import com.romraider.logger.ecu.comms.query.EcuQuery;
@ -34,12 +34,12 @@ import java.util.Collection;
public final class SSMLoggerConnection implements LoggerConnection {
private static final long SEND_TIMEOUT = 2000L;
private final LoggerProtocol protocol = new SSMLoggerProtocol();
private final SerialConnectionManager manager;
private final ConnectionManager manager;
public SSMLoggerConnection(String portName, ConnectionProperties connectionProperties) {
checkNotNullOrEmpty(portName, "portName");
checkNotNull(connectionProperties);
this.manager = new SerialConnectionManagerImpl(portName, connectionProperties);
this.manager = new SerialConnectionManager(portName, connectionProperties);
}
public void sendAddressReads(Collection<EcuQuery> queries) {

View File

@ -22,11 +22,11 @@
package com.romraider.logger.ecu.comms.manager;
import com.romraider.Settings;
import com.romraider.io.connection.ConnectionManager;
import com.romraider.io.connection.ConnectionProperties;
import com.romraider.io.j2534.api.J2534ConnectionManager;
import com.romraider.io.protocol.Protocol;
import static com.romraider.io.protocol.ProtocolFactory.getProtocol;
import com.romraider.io.serial.connection.SerialConnectionManager;
import com.romraider.io.serial.connection.SerialConnectionManagerImpl;
import com.romraider.logger.ecu.comms.query.EcuInitCallback;
import com.romraider.logger.ecu.comms.query.EcuQuery;
import com.romraider.logger.ecu.comms.query.EcuQueryImpl;
@ -143,12 +143,13 @@ public final class QueryManagerImpl implements QueryManager {
try {
Protocol protocol = getProtocol(settings.getLoggerProtocol());
ConnectionProperties connectionProperties = settings.getLoggerConnectionProperties();
SerialConnectionManager connectionManager = new SerialConnectionManagerImpl(settings.getLoggerPort(), connectionProperties);
// ConnectionManager connectionManager = new SerialConnectionManager(settings.getLoggerPort(), connectionProperties);
ConnectionManager connectionManager = new J2534ConnectionManager(connectionProperties);
try {
messageListener.reportMessage("Sending ECU Init...");
byte[] request = protocol.constructEcuInitRequest();
LOGGER.debug("Ecu Init Request ---> " + asHex(request));
byte[] response = connectionManager.send(request, connectionProperties.getSendTimeout());
byte[] response = connectionManager.send(request, 500L);
byte[] processedResponse = protocol.preprocessResponse(request, response);
protocol.checkValidEcuInitResponse(processedResponse);
LOGGER.debug("Ecu Init Response <--- " + asHex(processedResponse));

View File

@ -22,11 +22,11 @@
package com.romraider.logger.ecu.comms.reset;
import com.romraider.Settings;
import com.romraider.io.connection.ConnectionManager;
import com.romraider.io.connection.ConnectionProperties;
import com.romraider.io.protocol.Protocol;
import static com.romraider.io.protocol.ProtocolFactory.getProtocol;
import com.romraider.io.serial.connection.SerialConnectionManager;
import com.romraider.io.serial.connection.SerialConnectionManagerImpl;
import com.romraider.logger.ecu.ui.MessageListener;
import static com.romraider.util.HexUtil.asHex;
import static com.romraider.util.ParamChecker.checkNotNull;
@ -47,7 +47,7 @@ public final class ResetManagerImpl implements ResetManager {
try {
Protocol protocol = getProtocol(settings.getLoggerProtocol());
ConnectionProperties connectionProperties = settings.getLoggerConnectionProperties();
SerialConnectionManager connectionManager = new SerialConnectionManagerImpl(settings.getLoggerPort(), connectionProperties);
ConnectionManager connectionManager = new SerialConnectionManager(settings.getLoggerPort(), connectionProperties);
try {
messageListener.reportMessage("Sending ECU Reset...");
byte[] request = protocol.constructEcuResetRequest();

View File

@ -21,9 +21,9 @@
package com.romraider.ramtune.test.command.executor;
import com.romraider.io.connection.ConnectionManager;
import com.romraider.io.connection.ConnectionProperties;
import com.romraider.io.serial.connection.SerialConnectionManager;
import com.romraider.io.serial.connection.SerialConnectionManagerImpl;
import static com.romraider.util.ParamChecker.checkNotNull;
import static com.romraider.util.ParamChecker.checkNotNullOrEmpty;
@ -39,7 +39,7 @@ public final class CommandExecutorImpl implements CommandExecutor {
}
public byte[] executeCommand(byte[] command) {
SerialConnectionManager connectionManager = new SerialConnectionManagerImpl(port, connectionProperties);
ConnectionManager connectionManager = new SerialConnectionManager(port, connectionProperties);
try {
int timeout = connectionProperties.getSendTimeout();
return connectionManager.send(command, timeout);