switch hpfp and aux valves to AngleBasedEventNew (#4882)

* switch hpfp to AngleBasedEventNew

* aux valves too!
This commit is contained in:
Matthew Kennedy 2022-12-10 13:15:11 -08:00 committed by GitHub
parent 1c5847eb03
commit 2c58579a8d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 58 additions and 21 deletions

View File

@ -14,6 +14,7 @@
#include "trigger_structure.h"
struct AngleBasedEventOld;
struct AngleBasedEventNew;
struct AngleBasedEventBase {
scheduling_s scheduling;
@ -28,7 +29,10 @@ struct AngleBasedEventBase {
virtual bool shouldSchedule(uint32_t trgEventIndex, float currentPhase, float nextPhase) 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;
float getAngleFromNow(float currentPhase) const override;
AngleBasedEventOld* asOld() override { return this; }
virtual const AngleBasedEventOld* asOld() const override { return this; }
};
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(float currentPhase, float nextPhase) const;
float getAngleFromNow(float currentPhase) const override;
virtual const AngleBasedEventNew* asNew() const override { return this; }
};
#define MAX_OUTPUTS_FOR_IGNITION 2
@ -119,8 +125,8 @@ public:
int valveIndex;
angle_t extra;
AngleBasedEventOld open;
AngleBasedEventOld close;
AngleBasedEventNew open;
AngleBasedEventNew close;
};

View File

@ -84,7 +84,7 @@ public:
#if !EFI_UNIT_TEST
private:
#endif // EFI_UNIT_TEST
AngleBasedEventOld m_event;
AngleBasedEventNew m_event;
HpfpQuantity m_quantity;
HpfpLobe m_lobe;

View File

@ -308,7 +308,7 @@ scheduling_s * EngineTestHelper::assertEvent5(const char *msg, int index, void *
return event;
}
AngleBasedEventBase * EngineTestHelper::assertTriggerEvent(const char *msg,
const AngleBasedEventBase * EngineTestHelper::assertTriggerEvent(const char *msg,
int index, AngleBasedEventBase *expected,
void *callback,
int triggerEventIndex, angle_t angleOffsetFromTriggerEvent) {
@ -324,6 +324,23 @@ AngleBasedEventBase * EngineTestHelper::assertTriggerEvent(const char *msg,
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 * actual = assertEvent5(msg, index, callback, expectedTimestamp);
return actual;

View File

@ -84,7 +84,8 @@ public:
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);
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 assertInjectorUpEvent(const char *msg, int eventIndex, efitimeus_t momentX, long injectorIndex);

View File

@ -14,15 +14,30 @@ TEST(Actuators, AuxValves) {
EngineTestHelper eth(NISSAN_PRIMERA);
engine->needTdcCallback = false;
// Engine must be "spinning" for scheduleByAngle to work
engine->rpmCalculator.setRpmValue(1000);
setupSimpleTestEngineWithMafAndTT_ONE_trigger(&eth, IM_SEQUENTIAL);
engineConfiguration->isInjectionEnabled = false;
eth.assertTriggerEvent("a0", 0, &engine->auxValves[0][0].open, (void*)&auxPlainPinTurnOn, 0);
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 */);
ASSERT_EQ( 100, round(Sensor::getOrZero(SensorType::Rpm))) << "spinning-RPM#1";
// Execute the first one, ensure scheduling for the "close" event happens
engine->module<TriggerScheduler>()->scheduleEventsUntilNextTriggerTooth(1000, 0, 0, 0, 1);
eth.assertTriggerEvent("a0", 0, &engine->auxValves[0][0].open, (void*)&auxPlainPinTurnOn, 7, 86);
eth.assertTriggerEvent("a1", 1, &engine->auxValves[0][1].open, (void*)&auxPlainPinTurnOn, 3, 86);
eth.assertTriggerEvent("a2", 2, &engine->auxValves[1][0].open, (void*)&auxPlainPinTurnOn, 5, 86);
// Old head should now be missing - we just ran it
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);
// 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);
}

View File

@ -272,22 +272,20 @@ TEST(HPFP, Schedule) {
hpfp.onFastCallback();
// First event was scheduled by setRpmValue with 0 injection mass. So, it's off.
eth.assertTriggerEvent("h0", 0, &hpfp.m_event, (void*)&HpfpController::pinTurnOff,
1, angle0 - 0);
eth.assertTriggerEvent("h0", 0, &hpfp.m_event, (void*)&HpfpController::pinTurnOff, 270);
// Make the previous event happen, schedule the next.
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
HpfpController::pinTurnOff(&hpfp);
// Now we should have a regular on/off event.
eth.assertTriggerEvent("h1", 0, &hpfp.m_event, (void*)&HpfpController::pinTurnOn,
2, angle1 - 180);
eth.assertTriggerEvent("h1", 0, &hpfp.m_event, (void*)&HpfpController::pinTurnOn, 450 - 37.6923065f);
// Make it happen
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
// struct.