fome-fw/unit_tests/tests/trigger/test_nissan_vq_vvt.cpp

130 lines
3.2 KiB
C++

/*
* @file test_nissan_vq_vvt.cpp
*
* Created on: Jul 2, 2021
* @author Andrey Belomutskiy, (c) 2012-2021
*/
#include "engine_test_helper.h"
#include "trigger_nissan.h"
#include "nissan_vq.h"
class TriggerCallback {
public:
Engine *engine;
int toothIndex;
TriggerWaveform *form;
bool isVvt;
int vvtBankIndex;
};
static void func(TriggerCallback *callback) {
int formIndex = callback->toothIndex % callback->form->getSize();
Engine *engine = callback->engine;
EXPAND_Engine;
int value = callback->form->wave.channels[0].getState(formIndex);
efitick_t nowNt = getTimeNowNt();
if (callback->isVvt) {
trigger_value_e v = value ? TV_RISE : TV_FALL;
hwHandleVvtCamSignal(v, nowNt, callback->vvtBankIndex * CAMS_PER_BANK PASS_ENGINE_PARAMETER_SUFFIX);
} else {
handleShaftSignal(0, value, nowNt PASS_ENGINE_PARAMETER_SUFFIX);
}
}
static void scheduleTriggerEvents(TriggerWaveform *shape,
float timeScale,
int count,
bool isVvt,
int vvtBankIndex,
int vvtOffset
DECLARE_ENGINE_PARAMETER_SUFFIX) {
int totalIndex = 0;
/**
* yet another approach to trigger testing: let's schedule a huge list of events from heap
* and then execute those one
*/
for (int r = 0; r < count; r++) {
for (size_t i = 0; i < shape->getSize(); i++) {
float angle = vvtOffset + shape->getAngle(totalIndex);
TriggerCallback *param = new TriggerCallback();
param->engine = engine;
param->toothIndex = totalIndex;
param->form = shape;
param->isVvt = isVvt;
param->vvtBankIndex = vvtBankIndex;
scheduling_s *sch = new scheduling_s();
engine->executor.scheduleByTimestamp(sch, timeScale * 1000 * angle, { func, param });
totalIndex++;
}
}
}
TEST(nissan, vq_vvt) {
WITH_ENGINE_TEST_HELPER (HELLEN_121_NISSAN);
engineConfiguration->isIgnitionEnabled = false;
engineConfiguration->isInjectionEnabled = false;
int cyclesCount = 36;
{
static TriggerWaveform crank;
initializeNissanVQcrank(&crank);
scheduleTriggerEvents(&crank,
/* timeScale */ 1,
cyclesCount, false, -1, 0 PASS_ENGINE_PARAMETER_SUFFIX);
}
// crank being FOUR_STROKE_THREE_TIMES_CRANK_SENSOR means 120 degrees cycle duration which does not match cam shaft cycle duration
float vvtTimeScale = 1 / 1.5;
angle_t testVvtOffset = 2;
{
static TriggerWaveform vvt;
initializeNissanVQvvt(&vvt);
scheduleTriggerEvents(&vvt,
/* timeScale */ vvtTimeScale,
cyclesCount / 6, true,
/* vvtBankIndex */ 0,
/* vvtOffset */ testVvtOffset
PASS_ENGINE_PARAMETER_SUFFIX);
}
{
static TriggerWaveform vvt;
initializeNissanVQvvt(&vvt);
scheduleTriggerEvents(&vvt,
/* timeScale */ vvtTimeScale,
cyclesCount / 6, true,
/* vvtBankIndex */1,
/* vvtOffset */ testVvtOffset + NISSAN_VQ_CAM_OFFSET
PASS_ENGINE_PARAMETER_SUFFIX);
}
scheduling_s *head;
while ((head = engine->executor.getHead()) != nullptr) {
eth.setTimeAndInvokeEventsUs(head->momentX);
}
ASSERT_EQ(250, GET_RPM());
TriggerCentral *tc = &engine->triggerCentral;
ASSERT_TRUE(tc->vvtState[0][0].getShaftSynchronized());
ASSERT_TRUE(tc->vvtState[1][0].getShaftSynchronized());
ASSERT_NEAR(-testVvtOffset, tc->vvtPosition[0][0], EPS2D);
ASSERT_NEAR(0/*-testVvtOffset*/, tc->vvtPosition[1][0], EPS2D);
//todo EXPECT_EQ(0, eth.recentWarnings()->getCount());
}