diff --git a/firmware/console/binary/live_data.cpp b/firmware/console/binary/live_data.cpp index f870f74b93..252dabdc18 100644 --- a/firmware/console/binary/live_data.cpp +++ b/firmware/console/binary/live_data.cpp @@ -180,6 +180,11 @@ const throttle_model_s* getLiveData(size_t) { #endif } +template<> +const lambda_monitor_s* getLiveData(size_t) { + return &engine->lambdaMonitor; +} + static const FragmentEntry fragments[] = { // This header is generated - do not edit by hand! #include "live_data_fragments.h" diff --git a/firmware/controllers/math/lambda_monitor.cpp b/firmware/controllers/math/lambda_monitor.cpp index 22dc0aa92c..e23336c533 100644 --- a/firmware/controllers/math/lambda_monitor.cpp +++ b/firmware/controllers/math/lambda_monitor.cpp @@ -13,23 +13,27 @@ float LambdaMonitor::getMaxAllowedLambda(float rpm, float load) const { } bool LambdaMonitorBase::isCut() const { - return m_isCut; + return lambdaMonitorCut; } void LambdaMonitorBase::update(float rpm, float load) { - if (isCurrentlyGood(rpm, load)) { + bool isGood = isCurrentlyGood(rpm, load); + lambdaCurrentlyGood = isGood; + if (isGood) { m_timeSinceGoodLambda.reset(); } + lambdaTimeSinceGood = m_timeSinceGoodLambda.getElapsedSeconds(); + if (m_timeSinceGoodLambda.hasElapsedSec(engineConfiguration->lambdaProtectionTimeout)) { // Things have been bad long enough, cut! - m_isCut = true; + lambdaMonitorCut = true; } - if (m_isCut) { + if (lambdaMonitorCut) { // If things are back to normal, cancel the cut and force a reset if (restoreConditionsMet(rpm, load)) { - m_isCut = false; + lambdaMonitorCut = false; m_timeSinceGoodLambda.reset(); } } diff --git a/firmware/controllers/math/lambda_monitor.h b/firmware/controllers/math/lambda_monitor.h index fdaea8638e..936da4824a 100644 --- a/firmware/controllers/math/lambda_monitor.h +++ b/firmware/controllers/math/lambda_monitor.h @@ -1,6 +1,8 @@ #pragma once -struct LambdaMonitorBase { +#include "lambda_monitor_generated.h" + +struct LambdaMonitorBase : public lambda_monitor_s { void update(float rpm, float load); bool isCut() const; @@ -19,7 +21,6 @@ protected: private: Timer m_timeSinceGoodLambda; - bool m_isCut = false; }; class LambdaMonitor : public LambdaMonitorBase { diff --git a/firmware/controllers/math/lambda_monitor.txt b/firmware/controllers/math/lambda_monitor.txt new file mode 100644 index 0000000000..c2848e016b --- /dev/null +++ b/firmware/controllers/math/lambda_monitor.txt @@ -0,0 +1,5 @@ +struct_no_prefix lambda_monitor_s + bit lambdaCurrentlyGood + bit lambdaMonitorCut + uint16_t autoscale lambdaTimeSinceGood;;"sec", 0.01, 0, 0, 1, 2 +end_struct diff --git a/firmware/integration/LiveData.yaml b/firmware/integration/LiveData.yaml index d494fb9587..0df1c1ae67 100644 --- a/firmware/integration/LiveData.yaml +++ b/firmware/integration/LiveData.yaml @@ -176,3 +176,8 @@ Usages: - name: vvt java: VvtState.java folder: controllers/actuators + + - name: lambda_monitor + java: LambdaMonitor.java + folder: controllers/math + constexpr: "___engine.lambdaMonitor"