From 06060dc43b7c2f7e3c82e119aab236d7af40cb85 Mon Sep 17 00:00:00 2001 From: rusefillc Date: Tue, 10 Aug 2021 06:42:39 -0400 Subject: [PATCH] Implement auto knock threshold sampling #3033 --- .../controllers/engine_cycle/spark_logic.cpp | 2 +- firmware/controllers/sensors/software_knock.cpp | 17 ++++++++++++++++- firmware/controllers/sensors/software_knock.h | 3 ++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/firmware/controllers/engine_cycle/spark_logic.cpp b/firmware/controllers/engine_cycle/spark_logic.cpp index 02001940e1..6cb305e06f 100644 --- a/firmware/controllers/engine_cycle/spark_logic.cpp +++ b/firmware/controllers/engine_cycle/spark_logic.cpp @@ -216,7 +216,7 @@ if (engineConfiguration->debugMode == DBG_DWELL_METRIC) { } #if EFI_SOFTWARE_KNOCK - startKnockSampling(event->cylinderNumber); + knockSamplingCallback(event->cylinderNumber, nowNt); #endif #if EFI_HIP_9011 hip9011_onFireEvent(event->cylinderNumber, nowNt); diff --git a/firmware/controllers/sensors/software_knock.cpp b/firmware/controllers/sensors/software_knock.cpp index 069ceaef6e..fc0b3e3bbd 100644 --- a/firmware/controllers/sensors/software_knock.cpp +++ b/firmware/controllers/sensors/software_knock.cpp @@ -19,6 +19,7 @@ static Biquad knockFilter; static volatile bool knockIsSampling = false; static volatile bool knockNeedsProcess = false; static volatile size_t sampleCount = 0; +static int cylinderIndexCopy; chibios_rt::BinarySemaphore knockSem(/* taken =*/ true); @@ -105,7 +106,7 @@ const ADCConversionGroup* getConversionGroup(uint8_t cylinderIndex) { return &adcConvGroupCh1; } -void startKnockSampling(uint8_t cylinderIndex) { +static void startKnockSampling(uint8_t cylinderIndex) { if (!CONFIG(enableSoftwareKnock)) { return; } @@ -141,6 +142,20 @@ void startKnockSampling(uint8_t cylinderIndex) { lastKnockSampleTime = getTimeNowNt(); } +static void startKnockSamplingNoParam(void *arg) { + // ugly as hell but that's error: cast between incompatible function types from 'void (*)(uint8_t)' {aka 'void (*)(unsigned char)'} to 'schfunc_t' {aka 'void (*)(void*)'} [-Werror=cast-function-type] + startKnockSampling(cylinderIndexCopy); +} + +static scheduling_s startSampling; + +void knockSamplingCallback(uint8_t cylinderIndex, efitick_t nowNt) { + cylinderIndexCopy = cylinderIndex; + + scheduleByAngle(&startSampling, nowNt, + /*angle*/CONFIG(knockDetectionWindowStart), startKnockSamplingNoParam PASS_ENGINE_PARAMETER_SUFFIX); +} + class KnockThread : public ThreadController<256> { public: KnockThread() : ThreadController("knock", PRIO_KNOCK_PROCESS) {} diff --git a/firmware/controllers/sensors/software_knock.h b/firmware/controllers/sensors/software_knock.h index 1fdd0e4fce..472798822d 100644 --- a/firmware/controllers/sensors/software_knock.h +++ b/firmware/controllers/sensors/software_knock.h @@ -1,7 +1,8 @@ #pragma once +#include "pch.h" #include void initSoftwareKnock(); -void startKnockSampling(uint8_t cylinderIndex); +void knockSamplingCallback(uint8_t cylinderIndex, efitick_t nowNt); void processLastKnockEvent();