aux valves unit test

This commit is contained in:
rusefi 2019-11-23 22:55:21 -05:00
parent 07c7219f51
commit 18bb121cbe
10 changed files with 72 additions and 24 deletions

View File

@ -20,7 +20,13 @@ void setNissanPrimeraEngineConfiguration(DECLARE_CONFIG_PARAMETER_SIGNATURE) {
engineConfiguration->trigger.type = TT_NISSAN_SR20VE; engineConfiguration->trigger.type = TT_NISSAN_SR20VE;
// engineConfiguration->auxValves[0] boardConfiguration->ignitionPins[0] = GPIOD_7;
boardConfiguration->ignitionPins[1] = GPIO_UNASSIGNED;
boardConfiguration->ignitionPins[2] = GPIOD_6;
engineConfiguration->auxValves[0] = GPIOE_14;
engineConfiguration->auxValves[1] = GPIOE_12;
} }
void setNissanPrimeraEngineConfiguration_360(DECLARE_CONFIG_PARAMETER_SIGNATURE) { void setNissanPrimeraEngineConfiguration_360(DECLARE_CONFIG_PARAMETER_SIGNATURE) {

View File

@ -45,6 +45,8 @@ class RpmCalculator;
#define CLEANUP_MODE_TPS 90 #define CLEANUP_MODE_TPS 90
#define STEPPER_PARKING_TPS CLEANUP_MODE_TPS #define STEPPER_PARKING_TPS CLEANUP_MODE_TPS
#define CYCLE_ALTERNATION 2
class Engine { class Engine {
public: public:
explicit Engine(persistent_config_s *config); explicit Engine(persistent_config_s *config);
@ -56,6 +58,14 @@ public:
LocalVersionHolder auxParametersVersion; LocalVersionHolder auxParametersVersion;
operation_mode_e getOperationMode(DECLARE_ENGINE_PARAMETER_SIGNATURE); operation_mode_e getOperationMode(DECLARE_ENGINE_PARAMETER_SIGNATURE);
scheduling_s auxTurnOnEvent[AUX_DIGITAL_VALVE_COUNT][/* we have two 180 cycles within engine 360 revolution */ 2][CYCLE_ALTERNATION];
scheduling_s auxTurnOffEvent[AUX_DIGITAL_VALVE_COUNT][2][CYCLE_ALTERNATION];
int auxSchedulingIndex = 2;
bool needTdcCallback = true;
/** /**
* By the way 32-bit value should hold at least 400 hours of events at 6K RPM x 12 events per revolution * By the way 32-bit value should hold at least 400 hours of events at 6K RPM x 12 events per revolution
*/ */

View File

@ -21,26 +21,19 @@
EXTERN_ENGINE EXTERN_ENGINE
; ;
#define CYCLE_ALTERNATION 2 void plainPinTurnOn(NamedOutputPin *output) {
static scheduling_s turnOnEvent[AUX_DIGITAL_VALVE_COUNT][/* we have two 180 cycles within engine 360 revolution */ 2][CYCLE_ALTERNATION];
static scheduling_s turnOffEvent[AUX_DIGITAL_VALVE_COUNT][2][CYCLE_ALTERNATION];
static void turnOn(NamedOutputPin *output) {
output->setHigh(); output->setHigh();
} }
static void turnOff(NamedOutputPin *output) { void plainPinTurnOff(NamedOutputPin *output) {
output->setLow(); output->setLow();
} }
#define SCHEDULING_TRIGGER_INDEX 2
static void auxValveTriggerCallback(trigger_event_e ckpSignalType, static void auxValveTriggerCallback(trigger_event_e ckpSignalType,
uint32_t index DECLARE_ENGINE_PARAMETER_SUFFIX) { uint32_t index DECLARE_ENGINE_PARAMETER_SUFFIX) {
UNUSED(ckpSignalType); UNUSED(ckpSignalType);
if (index != SCHEDULING_TRIGGER_INDEX) { if (index != engine->auxSchedulingIndex) {
return; return;
} }
int rpm = GET_RPM_VALUE; int rpm = GET_RPM_VALUE;
@ -71,8 +64,8 @@ static void auxValveTriggerCallback(trigger_event_e ckpSignalType,
*/ */
angle_t extra = phaseIndex * 360 + valveIndex * 180; angle_t extra = phaseIndex * 360 + valveIndex * 180;
angle_t onTime = extra + engine->engineState.auxValveStart; angle_t onTime = extra + engine->engineState.auxValveStart;
scheduling_s *onEvent = &turnOnEvent[valveIndex][phaseIndex][engineCycleAlternation]; scheduling_s *onEvent = &engine->auxTurnOnEvent[valveIndex][phaseIndex][engineCycleAlternation];
scheduling_s *offEvent = &turnOffEvent[valveIndex][phaseIndex][engineCycleAlternation]; scheduling_s *offEvent = &engine->auxTurnOffEvent[valveIndex][phaseIndex][engineCycleAlternation];
bool isOverlap = onEvent->isScheduled || offEvent->isScheduled; bool isOverlap = onEvent->isScheduled || offEvent->isScheduled;
if (isOverlap) { if (isOverlap) {
enginePins.debugTriggerSync.setValue(1); enginePins.debugTriggerSync.setValue(1);
@ -81,12 +74,12 @@ static void auxValveTriggerCallback(trigger_event_e ckpSignalType,
fixAngle(onTime, "onTime", CUSTOM_ERR_6556); fixAngle(onTime, "onTime", CUSTOM_ERR_6556);
scheduleByAngle(rpm, onEvent, scheduleByAngle(rpm, onEvent,
onTime, onTime,
(schfunc_t) &turnOn, output PASS_ENGINE_PARAMETER_SUFFIX); (schfunc_t) &plainPinTurnOn, output PASS_ENGINE_PARAMETER_SUFFIX);
angle_t offTime = extra + engine->engineState.auxValveEnd; angle_t offTime = extra + engine->engineState.auxValveEnd;
fixAngle(offTime, "offTime", CUSTOM_ERR_6557); fixAngle(offTime, "offTime", CUSTOM_ERR_6557);
scheduleByAngle(rpm, offEvent, scheduleByAngle(rpm, offEvent,
offTime, offTime,
(schfunc_t) &turnOff, output PASS_ENGINE_PARAMETER_SUFFIX); (schfunc_t) &plainPinTurnOff, output PASS_ENGINE_PARAMETER_SUFFIX);
if (isOverlap) { if (isOverlap) {
enginePins.debugTriggerSync.setValue(0); enginePins.debugTriggerSync.setValue(0);
} }

View File

@ -1,16 +1,15 @@
/* /*
* aux_valves.h * @file aux_valves.h
* *
* @date Nov 25, 2017 * @date Nov 25, 2017
* @author Andrey Belomutskiy, (c) 2012-2017 * @author Andrey Belomutskiy, (c) 2012-2017
*/ */
#ifndef CONTROLLERS_TRIGGER_AUX_VALVES_H_ #pragma once
#define CONTROLLERS_TRIGGER_AUX_VALVES_H_
#include "engine.h" #include "engine.h"
void initAuxValves(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX); void initAuxValves(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX);
void updateAuxValves(DECLARE_ENGINE_PARAMETER_SIGNATURE); void updateAuxValves(DECLARE_ENGINE_PARAMETER_SIGNATURE);
void plainPinTurnOn(NamedOutputPin *output);
#endif /* CONTROLLERS_TRIGGER_AUX_VALVES_H_ */ void plainPinTurnOff(NamedOutputPin *output);

View File

@ -296,6 +296,9 @@ static char rpmBuffer[_MAX_FILLER];
* digital sniffer. * digital sniffer.
*/ */
static void onTdcCallback(Engine *engine) { static void onTdcCallback(Engine *engine) {
if (!engine->needTdcCallback) {
return;
}
EXPAND_Engine; EXPAND_Engine;
itoa10(rpmBuffer, GET_RPM()); itoa10(rpmBuffer, GET_RPM());
#if EFI_ENGINE_SNIFFER #if EFI_ENGINE_SNIFFER

View File

@ -258,7 +258,7 @@ static bool scheduleOrQueue(AngleBasedEvent *event, uint32_t trgEventIndex, angl
bool isPending = assertNotInIgnitionList(ENGINE(ignitionEventsHead), event); bool isPending = assertNotInIgnitionList(ENGINE(ignitionEventsHead), event);
if (isPending) { if (isPending) {
#if SPARK_EXTREME_LOGGING #if SPARK_EXTREME_LOGGING
scheduleMsg(logger, "isPending thus nt adding to queue index=%d rev=%d now=%d", trgEventIndex, getRevolutionCounter(), (int)getTimeNowUs()); scheduleMsg(logger, "isPending thus not adding to queue index=%d rev=%d now=%d", trgEventIndex, getRevolutionCounter(), (int)getTimeNowUs());
#endif /* FUEL_MATH_EXTREME_LOGGING */ #endif /* FUEL_MATH_EXTREME_LOGGING */
} else { } else {
LL_APPEND2(ENGINE(ignitionEventsHead), event, nextToothEvent); LL_APPEND2(ENGINE(ignitionEventsHead), event, nextToothEvent);

View File

@ -163,14 +163,19 @@ void EngineTestHelper::assertInjectorDownEvent(const char *msg, int eventIndex,
scheduling_s * EngineTestHelper::assertEvent5(const char *msg, int index, void *callback, efitime_t expectedTimestamp) { scheduling_s * EngineTestHelper::assertEvent5(const char *msg, int index, void *callback, efitime_t expectedTimestamp) {
TestExecutor *executor = &engine.executor; TestExecutor *executor = &engine.executor;
EXPECT_TRUE(executor->size() > index) << msg; EXPECT_TRUE(executor->size() > index) << msg << " valid index";
scheduling_s *event = executor->getForUnitTest(index); scheduling_s *event = executor->getForUnitTest(index);
assertEqualsM4(msg, " up/down", (void*)event->action.getCallback() == (void*) callback, 1); assertEqualsM4(msg, " callback up/down", (void*)event->action.getCallback() == (void*) callback, 1);
efitime_t start = getTimeNowUs(); efitime_t start = getTimeNowUs();
assertEqualsM(msg, expectedTimestamp, event->momentX - start); assertEqualsM4(msg, " timestamp", expectedTimestamp, event->momentX - start);
return event; return event;
} }
scheduling_s * EngineTestHelper::assertScheduling(const char *msg, int index, scheduling_s *expected, void *callback, efitime_t expectedTimestamp) {
scheduling_s * actual = assertEvent5(msg, index, callback, expectedTimestamp);
}
void EngineTestHelper::assertEvent(const char *msg, int index, void *callback, efitime_t momentX, InjectionEvent *expectedEvent) { void EngineTestHelper::assertEvent(const char *msg, int index, void *callback, efitime_t momentX, InjectionEvent *expectedEvent) {
scheduling_s *event = assertEvent5(msg, index, callback, momentX); scheduling_s *event = assertEvent5(msg, index, callback, momentX);

View File

@ -47,6 +47,7 @@ public:
void clearQueue(); void clearQueue();
scheduling_s * assertEvent5(const char *msg, int index, void *callback, efitime_t expectedTimestamp); scheduling_s * assertEvent5(const char *msg, int index, void *callback, efitime_t expectedTimestamp);
scheduling_s * assertScheduling(const char *msg, int index, scheduling_s *expected, void *callback, efitime_t expectedTimestamp);
void assertEvent(const char *msg, int index, void *callback, efitime_t momentX, InjectionEvent *event); void assertEvent(const char *msg, int index, void *callback, efitime_t momentX, InjectionEvent *event);
void assertInjectorUpEvent(const char *msg, int eventIndex, efitime_t momentX, long injectorIndex); void assertInjectorUpEvent(const char *msg, int eventIndex, efitime_t momentX, long injectorIndex);
void assertInjectorDownEvent(const char *msg, int eventIndex, efitime_t momentX, long injectorIndex); void assertInjectorDownEvent(const char *msg, int eventIndex, efitime_t momentX, long injectorIndex);

View File

@ -0,0 +1,30 @@
/*
* @file test_aux_valves.cpp
*
* @date: Nov 23, 2019
* @Author: Andrey Belomutskiy, (c) 2012-2019
*/
#include "engine_test_helper.h"
#include "aux_valves.h"
TEST(misc, testAuxValves) {
WITH_ENGINE_TEST_HELPER(NISSAN_PRIMERA);
engine->auxSchedulingIndex = 0;
engine->needTdcCallback = false;
setupSimpleTestEngineWithMafAndTT_ONE_trigger(&eth, IM_SEQUENTIAL);
engineConfiguration->isInjectionEnabled = false;
eth.fireTriggerEvents2(2 /* count */ , 600 /* ms */);
ASSERT_EQ( 100, GET_RPM()) << "spinning-RPM#1";
scheduling_s *sch;
sch = eth.assertScheduling("a0", 0, (void*)&engine->auxTurnOnEvent, &plainPinTurnOn, -600000);
sch = eth.assertScheduling("a1", 1, (void*)&engine->auxTurnOffEvent, &plainPinTurnOff, -550000);
sch = eth.assertScheduling("a2", 2, (void*)&engine->auxTurnOnEvent[1][0][0], &plainPinTurnOn, -300000);
}

View File

@ -1,6 +1,7 @@
TESTS_SRC_CPP = \ TESTS_SRC_CPP = \
tests/test_util.cpp \ tests/test_util.cpp \
tests/test_ion.cpp \ tests/test_ion.cpp \
tests/test_aux_valves.cpp \
tests/test_on_demand_parameters.cpp \ tests/test_on_demand_parameters.cpp \
tests/test_hip9011.cpp \ tests/test_hip9011.cpp \
tests/test_cj125.cpp \ tests/test_cj125.cpp \