diff --git a/firmware/controllers/algo/engine.cpp b/firmware/controllers/algo/engine.cpp index 9e7b10e6cf..beda937a0b 100644 --- a/firmware/controllers/algo/engine.cpp +++ b/firmware/controllers/algo/engine.cpp @@ -54,10 +54,8 @@ FsioState::FsioState() { void Engine::eInitializeTriggerShape(Logging *logger DECLARE_ENGINE_PARAMETER_SUFFIX) { #if EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT -#if !EFI_UNIT_TEST // we have a confusing threading model so some synchronization would not hurt bool alreadyLocked = lockAnyContext(); -#endif /* EFI_UNIT_TEST */ TRIGGER_SHAPE(initializeTriggerShape(logger, engineConfiguration->ambiguousOperationMode, @@ -87,11 +85,9 @@ void Engine::eInitializeTriggerShape(Logging *logger DECLARE_ENGINE_PARAMETER_SU engine->engineCycleEventCount = TRIGGER_SHAPE(getLength()); } -#if !EFI_UNIT_TEST if (!alreadyLocked) { unlockAnyContext(); } -#endif /* EFI_UNIT_TEST */ if (!TRIGGER_SHAPE(shapeDefinitionError)) { prepareOutputSignals(PASS_ENGINE_PARAMETER_SIGNATURE); diff --git a/firmware/controllers/algo/engine2.cpp b/firmware/controllers/algo/engine2.cpp index d92377b486..3e9bf728a9 100644 --- a/firmware/controllers/algo/engine2.cpp +++ b/firmware/controllers/algo/engine2.cpp @@ -227,9 +227,7 @@ void EngineState::periodicFastCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) { void EngineState::updateTChargeK(int rpm, float tps DECLARE_ENGINE_PARAMETER_SUFFIX) { #if EFI_ENGINE_CONTROL - float coolantC = ENGINE(sensors.clt); - float intakeC = ENGINE(sensors.iat); - float newTCharge = getTCharge(rpm, tps, coolantC, intakeC PASS_ENGINE_PARAMETER_SUFFIX); + float newTCharge = getTCharge(rpm, tps, getCoolantTemperature(), getIntakeAirTemperature() PASS_ENGINE_PARAMETER_SUFFIX); // convert to microsecs and then to seconds efitick_t curTime = getTimeNowNt(); float secsPassed = (float)NT2US(curTime - timeSinceLastTChargeK) / 1000000.0f; diff --git a/firmware/controllers/algo/fuel_math.cpp b/firmware/controllers/algo/fuel_math.cpp index 76e40636c2..fe200e0fbf 100644 --- a/firmware/controllers/algo/fuel_math.cpp +++ b/firmware/controllers/algo/fuel_math.cpp @@ -73,12 +73,14 @@ DISPLAY(DISPLAY_IF(isCrankingState)) floatms_t getCrankingFuel3(float coolantTem DISPLAY_SENSOR(TPS); DISPLAY_TEXT(eol); - DISPLAY_TEXT(Cranking_fuel); - floatms_t crankingFuel = engine->engineState.DISPLAY_PREFIX(cranking).DISPLAY_FIELD(fuel) = baseCrankingFuel + floatms_t crankingFuel = baseCrankingFuel * engine->engineState.cranking.durationCoefficient * engine->engineState.cranking.coolantTemperatureCoefficient * engine->engineState.cranking.tpsCoefficient; + DISPLAY_TEXT(Cranking_fuel); + engine->engineState.DISPLAY_PREFIX(cranking).DISPLAY_FIELD(fuel) = crankingFuel; + if (crankingFuel <= 0) { warning(CUSTOM_ERR_ZERO_CRANKING_FUEL, "Cranking fuel value %f", crankingFuel); } diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index 8fab794066..aa16ea2376 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -92,6 +92,8 @@ #include "cj125.h" #endif /* EFI_CJ125 */ +EXTERN_ENGINE; + // this method is used by real firmware and simulator and unit test void mostCommonInitEngineController(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) { #if !EFI_UNIT_TEST @@ -114,6 +116,12 @@ void mostCommonInitEngineController(Logging *sharedLogger DECLARE_ENGINE_PARAMET initElectronicThrottle(PASS_ENGINE_PARAMETER_SIGNATURE); #endif /* EFI_ELECTRONIC_THROTTLE_BODY */ +#if EFI_MAP_AVERAGING + if (engineConfiguration->isMapAveragingEnabled) { + initMapAveraging(sharedLogger PASS_ENGINE_PARAMETER_SUFFIX); + } +#endif /* EFI_MAP_AVERAGING */ + } EXTERN_ENGINE; @@ -751,12 +759,6 @@ void initEngineContoller(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) initMalfunctionIndicator(); #endif /* EFI_MALFUNCTION_INDICATOR */ -#if EFI_MAP_AVERAGING - if (engineConfiguration->isMapAveragingEnabled) { - initMapAveraging(sharedLogger, engine); - } -#endif /* EFI_MAP_AVERAGING */ - initEgoAveraging(PASS_ENGINE_PARAMETER_SIGNATURE); #if EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT @@ -810,6 +812,6 @@ int getRusEfiVersion(void) { if (initBootloader() != 0) return 123; #endif /* EFI_BOOTLOADER_INCLUDE_CODE */ - return 20191009; + return 20191013; } #endif /* EFI_UNIT_TEST */ diff --git a/firmware/controllers/map_averaging.cpp b/firmware/controllers/map_averaging.cpp index b0284e5341..d754d7a403 100644 --- a/firmware/controllers/map_averaging.cpp +++ b/firmware/controllers/map_averaging.cpp @@ -111,15 +111,16 @@ static bool isAveraging = false; static void startAveraging(void *arg) { (void) arg; efiAssertVoid(CUSTOM_ERR_6649, getCurrentRemainingStack() > 128, "lowstck#9"); + bool wasLocked = lockAnyContext(); - ; // with locking we would have a consistent state mapAdcAccumulator = 0; mapMeasurementsCounter = 0; isAveraging = true; - if (!wasLocked) + if (!wasLocked) { unlockAnyContext(); - ; + } + mapAveragingPin.setHigh(); } @@ -177,7 +178,9 @@ void mapAveragingAdcCallback(adcsample_t adcValue) { static void endAveraging(void *arg) { (void) arg; +#if ! EFI_UNIT_TEST bool wasLocked = lockAnyContext(); +#endif isAveraging = false; // with locking we would have a consistent state #if HAL_USE_ADC @@ -198,13 +201,15 @@ static void endAveraging(void *arg) { warning(CUSTOM_UNEXPECTED_MAP_VALUE, "No MAP values"); } #endif +#if ! EFI_UNIT_TEST if (!wasLocked) unlockAnyContext(); ; +#endif mapAveragingPin.setLow(); } -static void applyMapMinBufferLength() { +static void applyMapMinBufferLength(DECLARE_ENGINE_PARAMETER_SIGNATURE) { // check range mapMinBufferLength = maxI(minI(CONFIGB(mapMinBufferLength), MAX_MAP_BUFFER_LENGTH), 1); // reset index @@ -215,14 +220,14 @@ static void applyMapMinBufferLength() { } } -void postMapState(TunerStudioOutputChannels *tsOutputChannels) { #if EFI_TUNER_STUDIO +void postMapState(TunerStudioOutputChannels *tsOutputChannels) { tsOutputChannels->debugFloatField1 = v_averagedMapValue; tsOutputChannels->debugFloatField2 = engine->engineState.mapAveragingDuration; tsOutputChannels->debugFloatField3 = currentPressure; tsOutputChannels->debugIntField1 = mapMeasurementsCounter; -#endif /* EFI_TUNER_STUDIO */ } +#endif /* EFI_TUNER_STUDIO */ void refreshMapAveragingPreCalc(DECLARE_ENGINE_PARAMETER_SIGNATURE) { int rpm = GET_RPM_VALUE; @@ -237,6 +242,9 @@ void refreshMapAveragingPreCalc(DECLARE_ENGINE_PARAMETER_SIGNATURE) { for (int i = 0; i < engineConfiguration->specs.cylindersCount; i++) { angle_t cylinderOffset = getEngineCycle(engine->getOperationMode(PASS_ENGINE_PARAMETER_SIGNATURE)) * i / engineConfiguration->specs.cylindersCount; efiAssertVoid(CUSTOM_ERR_6692, !cisnan(cylinderOffset), "cylinderOffset"); + // part of this formula related to specific cylinder offset is never changing - we can + // move the loop into start-up calculation and not have this loop as part of periodic calculation + // todo: change the logic as described above in order to reduce periodic CPU usage? float cylinderStart = start + cylinderOffset - offsetAngle + tdcPosition(); fixAngle(cylinderStart, "cylinderStart", CUSTOM_ERR_6562); engine->engineState.mapAveragingStart[i] = cylinderStart; @@ -272,7 +280,7 @@ static void mapAveragingTriggerCallback(trigger_event_e ckpEventType, } if (CONFIGB(mapMinBufferLength) != mapMinBufferLength) { - applyMapMinBufferLength(); + applyMapMinBufferLength(PASS_ENGINE_PARAMETER_SIGNATURE); } measurementsPerRevolution = measurementsPerRevolutionCounter; @@ -301,12 +309,14 @@ static void mapAveragingTriggerCallback(trigger_event_e ckpEventType, fixAngle(samplingEnd, "samplingEnd", CUSTOM_ERR_6563); // only if value is already prepared - int structIndex = engine->rpmCalculator.getRevolutionCounter() % 2; + int structIndex = getRevolutionCounter() % 2; + // at the moment we schedule based on time prediction based on current RPM and angle + // we are loosing precision in case of changing RPM - the further away is the event the worse is precision // todo: schedule this based on closest trigger event, same as ignition works scheduleByAngle(rpm, &startTimer[i][structIndex], samplingStart, - startAveraging, NULL, &engine->rpmCalculator); + startAveraging, NULL, &engine->rpmCalculator PASS_ENGINE_PARAMETER_SUFFIX); scheduleByAngle(rpm, &endTimer[i][structIndex], samplingEnd, - endAveraging, NULL, &engine->rpmCalculator); + endAveraging, NULL, &engine->rpmCalculator PASS_ENGINE_PARAMETER_SUFFIX); engine->m.mapAveragingCbTime = getTimeNowLowerNt() - engine->m.beforeMapAveragingCb; } @@ -338,7 +348,7 @@ float getMap(void) { } #endif /* EFI_PROD_CODE */ -void initMapAveraging(Logging *sharedLogger, Engine *engine) { +void initMapAveraging(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) { logger = sharedLogger; // startTimer[0].name = "map start0"; @@ -350,7 +360,7 @@ void initMapAveraging(Logging *sharedLogger, Engine *engine) { addTriggerEventListener(&mapAveragingTriggerCallback, "MAP averaging", engine); #endif /* EFI_SHAFT_POSITION_INPUT */ addConsoleAction("faststat", showMapStats); - applyMapMinBufferLength(); + applyMapMinBufferLength(PASS_ENGINE_PARAMETER_SIGNATURE); } #else diff --git a/firmware/controllers/map_averaging.h b/firmware/controllers/map_averaging.h index 08274f6296..6df7c1125b 100644 --- a/firmware/controllers/map_averaging.h +++ b/firmware/controllers/map_averaging.h @@ -16,9 +16,12 @@ void mapAveragingAdcCallback(adcsample_t newValue); #endif -void initMapAveraging(Logging *sharedLogger, Engine *engine); +void initMapAveraging(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX); void refreshMapAveragingPreCalc(DECLARE_ENGINE_PARAMETER_SIGNATURE); + +#if EFI_TUNER_STUDIO void postMapState(TunerStudioOutputChannels *tsOutputChannels); +#endif #endif /* EFI_MAP_AVERAGING */ diff --git a/firmware/controllers/obd2.cpp b/firmware/controllers/obd2.cpp index 65b4dfbf4b..86707408f8 100644 --- a/firmware/controllers/obd2.cpp +++ b/firmware/controllers/obd2.cpp @@ -37,7 +37,7 @@ #include "tps.h" #include "engine_math.h" #include "fuel_math.h" -#include "allsensors.h" +#include "thermistors.h" extern CANTxFrame txmsg; diff --git a/firmware/controllers/trigger/main_trigger_callback.cpp b/firmware/controllers/trigger/main_trigger_callback.cpp index 63dd496d95..f699375bdd 100644 --- a/firmware/controllers/trigger/main_trigger_callback.cpp +++ b/firmware/controllers/trigger/main_trigger_callback.cpp @@ -338,7 +338,7 @@ static ALWAYS_INLINE void handleFuelInjectionEvent(int injEventIndex, InjectionE static void fuelClosedLoopCorrection(DECLARE_ENGINE_PARAMETER_SIGNATURE) { #if ! EFI_UNIT_TEST if (GET_RPM_VALUE < CONFIG(fuelClosedLoopRpmThreshold) || - ENGINE(sensors.clt) < CONFIG(fuelClosedLoopCltThreshold) || + getCoolantTemperature() < CONFIG(fuelClosedLoopCltThreshold) || getTPS(PASS_ENGINE_PARAMETER_SIGNATURE) > CONFIG(fuelClosedLoopTpsThreshold) || ENGINE(sensors.currentAfr) < CONFIGB(fuelClosedLoopAfrLowThreshold) || ENGINE(sensors.currentAfr) > engineConfiguration->fuelClosedLoopAfrHighThreshold) { @@ -583,7 +583,7 @@ void startPrimeInjectionPulse(DECLARE_ENGINE_PARAMETER_SIGNATURE) { // If 'primeInjFalloffTemperature' is not specified (by default), we have a prime pulse deactivation at zero celsius degrees, which is okay. const float maxPrimeInjAtTemperature = -40.0f; // at this temperature the pulse is maximal. floatms_t pulseLength = interpolateClamped(maxPrimeInjAtTemperature, CONFIG(startOfCrankingPrimingPulse), - CONFIG(primeInjFalloffTemperature), 0.0f, ENGINE(sensors.clt)); + CONFIG(primeInjFalloffTemperature), 0.0f, getCoolantTemperature()); if (pulseLength > 0) { startSimultaniousInjection(engine); efitimeus_t turnOffDelayUs = (efitimeus_t)efiRound(MS2US(pulseLength), 1.0f); diff --git a/firmware/controllers/trigger/rpm_calculator.cpp b/firmware/controllers/trigger/rpm_calculator.cpp index 20f813323d..ee71664f37 100644 --- a/firmware/controllers/trigger/rpm_calculator.cpp +++ b/firmware/controllers/trigger/rpm_calculator.cpp @@ -6,8 +6,11 @@ * Actual getRpm() is calculated once per crankshaft revolution, based on the amount of time passed * since the start of previous shaft revolution. * + * We also have 'instant RPM' logic separate from this 'cycle RPM' logic. Open question is why do we not use + * instant RPM instead of cycle RPM more often. + * * @date Jan 1, 2013 - * @author Andrey Belomutskiy, (c) 2012-2018 + * @author Andrey Belomutskiy, (c) 2012-2019 */ #include "global.h" @@ -22,8 +25,7 @@ #if EFI_PROD_CODE #include "os_util.h" -#include "engine.h" -#endif +#endif /* EFI_PROD_CODE */ #if EFI_SENSOR_CHART #include "sensor_chart.h" @@ -86,8 +88,6 @@ extern bool hasFirmwareErrorFlag; static Logging * logger; -int revolutionCounterSinceBootForUnitTest = 0; - RpmCalculator::RpmCalculator() { #if !EFI_PROD_CODE mockRpm = MOCK_UNDEFINED; @@ -97,7 +97,6 @@ RpmCalculator::RpmCalculator() { // we need this initial to have not_running at first invocation lastRpmEventTimeNt = (efitime_t) -10 * US2NT(US_PER_SECOND_LL); - revolutionCounterSinceBootForUnitTest = 0; } /** @@ -179,12 +178,9 @@ spinning_state_e RpmCalculator::getState() const { void RpmCalculator::onNewEngineCycle() { revolutionCounterSinceBoot++; revolutionCounterSinceStart++; -#if EFI_UNIT_TEST - revolutionCounterSinceBootForUnitTest = revolutionCounterSinceBoot; -#endif /* EFI_UNIT_TEST */ } -uint32_t RpmCalculator::getRevolutionCounter(void) const { +uint32_t RpmCalculator::getRevolutionCounterM(void) const { return revolutionCounterSinceBoot; } @@ -231,9 +227,7 @@ void RpmCalculator::setSpinningUp(efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFI void rpmShaftPositionCallback(trigger_event_e ckpSignalType, uint32_t index DECLARE_ENGINE_PARAMETER_SUFFIX) { efitick_t nowNt = getTimeNowNt(); -#if EFI_PROD_CODE efiAssertVoid(CUSTOM_ERR_6632, getCurrentRemainingStack() > 256, "lowstckRCL"); -#endif RpmCalculator *rpmState = &engine->rpmCalculator; @@ -316,7 +310,7 @@ static void tdcMarkCallback(trigger_event_e ckpSignalType, (void) ckpSignalType; bool isTriggerSynchronizationPoint = index0 == 0; if (isTriggerSynchronizationPoint && ENGINE(isEngineChartEnabled)) { - int revIndex2 = engine->rpmCalculator.getRevolutionCounter() % 2; + int revIndex2 = getRevolutionCounter() % 2; int rpm = GET_RPM(); // todo: use tooth event-based scheduling, not just time-based scheduling if (isValidRpm(rpm)) { @@ -327,12 +321,6 @@ static void tdcMarkCallback(trigger_event_e ckpSignalType, } #endif -#if EFI_PROD_CODE || EFI_SIMULATOR -int getRevolutionCounter() { - return engine->rpmCalculator.getRevolutionCounter(); -} -#endif - /** * @return Current crankshaft angle, 0 to 720 for four-stroke */ @@ -362,7 +350,6 @@ void initRpmCalculator(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) { addTriggerEventListener(rpmShaftPositionCallback, "rpm reporter", engine); } -#if EFI_PROD_CODE || EFI_SIMULATOR /** * Schedules a callback 'angle' degree of crankshaft from now. * The callback would be executed once after the duration of time which @@ -370,17 +357,17 @@ void initRpmCalculator(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) { */ void scheduleByAngle(int rpm, scheduling_s *timer, angle_t angle, schfunc_t callback, void *param, RpmCalculator *calc DECLARE_ENGINE_PARAMETER_SUFFIX) { + // todo: remove 'calc' parameter UNUSED(rpm); ScopePerf perf(PE::ScheduleByAngle); efiAssertVoid(CUSTOM_ANGLE_NAN, !cisnan(angle), "NaN angle?"); efiAssertVoid(CUSTOM_ERR_6634, isValidRpm(rpm), "RPM check expected"); - float delayUs = calc->oneDegreeUs * angle; + float delayUs = ENGINE(rpmCalculator.oneDegreeUs) * angle; efiAssertVoid(CUSTOM_ERR_6635, !cisnan(delayUs), "NaN delay?"); - engine->executor.scheduleForLater(timer, (int) delayUs, callback, param); + ENGINE(executor.scheduleForLater(timer, (int) delayUs, callback, param)); } -#endif #else RpmCalculator::RpmCalculator() { diff --git a/firmware/controllers/trigger/rpm_calculator.h b/firmware/controllers/trigger/rpm_calculator.h index c07853d013..eec0a6ff31 100644 --- a/firmware/controllers/trigger/rpm_calculator.h +++ b/firmware/controllers/trigger/rpm_calculator.h @@ -89,7 +89,7 @@ public: * This method is invoked once per engine cycle right after we calculate new RPM value */ void onNewEngineCycle(); - uint32_t getRevolutionCounter(void) const; + uint32_t getRevolutionCounterM(void) const; void setRpmValue(int value DECLARE_ENGINE_PARAMETER_SUFFIX); /** * The same as setRpmValue() but without state change. @@ -158,7 +158,7 @@ void initRpmCalculator(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX); float getCrankshaftAngleNt(efitime_t timeNt DECLARE_ENGINE_PARAMETER_SUFFIX); -int getRevolutionCounter(void); +#define getRevolutionCounter() ENGINE(rpmCalculator.getRevolutionCounterM()) #if EFI_ENGINE_SNIFFER #define addEngineSnifferEvent(name, msg) if (ENGINE(isEngineChartEnabled)) { waveChart.addEvent3((name), (msg)); } diff --git a/firmware/controllers/trigger/spark_logic.cpp b/firmware/controllers/trigger/spark_logic.cpp index 041f4f58a2..83d896787d 100644 --- a/firmware/controllers/trigger/spark_logic.cpp +++ b/firmware/controllers/trigger/spark_logic.cpp @@ -37,6 +37,10 @@ int isIgnitionTimingError(void) { } static void fireSparkBySettingPinLow(IgnitionEvent *event, IgnitionOutputPin *output) { +#if EFI_UNIT_TEST + Engine *engine = event->engine; +#endif /* EFI_UNIT_TEST */ + #if SPARK_EXTREME_LOGGING scheduleMsg(logger, "spark goes low %d %s %d current=%d cnt=%d id=%d", getRevolutionCounter(), output->name, (int)getTimeNowUs(), output->currentLogicValue, output->outOfOrder, event->sparkId); @@ -162,7 +166,12 @@ if (engineConfiguration->debugMode == DBG_DWELL_METRIC) { } static void startDwellByTurningSparkPinHigh(IgnitionEvent *event, IgnitionOutputPin *output) { +#if EFI_UNIT_TEST + Engine *engine = event->engine; + EXPAND_Engine; +#endif /* EFI_UNIT_TEST */ + // todo: no reason for this to be disabled in unit_test mode?! #if ! EFI_UNIT_TEST if (GET_RPM_VALUE > 2 * engineConfiguration->cranking.rpm) { diff --git a/firmware/development/engine_sniffer.cpp b/firmware/development/engine_sniffer.cpp index dca046ed26..66fa82edef 100644 --- a/firmware/development/engine_sniffer.cpp +++ b/firmware/development/engine_sniffer.cpp @@ -77,7 +77,7 @@ static uint32_t skipUntilEngineCycle = 0; #if ! EFI_UNIT_TEST extern WaveChart waveChart; static void resetNow(void) { - skipUntilEngineCycle = engine->rpmCalculator.getRevolutionCounter() + 3; + skipUntilEngineCycle = getRevolutionCounter() + 3; waveChart.reset(); } #endif @@ -169,7 +169,7 @@ void WaveChart::addEvent3(const char *name, const char * msg) { if (!ENGINE(isEngineChartEnabled)) { return; } - if (skipUntilEngineCycle != 0 && ENGINE(rpmCalculator.getRevolutionCounter()) < skipUntilEngineCycle) + if (skipUntilEngineCycle != 0 && getRevolutionCounter() < skipUntilEngineCycle) return; #if EFI_SIMULATOR // todo: add UI control to enable this for firmware if desired diff --git a/firmware/development/sensor_chart.cpp b/firmware/development/sensor_chart.cpp index b728af810a..83e26fb806 100644 --- a/firmware/development/sensor_chart.cpp +++ b/firmware/development/sensor_chart.cpp @@ -39,7 +39,7 @@ void scAddData(float angle, float value) { return; } - if (engine->rpmCalculator.getRevolutionCounter() % engineConfiguration->sensorChartFrequency != 0) { + if (getRevolutionCounter() % engineConfiguration->sensorChartFrequency != 0) { /** * We are here if we do NOT need to add an event to the analog chart */ diff --git a/firmware/development/wave_analyzer.cpp b/firmware/development/wave_analyzer.cpp index 9227fe2b64..0f5a1ee8ac 100644 --- a/firmware/development/wave_analyzer.cpp +++ b/firmware/development/wave_analyzer.cpp @@ -80,7 +80,7 @@ void WaveReader::onFallEvent() { efitick_t width = nowUs - widthEventTimeUs; last_wave_high_widthUs = width; - int revolutionCounter = engine->rpmCalculator.getRevolutionCounter(); + int revolutionCounter = getRevolutionCounter(); totalOnTimeAccumulatorUs += width; if (currentRevolutionCounter != revolutionCounter) { diff --git a/firmware/svnversion.h b/firmware/svnversion.h index 6a7347951a..5963e218da 100644 --- a/firmware/svnversion.h +++ b/firmware/svnversion.h @@ -1,12 +1,12 @@ // This file was generated by Version2Header -// Wed Sep 11 18:20:00 EDT 2019 +// Mon Oct 14 12:58:12 EDT 2019 #ifndef GIT_HASH -#define GIT_HASH "33d13a78fc6eb5ba5c56835ab17b7ec1de34ed69" +#define GIT_HASH "7bb8bb7f140d6d96962da164262b42e2ed3f4807" #endif #ifndef VCS_VERSION -#define VCS_VERSION "19879" +#define VCS_VERSION "20053" #endif diff --git a/simulator/simulator/rusEfiFunctionalTest.cpp b/simulator/simulator/rusEfiFunctionalTest.cpp index 349f1e80cf..091e0b77dc 100644 --- a/simulator/simulator/rusEfiFunctionalTest.cpp +++ b/simulator/simulator/rusEfiFunctionalTest.cpp @@ -120,7 +120,7 @@ void rusEfiFunctionalTest(void) { initTriggerCentral(&sharedLogger); initTriggerEmulator(&sharedLogger PASS_ENGINE_PARAMETER_SUFFIX); #if EFI_MAP_AVERAGING - initMapAveraging(&sharedLogger, engine); + initMapAveraging(&sharedLogger PASS_ENGINE_PARAMETER_SUFFIX); #endif /* EFI_MAP_AVERAGING */ initMainEventListener(&sharedLogger PASS_ENGINE_PARAMETER_SUFFIX); diff --git a/unit_tests/efifeatures.h b/unit_tests/efifeatures.h index 9e00d3bc6e..ef90167e67 100644 --- a/unit_tests/efifeatures.h +++ b/unit_tests/efifeatures.h @@ -64,5 +64,6 @@ #define EFI_BOARD_TEST FALSE #define EFI_JOYSTICK FALSE +#define EFI_MAP_AVERAGING TRUE #endif /* EFIFEATURES_H_ */ diff --git a/unit_tests/global.h b/unit_tests/global.h index eaaf6a0b88..312f4eabb2 100644 --- a/unit_tests/global.h +++ b/unit_tests/global.h @@ -100,4 +100,8 @@ void print(const char *fmt, ...); #define CONFIG_PARAM(x) (x) +#define lockAnyContext() false + +#define unlockAnyContext() {} + #endif /* GLOBAL_H_ */ diff --git a/unit_tests/main.cpp b/unit_tests/main.cpp index 62b6707033..aa1b950b9a 100644 --- a/unit_tests/main.cpp +++ b/unit_tests/main.cpp @@ -34,12 +34,6 @@ efitick_t getTimeNowNt(void) { LoggingWithStorage sharedLogger("main"); -extern int revolutionCounterSinceBootForUnitTest; - -int getRevolutionCounter(void) { - return revolutionCounterSinceBootForUnitTest; -} - extern bool printTriggerDebug; bool verboseMode = false; @@ -47,7 +41,7 @@ GTEST_API_ int main(int argc, char **argv) { // printTriggerDebug = true; // resizeMap(); - printf("Success 20190825\r\n"); + printf("Success 20191013\r\n"); printAllTriggers(); // printConvertedTable(); testing::InitGoogleTest(&argc, argv); diff --git a/unit_tests/tests/test_fuel_map.cpp b/unit_tests/tests/test_fuel_map.cpp index 0b2b7e021c..43b7c72c53 100644 --- a/unit_tests/tests/test_fuel_map.cpp +++ b/unit_tests/tests/test_fuel_map.cpp @@ -85,11 +85,10 @@ TEST(misc, testFuelMap) { setFlatInjectorLag(0 PASS_CONFIG_PARAMETER_SUFFIX); - float iat = getIntakeAirTemperature(); - ASSERT_FALSE(cisnan(iat)); + ASSERT_FALSE(cisnan(getIntakeAirTemperature())); float iatCorrection = getIatFuelCorrection(-KELV PASS_ENGINE_PARAMETER_SUFFIX); ASSERT_EQ( 2, iatCorrection) << "IAT"; - engine->sensors.clt = getCoolantTemperature(); + ASSERT_FALSE(cisnan(getCoolantTemperature())); float cltCorrection = getCltFuelCorrection(PASS_ENGINE_PARAMETER_SIGNATURE); ASSERT_EQ( 1, cltCorrection) << "CLT"; float injectorLag = getInjectorLag(getVBatt(PASS_ENGINE_PARAMETER_SIGNATURE) PASS_ENGINE_PARAMETER_SUFFIX); diff --git a/unit_tests/tests/test_logic_expression.cpp b/unit_tests/tests/test_logic_expression.cpp index fe6c21b18e..59003b9fac 100644 --- a/unit_tests/tests/test_logic_expression.cpp +++ b/unit_tests/tests/test_logic_expression.cpp @@ -11,6 +11,7 @@ #include "fsio_impl.h" #include "cli_registry.h" #include "engine_test_helper.h" +#include "thermistors.h" #define TEST_POOL_SIZE 256 @@ -19,7 +20,7 @@ float getEngineValue(le_action_e action DECLARE_ENGINE_PARAMETER_SUFFIX) { case LE_METHOD_FAN: return engine->fsioState.mockFan; case LE_METHOD_COOLANT: - return engine->sensors.clt; + return getCoolantTemperature(); case LE_METHOD_RPM: return engine->fsioState.mockRpm; case LE_METHOD_CRANKING_RPM: diff --git a/unit_tests/tests/test_trigger_decoder.cpp b/unit_tests/tests/test_trigger_decoder.cpp index 46547edc26..44119a1618 100644 --- a/unit_tests/tests/test_trigger_decoder.cpp +++ b/unit_tests/tests/test_trigger_decoder.cpp @@ -584,7 +584,7 @@ static void setTestBug299(EngineTestHelper *eth) { // inj #0 |.......#|........|.......#|........| // inj #1 |........|.......#|........|.......#| ASSERT_EQ( 4, engine->executor.size()) << "qs#00"; - ASSERT_EQ( 3, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#3"; + ASSERT_EQ( 3, getRevolutionCounter()) << "rev cnt#3"; eth->assertInjectorUpEvent("setTestBug299: 1@0", 0, MS2US(8.5), 0); eth->assertInjectorDownEvent("@1", 1, MS2US(10), 0); eth->assertInjectorUpEvent("1@2", 2, MS2US(18.5), 1); @@ -607,7 +607,7 @@ static void setTestBug299(EngineTestHelper *eth) { // inj #0 |.......#|........|.......#|........| // inj #1 |........|.......#|........|.......#| ASSERT_EQ( 8, engine->executor.size()) << "qs#0"; - ASSERT_EQ( 3, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#3"; + ASSERT_EQ( 3, getRevolutionCounter()) << "rev cnt#3"; eth->assertInjectorUpEvent("02@0", 0, MS2US(-11.5), 0); eth->assertInjectorDownEvent("@1", 1, MS2US(-10), 0); eth->assertInjectorUpEvent("@2", 2, MS2US(-1.5), 1); @@ -650,7 +650,7 @@ static void setTestBug299(EngineTestHelper *eth) { // inj #0 |.......#|........|........|........| // inj #1 |........|.......#|........|........| ASSERT_EQ( 4, engine->executor.size()) << "qs#0-2"; - ASSERT_EQ( 4, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#4"; + ASSERT_EQ( 4, getRevolutionCounter()) << "rev cnt#4"; eth->assertInjectorUpEvent("0@0", 0, MS2US(8.5), 0); eth->assertInjectorDownEvent("0@1", 1, MS2US(10), 0); eth->assertInjectorUpEvent("0@2", 2, MS2US(18.5), 1); @@ -706,9 +706,9 @@ void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) { ASSERT_EQ( 0, engine->executor.size()) << "qs#1#2"; - ASSERT_EQ( 4, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#4#0"; + ASSERT_EQ( 4, getRevolutionCounter()) << "rev cnt#4#0"; eth.firePrimaryTriggerRise(); - ASSERT_EQ( 5, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#4#1"; + ASSERT_EQ( 5, getRevolutionCounter()) << "rev cnt#4#1"; // time...|0.......|10......|20......|30......|40......|50......|60......| // inj #0 |########|##...###|########|.....###|########|........|........| // inj #1 |.....###|########|....####|########|........|........|........| @@ -726,7 +726,7 @@ void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) { // { // scheduling_s *ev = engine->executor.getForUnitTest(9); -// ASSERT_EQ( 5, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#4#2"; +// ASSERT_EQ( 5, getRevolutionCounter()) << "rev cnt#4#2"; // ASSERT_TRUE(ev == &engineConfiguration->fuelActuators[2].signalPair[1].signalTimerDown) << "down 50"; // } @@ -736,7 +736,7 @@ void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) { eth.fireFall(20); ASSERT_EQ( 8, engine->executor.size()) << "qs#2#1"; - ASSERT_EQ( 5, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#5"; + ASSERT_EQ( 5, getRevolutionCounter()) << "rev cnt#5"; // using old fuel schedule - but already wider pulses // time...|-20.....|-10.....|0.......|10......|20......|30......|40......| // inj #0 |........|.....###|########|.....###|########|........|........| @@ -781,7 +781,7 @@ void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) { eth.firePrimaryTriggerRise(); ASSERT_EQ( 4, engine->executor.size()) << "qs#2#2"; - ASSERT_EQ( 6, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt6"; + ASSERT_EQ( 6, getRevolutionCounter()) << "rev cnt6"; // time...|-20.....|-10.....|0.......|10......|20......|30......|40......| // inj #0 |########|.....###|########|....####|........|........|........| // inj #1 |.....###|########|.....###|########|........|........|........| @@ -821,7 +821,7 @@ void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) { eth.firePrimaryTriggerFall(); ASSERT_EQ( 5, engine->executor.size()) << "qs#3"; - ASSERT_EQ( 6, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt6"; + ASSERT_EQ( 6, getRevolutionCounter()) << "rev cnt6"; ASSERT_EQ( 0, eth.executeActions()) << "executed #6"; diff --git a/unit_tests/unit_test_framework.h b/unit_tests/unit_test_framework.h index 808b6c6044..66e16cbe15 100644 --- a/unit_tests/unit_test_framework.h +++ b/unit_tests/unit_test_framework.h @@ -12,6 +12,9 @@ #include "gtest/gtest.h" #include "gmock/gmock.h" +// This lets us inspect private state from unit tests +#define private public + #define EPS1D 0.1 #define EPS2D 0.01 #define EPS3D 0.001