basic hw in the loop - pwm self validation #2028

This commit is contained in:
rusefi 2020-12-13 00:02:19 -05:00
parent 3141d96915
commit 3415e1d9d6
6 changed files with 77 additions and 85 deletions

View File

@ -1,22 +1,17 @@
package com.rusefi; package com.rusefi;
import com.rusefi.config.generated.Fields;
import com.rusefi.core.Sensor; import com.rusefi.core.Sensor;
import com.rusefi.core.SensorCentral; import com.rusefi.core.SensorCentral;
import com.rusefi.functional_tests.EcuTestHelper; import com.rusefi.functional_tests.EcuTestHelper;
import com.rusefi.io.CommandQueue;
import com.rusefi.io.LinkManager;
import com.rusefi.waves.EngineChart; import com.rusefi.waves.EngineChart;
import com.rusefi.waves.EngineReport; import com.rusefi.waves.EngineReport;
import org.junit.Before;
import org.junit.Test;
import java.util.concurrent.atomic.AtomicReference; import static com.rusefi.IoUtil.getEnableCommand;
import java.util.function.Function;
import static com.rusefi.IoUtil.*;
import static com.rusefi.TestingUtils.*; import static com.rusefi.TestingUtils.*;
import static com.rusefi.config.generated.Fields.*; import static com.rusefi.config.generated.Fields.*;
import static com.rusefi.waves.EngineReport.isCloseEnough;
/** /**
* rusEfi firmware simulator functional test suite * rusEfi firmware simulator functional test suite
@ -26,57 +21,16 @@ import static com.rusefi.waves.EngineReport.isCloseEnough;
* @author Andrey Belomutskiy * @author Andrey Belomutskiy
* 3/5/14 * 3/5/14
*/ */
public class FunctionalTestsSuite { public class FunctionalTest {
private EcuTestHelper ecu;
private final EcuTestHelper ecu; @Before
public void startUp() {
public FunctionalTestsSuite(LinkManager linkManager, CommandQueue commandQueue) { ecu = EcuTestHelper.createInstance();
ecu = new EcuTestHelper(linkManager);
} }
void mainTestBody() { @Test
testCustomEngine(); public void testCustomEngine() {
testMazdaMiata2003();
test2003DodgeNeon();
testFordAspire();
test1995DodgeNeon();
testMazdaProtege();
// todo? sendCommand("reboot"); // this would cause firmware in 5 seconds
// todo? sleep(10); // time to reboot
testBmwE34();
testSachs();
testRoverV8();
testCamaro();
testCitroenBerlingo();
testFord6();
testFordFiesta();
}
public static final Function<String, Object> FAIL = errorCode -> {
if (errorCode != null)
throw new IllegalStateException("Failed " + errorCode);
return null;
};
public static void assertRpmDoesNotJump(int rpm, int settleTime, int testDuration, Function<String, Object> callback, CommandQueue commandQueue) {
IoUtil.changeRpm(commandQueue, rpm);
sleepSeconds(settleTime);
AtomicReference<String> result = new AtomicReference<>();
long start = System.currentTimeMillis();
SensorCentral.SensorListener listener = value -> {
double actualRpm = SensorCentral.getInstance().getValue(Sensor.RPM);
if (!isCloseEnough(rpm, actualRpm)) {
long seconds = (System.currentTimeMillis() - start) / 1000;
result.set("Got " + actualRpm + " while trying to stay at " + rpm + " after " + seconds + " seconds");
}
};
SensorCentral.getInstance().addListener(Sensor.RPM, listener);
sleepSeconds(testDuration);
callback.apply(result.get());
SensorCentral.getInstance().removeListener(Sensor.RPM, listener);
}
private void testCustomEngine() {
ecu.setEngineType(ET_DEFAULT_FRANKENSO); ecu.setEngineType(ET_DEFAULT_FRANKENSO);
ecu.sendCommand("set_toothed_wheel 4 0"); ecu.sendCommand("set_toothed_wheel 4 0");
// sendCommand("enable trigger_only_front"); // sendCommand("enable trigger_only_front");
@ -87,24 +41,28 @@ public class FunctionalTestsSuite {
// changeRpm(1500); // changeRpm(1500);
} }
private void testMazdaMiata2003() { @Test
public void testMazdaMiata2003() {
ecu.setEngineType(ET_FRANKENSO_MIATA_NB2); ecu.setEngineType(ET_FRANKENSO_MIATA_NB2);
ecu.sendCommand("get cranking_dwell"); // just test coverage ecu.sendCommand("get cranking_dwell"); // just test coverage
// sendCommand("get nosuchgettersdfsdfsdfsdf"); // just test coverage // sendCommand("get nosuchgettersdfsdfsdfsdf"); // just test coverage
} }
private void testCamaro() { @Test
public void testCamaro() {
ecu.setEngineType(ET_CAMARO); ecu.setEngineType(ET_CAMARO);
} }
private void testSachs() { @Test
public void testSachs() {
ecu.setEngineType(ET_SACHS); ecu.setEngineType(ET_SACHS);
// String msg = "BMW"; // String msg = "BMW";
ecu.changeRpm(1200); ecu.changeRpm(1200);
// todo: add more content // todo: add more content
} }
private void testBmwE34() { @Test
public void testBmwE34() {
ecu.setEngineType(ET_BMW_E34); ecu.setEngineType(ET_BMW_E34);
ecu.sendCommand("chart 1"); ecu.sendCommand("chart 1");
String msg = "BMW"; String msg = "BMW";
@ -127,18 +85,16 @@ public class FunctionalTestsSuite {
assertWave(msg, chart, EngineChart.MAP_AVERAGING, 0.139, x, x + 120, x + 240, x + 360, x + 480, x + 600); assertWave(msg, chart, EngineChart.MAP_AVERAGING, 0.139, x, x + 120, x + 240, x + 360, x + 480, x + 600);
} }
private void testCitroenBerlingo() { @Test
public void testCitroenBerlingo() {
ecu.setEngineType(ET_CITROEN_TU3JP); ecu.setEngineType(ET_CITROEN_TU3JP);
// String msg = "Citroen"; // String msg = "Citroen";
ecu.changeRpm(1200); ecu.changeRpm(1200);
// todo: add more content // todo: add more content
} }
private EngineChart nextChart() { @Test
return TestingUtils.nextChart(ecu.commandQueue); public void test2003DodgeNeon() {
}
private void test2003DodgeNeon() {
ecu.setEngineType(ET_DODGE_NEON_2003_CRANK); ecu.setEngineType(ET_DODGE_NEON_2003_CRANK);
ecu.sendCommand("set wwaeTau 0"); ecu.sendCommand("set wwaeTau 0");
ecu.sendCommand("set wwaeBeta 0"); ecu.sendCommand("set wwaeBeta 0");
@ -204,7 +160,8 @@ public class FunctionalTestsSuite {
assertWave(true, msg, chart, EngineChart.SPARK_1, 0.13299999999999998, EngineReport.RATIO, EngineReport.RATIO, x + 180, x + 540); assertWave(true, msg, chart, EngineChart.SPARK_1, 0.13299999999999998, EngineReport.RATIO, EngineReport.RATIO, x + 180, x + 540);
} }
private void testMazdaProtege() { @Test
public void testMazdaProtege() {
ecu.setEngineType(ET_FORD_ESCORT_GT); ecu.setEngineType(ET_FORD_ESCORT_GT);
EngineChart chart; EngineChart chart;
ecu.sendCommand("set mock_vbatt_voltage 1.395"); ecu.sendCommand("set mock_vbatt_voltage 1.395");
@ -231,7 +188,8 @@ public class FunctionalTestsSuite {
assertWaveFall(msg, chart, EngineChart.INJECTOR_2, 0.21433333333333345, x, x + 360); assertWaveFall(msg, chart, EngineChart.INJECTOR_2, 0.21433333333333345, x, x + 360);
} }
private void test1995DodgeNeon() { @Test
public void test1995DodgeNeon() {
ecu.setEngineType(ET_DODGE_NEON_1995); ecu.setEngineType(ET_DODGE_NEON_1995);
EngineChart chart; EngineChart chart;
sendComplexCommand("set_whole_fuel_map 3"); sendComplexCommand("set_whole_fuel_map 3");
@ -265,11 +223,13 @@ public class FunctionalTestsSuite {
assertWaveFall(msg, chart, EngineChart.INJECTOR_4, 0.493, x + 540); assertWaveFall(msg, chart, EngineChart.INJECTOR_4, 0.493, x + 540);
} }
private void testRoverV8() { @Test
public void testRoverV8() {
ecu.setEngineType(ET_ROVER_V8); ecu.setEngineType(ET_ROVER_V8);
} }
private void testFordFiesta() { @Test
public void testFordFiesta() {
ecu.setEngineType(ET_FORD_FIESTA); ecu.setEngineType(ET_FORD_FIESTA);
EngineChart chart; EngineChart chart;
ecu.changeRpm(2000); ecu.changeRpm(2000);
@ -283,7 +243,8 @@ public class FunctionalTestsSuite {
assertWaveNull(msg, chart, EngineChart.SPARK_4); assertWaveNull(msg, chart, EngineChart.SPARK_4);
} }
private void testFord6() { @Test
public void testFord6() {
ecu.setEngineType(ET_FORD_INLINE_6); ecu.setEngineType(ET_FORD_INLINE_6);
EngineChart chart; EngineChart chart;
ecu.changeRpm(2000); ecu.changeRpm(2000);
@ -300,7 +261,8 @@ public class FunctionalTestsSuite {
assertTrue(msg + " trigger2", chart.get(EngineChart.TRIGGER_2) != null); assertTrue(msg + " trigger2", chart.get(EngineChart.TRIGGER_2) != null);
} }
private void testFordAspire() { @Test
public void testFordAspire() {
ecu.setEngineType(ET_FORD_ASPIRE); ecu.setEngineType(ET_FORD_ASPIRE);
ecu.sendCommand("disable cylinder_cleanup"); ecu.sendCommand("disable cylinder_cleanup");
ecu.sendCommand("set mock_map_voltage 1"); ecu.sendCommand("set mock_map_voltage 1");
@ -436,4 +398,8 @@ public class FunctionalTestsSuite {
private static void assertWaveNull(String msg, EngineChart chart, String key) { private static void assertWaveNull(String msg, EngineChart chart, String key) {
assertNull(msg + "chart for " + key, chart.get(key)); assertNull(msg + "chart for " + key, chart.get(key));
} }
private EngineChart nextChart() {
return TestingUtils.nextChart(ecu.commandQueue);
}
} }

View File

@ -3,7 +3,7 @@ package com.rusefi;
import com.rusefi.functional_tests.EcuTestHelper; import com.rusefi.functional_tests.EcuTestHelper;
import org.junit.Test; import org.junit.Test;
import static com.rusefi.FunctionalTestsSuite.FAIL; import static com.rusefi.functional_tests.EcuTestHelper.FAIL;
import static com.rusefi.config.generated.Fields.*; import static com.rusefi.config.generated.Fields.*;
public class HighRevTest { public class HighRevTest {
@ -16,7 +16,7 @@ public class HighRevTest {
ecu.sendCommand("set " + CMD_ENGINESNIFFERRPMTHRESHOLD + " 100"); ecu.sendCommand("set " + CMD_ENGINESNIFFERRPMTHRESHOLD + " 100");
ecu.changeRpm(900); ecu.changeRpm(900);
// first let's get to expected RPM // first let's get to expected RPM
FunctionalTestsSuite.assertRpmDoesNotJump(16000, 5, 40, FAIL, ecu.commandQueue); EcuTestHelper.assertRpmDoesNotJump(16000, 5, 40, FAIL, ecu.commandQueue);
} }
@Test @Test
@ -25,11 +25,11 @@ public class HighRevTest {
ecu.setEngineType(ET_BMW_M73_F); ecu.setEngineType(ET_BMW_M73_F);
ecu.changeRpm(700); ecu.changeRpm(700);
// first let's get to expected RPM // first let's get to expected RPM
FunctionalTestsSuite.assertRpmDoesNotJump(16000, 5, 40, FAIL, ecu.commandQueue); EcuTestHelper.assertRpmDoesNotJump(16000, 5, 40, FAIL, ecu.commandQueue);
testCaseBug1873(ecu); testCaseBug1873(ecu);
} }
private void testCaseBug1873(EcuTestHelper ecu) { private void testCaseBug1873(EcuTestHelper ecu) {
FunctionalTestsSuite.assertRpmDoesNotJump(60, 5, 110, FAIL, ecu.commandQueue); EcuTestHelper.assertRpmDoesNotJump(60, 5, 110, FAIL, ecu.commandQueue);
} }
} }

View File

@ -10,6 +10,8 @@ import static com.devexperts.logging.Logging.getLogging;
import static com.rusefi.Timeouts.SECOND; import static com.rusefi.Timeouts.SECOND;
/** /**
* dead?
*
* The following jumper wires are used to test some subsystems as realistically as possible: * The following jumper wires are used to test some subsystems as realistically as possible:
* PD1 <=> PC6 * PD1 <=> PC6
* PD2 <=> PA5 * PD2 <=> PA5
@ -48,7 +50,7 @@ public class RealHardwareTestLauncher {
public static boolean runHardwareTest() { public static boolean runHardwareTest() {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
try { try {
runRealHardwareTest(ControllerConnectorState.getLinkManager()); // runRealHardwareTest(ControllerConnectorState.getLinkManager());
} catch (Throwable e) { } catch (Throwable e) {
StringWriter sw = new StringWriter(); StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw); PrintWriter pw = new PrintWriter(sw);
@ -61,9 +63,4 @@ public class RealHardwareTestLauncher {
log.info("Done in " + time + "secs"); log.info("Done in " + time + "secs");
return true; return true;
} }
private static void runRealHardwareTest(LinkManager linkManager) {
// now run common part of the test which should be same on real hardware and simulator
new FunctionalTestsSuite(linkManager, linkManager.getCommandQueue()).mainTestBody();
}
} }

View File

@ -22,7 +22,8 @@ public class SimulatorFunctionalTestLauncher {
try { try {
LinkManager linkManager = new LinkManager(); LinkManager linkManager = new LinkManager();
IoUtil.connectToSimulator(linkManager, startSimulator); IoUtil.connectToSimulator(linkManager, startSimulator);
new FunctionalTestsSuite(linkManager, linkManager.getCommandQueue()).mainTestBody(); // todo: new implementation for unit tests?
// new FunctionalTest(linkManager, linkManager.getCommandQueue()).mainTestBody();
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
failed = true; failed = true;

View File

@ -5,16 +5,26 @@ import com.rusefi.ControllerConnectorState;
import com.rusefi.IoUtil; import com.rusefi.IoUtil;
import com.rusefi.Timeouts; import com.rusefi.Timeouts;
import com.rusefi.config.generated.Fields; import com.rusefi.config.generated.Fields;
import com.rusefi.core.Sensor;
import com.rusefi.core.SensorCentral;
import com.rusefi.io.CommandQueue; import com.rusefi.io.CommandQueue;
import com.rusefi.io.LinkManager; import com.rusefi.io.LinkManager;
import com.rusefi.waves.EngineReport; import com.rusefi.waves.EngineReport;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import static com.devexperts.logging.Logging.getLogging; import static com.devexperts.logging.Logging.getLogging;
import static com.rusefi.IoUtil.*; import static com.rusefi.IoUtil.*;
import static com.rusefi.waves.EngineReport.isCloseEnough; import static com.rusefi.waves.EngineReport.isCloseEnough;
public class EcuTestHelper { public class EcuTestHelper {
public static final Function<String, Object> FAIL = errorCode -> {
if (errorCode != null)
throw new IllegalStateException("Failed " + errorCode);
return null;
};
private static final Logging log = getLogging(EcuTestHelper.class); private static final Logging log = getLogging(EcuTestHelper.class);
public static final int COMPLEX_COMMAND_RETRY = 10000; public static final int COMPLEX_COMMAND_RETRY = 10000;
@ -28,6 +38,24 @@ public class EcuTestHelper {
this.linkManager = linkManager; this.linkManager = linkManager;
} }
public static void assertRpmDoesNotJump(int rpm, int settleTime, int testDuration, Function<String, Object> callback, CommandQueue commandQueue) {
IoUtil.changeRpm(commandQueue, rpm);
sleepSeconds(settleTime);
AtomicReference<String> result = new AtomicReference<>();
long start = System.currentTimeMillis();
SensorCentral.SensorListener listener = value -> {
double actualRpm = SensorCentral.getInstance().getValue(Sensor.RPM);
if (!isCloseEnough(rpm, actualRpm)) {
long seconds = (System.currentTimeMillis() - start) / 1000;
result.set("Got " + actualRpm + " while trying to stay at " + rpm + " after " + seconds + " seconds");
}
};
SensorCentral.getInstance().addListener(Sensor.RPM, listener);
sleepSeconds(testDuration);
callback.apply(result.get());
SensorCentral.getInstance().removeListener(Sensor.RPM, listener);
}
@NotNull @NotNull
public LinkManager getLinkManager() { public LinkManager getLinkManager() {
return linkManager; return linkManager;

View File

@ -1,11 +1,11 @@
package com.rusefi.ui.widgets; package com.rusefi.ui.widgets;
import com.fathzer.soft.javaluator.DoubleEvaluator; import com.fathzer.soft.javaluator.DoubleEvaluator;
import com.rusefi.FunctionalTestsSuite;
import com.rusefi.FileLog; import com.rusefi.FileLog;
import com.rusefi.InfixConverter; import com.rusefi.InfixConverter;
import com.rusefi.NamedThreadFactory; import com.rusefi.NamedThreadFactory;
import com.rusefi.core.MessagesCentral; import com.rusefi.core.MessagesCentral;
import com.rusefi.functional_tests.EcuTestHelper;
import com.rusefi.io.CommandQueue; import com.rusefi.io.CommandQueue;
import com.rusefi.io.LinkManager; import com.rusefi.io.LinkManager;
import com.rusefi.ui.RecentCommands; import com.rusefi.ui.RecentCommands;
@ -189,7 +189,7 @@ public class AnyCommand {
return null; return null;
} }
}; };
FunctionalTestsSuite.assertRpmDoesNotJump(rpm, settleTime, durationTime, callback, linkManager.getCommandQueue()); EcuTestHelper.assertRpmDoesNotJump(rpm, settleTime, durationTime, callback, linkManager.getCommandQueue());
} }
}).start(); }).start();
} }