From 3d096b2ac1f9e87e1306f7376b9076f50241860b Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 15 Jan 2023 08:26:08 -0500 Subject: [PATCH] totalFuel and totalIgnition correction gauges in Tunerstudio #4955 --- firmware/console/binary/live_data.cpp | 5 ----- firmware/controllers/algo/advance_map.cpp | 12 ++++++------ firmware/controllers/algo/engine.h | 3 +-- firmware/controllers/algo/engine2.cpp | 6 +++--- firmware/controllers/algo/ignition_state.txt | 8 +++++++- firmware/controllers/algo/timing_state.txt | 6 ------ .../controllers/engine_cycle/spark_logic.cpp | 18 +++++++++--------- firmware/integration/LiveData.yaml | 12 +++--------- .../tests/trigger/test_trigger_decoder.cpp | 4 ++-- 9 files changed, 31 insertions(+), 43 deletions(-) diff --git a/firmware/console/binary/live_data.cpp b/firmware/console/binary/live_data.cpp index d645e2dfd8..45d3d44d78 100644 --- a/firmware/console/binary/live_data.cpp +++ b/firmware/console/binary/live_data.cpp @@ -94,11 +94,6 @@ const engine_state_s* getLiveData(size_t) { return &engine->engineState; } -template<> -const timing_state_s* getLiveData(size_t) { - return &engine->timingState; -} - template<> const tps_accel_state_s* getLiveData(size_t) { return &engine->tpsAccelEnrichment; diff --git a/firmware/controllers/algo/advance_map.cpp b/firmware/controllers/algo/advance_map.cpp index 0fe3a40ca6..237601566c 100644 --- a/firmware/controllers/algo/advance_map.cpp +++ b/firmware/controllers/algo/advance_map.cpp @@ -109,9 +109,9 @@ static angle_t getAdvanceCorrections(float engineLoad) { auto iat = Sensor::get(SensorType::Iat); if (!iat) { - engine->timingState.timingIatCorrection = 0; + engine->ignitionState.timingIatCorrection = 0; } else { - engine->timingState.timingIatCorrection = interpolate3d( + engine->ignitionState.timingIatCorrection = interpolate3d( config->ignitionIatCorrTable, config->ignitionIatCorrLoadBins, engineLoad, config->ignitionIatCorrTempBins, iat.Value @@ -121,16 +121,16 @@ static angle_t getAdvanceCorrections(float engineLoad) { #if EFI_SHAFT_POSITION_INPUT && EFI_IDLE_CONTROL float instantRpm = engine->triggerCentral.instantRpm.getInstantRpm(); - engine->timingState.timingPidCorrection = engine->module()->getIdleTimingAdjustment(instantRpm); + engine->ignitionState.timingPidCorrection = engine->module()->getIdleTimingAdjustment(instantRpm); #endif // EFI_SHAFT_POSITION_INPUT && EFI_IDLE_CONTROL #if EFI_TUNER_STUDIO engine->outputChannels.multiSparkCounter = engine->engineState.multispark.count; #endif /* EFI_TUNER_STUDIO */ - return engine->timingState.timingIatCorrection - + engine->timingState.cltTimingCorrection - + engine->timingState.timingPidCorrection; + return engine->ignitionState.timingIatCorrection + + engine->ignitionState.cltTimingCorrection + + engine->ignitionState.timingPidCorrection; } /** diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index 27d78516fc..02946c5fc1 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -10,7 +10,6 @@ #include "global_shared.h" #include "engine_module.h" #include "engine_state.h" -#include "timing_state_generated.h" #include "rpm_calculator.h" #include "event_registry.h" #include "table_helper.h" @@ -271,7 +270,7 @@ public: void resetEngineSnifferIfInTestMode(); EngineState engineState; - timing_state_s timingState; + /** * idle blip is a development tool: alternator PID research for instance have benefited from a repetitive change of RPM */ diff --git a/firmware/controllers/algo/engine2.cpp b/firmware/controllers/algo/engine2.cpp index def37dd178..4d9c2faa3d 100644 --- a/firmware/controllers/algo/engine2.cpp +++ b/firmware/controllers/algo/engine2.cpp @@ -127,8 +127,8 @@ void EngineState::periodicFastCallback() { recalculateAuxValveTiming(); int rpm = Sensor::getOrZero(SensorType::Rpm); - engine->timingState.sparkDwell = engine->ignitionState.getSparkDwell(rpm); - engine->timingState.dwellAngle = cisnan(rpm) ? NAN : engine->timingState.sparkDwell / getOneDegreeTimeMs(rpm); + engine->ignitionState.sparkDwell = engine->ignitionState.getSparkDwell(rpm); + engine->ignitionState.dwellAngle = cisnan(rpm) ? NAN : engine->ignitionState.sparkDwell / getOneDegreeTimeMs(rpm); // todo: move this into slow callback, no reason for IAT corr to be here engine->fuelComputer.running.intakeTemperatureCoefficient = getIatFuelCorrection(); @@ -147,7 +147,7 @@ void EngineState::periodicFastCallback() { engine->fuelComputer.running.postCrankingFuelCorrection = 1.0f; } - engine->timingState.cltTimingCorrection = getCltTimingCorrection(); + engine->ignitionState.cltTimingCorrection = getCltTimingCorrection(); baroCorrection = getBaroCorrection(); diff --git a/firmware/controllers/algo/ignition_state.txt b/firmware/controllers/algo/ignition_state.txt index e13459e321..cbd7a933b4 100644 --- a/firmware/controllers/algo/ignition_state.txt +++ b/firmware/controllers/algo/ignition_state.txt @@ -1,6 +1,12 @@ struct_no_prefix ignition_state_s - float baseDwell + floatms_t sparkDwell;@@GAUGE_COIL_DWELL_TIME@@ + angle_t dwellAngle;ignition dwell duration\nas crankshaft angle\nNAN if engine is stopped\nSee also sparkDwell + int16_t autoscale cltTimingCorrection;;"deg",{1/@@PACK_MULT_PERCENT@@}, 0, -20, 20, 2 + int16_t autoscale timingIatCorrection;;"deg",{1/@@PACK_MULT_PERCENT@@}, 0, -20, 20, 2 + int16_t autoscale timingPidCorrection;;"deg",{1/@@PACK_MULT_PERCENT@@}, 0, -20, 20, 2 + + float dwellVoltageCorrection float luaTimingAdd; diff --git a/firmware/controllers/algo/timing_state.txt b/firmware/controllers/algo/timing_state.txt index 7649e985c4..23654dff7a 100644 --- a/firmware/controllers/algo/timing_state.txt +++ b/firmware/controllers/algo/timing_state.txt @@ -1,9 +1,3 @@ struct_no_prefix timing_state_s - ! spark-related - floatms_t sparkDwell;@@GAUGE_COIL_DWELL_TIME@@ - angle_t dwellAngle;ignition dwell duration\nas crankshaft angle\nNAN if engine is stopped\nSee also sparkDwell - int16_t autoscale cltTimingCorrection;;"deg",{1/@@PACK_MULT_PERCENT@@}, 0, -20, 20, 2 - int16_t autoscale timingIatCorrection;;"deg",{1/@@PACK_MULT_PERCENT@@}, 0, -20, 20, 2 - int16_t autoscale timingPidCorrection;;"deg",{1/@@PACK_MULT_PERCENT@@}, 0, -20, 20, 2 end_struct diff --git a/firmware/controllers/engine_cycle/spark_logic.cpp b/firmware/controllers/engine_cycle/spark_logic.cpp index 2d28cb3c84..84a5248f83 100644 --- a/firmware/controllers/engine_cycle/spark_logic.cpp +++ b/firmware/controllers/engine_cycle/spark_logic.cpp @@ -221,8 +221,8 @@ if (engineConfiguration->debugMode == DBG_DWELL_METRIC) { #endif /* EFI_UNIT_TEST */ // now that we've just fired a coil let's prepare the new schedule for the next engine revolution - angle_t dwellAngleDuration = engine->timingState.dwellAngle; - floatms_t sparkDwell = engine->timingState.sparkDwell; + angle_t dwellAngleDuration = engine->ignitionState.dwellAngle; + floatms_t sparkDwell = engine->ignitionState.sparkDwell; if (cisnan(dwellAngleDuration) || cisnan(sparkDwell)) { // we are here if engine has just stopped return; @@ -321,7 +321,7 @@ static void scheduleSparkEvent(bool limitedSpark, IgnitionEvent *event, int rpm, efitick_t edgeTimestamp, float currentPhase, float nextPhase) { angle_t sparkAngle = event->sparkAngle; - const floatms_t dwellMs = engine->timingState.sparkDwell; + const floatms_t dwellMs = engine->ignitionState.sparkDwell; if (cisnan(dwellMs) || dwellMs <= 0) { warning(CUSTOM_DWELL, "invalid dwell to handle: %.2f at %d", dwellMs, rpm); return; @@ -406,8 +406,8 @@ static void scheduleSparkEvent(bool limitedSpark, IgnitionEvent *event, void initializeIgnitionActions() { IgnitionEventList *list = &engine->ignitionEvents; - angle_t dwellAngle = engine->timingState.dwellAngle; - floatms_t sparkDwell = engine->timingState.sparkDwell; + angle_t dwellAngle = engine->ignitionState.dwellAngle; + floatms_t sparkDwell = engine->ignitionState.sparkDwell; if (cisnan(engine->engineState.timingAdvance[0]) || cisnan(dwellAngle)) { // error should already be reported // need to invalidate previous ignition schedule @@ -440,11 +440,11 @@ static void prepareIgnitionSchedule() { maxAllowedDwellAngle = getEngineCycle(operationMode) / engineConfiguration->specs.cylindersCount / 1.1; } - if (engine->timingState.dwellAngle == 0) { + if (engine->ignitionState.dwellAngle == 0) { warning(CUSTOM_ZERO_DWELL, "dwell is zero?"); } - if (engine->timingState.dwellAngle > maxAllowedDwellAngle) { - warning(CUSTOM_DWELL_TOO_LONG, "dwell angle too long: %.2f", engine->timingState.dwellAngle); + if (engine->ignitionState.dwellAngle > maxAllowedDwellAngle) { + warning(CUSTOM_DWELL_TOO_LONG, "dwell angle too long: %.2f", engine->ignitionState.dwellAngle); } // todo: add some check for dwell overflow? like 4 times 6 ms while engine cycle is less then that @@ -536,7 +536,7 @@ int getNumberOfSparks(ignition_mode_e mode) { * @see getInjectorDutyCycle */ percent_t getCoilDutyCycle(int rpm) { - floatms_t totalPerCycle = engine->timingState.sparkDwell * getNumberOfSparks(getCurrentIgnitionMode()); + floatms_t totalPerCycle = engine->ignitionState.sparkDwell * getNumberOfSparks(getCurrentIgnitionMode()); floatms_t engineCycleDuration = getCrankshaftRevolutionTimeMs(rpm) * (getEngineRotationState()->getOperationMode() == TWO_STROKE ? 1 : 2); return 100 * totalPerCycle / engineCycleDuration; } diff --git a/firmware/integration/LiveData.yaml b/firmware/integration/LiveData.yaml index a9f10842d8..f4eb3a30f5 100644 --- a/firmware/integration/LiveData.yaml +++ b/firmware/integration/LiveData.yaml @@ -26,11 +26,11 @@ Usages: prepend: integration/rusefi_config.txt constexpr: "engine->fuelComputer" - - name: timing_state - java: TimingState.java + - name: ignition_state + java: IgnitionState.java folder: controllers/algo prepend: integration/rusefi_config.txt - constexpr: "engine->timingState" + constexpr: "engine->ignitionState" - name: knock_controller java: KnockController.java @@ -124,12 +124,6 @@ Usages: folder: controllers/actuators output_name: idle - - name: ignition_state - java: IgnitionState.java - folder: controllers/algo - prepend: integration/rusefi_config.txt - constexpr: "engine->ignitionState" - - name: electronic_throttle java: ElectronicThrottle.java folder: controllers/actuators diff --git a/unit_tests/tests/trigger/test_trigger_decoder.cpp b/unit_tests/tests/trigger/test_trigger_decoder.cpp index 9b058e5a5c..d04b86bfa1 100644 --- a/unit_tests/tests/trigger/test_trigger_decoder.cpp +++ b/unit_tests/tests/trigger/test_trigger_decoder.cpp @@ -247,7 +247,7 @@ TEST(misc, testRpmCalculator) { eth.firePrimaryTriggerRise(); ASSERT_EQ(1500, Sensor::getOrZero(SensorType::Rpm)); - assertEqualsM("dwell", 4.5, engine->timingState.dwellAngle); + assertEqualsM("dwell", 4.5, engine->ignitionState.dwellAngle); assertEqualsM("fuel #2", 4.5450, engine->engineState.injectionDuration); assertEqualsM("one degree", 111.1111, engine->rpmCalculator.oneDegreeUs); ASSERT_EQ( 1, ilist->isReady) << "size #2"; @@ -296,7 +296,7 @@ TEST(misc, testRpmCalculator) { eth.fireRise(5); ASSERT_EQ( 4, engine->executor.size()) << "queue size 4.3"; - assertEqualsM("dwell", 4.5, eth.engine.timingState.dwellAngle); + assertEqualsM("dwell", 4.5, eth.engine.ignitionState.dwellAngle); assertEqualsM("fuel #3", 4.5450, eth.engine.engineState.injectionDuration); ASSERT_EQ(1500, Sensor::getOrZero(SensorType::Rpm));