From 6a10aceb16b7dd7eab41facb62bf85d0a3d71661 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Mon, 5 Aug 2024 21:42:32 -0700 Subject: [PATCH] log map averaging duration --- firmware/controllers/algo/engine_state.h | 5 +---- firmware/controllers/algo/engine_state.txt | 2 ++ .../controllers/engine_cycle/map_averaging.cpp | 17 +++++++++++++---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/firmware/controllers/algo/engine_state.h b/firmware/controllers/algo/engine_state.h index 82ff9355fe..5235be96dd 100644 --- a/firmware/controllers/algo/engine_state.h +++ b/firmware/controllers/algo/engine_state.h @@ -48,11 +48,8 @@ public: * MAP averaging angle start, in relation to 'mapAveragingSchedulingAtIndex' trigger index index */ angle_t mapAveragingStart[MAX_CYLINDER_COUNT]; - angle_t mapAveragingDuration = 0; - /** - * timing advance is angle distance before Top Dead Center (TDP), i.e. "10 degree timing advance" means "happens 10 degrees before TDC" - */ + // degrees timing advance - 10 means fire spark 10 degrees BTDC angle_t timingAdvance[MAX_CYLINDER_COUNT] = {0}; // Angle between firing the main (primary) spark and the secondary (trailing) spark diff --git a/firmware/controllers/algo/engine_state.txt b/firmware/controllers/algo/engine_state.txt index 69a50d4d42..2da0bbb7be 100644 --- a/firmware/controllers/algo/engine_state.txt +++ b/firmware/controllers/algo/engine_state.txt @@ -54,5 +54,7 @@ struct_no_prefix engine_state_s uint16_t autoscale veTableYAxis;;"%",{1/100}, 0, 0, 0, 0 + uint16_t autoscale mapAveragingDuration;;"deg", 0.01, 0, 0, 0, 0 + ! engine_state_s end_struct diff --git a/firmware/controllers/engine_cycle/map_averaging.cpp b/firmware/controllers/engine_cycle/map_averaging.cpp index bd5451c9bd..38171076d0 100644 --- a/firmware/controllers/engine_cycle/map_averaging.cpp +++ b/firmware/controllers/engine_cycle/map_averaging.cpp @@ -65,13 +65,19 @@ static size_t currentMapAverager = 0; static void startAveraging(sampler* s) { efiAssertVoid(ObdCode::CUSTOM_ERR_6649, getCurrentRemainingStack() > 128, "lowstck#9"); + float duration = engine->engineState.mapAveragingDuration; + if (duration == 0) { + // Zero duration means the engine wasn't spinning or something, abort + return; + } + // TODO: set currentMapAverager based on cylinder bank auto& averager = getMapAvg(currentMapAverager); averager.start(); mapAveragingPin.setHigh(); - scheduleByAngle(&s->endTimer, getTimeNowNt(), engine->engineState.mapAveragingDuration, + scheduleByAngle(&s->endTimer, getTimeNowNt(), duration, { endAveraging, &averager }); } @@ -171,6 +177,7 @@ void refreshMapAveragingPreCalc() { if (isValidRpm(rpm)) { MAP_sensor_config_s * c = &engineConfiguration->map; angle_t start = interpolate2d(rpm, c->samplingAngleBins, c->samplingAngle); + angle_t duration = interpolate2d(rpm, c->samplingWindowBins, c->samplingWindow); efiAssertVoid(ObdCode::CUSTOM_ERR_MAP_START_ASSERT, !std::isnan(start), "start"); angle_t offsetAngle = engine->triggerCentral.triggerFormDetails.eventAngles[engineConfiguration->mapAveragingSchedulingAtIndex]; @@ -186,12 +193,14 @@ void refreshMapAveragingPreCalc() { wrapAngle(cylinderStart, "cylinderStart", ObdCode::CUSTOM_ERR_6562); engine->engineState.mapAveragingStart[i] = cylinderStart; } - engine->engineState.mapAveragingDuration = interpolate2d(rpm, c->samplingWindowBins, c->samplingWindow); + + engine->engineState.mapAveragingDuration = duration; } else { for (size_t i = 0; i < engineConfiguration->cylindersCount; i++) { - engine->engineState.mapAveragingStart[i] = NAN; + engine->engineState.mapAveragingStart[i] = 0; } - engine->engineState.mapAveragingDuration = NAN; + + engine->engineState.mapAveragingDuration = 0; } }