switch hpfp and aux valves to AngleBasedEventNew (#4882)
* switch hpfp to AngleBasedEventNew * aux valves too!
This commit is contained in:
parent
1c5847eb03
commit
2c58579a8d
|
@ -14,6 +14,7 @@
|
||||||
#include "trigger_structure.h"
|
#include "trigger_structure.h"
|
||||||
|
|
||||||
struct AngleBasedEventOld;
|
struct AngleBasedEventOld;
|
||||||
|
struct AngleBasedEventNew;
|
||||||
|
|
||||||
struct AngleBasedEventBase {
|
struct AngleBasedEventBase {
|
||||||
scheduling_s scheduling;
|
scheduling_s scheduling;
|
||||||
|
@ -28,7 +29,10 @@ struct AngleBasedEventBase {
|
||||||
virtual bool shouldSchedule(uint32_t trgEventIndex, float currentPhase, float nextPhase) const = 0;
|
virtual bool shouldSchedule(uint32_t trgEventIndex, float currentPhase, float nextPhase) const = 0;
|
||||||
virtual float getAngleFromNow(float currentPhase) const = 0;
|
virtual float getAngleFromNow(float currentPhase) const = 0;
|
||||||
|
|
||||||
virtual AngleBasedEventOld* asOld() { return nullptr; }
|
// Virtual functions to get these as old/new variants, since we don't have RTTI for dynamic casts to work
|
||||||
|
// (this is poor man's RTTI)
|
||||||
|
virtual const AngleBasedEventOld* asOld() const { return nullptr; }
|
||||||
|
virtual const AngleBasedEventNew* asNew() const { return nullptr; }
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -50,7 +54,7 @@ struct AngleBasedEventOld : public AngleBasedEventBase {
|
||||||
bool shouldSchedule(uint32_t trgEventIndex, float currentPhase, float nextPhase) const override;
|
bool shouldSchedule(uint32_t trgEventIndex, float currentPhase, float nextPhase) const override;
|
||||||
float getAngleFromNow(float currentPhase) const override;
|
float getAngleFromNow(float currentPhase) const override;
|
||||||
|
|
||||||
AngleBasedEventOld* asOld() override { return this; }
|
virtual const AngleBasedEventOld* asOld() const override { return this; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AngleBasedEventNew : public AngleBasedEventBase {
|
struct AngleBasedEventNew : public AngleBasedEventBase {
|
||||||
|
@ -60,6 +64,8 @@ struct AngleBasedEventNew : public AngleBasedEventBase {
|
||||||
bool shouldSchedule(uint32_t trgEventIndex, float currentPhase, float nextPhase) const override;
|
bool shouldSchedule(uint32_t trgEventIndex, float currentPhase, float nextPhase) const override;
|
||||||
bool shouldSchedule(float currentPhase, float nextPhase) const;
|
bool shouldSchedule(float currentPhase, float nextPhase) const;
|
||||||
float getAngleFromNow(float currentPhase) const override;
|
float getAngleFromNow(float currentPhase) const override;
|
||||||
|
|
||||||
|
virtual const AngleBasedEventNew* asNew() const override { return this; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_OUTPUTS_FOR_IGNITION 2
|
#define MAX_OUTPUTS_FOR_IGNITION 2
|
||||||
|
@ -119,8 +125,8 @@ public:
|
||||||
int valveIndex;
|
int valveIndex;
|
||||||
angle_t extra;
|
angle_t extra;
|
||||||
|
|
||||||
AngleBasedEventOld open;
|
AngleBasedEventNew open;
|
||||||
AngleBasedEventOld close;
|
AngleBasedEventNew close;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ public:
|
||||||
#if !EFI_UNIT_TEST
|
#if !EFI_UNIT_TEST
|
||||||
private:
|
private:
|
||||||
#endif // EFI_UNIT_TEST
|
#endif // EFI_UNIT_TEST
|
||||||
AngleBasedEventOld m_event;
|
AngleBasedEventNew m_event;
|
||||||
|
|
||||||
HpfpQuantity m_quantity;
|
HpfpQuantity m_quantity;
|
||||||
HpfpLobe m_lobe;
|
HpfpLobe m_lobe;
|
||||||
|
|
|
@ -308,7 +308,7 @@ scheduling_s * EngineTestHelper::assertEvent5(const char *msg, int index, void *
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
AngleBasedEventBase * EngineTestHelper::assertTriggerEvent(const char *msg,
|
const AngleBasedEventBase * EngineTestHelper::assertTriggerEvent(const char *msg,
|
||||||
int index, AngleBasedEventBase *expected,
|
int index, AngleBasedEventBase *expected,
|
||||||
void *callback,
|
void *callback,
|
||||||
int triggerEventIndex, angle_t angleOffsetFromTriggerEvent) {
|
int triggerEventIndex, angle_t angleOffsetFromTriggerEvent) {
|
||||||
|
@ -324,6 +324,23 @@ AngleBasedEventBase * EngineTestHelper::assertTriggerEvent(const char *msg,
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const AngleBasedEventBase * EngineTestHelper::assertTriggerEvent(const char *msg,
|
||||||
|
int index, AngleBasedEventBase *expected,
|
||||||
|
void *callback,
|
||||||
|
angle_t enginePhase) {
|
||||||
|
AngleBasedEventBase * event2 =
|
||||||
|
engine.module<TriggerScheduler>()->getElementAtIndexForUnitTest(index);
|
||||||
|
|
||||||
|
auto event = event2->asNew();
|
||||||
|
|
||||||
|
if (callback) {
|
||||||
|
assertEqualsM4(msg, " callback up/down", (void*)event->action.getCallback() == (void*) callback, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEqualsM4(msg, " angle", enginePhase, event->enginePhase);
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
scheduling_s * EngineTestHelper::assertScheduling(const char *msg, int index, scheduling_s *expected, void *callback, efitimeus_t expectedTimestamp) {
|
scheduling_s * EngineTestHelper::assertScheduling(const char *msg, int index, scheduling_s *expected, void *callback, efitimeus_t expectedTimestamp) {
|
||||||
scheduling_s * actual = assertEvent5(msg, index, callback, expectedTimestamp);
|
scheduling_s * actual = assertEvent5(msg, index, callback, expectedTimestamp);
|
||||||
return actual;
|
return actual;
|
||||||
|
|
|
@ -84,7 +84,8 @@ public:
|
||||||
scheduling_s * assertEvent5(const char *msg, int index, void *callback, efitimeus_t expectedTimestamp);
|
scheduling_s * assertEvent5(const char *msg, int index, void *callback, efitimeus_t expectedTimestamp);
|
||||||
scheduling_s * assertScheduling(const char *msg, int index, scheduling_s *expected, void *callback, efitimeus_t expectedTimestamp);
|
scheduling_s * assertScheduling(const char *msg, int index, scheduling_s *expected, void *callback, efitimeus_t expectedTimestamp);
|
||||||
|
|
||||||
AngleBasedEventBase * assertTriggerEvent(const char *msg, int index, AngleBasedEventBase *expected, void *callback, int triggerEventIndex, angle_t angleOffsetFromTriggerEvent);
|
const AngleBasedEventBase* assertTriggerEvent(const char *msg, int index, AngleBasedEventBase *expected, void *callback, int triggerEventIndex, angle_t angleOffsetFromTriggerEvent);
|
||||||
|
const AngleBasedEventBase* assertTriggerEvent(const char *msg, int index, AngleBasedEventBase *expected, void *callback, angle_t enginePhase);
|
||||||
|
|
||||||
void assertEvent(const char *msg, int index, void *callback, efitimeus_t momentX, InjectionEvent *event);
|
void assertEvent(const char *msg, int index, void *callback, efitimeus_t momentX, InjectionEvent *event);
|
||||||
void assertInjectorUpEvent(const char *msg, int eventIndex, efitimeus_t momentX, long injectorIndex);
|
void assertInjectorUpEvent(const char *msg, int eventIndex, efitimeus_t momentX, long injectorIndex);
|
||||||
|
|
|
@ -14,15 +14,30 @@ TEST(Actuators, AuxValves) {
|
||||||
|
|
||||||
EngineTestHelper eth(NISSAN_PRIMERA);
|
EngineTestHelper eth(NISSAN_PRIMERA);
|
||||||
|
|
||||||
engine->needTdcCallback = false;
|
// Engine must be "spinning" for scheduleByAngle to work
|
||||||
|
engine->rpmCalculator.setRpmValue(1000);
|
||||||
|
|
||||||
setupSimpleTestEngineWithMafAndTT_ONE_trigger(ð, IM_SEQUENTIAL);
|
eth.assertTriggerEvent("a0", 0, &engine->auxValves[0][0].open, (void*)&auxPlainPinTurnOn, 0);
|
||||||
engineConfiguration->isInjectionEnabled = false;
|
eth.assertTriggerEvent("a1", 1, &engine->auxValves[0][1].open, (void*)&auxPlainPinTurnOn, 360);
|
||||||
|
eth.assertTriggerEvent("a2", 2, &engine->auxValves[1][0].open, (void*)&auxPlainPinTurnOn, 180);
|
||||||
|
eth.assertTriggerEvent("a3", 3, &engine->auxValves[1][1].open, (void*)&auxPlainPinTurnOn, 540);
|
||||||
|
|
||||||
eth.fireTriggerEvents2(2 /* count */ , 600 /* ms */);
|
// Execute the first one, ensure scheduling for the "close" event happens
|
||||||
ASSERT_EQ( 100, round(Sensor::getOrZero(SensorType::Rpm))) << "spinning-RPM#1";
|
engine->module<TriggerScheduler>()->scheduleEventsUntilNextTriggerTooth(1000, 0, 0, 0, 1);
|
||||||
|
|
||||||
eth.assertTriggerEvent("a0", 0, &engine->auxValves[0][0].open, (void*)&auxPlainPinTurnOn, 7, 86);
|
// Old head should now be missing - we just ran it
|
||||||
eth.assertTriggerEvent("a1", 1, &engine->auxValves[0][1].open, (void*)&auxPlainPinTurnOn, 3, 86);
|
eth.assertTriggerEvent("a1", 0, &engine->auxValves[0][1].open, (void*)&auxPlainPinTurnOn, 360);
|
||||||
eth.assertTriggerEvent("a2", 2, &engine->auxValves[1][0].open, (void*)&auxPlainPinTurnOn, 5, 86);
|
eth.assertTriggerEvent("a2", 1, &engine->auxValves[1][0].open, (void*)&auxPlainPinTurnOn, 180);
|
||||||
|
eth.assertTriggerEvent("a3", 2, &engine->auxValves[1][1].open, (void*)&auxPlainPinTurnOn, 540);
|
||||||
|
|
||||||
|
// Execute the action it put on the regular scheduler
|
||||||
|
eth.executeUntil(999999);
|
||||||
|
|
||||||
|
eth.assertTriggerEvent("a1", 0, &engine->auxValves[0][1].open, (void*)&auxPlainPinTurnOn, 360);
|
||||||
|
eth.assertTriggerEvent("a2", 1, &engine->auxValves[1][0].open, (void*)&auxPlainPinTurnOn, 180);
|
||||||
|
eth.assertTriggerEvent("a3", 2, &engine->auxValves[1][1].open, (void*)&auxPlainPinTurnOn, 540);
|
||||||
|
// same event is back at the end of the list
|
||||||
|
eth.assertTriggerEvent("a0", 3, &engine->auxValves[0][0].open, (void*)&auxPlainPinTurnOn, 0);
|
||||||
|
// PLUS the turn off event!
|
||||||
|
eth.assertTriggerEvent("off", 4, &engine->auxValves[0][0].close, nullptr, 30);
|
||||||
}
|
}
|
||||||
|
|
|
@ -272,22 +272,20 @@ TEST(HPFP, Schedule) {
|
||||||
|
|
||||||
hpfp.onFastCallback();
|
hpfp.onFastCallback();
|
||||||
// First event was scheduled by setRpmValue with 0 injection mass. So, it's off.
|
// First event was scheduled by setRpmValue with 0 injection mass. So, it's off.
|
||||||
eth.assertTriggerEvent("h0", 0, &hpfp.m_event, (void*)&HpfpController::pinTurnOff,
|
eth.assertTriggerEvent("h0", 0, &hpfp.m_event, (void*)&HpfpController::pinTurnOff, 270);
|
||||||
1, angle0 - 0);
|
|
||||||
|
|
||||||
// Make the previous event happen, schedule the next.
|
// Make the previous event happen, schedule the next.
|
||||||
engine->module<TriggerScheduler>()->scheduleEventsUntilNextTriggerTooth(
|
engine->module<TriggerScheduler>()->scheduleEventsUntilNextTriggerTooth(
|
||||||
1000, 1, tick_per_deg * 0, 0, 0);
|
1000, 1, tick_per_deg * 0, 180, 360);
|
||||||
// Mock executor doesn't run events, so we run it manually
|
// Mock executor doesn't run events, so we run it manually
|
||||||
HpfpController::pinTurnOff(&hpfp);
|
HpfpController::pinTurnOff(&hpfp);
|
||||||
|
|
||||||
// Now we should have a regular on/off event.
|
// Now we should have a regular on/off event.
|
||||||
eth.assertTriggerEvent("h1", 0, &hpfp.m_event, (void*)&HpfpController::pinTurnOn,
|
eth.assertTriggerEvent("h1", 0, &hpfp.m_event, (void*)&HpfpController::pinTurnOn, 450 - 37.6923065f);
|
||||||
2, angle1 - 180);
|
|
||||||
|
|
||||||
// Make it happen
|
// Make it happen
|
||||||
engine->module<TriggerScheduler>()->scheduleEventsUntilNextTriggerTooth(
|
engine->module<TriggerScheduler>()->scheduleEventsUntilNextTriggerTooth(
|
||||||
1000, 2, tick_per_deg * 180, 0, 0);
|
1000, 2, tick_per_deg * 180, 360, 540);
|
||||||
|
|
||||||
// Since we have a mock scheduler, lets insert the correct timestamp in the scheduling
|
// Since we have a mock scheduler, lets insert the correct timestamp in the scheduling
|
||||||
// struct.
|
// struct.
|
||||||
|
|
Loading…
Reference in New Issue