blob: f4ac13dbb79bb4b841cc9ae08164ff83488beda0 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.car.obd2.test;
import static com.android.car.obd2.test.Utils.concatIntArrays;
import static com.android.car.obd2.test.Utils.stringsToIntArray;
import static org.junit.Assert.*;
import com.android.car.obd2.Obd2Command;
import com.android.car.obd2.Obd2Connection;
import java.util.Optional;
import org.junit.Test;
public class Obd2CommandTest {
private static final String[] EXPECTED_INIT_COMMANDS =
new String[] {
"ATD\r", "ATZ\r", "AT E0\r", "AT L0\r", "AT S0\r", "AT H0\r", "AT SP 0\r"
};
private static final String OBD2_PROMPT = ">";
private static final String[] EXPECTED_INIT_RESPONSES =
new String[] {
OBD2_PROMPT,
OBD2_PROMPT,
OBD2_PROMPT,
OBD2_PROMPT,
OBD2_PROMPT,
OBD2_PROMPT,
OBD2_PROMPT
};
private static final float FLOAT_EQUALITY_DELTA = 0.0001f;
void checkLiveFrameIntCommand(int pid, String responseBytes, int expectedResponse) {
String[] commandToSend = new String[] {String.format("01%02X\r", pid)};
String[] responseToGet =
new String[] {String.format("41 %02X %s", pid, responseBytes), OBD2_PROMPT};
MockObd2UnderlyingTransport transport =
new MockObd2UnderlyingTransport(
concatIntArrays(
stringsToIntArray(EXPECTED_INIT_COMMANDS),
stringsToIntArray(commandToSend)),
concatIntArrays(
stringsToIntArray(EXPECTED_INIT_RESPONSES),
stringsToIntArray(responseToGet)));
Obd2Connection obd2Connection = new Obd2Connection(transport);
Obd2Command<Integer> commandObject =
Obd2Command.getLiveFrameCommand(Obd2Command.getIntegerCommand(pid));
assertNotNull(commandObject);
Optional<Integer> receivedResponse = Optional.empty();
try {
receivedResponse = commandObject.run(obd2Connection);
} catch (Exception e) {
assertTrue("live frame command " + pid + " caused an exception: " + e, false);
}
assertTrue("live frame contains a response", receivedResponse.isPresent());
assertEquals(expectedResponse, (int) receivedResponse.get());
}
void checkLiveFrameFloatCommand(int pid, String responseBytes, float expectedResponse) {
String[] commandToSend = new String[] {String.format("01%02X\r", pid)};
String[] responseToGet =
new String[] {String.format("41 %02X %s", pid, responseBytes), OBD2_PROMPT};
MockObd2UnderlyingTransport transport =
new MockObd2UnderlyingTransport(
concatIntArrays(
stringsToIntArray(EXPECTED_INIT_COMMANDS),
stringsToIntArray(commandToSend)),
concatIntArrays(
stringsToIntArray(EXPECTED_INIT_RESPONSES),
stringsToIntArray(responseToGet)));
Obd2Connection obd2Connection = new Obd2Connection(transport);
Obd2Command<Float> commandObject =
Obd2Command.getLiveFrameCommand(Obd2Command.getFloatCommand(pid));
assertNotNull(commandObject);
Optional<Float> receivedResponse = Optional.empty();
try {
receivedResponse = commandObject.run(obd2Connection);
} catch (Exception e) {
assertTrue("live frame command " + pid + " caused an exception: " + e, false);
}
assertTrue("live frame contains a response", receivedResponse.isPresent());
assertEquals(expectedResponse, (float) receivedResponse.get(), FLOAT_EQUALITY_DELTA);
}
void checkFreezeFrameIntCommand(int pid, String responseBytes, int expectedResponse) {
String[] commandToSend = new String[] {String.format("02%02X 01\r", pid)};
String[] responseToGet =
new String[] {String.format("42 %02X 01 %s", pid, responseBytes), OBD2_PROMPT};
MockObd2UnderlyingTransport transport =
new MockObd2UnderlyingTransport(
concatIntArrays(
stringsToIntArray(EXPECTED_INIT_COMMANDS),
stringsToIntArray(commandToSend)),
concatIntArrays(
stringsToIntArray(EXPECTED_INIT_RESPONSES),
stringsToIntArray(responseToGet)));
Obd2Connection obd2Connection = new Obd2Connection(transport);
Obd2Command<Integer> commandObject =
Obd2Command.getFreezeFrameCommand(Obd2Command.getIntegerCommand(pid), 0x1);
assertNotNull(commandObject);
Optional<Integer> receivedResponse = Optional.empty();
try {
receivedResponse = commandObject.run(obd2Connection);
} catch (Exception e) {
assertTrue("freeze frame command " + pid + " caused an exception: " + e, false);
}
assertTrue("freeze frame contains a response", receivedResponse.isPresent());
assertEquals(expectedResponse, (int) receivedResponse.get());
}
void checkFreezeFrameFloatCommand(int pid, String responseBytes, float expectedResponse) {
String[] commandToSend = new String[] {String.format("02%02X 01\r", pid)};
String[] responseToGet =
new String[] {String.format("42 %02X 01 %s", pid, responseBytes), OBD2_PROMPT};
MockObd2UnderlyingTransport transport =
new MockObd2UnderlyingTransport(
concatIntArrays(
stringsToIntArray(EXPECTED_INIT_COMMANDS),
stringsToIntArray(commandToSend)),
concatIntArrays(
stringsToIntArray(EXPECTED_INIT_RESPONSES),
stringsToIntArray(responseToGet)));
Obd2Connection obd2Connection = new Obd2Connection(transport);
Obd2Command<Float> commandObject =
Obd2Command.getFreezeFrameCommand(Obd2Command.getFloatCommand(pid), 0x1);
assertNotNull(commandObject);
Optional<Float> receivedResponse = Optional.empty();
try {
receivedResponse = commandObject.run(obd2Connection);
} catch (Exception e) {
assertTrue("freeze frame command " + pid + " caused an exception: " + e, false);
}
assertTrue("freeze frame contains a response", receivedResponse.isPresent());
assertEquals(expectedResponse, (float) receivedResponse.get(), FLOAT_EQUALITY_DELTA);
}
void checkCommand(int pid, String responseBytes, int expectedResponse) {
checkLiveFrameIntCommand(pid, responseBytes, expectedResponse);
checkFreezeFrameIntCommand(pid, responseBytes, expectedResponse);
}
void checkCommand(int pid, String responseBytes, float expectedResponse) {
checkLiveFrameFloatCommand(pid, responseBytes, expectedResponse);
checkFreezeFrameFloatCommand(pid, responseBytes, expectedResponse);
}
@Test
public void testEngineOilTemperature() {
checkCommand(0x5C, "87", 95);
}
@Test
public void testAmbientAirTemperature() {
checkCommand(0x46, "A1", 63.137257f);
}
@Test
public void testCalculatedEngineLoad() {
checkCommand(0x04, "34", 23.1111f);
}
@Test
public void testEngineCoolantTemperature() {
checkCommand(0x05, "63", 59);
}
@Test
public void testFuelGaugePressure() {
checkCommand(0x0A, "12", 54);
}
@Test
public void testFuelSystemStatus() {
checkCommand(0x03, "08", 8);
}
@Test
public void testFuelTankLevel() {
checkCommand(0x2F, "5F", 37.2549f);
}
@Test
public void testFuelTrim() {
checkCommand(0x06, "42", 54.6875f);
checkCommand(0x07, "42", 54.6875f);
checkCommand(0x08, "42", 54.6875f);
checkCommand(0x09, "42", 54.6875f);
}
@Test
public void testRpm() {
checkCommand(0x0C, "12 0F", 1155);
}
@Test
public void testEngineRuntime() {
checkCommand(0x1F, "04 10", 1040);
}
@Test
public void testSpeed() {
checkCommand(0x0D, "82", 130);
}
@Test
public void testThrottlePosition() {
checkCommand(0x11, "3D", 23.921576f);
}
}