From bb2208fb52e6746b5f1b6adc01d72d9a6bd27f4c Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Thu, 3 Dec 2020 10:13:45 -0600 Subject: [PATCH] add timer since last trigger tooth (#2004) * add elapsed time to timer * store trigger time * fsio method * don't do a 64b divide Co-authored-by: Matthew Kennedy --- firmware/controllers/core/fsio_impl.cpp | 2 ++ firmware/controllers/trigger/trigger_central.cpp | 2 ++ firmware/controllers/trigger/trigger_central.h | 8 ++++++++ firmware/util/timer.cpp | 16 ++++++++++++++++ firmware/util/timer.h | 9 +++++++++ 5 files changed, 37 insertions(+) diff --git a/firmware/controllers/core/fsio_impl.cpp b/firmware/controllers/core/fsio_impl.cpp index 9d11357b38..6b9b193ac7 100644 --- a/firmware/controllers/core/fsio_impl.cpp +++ b/firmware/controllers/core/fsio_impl.cpp @@ -71,6 +71,7 @@ static LENameOrdinalPair leExhaustVVT(LE_METHOD_EXHAUST_VVT, "evvt"); static LENameOrdinalPair leCrankingRpm(LE_METHOD_CRANKING_RPM, "cranking_rpm"); static LENameOrdinalPair leStartupFuelPumpDuration(LE_METHOD_STARTUP_FUEL_PUMP_DURATION, "startup_fuel_pump_duration"); static LENameOrdinalPair leInShutdown(LE_METHOD_IN_SHUTDOWN, "in_shutdown"); +static LENameOrdinalPair leTimeSinceTrigger(LE_METHOD_TIME_SINCE_TRIGGER_EVENT, "time_since_trigger"); #include "fsio_names.def" @@ -140,6 +141,7 @@ FsioValue getEngineValue(le_action_e action DECLARE_ENGINE_PARAMETER_SUFFIX) { return engine->triggerCentral.getVVTPosition(); #endif case LE_METHOD_TIME_SINCE_TRIGGER_EVENT: + return engine->triggerCentral.getTimeSinceTriggerEvent(); case LE_METHOD_TIME_SINCE_BOOT: #if EFI_MAIN_RELAY_CONTROL // in main relay control mode, we return the number of seconds since the ignition is turned on diff --git a/firmware/controllers/trigger/trigger_central.cpp b/firmware/controllers/trigger/trigger_central.cpp index 147f77ada1..ed2aa217af 100644 --- a/firmware/controllers/trigger/trigger_central.cpp +++ b/firmware/controllers/trigger/trigger_central.cpp @@ -426,6 +426,8 @@ void TriggerCentral::handleShaftSignal(trigger_event_e signal, efitick_t timesta engine->onTriggerSignalEvent(timestamp); + m_lastEventTimer.reset(timestamp); + int eventIndex = (int) signal; efiAssertVoid(CUSTOM_TRIGGER_EVENT_TYPE, eventIndex >= 0 && eventIndex < HW_EVENT_TYPES, "signal type"); hwEventCounters[eventIndex]++; diff --git a/firmware/controllers/trigger/trigger_central.h b/firmware/controllers/trigger/trigger_central.h index ad4c79d6e8..20d2107a6e 100644 --- a/firmware/controllers/trigger/trigger_central.h +++ b/firmware/controllers/trigger/trigger_central.h @@ -11,6 +11,7 @@ #include "listener_array.h" #include "trigger_decoder.h" #include "trigger_central_generated.h" +#include "timer.h" class Engine; typedef void (*ShaftPositionListener)(trigger_event_e signal, uint32_t index, efitick_t edgeTimestamp DECLARE_ENGINE_PARAMETER_SUFFIX); @@ -43,6 +44,10 @@ public: void resetCounters(); void validateCamVvtCounters(); + float getTimeSinceTriggerEvent() const { + return m_lastEventTimer.getElapsedSeconds(); + } + TriggerNoiseFilter noiseFilter; trigger_type_e vvtTriggerType; @@ -67,6 +72,9 @@ public: TriggerWaveform vvtShape; TriggerFormDetails triggerFormDetails; + + // Keep track of the last time we got a valid trigger event + Timer m_lastEventTimer; }; void triggerInfo(void); diff --git a/firmware/util/timer.cpp b/firmware/util/timer.cpp index 20601bc111..93f6844592 100644 --- a/firmware/util/timer.cpp +++ b/firmware/util/timer.cpp @@ -5,6 +5,10 @@ void Timer::reset() { m_lastReset = getTimeNowNt(); } +void Timer::reset(efitick_t nowNt) { + m_lastReset = nowNt; +} + bool Timer::hasElapsedSec(float seconds) const { return hasElapsedMs(seconds * 1e3); } @@ -25,3 +29,15 @@ bool Timer::hasElapsedUs(float microseconds) const { return delta32 > USF2NT(microseconds); } + +float Timer::getElapsedSeconds() const { + auto delta = getTimeNowNt() - m_lastReset; + + if (delta > UINT32_MAX - 1) { + delta = UINT32_MAX - 1; + } + + auto delta32 = (uint32_t)delta; + + return NT2US(delta32); +} diff --git a/firmware/util/timer.h b/firmware/util/timer.h index fd45e2d3c1..719f71466d 100644 --- a/firmware/util/timer.h +++ b/firmware/util/timer.h @@ -5,10 +5,19 @@ class Timer { public: void reset(); + + // Reset the timer to a known timestamp (don't take a timestamp internally) + void reset(efitick_t nowNt); + bool hasElapsedSec(float seconds) const; bool hasElapsedMs(float ms) const; bool hasElapsedUs(float us) const; + // Return the elapsed time since the last reset. + // If the elapsed time is longer than 2^32 timer tick counts, + // then a time period representing 2^32 counts will be returned. + float getElapsedSeconds() const; + private: efitick_t m_lastReset = INT64_MIN; };