From a95756b068feb85185b562138f2fdf44c55d890c Mon Sep 17 00:00:00 2001 From: rusEfi Date: Mon, 3 Nov 2014 12:03:03 -0600 Subject: [PATCH] auto-sync --- firmware/controllers/algo/fuel_math.cpp | 15 ++++++++++--- firmware/controllers/algo/fuel_math.h | 2 +- .../controllers/trigger/rpm_calculator.cpp | 21 +++++++++++++++++-- firmware/controllers/trigger/rpm_calculator.h | 11 +++++++++- .../{analog_chart.c => analog_chart.cpp} | 4 ++-- firmware/emulation/emulation.mk | 2 +- unit_tests/test_fuel_map.cpp | 9 ++++---- 7 files changed, 50 insertions(+), 14 deletions(-) rename firmware/emulation/{analog_chart.c => analog_chart.cpp} (98%) diff --git a/firmware/controllers/algo/fuel_math.cpp b/firmware/controllers/algo/fuel_math.cpp index 551064e823..2a84f7a209 100644 --- a/firmware/controllers/algo/fuel_math.cpp +++ b/firmware/controllers/algo/fuel_math.cpp @@ -155,14 +155,23 @@ float getBaseTableFuel(engine_configuration_s *engineConfiguration, int rpm, flo * @return Duration of fuel injection while craning, in milliseconds */ float getCrankingFuel(Engine *engine) { - return getStartingFuel(engine->engineConfiguration, getCoolantTemperature(engine)); + return getCrankingFuel3(engine->engineConfiguration, getCoolantTemperature(engine), + engine->rpmCalculator->getRevolutionCounterSinceStart() + ); } -float getStartingFuel(engine_configuration_s *engineConfiguration, float coolantTemperature) { +float getCrankingFuel3(engine_configuration_s *engineConfiguration, float coolantTemperature, + uint32_t revolutionCounterSinceStart) { // these magic constants are in Celsius float baseCrankingFuel = engineConfiguration->crankingSettings.baseCrankingFuel; if (cisnan(coolantTemperature)) return baseCrankingFuel; + float durationCoef = interpolate2d(revolutionCounterSinceStart, + engineConfiguration->crankingCycleBins, + engineConfiguration->crankingCycleCoef, CRANKING_CURVE_SIZE); + return interpolate2d(coolantTemperature, engineConfiguration->crankingFuelBins, - engineConfiguration->crankingFuelCoef, CRANKING_CURVE_SIZE) * baseCrankingFuel; + engineConfiguration->crankingFuelCoef, CRANKING_CURVE_SIZE) + * baseCrankingFuel + * durationCoef; } diff --git a/firmware/controllers/algo/fuel_math.h b/firmware/controllers/algo/fuel_math.h index 387a026d6b..c9865f7376 100644 --- a/firmware/controllers/algo/fuel_math.h +++ b/firmware/controllers/algo/fuel_math.h @@ -19,7 +19,7 @@ float getInjectorLag(engine_configuration_s *engineConfiguration, float vBatt); float getCltCorrection(engine_configuration_s *engineConfiguration, float clt); float getRunningFuel(float baseFuel, Engine *engine, int rpm); float getCrankingFuel(Engine *engine); -float getStartingFuel(engine_configuration_s *engineConfiguration, float coolantTemperature); +float getCrankingFuel3(engine_configuration_s *engineConfiguration, float coolantTemperature, uint32_t revolutionCounterSinceStart); float getFuelMs(int rpm, Engine *engine); #endif /* FUEL_MAP_H_ */ diff --git a/firmware/controllers/trigger/rpm_calculator.cpp b/firmware/controllers/trigger/rpm_calculator.cpp index 3587b39c89..673490e285 100644 --- a/firmware/controllers/trigger/rpm_calculator.cpp +++ b/firmware/controllers/trigger/rpm_calculator.cpp @@ -64,6 +64,8 @@ RpmCalculator::RpmCalculator() { // we need this initial to have not_running at first invocation lastRpmEventTimeUs = (uint64_t) -10 * US_PER_SECOND; + revolutionCounterSinceStart = 0; + revolutionCounterSinceBoot = 0; } /** @@ -74,6 +76,20 @@ bool RpmCalculator::isRunning(void) { return nowUs - lastRpmEventTimeUs < US_PER_SECOND; } +void RpmCalculator::onNewEngineCycle() { + revolutionCounterSinceBoot++; + revolutionCounterSinceStart++; +} + +uint32_t RpmCalculator::getRevolutionCounter(void) { + return revolutionCounterSinceBoot; +} + +uint32_t RpmCalculator::getRevolutionCounterSinceStart(void) { + return revolutionCounterSinceStart; +} + + // todo: migrate to float return result or add a float verion? this would have with calculations // todo: add a version which does not check time & saves time? need to profile int RpmCalculator::rpm(void) { @@ -82,6 +98,7 @@ int RpmCalculator::rpm(void) { return mockRpm; #endif if (!isRunning()) { + revolutionCounterSinceStart = 0; return 0; } return rpmValue; @@ -122,7 +139,7 @@ void rpmShaftPositionCallback(trigger_event_e ckpSignalType, uint32_t index, Rpm #endif return; } - rpmState->revolutionCounter++; + rpmState->onNewEngineCycle(); bool hadRpmRecently = rpmState->isRunning(); @@ -186,7 +203,7 @@ uint64_t getLastRpmEventTime(void) { } int getRevolutionCounter(void) { - return rpmState.revolutionCounter; + return rpmState.getRevolutionCounter(); } /** diff --git a/firmware/controllers/trigger/rpm_calculator.h b/firmware/controllers/trigger/rpm_calculator.h index 20bc5b335d..518666ec95 100644 --- a/firmware/controllers/trigger/rpm_calculator.h +++ b/firmware/controllers/trigger/rpm_calculator.h @@ -28,14 +28,23 @@ public: int mockRpm; #endif RpmCalculator(); + bool isRunning(void); int rpm(void); + void onNewEngineCycle(); + uint32_t getRevolutionCounter(void); + uint32_t getRevolutionCounterSinceStart(void); volatile int rpmValue; volatile uint64_t lastRpmEventTimeUs; +private: /** * This counter is incremented with each revolution of one of the shafts. Could be * crankshaft could be camshaft. */ - volatile int revolutionCounter;bool isRunning(void); + volatile uint32_t revolutionCounterSinceBoot; + /** + * Same as the above, but since the engine started spinning + */ + volatile uint32_t revolutionCounterSinceStart; }; #define getRpm() getRpmE(&engine) diff --git a/firmware/emulation/analog_chart.c b/firmware/emulation/analog_chart.cpp similarity index 98% rename from firmware/emulation/analog_chart.c rename to firmware/emulation/analog_chart.cpp index 16bc6cf098..1c331843eb 100644 --- a/firmware/emulation/analog_chart.c +++ b/firmware/emulation/analog_chart.cpp @@ -1,13 +1,13 @@ /** - * @file analog_chart.c + * @file analog_chart.cpp * * @date Dec 20, 2013 * @author Andrey Belomutskiy, (c) 2012-2014 */ #include "main.h" -#include "rpm_calculator.h" #include "analog_chart.h" +#include "rpm_calculator.h" #include "status_loop.h" #include "engine_configuration.h" diff --git a/firmware/emulation/emulation.mk b/firmware/emulation/emulation.mk index 187a828040..5c28f0ba1e 100644 --- a/firmware/emulation/emulation.mk +++ b/firmware/emulation/emulation.mk @@ -1,10 +1,10 @@ EMULATIONSRC = emulation/hw_layer/poten.c \ - emulation/analog_chart.c \ emulation/test/test.c \ emulation/test/testbmk.c EMULATIONSRC_CPP = emulation/trigger_emulator.cpp \ + emulation/analog_chart.cpp \ emulation/rfi_perftest.cpp \ emulation/engine_emulator.cpp \ emulation/wave_analyzer.cpp diff --git a/unit_tests/test_fuel_map.cpp b/unit_tests/test_fuel_map.cpp index 96cf17f601..eda22b9241 100644 --- a/unit_tests/test_fuel_map.cpp +++ b/unit_tests/test_fuel_map.cpp @@ -94,10 +94,11 @@ void testFuelMap(void) { printf("*************************************************** getStartingFuel\r\n"); // NAN in case we have issues with the CLT sensor - assertEqualsM("getStartingFuel nan", 4, getStartingFuel(engineConfiguration, NAN)); - assertEqualsM("getStartingFuel#1", 11.8667, getStartingFuel(engineConfiguration, 0)); - assertEqualsM("getStartingFuel#2", 10.2400, getStartingFuel(engineConfiguration, 8)); - assertEqualsM("getStartingFuel#3", 5.6000, getStartingFuel(engineConfiguration, 70)); + assertEqualsM("getStartingFuel nan", 4, getCrankingFuel3(engineConfiguration, NAN, 0)); + assertEqualsM("getStartingFuel#1", 23.7333, getCrankingFuel3(engineConfiguration, 0, 4)); + assertEqualsM("getStartingFuel#2", 18.0419, getCrankingFuel3(engineConfiguration, 8, 15)); + assertEqualsM("getStartingFuel#3", 11.2000, getCrankingFuel3(engineConfiguration, 70, 0)); + assertEqualsM("getStartingFuel#3", 5.6000, getCrankingFuel3(engineConfiguration, 70, 50)); } extern engine_configuration_s *engineConfiguration;