104 lines
4.2 KiB
C++
104 lines
4.2 KiB
C++
/*
|
|
* test_fasterEngineSpinningUp.cpp
|
|
*
|
|
* Created on: Mar 6, 2018
|
|
*/
|
|
|
|
#include "engine_math.h"
|
|
#include "test_fasterEngineSpinningUp.h"
|
|
#include "test_trigger_decoder.h"
|
|
#include "event_queue.h"
|
|
#include "unit_test_framework.h"
|
|
|
|
extern EventQueue schedulingQueue;
|
|
extern int timeNowUs;
|
|
|
|
void testFasterEngineSpinningUp() {
|
|
// this is just a reference unit test implementation
|
|
printf("*************************************************** testFasterEngineSpinningUp\r\n");
|
|
|
|
EngineTestHelper eth(TEST_ENGINE);
|
|
EXPAND_EngineTestHelper
|
|
|
|
// turn on FasterEngineSpinUp mode
|
|
engineConfiguration->bc.isFasterEngineSpinUpEnabled = true;
|
|
// set ignition mode
|
|
engineConfiguration->ignitionMode = IM_INDIVIDUAL_COILS;
|
|
// set cranking threshold (used below)
|
|
engineConfiguration->cranking.rpm = 999;
|
|
// set sequential injection mode to test auto-change to simultaneous when spinning-up
|
|
setupSimpleTestEngineWithMafAndTT_ONE_trigger(ð, IM_SEQUENTIAL);
|
|
|
|
// check if it's true
|
|
assertEquals(IM_SEQUENTIAL, engine->getCurrentInjectionMode(PASS_ENGINE_PARAMETER_SIGNATURE));
|
|
assertEquals(IM_INDIVIDUAL_COILS, getIgnitionMode(PASS_ENGINE_PARAMETER_SIGNATURE));
|
|
// check if the engine has the right state
|
|
assertEquals(STOPPED, engine->rpmCalculator.getState());
|
|
// check RPM
|
|
assertEqualsM("RPM=0", 0, engine->rpmCalculator.getRpm(PASS_ENGINE_PARAMETER_SIGNATURE));
|
|
// the queue should be empty, no trigger events yet
|
|
assertEqualsM("plain#1", 0, schedulingQueue.size());
|
|
|
|
// check all events starting from now
|
|
int timeStartUs = timeNowUs;
|
|
// advance 1 revolution
|
|
eth.fireRise(200);
|
|
|
|
// check if the mode is changed
|
|
assertEquals(SPINNING_UP, engine->rpmCalculator.getState());
|
|
// due to isFasterEngineSpinUp=true, we should have already detected RPM!
|
|
assertEqualsM("RPM#1", 300, engine->rpmCalculator.getRpm(PASS_ENGINE_PARAMETER_SIGNATURE));
|
|
// two simultaneous injections
|
|
assertEqualsM("plain#1", 4, schedulingQueue.size());
|
|
// test if they are simultaneous
|
|
assertEquals(IM_SIMULTANEOUS, engine->getCurrentInjectionMode(PASS_ENGINE_PARAMETER_SIGNATURE));
|
|
// test if ignition mode is temporary changed to wasted spark, if set to ind.coils
|
|
assertEquals(IM_WASTED_SPARK, getIgnitionMode(PASS_ENGINE_PARAMETER_SIGNATURE));
|
|
// check real events
|
|
assertEvent5("inj start#1", 0, (void*)startSimultaniousInjection, timeStartUs, MS2US(200) + 97975);
|
|
assertEvent5("inj end#1", 1, (void*)endSimultaniousInjection, timeStartUs, MS2US(200) + 100000);
|
|
|
|
// skip the rest of the cycle
|
|
eth.fireFall(200);
|
|
|
|
// now clear and advance more
|
|
eth.clearQueue();
|
|
|
|
eth.fireRise(200);
|
|
|
|
// check if the mode is changed when fully synched
|
|
assertEquals(CRANKING, engine->rpmCalculator.getState());
|
|
// check RPM
|
|
assertEqualsM("RPM#2", 300, engine->rpmCalculator.getRpm(PASS_ENGINE_PARAMETER_SIGNATURE));
|
|
// test if they are simultaneous in cranking mode too
|
|
assertEquals(IM_SIMULTANEOUS, engine->getCurrentInjectionMode(PASS_ENGINE_PARAMETER_SIGNATURE));
|
|
// test if ignition mode is restored to ind.coils
|
|
assertEquals(IM_INDIVIDUAL_COILS, getIgnitionMode(PASS_ENGINE_PARAMETER_SIGNATURE));
|
|
// two simultaneous injections
|
|
assertEqualsM("plain#2", 4, schedulingQueue.size());
|
|
// check real events
|
|
assertEvent5("inj start#2", 0, (void*)startSimultaniousInjection, timeNowUs, 97975);
|
|
assertEvent5("inj end#2", 1, (void*)endSimultaniousInjection, timeNowUs, 100000);
|
|
|
|
// skip, clear & advance 1 more revolution at higher RPM
|
|
eth.fireFall(60);
|
|
|
|
eth.clearQueue();
|
|
timeStartUs = timeNowUs;
|
|
eth.fireTriggerEventsWithDuration(60);
|
|
|
|
// check if the mode is now changed to 'running' at higher RPM
|
|
assertEquals(RUNNING, engine->rpmCalculator.getState());
|
|
// check RPM
|
|
assertEqualsM("RPM#3", 1000, engine->rpmCalculator.getRpm(PASS_ENGINE_PARAMETER_SIGNATURE));
|
|
// check if the injection mode is back to sequential now
|
|
assertEquals(IM_SEQUENTIAL, engine->getCurrentInjectionMode(PASS_ENGINE_PARAMETER_SIGNATURE));
|
|
// 4 sequential injections for the full cycle
|
|
assertEqualsM("plain#3", 8, schedulingQueue.size());
|
|
|
|
// check real events for sequential injection
|
|
// Note: See addFuelEvents() fix inside setRpmValue()!
|
|
assertEvent5("inj start#3", 0, (void*)seTurnPinHigh, timeStartUs, MS2US(60) + 27974);
|
|
assertEvent5("inj end#3", 1, (void*)seTurnPinLow, timeStartUs, MS2US(60) + 27974 + 3000);
|
|
}
|