From a6103dca5670189ed47309f78e8d0a63fe36528c Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 5 Oct 2023 22:58:18 -0400 Subject: [PATCH] tooth-event angle cannot be negative --- firmware/controllers/engine_cycle/aux_valves.cpp | 8 ++++++-- .../engine_cycle/high_pressure_fuel_pump.cpp | 2 ++ firmware/controllers/engine_cycle/spark_logic.cpp | 1 + .../controllers/system/timer/trigger_scheduler.cpp | 14 +++++++++----- .../controllers/system/timer/trigger_scheduler.h | 6 +++--- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/firmware/controllers/engine_cycle/aux_valves.cpp b/firmware/controllers/engine_cycle/aux_valves.cpp index 1d1ee73052..6398b59a9f 100644 --- a/firmware/controllers/engine_cycle/aux_valves.cpp +++ b/firmware/controllers/engine_cycle/aux_valves.cpp @@ -25,7 +25,9 @@ static void plainPinTurnOff(NamedOutputPin *output) { static void scheduleOpen(AuxActor *current) { - engine->module()->schedule(¤t->open, + engine->module()->schedule( + "aux-valve", + ¤t->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()->schedule(¤t->close, + engine->module()->schedule( + "aux-valve", + ¤t->close, current->extra + engine->engineState.auxValveEnd, { plainPinTurnOff, output } ); diff --git a/firmware/controllers/engine_cycle/high_pressure_fuel_pump.cpp b/firmware/controllers/engine_cycle/high_pressure_fuel_pump.cpp index 987171675c..e361e991a5 100644 --- a/firmware/controllers/engine_cycle/high_pressure_fuel_pump.cpp +++ b/firmware/controllers/engine_cycle/high_pressure_fuel_pump.cpp @@ -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()->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()->schedule( + "hpfp", &m_event, lobe, { pinTurnOff, this }); } diff --git a/firmware/controllers/engine_cycle/spark_logic.cpp b/firmware/controllers/engine_cycle/spark_logic.cpp index b9ec6e0d90..e9a2b8d50a 100644 --- a/firmware/controllers/engine_cycle/spark_logic.cpp +++ b/firmware/controllers/engine_cycle/spark_logic.cpp @@ -375,6 +375,7 @@ static void scheduleSparkEvent(bool limitedSpark, IgnitionEvent *event, assertAngleRange(sparkAngle, "findAngle#a5", ObdCode::CUSTOM_ERR_6549); bool scheduled = engine->module()->scheduleOrQueue( + "spark", &event->sparkEvent, edgeTimestamp, sparkAngle, { fireSparkAndPrepareNextSchedule, event }, currentPhase, nextPhase); diff --git a/firmware/controllers/system/timer/trigger_scheduler.cpp b/firmware/controllers/system/timer/trigger_scheduler.cpp index 922e4a354e..da4b03c064 100644 --- a/firmware/controllers/system/timer/trigger_scheduler.cpp +++ b/firmware/controllers/system/timer/trigger_scheduler.cpp @@ -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; { diff --git a/firmware/controllers/system/timer/trigger_scheduler.h b/firmware/controllers/system/timer/trigger_scheduler.h index d636d5d419..314c0d0161 100644 --- a/firmware/controllers/system/timer/trigger_scheduler.h +++ b/firmware/controllers/system/timer/trigger_scheduler.h @@ -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);