tooth-event angle cannot be negative

This commit is contained in:
Andrey 2023-10-05 22:58:18 -04:00 committed by rusefillc
parent d9b00d8124
commit a6103dca56
5 changed files with 21 additions and 10 deletions

View File

@ -25,7 +25,9 @@ static void plainPinTurnOff(NamedOutputPin *output) {
static void scheduleOpen(AuxActor *current) {
engine->module<TriggerScheduler>()->schedule(&current->open,
engine->module<TriggerScheduler>()->schedule(
"aux-valve",
&current->open,
current->extra + engine->engineState.auxValveStart,
{ auxPlainPinTurnOn, current }
);
@ -41,7 +43,9 @@ void auxPlainPinTurnOn(AuxActor *current) {
fixAngle(duration, "duration", ObdCode::CUSTOM_ERR_6557);
engine->module<TriggerScheduler>()->schedule(&current->close,
engine->module<TriggerScheduler>()->schedule(
"aux-valve",
&current->close,
current->extra + engine->engineState.auxValveEnd,
{ plainPinTurnOff, output }
);

View File

@ -224,6 +224,7 @@ void HpfpController::scheduleNextCycle() {
* We are good to use just one m_event instance because new events are scheduled when we turn off valve.
*/
engine->module<TriggerScheduler>()->schedule(
"hpfp",
&m_event,
di_nextStart,
{ pinTurnOn, this });
@ -235,6 +236,7 @@ void HpfpController::scheduleNextCycle() {
// will schedule the next lobe.
// todo: would it have been cleaner to schedule 'scheduleNextCycle' directly?
engine->module<TriggerScheduler>()->schedule(
"hpfp",
&m_event, lobe,
{ pinTurnOff, this });
}

View File

@ -375,6 +375,7 @@ static void scheduleSparkEvent(bool limitedSpark, IgnitionEvent *event,
assertAngleRange(sparkAngle, "findAngle#a5", ObdCode::CUSTOM_ERR_6549);
bool scheduled = engine->module<TriggerScheduler>()->scheduleOrQueue(
"spark",
&event->sparkEvent, edgeTimestamp, sparkAngle,
{ fireSparkAndPrepareNextSchedule, event },
currentPhase, nextPhase);

View File

@ -6,10 +6,10 @@ bool TriggerScheduler::assertNotInList(AngleBasedEvent *head, AngleBasedEvent *e
assertNotInListMethodBody(head, element, nextToothEvent)
}
void TriggerScheduler::schedule(AngleBasedEvent* event, angle_t angle, action_s action) {
void TriggerScheduler::schedule(const char *msg, AngleBasedEvent* event, angle_t angle, action_s action) {
event->setAngle(angle);
schedule(event, action);
schedule(msg, event, action);
}
/**
@ -18,7 +18,7 @@ void TriggerScheduler::schedule(AngleBasedEvent* event, angle_t angle, action_s
* @return true if event corresponds to current tooth and was time-based scheduler
* false if event was put into queue for scheduling at a later tooth
*/
bool TriggerScheduler::scheduleOrQueue(AngleBasedEvent *event,
bool TriggerScheduler::scheduleOrQueue(const char *msg, AngleBasedEvent *event,
efitick_t edgeTimestamp,
angle_t angle,
action_s action,
@ -38,13 +38,17 @@ bool TriggerScheduler::scheduleOrQueue(AngleBasedEvent *event,
return true;
} else {
// If not due now, add it to the queue to be scheduled later
schedule(event, action);
schedule(msg, event, action);
return false;
}
}
void TriggerScheduler::schedule(AngleBasedEvent* event, action_s action) {
void TriggerScheduler::schedule(const char *msg, AngleBasedEvent* event, action_s action) {
if (event->enginePhase < 0) {
criticalError("Negative angle %s %f", msg, event->enginePhase);
}
event->action = action;
{

View File

@ -6,10 +6,10 @@ class TriggerScheduler : public EngineModule {
public:
// *kludge* we have three methods with *schedule* in the name meaning three different things
// this method just places event into the collection of tooth-based events
void schedule(AngleBasedEvent* event, angle_t angle, action_s action);
void schedule(const char *msg, AngleBasedEvent* event, angle_t angle, action_s action);
// 'schedule' means 'delegates to time-based scheduler' and 'queue' here matches the 'schedule' method above
bool scheduleOrQueue(AngleBasedEvent *event,
bool scheduleOrQueue(const char *msg, AngleBasedEvent *event,
efitick_t edgeTimestamp,
angle_t angle,
action_s action,
@ -25,7 +25,7 @@ public:
#endif // EFI_UNIT_TEST
private:
void schedule(AngleBasedEvent* event, action_s action);
void schedule(const char *msg, AngleBasedEvent* event, action_s action);
bool assertNotInList(AngleBasedEvent *head, AngleBasedEvent *element);