From 98ca441bb0133f3699ea9226d826be700f121d0b Mon Sep 17 00:00:00 2001 From: kascade Date: Fri, 28 Jul 2006 14:45:44 +0000 Subject: [PATCH] ssm protocol beginnings added git-svn-id: http://svn.3splooges.com/romraider-arch/trunk@189 d2e2e1cd-ba16-0410-be16-b7c4453c7c2d --- .../definition/DefaultLoggerDefinition.java | 4 + .../logger/definition/LoggerDefinition.java | 4 + .../UnsupportedProtocolException.java | 20 + src/enginuity/logger/log_defs.xml | 692 +++++++++ .../manager/DefaultTransmissionManager.java | 2 +- src/enginuity/logger/protocol/Protocol.java | 13 + .../logger/protocol/ProtocolFactory.java | 22 + .../logger/protocol/SSMProtocol.java | 99 ++ src/enginuity/logger/ssm_info.txt | 1273 +++++++++++++++++ src/enginuity/util/HexUtil.java | 66 + 10 files changed, 2194 insertions(+), 1 deletion(-) create mode 100644 src/enginuity/logger/definition/DefaultLoggerDefinition.java create mode 100644 src/enginuity/logger/definition/LoggerDefinition.java create mode 100644 src/enginuity/logger/exception/UnsupportedProtocolException.java create mode 100644 src/enginuity/logger/log_defs.xml create mode 100644 src/enginuity/logger/protocol/Protocol.java create mode 100644 src/enginuity/logger/protocol/ProtocolFactory.java create mode 100644 src/enginuity/logger/protocol/SSMProtocol.java create mode 100644 src/enginuity/logger/ssm_info.txt create mode 100644 src/enginuity/util/HexUtil.java diff --git a/src/enginuity/logger/definition/DefaultLoggerDefinition.java b/src/enginuity/logger/definition/DefaultLoggerDefinition.java new file mode 100644 index 00000000..d64f9f13 --- /dev/null +++ b/src/enginuity/logger/definition/DefaultLoggerDefinition.java @@ -0,0 +1,4 @@ +package enginuity.logger.definition; + +public final class DefaultLoggerDefinition implements LoggerDefinition { +} diff --git a/src/enginuity/logger/definition/LoggerDefinition.java b/src/enginuity/logger/definition/LoggerDefinition.java new file mode 100644 index 00000000..7d71c32c --- /dev/null +++ b/src/enginuity/logger/definition/LoggerDefinition.java @@ -0,0 +1,4 @@ +package enginuity.logger.definition; + +public interface LoggerDefinition { +} diff --git a/src/enginuity/logger/exception/UnsupportedProtocolException.java b/src/enginuity/logger/exception/UnsupportedProtocolException.java new file mode 100644 index 00000000..2d5bccfe --- /dev/null +++ b/src/enginuity/logger/exception/UnsupportedProtocolException.java @@ -0,0 +1,20 @@ +package enginuity.logger.exception; + +public final class UnsupportedProtocolException extends RuntimeException { + + public UnsupportedProtocolException() { + } + + public UnsupportedProtocolException(String string) { + super(string); + } + + public UnsupportedProtocolException(String string, Throwable throwable) { + super(string, throwable); + } + + public UnsupportedProtocolException(Throwable throwable) { + super(throwable); + } + +} diff --git a/src/enginuity/logger/log_defs.xml b/src/enginuity/logger/log_defs.xml new file mode 100644 index 00000000..be0d2b1e --- /dev/null +++ b/src/enginuity/logger/log_defs.xml @@ -0,0 +1,692 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/enginuity/logger/manager/DefaultTransmissionManager.java b/src/enginuity/logger/manager/DefaultTransmissionManager.java index 41d97e16..2a316c72 100644 --- a/src/enginuity/logger/manager/DefaultTransmissionManager.java +++ b/src/enginuity/logger/manager/DefaultTransmissionManager.java @@ -11,7 +11,7 @@ import static gnu.io.SerialPort.PARITY_NONE; import static gnu.io.SerialPort.STOPBITS_1; public final class DefaultTransmissionManager implements TransmissionManager { - private static final int BAUDRATE = 10400; + private static final int BAUDRATE = 4800; private static final int CONNECT_TIMEOUT = 2000; private final TwoWaySerialComm twoWaySerialComm = new DefaultTwoWaySerialComm(); private SerialConnection serialConnection = null; diff --git a/src/enginuity/logger/protocol/Protocol.java b/src/enginuity/logger/protocol/Protocol.java new file mode 100644 index 00000000..35ca7ee7 --- /dev/null +++ b/src/enginuity/logger/protocol/Protocol.java @@ -0,0 +1,13 @@ +package enginuity.logger.protocol; + +public interface Protocol { + + byte[] constructReadMemoryRequest(byte[] fromAddress, int numBytes); + + byte[] constructReadAddressRequest(byte[]... addresses); + + byte[] constructEcuInitRequest(); + + byte[] extractResponseData(byte[] response); + +} diff --git a/src/enginuity/logger/protocol/ProtocolFactory.java b/src/enginuity/logger/protocol/ProtocolFactory.java new file mode 100644 index 00000000..f9b10e72 --- /dev/null +++ b/src/enginuity/logger/protocol/ProtocolFactory.java @@ -0,0 +1,22 @@ +package enginuity.logger.protocol; + +import enginuity.logger.exception.UnsupportedProtocolException; + +public final class ProtocolFactory { + private static final ProtocolFactory INSTANCE = new ProtocolFactory(); + + public static ProtocolFactory getInstance() { + return INSTANCE; + } + + private ProtocolFactory() { + } + + public Protocol getProtocol(String protocolName) { + try { + return (Protocol) Class.forName(this.getClass().getPackage().getName() + "." + protocolName + "Protocol").newInstance(); + } catch (Exception e) { + throw new UnsupportedProtocolException("'" + protocolName + "' is not a supported protocol", e); + } + } +} diff --git a/src/enginuity/logger/protocol/SSMProtocol.java b/src/enginuity/logger/protocol/SSMProtocol.java new file mode 100644 index 00000000..590b189b --- /dev/null +++ b/src/enginuity/logger/protocol/SSMProtocol.java @@ -0,0 +1,99 @@ +package enginuity.logger.protocol; + +import static enginuity.util.HexUtil.asBytes; +import static enginuity.util.HexUtil.asHex; +import static enginuity.util.ParamChecker.checkGreaterThanZero; +import static enginuity.util.ParamChecker.checkNotNullOrEmpty; + +public final class SSMProtocol implements Protocol { + private static final byte[] HEADER = {(byte) 0x80, (byte) 0x10, (byte) 0xF0}; + private static final byte READ_MEMORY_COMMAND = (byte) 0xA0; + private static final byte READ_ADDRESS_COMMAND = (byte) 0xA8; + private static final byte ECU_INIT_COMMAND = (byte) 0xBF; + + + public byte[] constructReadMemoryRequest(byte[] fromAddress, int numBytes) { + checkNotNullOrEmpty(fromAddress, "fromAddress"); + checkGreaterThanZero(numBytes, "numBytes"); + // 0x80 0x10 0xF0 data_length 0xA0 from_address num_bytes-1 checksum + return buildRequest(READ_MEMORY_COMMAND, fromAddress, new byte[]{asByte(numBytes - 1)}); + } + + public byte[] constructReadAddressRequest(byte[]... addresses) { + checkNotNullOrEmpty(addresses, "addresses"); + // 0x80 0x10 0xF0 data_length 0xA8 address1 address2 ... addressN checksum + return buildRequest(READ_ADDRESS_COMMAND, addresses); + } + + public byte[] constructEcuInitRequest() { + // 0x80 0x10 0xF0 0x01 0xBF 0x40 + return buildRequest(ECU_INIT_COMMAND, new byte[0]); + } + + public byte[] extractResponseData(byte[] response) { + //TODO: Finish this!! + throw new UnsupportedOperationException("Not yet implemented!"); + } + + + private byte[] buildRequest(byte command, byte[]... content) { + byte[] data = new byte[0]; + for (byte[] tmp : content) { + byte[] tmp2 = new byte[data.length + tmp.length]; + System.arraycopy(data, 0, tmp2, 0, data.length); + System.arraycopy(tmp, 0, tmp2, data.length, tmp.length); + data = tmp2; + } + byte[] request = new byte[HEADER.length + data.length + 3]; + System.arraycopy(HEADER, 0, request, 0, HEADER.length); + request[HEADER.length] = asByte(data.length + 1); + request[HEADER.length + 1] = command; + System.arraycopy(data, 0, request, HEADER.length + 2, data.length); + addChecksum(request); + return request; + } + + private void addChecksum(byte[] request) { + int total = 0; + for (int i = 0; i < (request.length - 1); i++) { + byte b = request[i]; + total += asInt(b); + } + request[request.length - 1] = asByte(total - ((total >>> 16) << 16)); + } + + @SuppressWarnings({"UnnecessaryBoxing"}) + private byte asByte(int i) { + return Integer.valueOf(i).byteValue(); + } + + @SuppressWarnings({"UnnecessaryBoxing"}) + private int asInt(byte b) { + return Byte.valueOf(b).intValue(); + } + + public byte[] asByteArray(int value) { + byte[] b = new byte[4]; + for (int i = 0; i < 4; i++) { + int offset = (b.length - 1 - i) * 8; + b[i] = (byte) ((value >>> offset) & 0xFF); + } + return b; + } + + //****************** Test stuff ***********************// + + public static void main(String... args) { + Protocol protocol = ProtocolFactory.getInstance().getProtocol("SSM"); + + byte[] bytes = protocol.constructEcuInitRequest(); + System.out.println("Ecu Init = " + asHex(bytes)); + + bytes = protocol.constructReadAddressRequest(asBytes("0x000008"), asBytes("0x00001C")); + System.out.println("Read Address (0x000008 and 0x00001C) = " + asHex(bytes)); + + bytes = protocol.constructReadMemoryRequest(asBytes("0x200000"), 128); + System.out.println("Read Memory (from 0x200000, 128 bytes) = " + asHex(bytes)); + } + +} diff --git a/src/enginuity/logger/ssm_info.txt b/src/enginuity/logger/ssm_info.txt new file mode 100644 index 00000000..127f2a35 --- /dev/null +++ b/src/enginuity/logger/ssm_info.txt @@ -0,0 +1,1273 @@ +The subaru select monitor protocol uses an ISO9141 interface and uses UART settings: 4800 bps n, 8, 1 +All data is sent and recieved using small packets that all share a common header. + + + +Packets all follow this structure: + +0x80 +Destination byte +Source byte +Data Size byte +data... +... +Checksum byte + +Known Destination and Source bytes respectively: +0x10 Subaru ECU +0xF0 Diagnostic tool + +The Data Size byte specifies the number of data bytes in the packet, the Checksum byte is the 8 least significant +bits of the sum of every packet byte (including the header) + +For example: + +If you send the packet: + +0x80 0x10 0xF0 0x01 0xBF 0x40 + +the ecu might respond with: +0x80 0xF0 0x10 0x39 0xFF 0xA2 0x10 0x0F 0x1B 0x14 0x40 0x05 0x05 0x73 0xFA 0xEB +0x80 0x2B 0xC1 0x02 0xAA 0x00 0x10 0x00 0x60 0xCE 0x54 0xF8 0xB0 0x60 0x00 0x00 +0xE0 0x00 0x00 0x00 0x00 0x00 0xDC 0x00 0x00 0x55 0x10 0x00 0x00 0x02 0x00 0x00 +0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x1F + + +When sending a packet to the ECU the first data byte is the command byte. +These are the known commands: + +0xA0 Read memory +0xA8 Read single address +0xB0 Write memory +0xB8 Write single address +0xBF ECU init + + +-------------------------------- Command Formats -------------------------------- + +A0 Block Read Request + +A0 PP AA AA AA CC + +PP == pad? +AA AA AA = address +CC == byte count - 1 + +A8 Address Read Request + +A8 PP A1 A1 A1 A2 A2 A2 A3 A3 A3... + +PP == pad? +A1 A1 A1 == address +A2 A2 A2 ... == optional addresses + +B0 Write Block Request + +B0 AA AA AA DD DD DD DD DD ... + +AA AA AA == address +DD DD ... == data of desired length + +B8 Address Write Request + +B8 AA AA AA DD + +AA AA AA == address +DD == data byte + +BF ECU Init Request + +BF + +-------------------------------- Command Examples ------------------------------- + +Block Read: Read 128 bytes from address 0x200000 (ecu returned all zeros) + +Sent: +0x80 0x10 0xF0 0x06 0xA0 0x00 0x20 0x00 0x00 0x7F 0xC5 + +Received: +0x80 0xF0 0x10 0x81 0xE0 +0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 +0xE1 + +----------------------- + +Address Read: Read Address 0x000008 and 0x00001C (ecu returns values 0x7D and 0xB1) + +Sent: +0x80 0x10 0xF0 0x08 0xA8 0x00 0x00 0x00 0x08 0x00 0x00 0x1C 0x54 + +Received: +0x80 0xF0 0x10 0x03 0xE8 0x7D 0xB1 0x99 + +----------------------- + +Block Write: Write 4 bytes to address 0x200000 (ecu returns written data) + +Sent: +0x80 0x10 0xF0 0x08 0xB0 0x20 0x00 0x00 0x01 0x02 0x03 0x04 0x62 + +Received: +0x80 0xF0 0x10 0x05 0xF0 0x01 0x02 0x03 0x04 0x7F + +----------------------- + +Write single address: Write value 0x02 to address 0x00006F + +Sent: +0x80 0x10 0xF0 0x05 0xB8 0x00 0x00 0x6F 0x02 0xAE + +Received: +0x80 0xF0 0x10 0x02 0xF8 0x02 0x7C + +---------------------------------------------------------------------------------- + +Certain bytes in the ECU Init string (returned from request 0xBF) can be examined to determine which parameters the ECU will support. +The individual bits are flags that will be set to one if the parameter can be read from the ECU (byte 9 is immediately after the 5 byte ECU ID value) +********** BYTE 9 ********** +7 Engine Load +6 Coolant Temperature +5 Air/Fuel Correction #1 +4 Air/Fuel Learning #1 +3 Air/Fuel Correction #2 +2 Air/Fuel Learning #2 +1 Manifold Absolute Pressure +0 Engine Speed + +********** BYTE 10 ********* +7 Vehicle Speed +6 Ignition Timing +5 Intake Air Temperature +4 Mass Air Flow +3 Throttle Opening Angle +2 Front O2 Sensor #1 +1 Rear O2 Sensor +0 Front O2 Sensor #2 + +********** BYTE 11 ********* +7 Battery Voltage +6 Air Flow Sensor Voltage +5 Throttle Sensor Voltage +4 Differential Pressure Sensor Voltage +3 Fuel Injection #1 Pulse Width +2 Fuel Injection #2 Pulse Width +1 Knock Correction +0 Atmospheric Pressure + +********** BYTE 12 ********** +7 Manifold Relative Pressure +6 Pressure Differential Sensor +5 Fuel Tank Pressure +4 CO Adjustment +3 Learned Ignition Timing +2 Accelerator Opening Angle +1 Fuel Temperature +0 Front O2 Heater #1 + +********** BYTE 13 ********* +7 Rear O2 Heater Current +6 Front O2 Heater #2 +5 Fuel Level +4 ------------------------- +3 Primary Wastegate Duty Cycle +2 Secondary Wastegate Duty Cycle +1 CPC Valve Duty Ratio +0 Tumble Valve Position Sensor Right + +********** BYTE 14 ********* +7 Tumble Valve Position Sensor Left +6 Idle Speed Control Valve Duty Ratio +5 Air/Fuel Lean Correction +4 Air/Fuel Heater Duty +3 Idle Speed Control Valve Step +2 Number of Ex. Gas Recirc Steps +1 Alternator Duty +0 Fuel Pump Duty + +********** BYTE 15 ********* +7 VVT Advance Angle Right +6 VVT Advance Angle Left +5 OCV Duty Right +4 OCV Duty Left +3 OCV Current Right +2 OCV Current Left +1 Air/Fuel Sensor #1 Current +0 Air/Fuel Sensor #2 Current + +********** BYTE 16 ********** +7 Air/Fuel Sensor #1 Resistance +6 Air/Fuel Sensor #2 Resistance +5 Air/Fuel Sensor #1 +4 Air/Fuel Sensor #2 +3 Air/Fuel Correction #3 +2 Air/Fuel Learning #3 +1 Rear O2 Heater Voltage +0 Air/Fuel Adjustment Voltage + +********** BYTE 17 ********** +7 ------------------------- +6 ------------------------- +5 Gear Position +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 18 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 Air/Fuel Sensor #1 Heater Current +3 Air/Fuel Sensor #2 Heater Current +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 19 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 20 ********** +7 ------------------------- +6 AT Vehicle ID +5 Test Mode Connector +4 Read Memory Connector +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- +********** BYTE 21 ********** +7 Neutral Position Switch +6 Idle Switch +5 ------------------------- +4 Intercooler AutoWash Switch +3 Ignition Switch +2 Power Steering Switch +1 Air Conditioning Switch +0 ------------------------- +********** BYTE 22 ********** +7 Handle Switchv +6 Starter Switch + +5 Front O2 Rich Signal +4 Rear O2 Rich Signal + +3 Front O2 #2 Rich Signal +2 Knock Signal 1 +1 Knock Signal 2 +0 Electrical Load Signal +********** BYTE 23 ********** +7 Crank Position Sensor +6 Cam Position Senso +5 Defogger Switch +4 Blower Switch +3 Interior Light Switch +2 Wiper Switch +1 Air-Con Lock Signal +0 Air-Con Mid Pressure Switch + +********** BYTE 24 ********** +7 Air-Con Compressor Signal +6 Radiator Fan Relay #3 +5 Radiator Fan Relay #1 +4 Radiator Fan Relay #2 +3 Fuel Pump Relay +2 Intercooler Auto-Wash Relay +1 CPC Solenoid Valve +0 Blow-By Leak Connector + +********** BYTE 25 ********** +7 PCV Solenoid Valve +6 TGV Output +5 TGV Drive +4 Variable Intake Air Solenoid +3 Pressure Sources Change +2 Vent Solenoid Valve +1 P/S Solenoid Valve +0 Assist Air Solenoid Valve + +********** BYTE 26 ********** +7 Tank Sensor Control Valve +6 Relief Valve Solenoid 1 +5 Relief Valve Solenoid 2 +4 TCS Relief Valve Solenoid +3 Ex. Gas Positive Pressure +2 Ex. Gas Negative Pressure +1 Intake Air Solenoid +0 Muffler Control + +********** BYTE 27 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 Retard Signal from AT +2 Fuel Cut Signal from AT +1 Ban of Torque Down +0 Request Torque Down VDC + +********** BYTE 28 ********** +7 Torque Control Signal #1 +6 Torque Control Signal #2 +5 Torque Permission Signal +4 EAM signal +3 AT coop. lock up signal +2 AT coop. lean burn signal +1 AT coop. rich spike signal +0 AET Signal + +********** BYTE 29 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 30 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 31 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 32 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 33 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 34 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 35 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 36 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 37 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 38 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 39 ********** +7 ------------------------- +6 ------------------------- +5 Throttle Motor Duty +4 Throttle Motor Voltage +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 40 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 41 ********** +7 Sub Throttle Sensor +6 Main Throttle Sensor +5 Sub Accelerator Sensor +4 Main Accelerator Sensor +3 Brake Booster Pressure +2 Fuel Pressure (High) +1 Exhaust Gas Temperature +0 ------------------------- + +********** BYTE 42 ********** +7 Cold Start Injector +6 SCV Step +5 Memorized Cruise Speed +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 43 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 44 ********** +7 Exhaust VVT Advance Angle Right +6 Exhaust VVT Advance Angle Left +5 Exhaust OCV Duty Right +4 Exhaust OCV Duty Left +3 Exhaust OCV Current Right +2 Exhaust OCV Current Left +1 ------------------------- +0 ------------------------- + +********** BYTE 45 ********** +7 ------------------------- +6 ETC Motor Relay +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 46 ********** +7 Clutch Switch +6 Stop Light Switch +5 Set/Coast Switch +4 Resume/Accelerate Switch +3 Brake Switch +2 ------------------------- +1 Accelerator Switch +0 ------------------------- + +********** BYTE 47 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 48 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 49 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 50 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 51 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 52 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 53 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 54 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 55 ********** +7 ------------------------- +6 ------------------------- +5 ------------------------- +4 ------------------------- +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + +********** BYTE 56 ********** +7 Roughness Monitor Cylinder #1 +6 Roughness Monitor Cylinder #2 +5 Roughness Monitor Cylinder #3 +4 Roughness Monitor Cylinder #4 +3 ------------------------- +2 ------------------------- +1 ------------------------- +0 ------------------------- + + +Parameters are read by providing a 3 byte address for each parameter via command 0xA8 For example use address 0x000008 for Coolant temp +and use addresses 0x00000E and 0x00000F for engine RPM + +Parameters ********************************************************** + +- Engine Load ---------------------------------------------- +8 bit value +P0x07 = low byte + +Multiply value by 100.0 and divide by 255 to get percent +------------------------------------------------------------ +- Coolant Temperature -------------------------------------- +8 bit value +P0x008 = low byte + + +Subtract 40 from value to get Degrees C +------------------------------------------------------------ +- Air/Fuel Correction #1 ----------------------------------- +8 bit value +P0x009 = low byte + +Subtract 128 from value and divide by 1.28 to get percent +------------------------------------------------------------ +- Air/Fuel Learning #1 ------------------------------------- +8 bit value +P0x00A = low byte + +Subtract 128 from value and divide by 1.28 to get percent +------------------------------------------------------------ +- Air/Fuel Correction #2 ----------------------------------- +8 bit value +P0x00B = low byte + +Subtract 128 from value and divide by 1.28 to get percent +------------------------------------------------------------ +- Air/Fuel Learning #2 ------------------------------------- +8 bit value +P0x00C = low byte + +Subtract 128 from value and divide by 1.28 to get percent +------------------------------------------------------------ +- Manifold Absolute Pressure ------------------------------- +8 bit value +P0x0D = low byte + +Multiply value by 37.0 and divide by 255 to get psig +------------------------------------------------------------ +- Engine Speed --------------------------------------------- +16 bit value +P0x0E = high byte +P0x0F = low byte + +Divide value by 4 to get RPM +------------------------------------------------------------ +- Vehicle Speed -------------------------------------------- +8 bit value +P0x010 = low byte + +Value is in km/h +------------------------------------------------------------ +- Ignition Timing ------------------------------------------ +8 bit balue P0x11 = low byte + +Subtract 128 from value and divide by 2 to get degrees +------------------------------------------------------------ +- Intake Air Temperature ----------------------------------- +8 bit value +P0x012 = low byte + +Subtract 40 from value to get Degrees C +------------------------------------------------------------ +- Mass Air Flow -------------------------------------------- +16 bit value +P0x13 = high byte +P0x14 = low byte + +Divide value by 100.0 to get grams/s +------------------------------------------------------------ +- Throttle Opening Angle ----------------------------------- +8 bit value +P0x15 = low byte + +Multiply value by 100.0 and divide by 255 to get percent +------------------------------------------------------------ +- Front O2 Sensor #1 --------------------------------------- +16 bit value +P0x016 = high byte +P0x017 = low byte + +Multiply value by 0.005 to get voltage +------------------------------------------------------------ +- Rear O2 Sensor ------------------------------------------- +16 bit value +P0x018 = high byte +P0x019 = low byte + +Multiply value by 0.005 to get voltage +------------------------------------------------------------ +- Front O2 Sensor #2 --------------------------------------- +16 bit value +P0x01A = high byte +P0x01B = low byte + +Multiply value by 0.005 to get voltage +------------------------------------------------------------ +- Battery Voltage ------------------------------------------ +8 bit value +P0x01C = low byte + +Multiply value by 0.08 to get volts +------------------------------------------------------------ +- Air Flow Sensor Voltage ---------------------------------- +8 bit value +P0x01D = low byte + +Multiply value by 0.02 to get volts +------------------------------------------------------------ +- Throttle Sensor Voltage ---------------------------------- +8 bit value +P0x01E = low byte + +Multiply value by 0.02 to get volts +------------------------------------------------------------ +- Differential Pressure Sensor Voltage --------------------- +8 bit value +P0x01F = low byte + +Multiply value by 0.02 to get Volts +------------------------------------------------------------ +- Fuel Injection #1 Pulse Width ---------------------------- +8 bit value +P0x20 = low byte + +Multiply value by 0.256 to get ms +------------------------------------------------------------ +- Fuel Injection #2 Pulse Width ---------------------------- +8 bit value +P0x21 = low byte + +Multiply value by 0.256 to get ms +------------------------------------------------------------ +- Knock Correction ----------------------------------------- +8 bit value +P0x22 = low byte + +Subtract 128 from value and divide by 2 to get degrees +------------------------------------------------------------ +- Atmospheric Pressure ------------------------------------- +8 bit value +P0x023 = low byte + +Multiply value by 37.0 and divide by 255 to get psig +------------------------------------------------------------ +- Manifold Relative Pressure ------------------------------- +8 bit value +P0x24 = low byte + +Subtract 128 from value, multiply by 37.0 and divide by 255 to get psig +------------------------------------------------------------ +- Pressure Differential Sensor ----------------------------- +8 bit value +P0x25 = low byte + +Subtract 128 from value, multiply by 37.0 and divide by 255 to get psig +------------------------------------------------------------ +- Fuel Tank Pressure --------------------------------------- +8 bit value +P0x026 = low byte + +Subtract 128 from value and multiply by 0.0035 to get psig +------------------------------------------------------------ +- CO Adjustment -------------------------------------------- +8 bit value +P0x027 = low byte + +Multiply value by 0.02 to get volts +------------------------------------------------------------ +- Learned Ignition Timing ---------------------------------- +8 bit value +P0x028 = low byte + +Subtract 128 from value and divide by 2 to get degrees +------------------------------------------------------------ +- Accelerator Opening Angle -------------------------------- +8 bit valuev P0x029 = low byte + +Divide value by 2.56 to get percent +------------------------------------------------------------ +- Fuel Temperature ----------------------------------------- +8 bit value +P0x02A = low byte + +Subtract 40 from value to get Degrees C +------------------------------------------------------------ +- Front O2 Heater #1 --------------------------------------- +8 bit value +P0x02B = low byte + +Multiply value by 10.04 and divide by 256 to get Amps +------------------------------------------------------------ +- Rear O2 Heater Current ----------------------------------- +8 bit value +P0x02C = low byte + +Multiply value by 10.04 and divide by 256 to get Amps +------------------------------------------------------------ +- Front O2 Heater #2 --------------------------------------- +8 bit value +P0x02D = low byte + +Multiply value by 10.04 and divide by 256 to get Amps +------------------------------------------------------------ +- Fuel Level ----------------------------------------------- +8 bit value +P0x02E = low byte + +Multiply value by 0.02 to get volts +------------------------------------------------------------ +- Primary Wastegate Duty Cycle ----------------------------- +8 bit value +P0x30 = low byte + + + +Multiply value by 100.0 and divide by 255 to get percent +------------------------------------------------------------ +- Secondary Wastegate Duty Cycle --------------------------- +8 bit value +P0x31 = low byte + +Multiply value by 100.0 and divide by 255 to get percent +------------------------------------------------------------ +- CPC Valve Duty Ratio ------------------------------------- +8 bit value +P0x032 = low byte + +Divide value by 2.55 to get percent +------------------------------------------------------------ +- Tumble Valve Position Sensor Right ----------------------- +8 bit value +P0x033 = low byte + +Multiply value by 0.02 to get volts +------------------------------------------------------------ +- Tumble Valve Position Sensor Left ------------------------ +8 bit value +P0x034 = low byte + +Multiply value by 0.02 to get volts +------------------------------------------------------------ +- Idle Speed Control Valve Duty Ratio ---------------------- +8 bit value +P0x035 = low byte + +Divide value by 2 to get percent +------------------------------------------------------------ +- Air/Fuel Lean Correction --------------------------------- +8 bit value +P0x036 = low byte + +Divide value by 2.55 to get percent +------------------------------------------------------------ +- Air/Fuel Heater Duty ------------------------------------- +8 bit value +P0x037 = low byte + +Divide value by 2.55 to get percent +------------------------------------------------------------ +- Idle Speed Control Valve Step ---------------------------- +8 bit value +P0x038 = low byte + +Value is in steps +------------------------------------------------------------ +- Number of Ex. Gas Recirc. Steps -------------------------- +8 bit value +P0x039 = low byte + +Value is in steps +------------------------------------------------------------ +- Alternator Duty ------------------------------------------ +8 bit value +P0x03A = low byte + +Value is in percent +------------------------------------------------------------ +- Fuel Pump Duty ------------------------------------------- +8 bit value +P0x03B = low byte + +Divide value by 2.55 to get percent +------------------------------------------------------------ +- Intake VVT Advance Angle Right --------------------------- +8 bit value +P0x03C = low byte + +Subtract 50 from value to get degrees +------------------------------------------------------------ +- Intake VVT Advance Angle Left --------------------------- +8 bit value +P0x03D = low byte + +Subtract 50 from value to get degrees +------------------------------------------------------------ +- Intake OCV Duty Right ------------------------------------ +8 bit value +P0x03E = low byte + +Divide value by 2.55 to get percent +------------------------------------------------------------ +- Intake OCV Duty Left ------------------------------------- +8 bit value +P0x03F = low byte + +Divide value by 2.55 to get percent +------------------------------------------------------------ +- Intake OCV Current Right --------------------------------- +8 bit value +P0x040 = low byte + +Multiply value by 32 to get mA +------------------------------------------------------------ +- Intake OCV Current Left ---------------------------------- +8 bit value +P0x041 = low byte + +Multiply value by 32 to get mA +------------------------------------------------------------ +- Air/Fuel Sensor #1 Current ------------------------------- +8 bit value +P0x042 = low byte + +Subtract 128 from value and multiply by .125 to get mA +------------------------------------------------------------ +- Air/Fuel Sensor #2 Current ------------------------------- +8 bit value +P0x043 = low byte + +Subtract 128 from value and multiply by .125 to get mA +------------------------------------------------------------ +- Air/Fuel Sensor #1 Resistance ---------------------------- +8 bit value +P0x044 = low byte + +Value is in ohms +------------------------------------------------------------ +- Air/Fuel Sensor #2 Resistance ---------------------------- +8 bit value +P0x045 = low byte + +Value is in ohms +------------------------------------------------------------ +- Air/Fuel Sensor #1 --------------------------------------- +8 bit value +P0x46 = low byte + +Divide value by 128.0 to get Lambda +------------------------------------------------------------ +- Air/Fuel Sensor #2 --------------------------------------- +8 bit value +P0x47 = low byte + +Divide value by 128.0 to get Lambda +------------------------------------------------------------ +- Gear Position -------------------------------------------- +8 bit value +P0x04A = low byte + +Add 1 to value to get gear +------------------------------------------------------------ +- A/F Sensor #1 Heater Current ----------------------------- +8 bit value +P0x053 = low byte + +Divide value by 10 to get Amps +------------------------------------------------------------ +- A/F Sensor #2 Heater Current ----------------------------- +8 bit value +P0x054 = low byte + + +Divide value by 10 to get Amps +------------------------------------------------------------ +- Roughness Monitor Cylinder #1 ---------------------------- +8 bit value +P0x0CE = low byte + +Value is in ? +------------------------------------------------------------ +- Roughness Monitor Cylinder #2 ---------------------------- +8 bit value +P0x0CF = low byte + +Value is in ? +------------------------------------------------------------ +- Air/Fuel Correction #3 ----------------------------------- +8 bit value +P0x0D0 = low byte + +Subtract 128 from value and divide by 1.28 to get percent +------------------------------------------------------------ +- Air/Fuel Learning #3 ------------------------------------- +8 bit value + +P0x0D1 = low byte + +Subtract 128 from value and divide by 1.28 to get percent +------------------------------------------------------------ +- Rear O2 Heater Voltage ----------------------------------- +8 bit value +P0x0D2 = low byte + +Multiply value by 0.02 to get volts +------------------------------------------------------------ +- Air/Fuel Adjustment Voltage ------------------------------ +8 bit value +P0x0D3 = low byte + +Multiply value by 0.02 to get voltage +------------------------------------------------------------ +- Roughness Monitor Cylinder #3 ---------------------------- +8 bit value +P0x0D8 = low byte + +Value is in ? +------------------------------------------------------------ +- Roughness Monitor Cylinder #4 ---------------------------- +8 bit value +P0x0D9 = low byte + +Value is in ? +------------------------------------------------------------ +- Throttle Motor Duty -------------------------------------- +8 bit value +P0x0fa = low byte + +Subtract 128 from value and divide by 1.28 to get percent +------------------------------------------------------------ +- Throttle Motor Voltage ----------------------------------- +8 bit value +P0x0FB = low byte + +Multiply value by 0.08 to get volts +------------------------------------------------------------ +- Sub Throttle Sensor -------------------------------------- +8 bit value +P0x100 = low byte + +Multiply value by 0.02 to get volts +------------------------------------------------------------ +- Main Throttle Sensor ------------------------------------- +8 bit value +P0x101 = low byte + +Multiply value by 0.02 to get volts +------------------------------------------------------------ +- Sub Accelerator Sensor ----------------------------------- +8 bit value +P0x102 = low byte + +Multiply value by 0.02 to get volts +------------------------------------------------------------ +- Main Accelerator Sensor ---------------------------------- +8 bit value +P0x103 = low byte + +Multiply value by 0.02 to get volts +------------------------------------------------------------ +- Brake Booster Pressure ----------------------------------- +8 bit value +P0x104 = low byte + +Multiply value by 37.0 and divide by 255 to get psig +------------------------------------------------------------ +- Fuel Pressure (High) ------------------------------------- +8 bit value +P0x105 = low byte + +Multiply value by 0.04 to get MPa +------------------------------------------------------------ +- Exhaust Gas Temperature ---------------------------------- +8 bit value +P0x106 = low byte + +Add 40 to value and multiply by 5 to get Degrees C +------------------------------------------------------------ +- Cold Start Injector -------------------------------------- +8 bit value +P0x108 = low byte + +Multiply value by .256 to get ms +------------------------------------------------------------ +- SCV Step ------------------------------------------------- +8 bit value +P0x109 = low byte + +Value is in Steps +------------------------------------------------------------ +- Memorised Cruise Speed ----------------------------------- +8 bit value +P0x10a = low byte + +Value is in km/h +------------------------------------------------------------ +- Exhaust VVT Advance Angle Right -------------------------- +8 bit value +P0x118 = low byte + +Subtract 50 from value to get degrees +------------------------------------------------------------ +- Exhaust VVT Advance Angle Left --------------------------- +8 bit value +P0x119 = low byte + +Subtract 50 from value to get degrees +------------------------------------------------------------ +- Exhaust OCV Duty Right ----------------------------------- +8 bit value +P0x11A = low byte + +Divide value by 2.55 to get percent +------------------------------------------------------------ +- Exhaust OCV Duty Left ------------------------------------ +8 bit value +P0x11B = low byte + +Divide value by 2.55 to get percent +------------------------------------------------------------ +- Exhaust OCV Current Right -------------------------------- +8 bit value +P0x11C = low byte + +Multiply value by 32 to get mA +------------------------------------------------------------ +- Exhaust OCV Current Left --------------------------------- +8 bit value +P0x11D = low byte + +Multiply value by 32 to get mA +------------------------------------------------------------ + + + +Switches are read in the same way a parameter is read except that it will +return up to +8 individual ON/OFF flags in the individual bits of the return byte + +Switches ************************************************************** + +Switch P0x061 +7 ----------------------- +6 AT Vehicle ID +5 Test Mode Connector +4 Read Memory Connector +3 ----------------------- +2 ----------------------- +1 ----------------------- +0 ----------------------- + +Switch P0x062 +7 Neutral Position Switch +6 Idle Switch +5 ----------------------- +4 Intercooler AutoWash Switch +3 Ignition Switch +2 Power Steering Switch +1 Air Conditioning Switch +0 ----------------------- + +Switch P0x063 +7 Handle Switch +6 Starter Switch +5 Front O2 Rich Signal +4 Rear O2 Rich Signal +3 Front O2 #2 Rich Signal +2 Knock Signal 1 +1 Knock Signal 2 +0 Electrical Load Signal + +Switch P0x064 +7 Crank Position Sensor +6 Cam Position Sensor +5 Defogger Switch +4 Blower Switch +3 Interior Light Switch +2 Wiper Switch +1 Air-Con Lock Signal +0 Air-Con Mid Pressure Switch + +Switch P0x065 +7 Air-Con Compressor Signal +6 Radiator Fan Relay #3 +5 Radiator Fan Relay #1 +4 Radiator Fan Relay #2 +3 Fuel Pump Relay +2 Intercooler Auto-Wash Relay +1 CPC Solenoid Valve +0 Blow-By Leak Connector + +Switch P0x066 +7 PCV Solenoid Valve +6 TGV Output +5 TGV Drive +4 Variable Intake Air Solenoid +3 Pressure Sources Change +2 Vent Solenoid Valve +1 P/S Solenoid Valve +0 Assist Air Solenoid Valve + +Switch P0x067 +7 Tank Sensor Control Valve +6 Relief Valve Solenoid 1 +5 Relief Valve Solenoid 2 +4 TCS Relief Valve Solenoid +3 Ex. Gas Positive Pressure +2 Ex. Gas Negative Pressure +1 Intake Air Solenoid +0 Muffler Control + +Switch P0x068 +7 ----------------------- +6 ----------------------- +5 ----------------------- +4 ----------------------- +3 Retard Signal from AT +2 Fuel Cut Signal from AT +1 Ban of Torque Down +0 Request Torque Down VDC + +Switch P0x069 +7 Torque Control Signal #1 +6 Torque Control Signal #2 +5 Torque Permission Signal +4 EAM Signal +3 AT coop. lock up signal +2 AT coop. lean burn signal +1 AT coop. rich spike signal +0 AET Signal + +Switch P0x120 +7 ----------------------- +6 ETC Motor Relay +5 ----------------------- +4 ----------------------- +3 ----------------------- +2 ----------------------- +1 ----------------------- +0 ----------------------- + +Switch P0x121 +7 Clutch Switch +6 Stop Light Switch +5 Set/Coast Switch +4 Rsume/Accelerate Switch +3 Brake Switch +2 ----------------------- +1 Accelerator Switch +0 ----------------------- diff --git a/src/enginuity/util/HexUtil.java b/src/enginuity/util/HexUtil.java new file mode 100644 index 00000000..b55ce6a2 --- /dev/null +++ b/src/enginuity/util/HexUtil.java @@ -0,0 +1,66 @@ +package enginuity.util; + +public final class HexUtil { + + private HexUtil() { + } + + public static String asHex(byte in[]) { + return bytesToHex(in).toUpperCase(); + } + + public static byte[] asBytes(String hex) { + if (hex.startsWith("0x")) { + hex = hex.substring(2); + } + return hexToBytes(hex); + } + + public static String bytesToHex(byte[] bs, int off, int length) { + StringBuffer sb = new StringBuffer(length * 2); + bytesToHexAppend(bs, off, length, sb); + return sb.toString(); + } + + public static void bytesToHexAppend(byte[] bs, int off, int length, StringBuffer sb) { + sb.ensureCapacity(sb.length() + length * 2); + for (int i = off; (i < (off + length)) && (i < bs.length); i++) { + sb.append(Character.forDigit((bs[i] >>> 4) & 0xf, 16)); + sb.append(Character.forDigit(bs[i] & 0xf, 16)); + } + } + + public static String bytesToHex(byte[] bs) { + return bytesToHex(bs, 0, bs.length); + } + + public static byte[] hexToBytes(String s) { + return hexToBytes(s, 0); + } + + public static byte[] hexToBytes(String s, int off) { + byte[] bs = new byte[off + (1 + s.length()) / 2]; + hexToBytes(s, bs, off); + return bs; + } + + public static void hexToBytes(String s, byte[] out, int off) throws NumberFormatException, IndexOutOfBoundsException { + int slen = s.length(); + if ((slen % 2) != 0) { + s = '0' + s; + } + if (out.length < off + slen / 2) { + throw new IndexOutOfBoundsException("Output buffer too small for input (" + out.length + "<" + off + slen / 2 + ")"); + } + // Safe to assume the string is even length + byte b1, b2; + for (int i = 0; i < slen; i += 2) { + b1 = (byte) Character.digit(s.charAt(i), 16); + b2 = (byte) Character.digit(s.charAt(i + 1), 16); + if ((b1 < 0) || (b2 < 0)) { + throw new NumberFormatException(); + } + out[off + i / 2] = (byte) (b1 << 4 | b2); + } + } +}