| Line | Branch | Decision | Exec | Source |
|---|---|---|---|---|
| 1 | /* | |||
| 2 | * test_fasterEngineSpinningUp.cpp | |||
| 3 | * | |||
| 4 | * Created on: Mar 6, 2018 | |||
| 5 | */ | |||
| 6 | ||||
| 7 | #include "pch.h" | |||
| 8 | #include "fuel_math.h" | |||
| 9 | #include "util/injection_crank_helper.h" | |||
| 10 | ||||
| 11 | 4 | TEST(cranking, testFasterEngineSpinningUp) { | ||
| 12 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
| 13 | extern bool unitTestBusyWaitHack; | |||
| 14 | 1 | unitTestBusyWaitHack = true; | ||
| 15 | 1 | float phase = 181; | ||
| 16 | 1 | setTable(config->injectionPhase, -phase); | ||
| 17 | 1 | engine->tdcMarkEnabled = false; | ||
| 18 | // turn on FasterEngineSpinUp mode | |||
| 19 | 1 | engineConfiguration->isFasterEngineSpinUpEnabled = true; | ||
| 20 |
1/1✓ Branch 1 taken 1 time.
|
1 | setTestFuelCrankingTable(12); | |
| 21 | ||||
| 22 | // set ignition mode | |||
| 23 | 1 | engineConfiguration->ignitionMode = IM_INDIVIDUAL_COILS; | ||
| 24 | // set cranking threshold (used below) | |||
| 25 | 1 | engineConfiguration->cranking.rpm = 999; | ||
| 26 | // set sequential injection mode to test auto-change to simultaneous when spinning-up | |||
| 27 |
1/1✓ Branch 1 taken 1 time.
|
1 | setupSimpleTestEngineWithMafAndTT_ONE_trigger(ð, IM_SEQUENTIAL); | |
| 28 | // Lie that this trigger requires disambiguation | |||
| 29 | 1 | engine->triggerCentral.triggerState.setNeedsDisambiguation(true); | ||
| 30 | ||||
| 31 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(IM_WASTED_SPARK, getCurrentIgnitionMode()); | |
| 32 | ||||
| 33 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.fireRise(1000 /*ms*/); | |
| 34 | ||||
| 35 | // check if it's true | |||
| 36 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(IM_SEQUENTIAL, getCurrentInjectionMode()); | |
| 37 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(IM_WASTED_SPARK, getCurrentIgnitionMode()); | |
| 38 | // check if the engine has the right state | |||
| 39 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(SPINNING_UP, engine->rpmCalculator.getState()); | |
| 40 |
4/9✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
|
1 | ASSERT_NEAR(0, getInjectionMass(200), EPS5D); | |
| 41 | // check RPM | |||
| 42 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(0, Sensor::getOrZero(SensorType::Rpm)); | |
| 43 | // the queue should be empty, no trigger events yet | |||
| 44 |
4/10✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
|
1 | ASSERT_EQ(0, engine->scheduler.size()) << "plain#1"; | |
| 45 | ||||
| 46 | // check all events starting from now | |||
| 47 | // advance 1 revolution | |||
| 48 | // because we have trivial TT_ONE trigger here synchronization would happen with just one rise front | |||
| 49 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.fireRise(200); | |
| 50 | ||||
| 51 | // check if the mode is changed | |||
| 52 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(SPINNING_UP, engine->rpmCalculator.getState()); | |
| 53 | // due to isFasterEngineSpinUp=true, we should have already detected RPM! | |||
| 54 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(300, Sensor::getOrZero(SensorType::Rpm)); | |
| 55 | // two simultaneous injections | |||
| 56 |
4/10✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
|
1 | ASSERT_EQ(4, engine->scheduler.size()) << "plain#2"; | |
| 57 | // test if they are simultaneous | |||
| 58 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(IM_SIMULTANEOUS, getCurrentInjectionMode()); | |
| 59 | // test if ignition mode is temporary changed to wasted spark, if set to individual coils | |||
| 60 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(IM_WASTED_SPARK, getCurrentIgnitionMode()); | |
| 61 | // check real events | |||
| 62 | ||||
| 63 | 1 | float expectedSimultaneousTimestamp = eth.angleToTimeUs(360 - phase); | ||
| 64 | ||||
| 65 | 1 | auto const startSimultaneousInjectionAction{ action_s::make<startSimultaneousInjection>() }; | ||
| 66 | 1 | auto const endSimultaneousInjectionAction{ action_s::make<endSimultaneousInjection>((InjectionEvent*){})}; | ||
| 67 | ||||
| 68 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.assertEvent5("inj start#1", 0, startSimultaneousInjectionAction, expectedSimultaneousTimestamp - MS2US(engine->engineState.injectionDuration)); | |
| 69 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.assertEvent5("inj end#1", 1, endSimultaneousInjectionAction, expectedSimultaneousTimestamp); | |
| 70 | ||||
| 71 | // skip the rest of the cycle | |||
| 72 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.moveTimeForwardUs(MS2US(200)); | |
| 73 | ||||
| 74 | // now clear and advance more | |||
| 75 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.executeActions(); | |
| 76 | ||||
| 77 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.fireRise(200); | |
| 78 | ||||
| 79 | // check if the mode is changed when fully synched | |||
| 80 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(CRANKING, engine->rpmCalculator.getState()); | |
| 81 | // check RPM | |||
| 82 |
3/7✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
|
1 | EXPECT_NEAR(200, Sensor::getOrZero(SensorType::Rpm), 0.01); | |
| 83 | // test if they are simultaneous in cranking mode too | |||
| 84 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(IM_SIMULTANEOUS, getCurrentInjectionMode()); | |
| 85 | // Should still be in wasted spark since we don't have cam sync yet | |||
| 86 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(IM_WASTED_SPARK, getCurrentIgnitionMode()); | |
| 87 | // two simultaneous injections | |||
| 88 |
4/10✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
|
1 | ASSERT_EQ( 4, engine->scheduler.size()) << "plain#2"; | |
| 89 | // check real events | |||
| 90 | 1 | expectedSimultaneousTimestamp = eth.angleToTimeUs(360 - phase); | ||
| 91 | ||||
| 92 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.assertEvent5("inj start#2", 0, startSimultaneousInjectionAction, expectedSimultaneousTimestamp - 1625); | |
| 93 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.assertEvent5("inj end#2", 1, endSimultaneousInjectionAction, expectedSimultaneousTimestamp); | |
| 94 | ||||
| 95 | // Now perform a fake VVT sync and check that ignition mode changes to sequential | |||
| 96 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->triggerCentral.syncEnginePhaseAndReport(2, 0); | |
| 97 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(IM_INDIVIDUAL_COILS, getCurrentIgnitionMode()); | |
| 98 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(IM_SIMULTANEOUS, getCurrentInjectionMode()); | |
| 99 | // still cranking fuel | |||
| 100 |
4/9✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
|
1 | ASSERT_NEAR(0.0039, getInjectionMass(200), EPS3D); | |
| 101 | ||||
| 102 | // skip, clear & advance 1 more revolution at higher RPM | |||
| 103 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.fireFall(60); | |
| 104 | ||||
| 105 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.clearQueue(); | |
| 106 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.fireTriggerEventsWithDuration(60); | |
| 107 | ||||
| 108 | // check if the mode is now changed to 'running' at higher RPM | |||
| 109 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(RUNNING, engine->rpmCalculator.getState()); | |
| 110 | // check RPM | |||
| 111 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(1000, Sensor::getOrZero(SensorType::Rpm)); | |
| 112 | // check if the injection mode is back to sequential now | |||
| 113 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(IM_SEQUENTIAL, getCurrentInjectionMode()); | |
| 114 |
4/9✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
|
1 | ASSERT_NEAR(0.0, getInjectionMass(200), EPS3D); // in this test fuel calculation is not active in running mode | |
| 115 | // 4 sequential injections for the full cycle | |||
| 116 |
4/10✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
|
1 | ASSERT_EQ( 8, engine->scheduler.size()) << "plain#3"; | |
| 117 | ||||
| 118 | // check real events for sequential injection | |||
| 119 | // Note: See addFuelEvents() fix inside setRpmValue()! | |||
| 120 | 1 | expectedSimultaneousTimestamp = eth.angleToTimeUs(phase); | ||
| 121 |
4/9✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
|
1 | ASSERT_EQ(180, eth.timeToAngle(30.000)); | |
| 122 | ||||
| 123 | 1 | auto const turnInjectionPinHighAction{ action_s::make<turnInjectionPinHigh>(uintptr_t{}) }; | ||
| 124 | 1 | auto const turnInjectionPinLowAction{ action_s::make<turnInjectionPinLow>((InjectionEvent*){})}; | ||
| 125 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.assertEvent5("inj start#3", 0, turnInjectionPinHighAction, -expectedSimultaneousTimestamp - 1625); | |
| 126 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.assertEvent5("inj end#3", 1, turnInjectionPinLowAction, -expectedSimultaneousTimestamp); | |
| 127 | 1 | } | ||
| 128 | ||||
| 129 | 3 | static void doTestFasterEngineSpinningUp60_2(int startUpDelayMs, int rpm1, int expectedRpm) { | ||
| 130 |
1/1✓ Branch 2 taken 3 times.
|
3 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
| 131 | // turn on FasterEngineSpinUp mode | |||
| 132 | 3 | engineConfiguration->isFasterEngineSpinUpEnabled = true; | ||
| 133 | ||||
| 134 |
1/1✓ Branch 1 taken 3 times.
|
3 | setupSimpleTestEngineWithMaf(ð, IM_SEQUENTIAL, trigger_type_e::TT_TOOTHED_WHEEL_60_2); | |
| 135 |
1/1✓ Branch 1 taken 3 times.
|
3 | eth.moveTimeForwardMs(startUpDelayMs); | |
| 136 | ||||
| 137 | // fire 30 tooth rise/fall signals | |||
| 138 |
1/1✓ Branch 1 taken 3 times.
|
3 | eth.fireTriggerEvents2(30 /* count */, 1 /*ms*/); | |
| 139 | // now fire missed tooth rise/fall | |||
| 140 |
1/1✓ Branch 1 taken 3 times.
|
3 | eth.fireRise(5 /*ms*/); | |
| 141 |
3/7✓ Branch 3 taken 3 times.
✓ Branch 6 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
|
3 | EXPECT_EQ(rpm1, round(Sensor::getOrZero(SensorType::Rpm))); | |
| 142 | ||||
| 143 |
1/1✓ Branch 1 taken 3 times.
|
3 | eth.fireFall(1); | |
| 144 |
1/1✓ Branch 1 taken 3 times.
|
3 | eth.fireTriggerEvents2(30, 1); | |
| 145 | ||||
| 146 | // After some more regular teeth, instant RPM is still correct | |||
| 147 |
3/7✓ Branch 3 taken 3 times.
✓ Branch 6 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
|
3 | EXPECT_EQ(rpm1, round(Sensor::getOrZero(SensorType::Rpm))); | |
| 148 | 6 | } | ||
| 149 | ||||
| 150 | 4 | TEST(cranking, testFasterEngineSpinningUp60_2) { | ||
| 151 | 1 | doTestFasterEngineSpinningUp60_2(0, 1000, 1000); | ||
| 152 | 1 | doTestFasterEngineSpinningUp60_2(100, 1000, 1000); | ||
| 153 | 1 | doTestFasterEngineSpinningUp60_2(1000, 1000, 1000); | ||
| 154 | 1 | } | ||
| 155 |