From 77508103622d060c0af16e6e06d0968b70c482d9 Mon Sep 17 00:00:00 2001 From: rusefi Date: Mon, 27 May 2019 18:50:23 -0400 Subject: [PATCH] refactoring: splitting huge header --- firmware/controllers/algo/engine.h | 151 +-------------------- firmware/controllers/algo/engine_parts.h | 165 +++++++++++++++++++++++ 2 files changed, 166 insertions(+), 150 deletions(-) create mode 100644 firmware/controllers/algo/engine_parts.h diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index 88ade9af23..01fb230123 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -9,6 +9,7 @@ #include "global.h" #include "globalaccess.h" +#include "engine_parts.h" #include "pid.h" #include "rpm_calculator.h" #include "event_registry.h" @@ -30,18 +31,6 @@ #include "global_execution_queue.h" #endif /* EFI_UNIT_TEST */ -#define MOCK_ADC_SIZE 16 - -class MockAdcState { -public: - MockAdcState(); - bool hasMockAdc[MOCK_ADC_SIZE]; - int fakeAdcValues[MOCK_ADC_SIZE]; - - void setMockVoltage(int hwChannel, float voltage); - int getMockAdcValue(int hwChannel) const; -}; - #define MAX_INJECTION_OUTPUT_COUNT INJECTION_PIN_COUNT #define FAST_CALLBACK_PERIOD_MS 20 @@ -64,91 +53,6 @@ private: void clear(); }; -class ThermistorMath { -public: - void setConfig(thermistor_conf_s *config); - void prepareThermistorCurve(thermistor_conf_s *tc); - float getKelvinTemperatureByResistance(float resistance) const; - float s_h_a = 0; - float s_h_b = 0; - float s_h_c = 0; -private: - thermistor_conf_s currentConfig = {}; -}; - -class Accelerometer { -public: - float x = 0; // G value - float y = 0; - float z = 0; -}; - -class SensorsState { -public: - SensorsState(); - /** - * Performance optimization: - * log() function needed for thermistor logic is relatively heavy, to avoid it we have these - * pre-calculated values - * Access to these two fields is not synchronized in any way - that should work since float read/write are atomic. - * - * values are in Celsius - */ - float iat = NAN; -#if EFI_UNIT_TEST - float mockClt = NAN; -#endif - float clt = NAN; - float auxTemp1 = NAN; - float auxTemp2 = NAN; - - /** - * Oil pressure in kPa - */ - float oilPressure; - - Accelerometer accelerometer; - - float vBatt = 0; - float currentAfr; - /** - * that's fuel in tank - just a gauge - */ - percent_t fuelTankLevel = 0; -}; - -class FuelConsumptionState { -public: - FuelConsumptionState(); - void addData(float durationMs); - void update(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX); - float perSecondConsumption = 0; - float perMinuteConsumption = 0; - float perSecondAccumulator = 0; - float perMinuteAccumulator = 0; - efitick_t accumulatedSecondPrevNt; - efitick_t accumulatedMinutePrevNt; -}; - -class TransmissionState { -public: - TransmissionState(); - gear_e gearSelectorPosition; -}; - -class WarningCodeState { -public: - WarningCodeState(); - void addWarningCode(obd_code_e code); - bool isWarningNow(efitimesec_t now, bool forIndicator DECLARE_ENGINE_PARAMETER_SUFFIX) const; - void clear(); - int warningCounter; - int lastErrorCode; - efitimesec_t timeOfPreviousWarning; - // todo: we need a way to post multiple recent warnings into TS - cyclic_buffer recentWarnings; -}; - class EngineState { public: EngineState(); @@ -282,59 +186,6 @@ class RpmCalculator; #define MAF_DECODING_CACHE_MULT (MAF_DECODING_CACHE_SIZE / 5.0) -typedef struct { - uint32_t beforeMainTrigger; - uint32_t mainTriggerCallbackTime; - - uint32_t beforeIgnitionSch; - uint32_t ignitionSchTime; - - uint32_t beforeInjectonSch; - uint32_t injectonSchTime; - - uint32_t beforeZeroTest; - uint32_t zeroTestTime; - - uint32_t beforeAdvance; - uint32_t advanceLookupTime; - - uint32_t beforeFuelCalc; - uint32_t fuelCalcTime; - - uint32_t beforeMapAveragingCb; - uint32_t mapAveragingCbTime; - - uint32_t beforeHipCb; - uint32_t hipCbTime; - - uint32_t beforeRpmCb; - uint32_t rpmCbTime; -} monitoring_timestamps_s; - -class FsioState { -public: - FsioState(); - float fsioTimingAdjustment = 0; - float fsioIdleTargetRPMAdjustment = 0; - float servoValues[SERVO_COUNT]; - float fsioLastValue[FSIO_COMMAND_COUNT]; - -#if EFI_ENABLE_ENGINE_WARNING - /** - * Shall we purposely miss on some cylinders in order to attract driver's attention to some problem - * like getting too hot - */ - float isEngineWarning; -#endif /* EFI_ENABLE_ENGINE_WARNING */ - -#if EFI_ENABLE_CRITICAL_ENGINE_STOP - /** - * Shall we stop engine due to some critical condition in order to save the engine - */ - float isCriticalEngineCondition; -#endif /* EFI_ENABLE_CRITICAL_ENGINE_STOP */ -}; - /** * I am not sure if this needs to be configurable. * diff --git a/firmware/controllers/algo/engine_parts.h b/firmware/controllers/algo/engine_parts.h new file mode 100644 index 0000000000..07edea8e0c --- /dev/null +++ b/firmware/controllers/algo/engine_parts.h @@ -0,0 +1,165 @@ +/* + * @file engine_parts.h + * + * @date May 27, 2019 + * @author Andrey Belomutskiy, (c) 2012-2019 + */ + +#ifndef CONTROLLERS_ALGO_ENGINE_PARTS_H_ +#define CONTROLLERS_ALGO_ENGINE_PARTS_H_ + +#include "global.h" +#include "engine_configuration_generated_structures.h" +#include "cyclic_buffer.h" + +#define MOCK_ADC_SIZE 16 + +class MockAdcState { +public: + MockAdcState(); + bool hasMockAdc[MOCK_ADC_SIZE]; + int fakeAdcValues[MOCK_ADC_SIZE]; + + void setMockVoltage(int hwChannel, float voltage); + int getMockAdcValue(int hwChannel) const; +}; + +class ThermistorMath { +public: + void setConfig(thermistor_conf_s *config); + void prepareThermistorCurve(thermistor_conf_s *tc); + float getKelvinTemperatureByResistance(float resistance) const; + float s_h_a = 0; + float s_h_b = 0; + float s_h_c = 0; +private: + thermistor_conf_s currentConfig = {}; +}; + +class Accelerometer { +public: + float x = 0; // G value + float y = 0; + float z = 0; +}; + +class SensorsState { +public: + SensorsState(); + /** + * Performance optimization: + * log() function needed for thermistor logic is relatively heavy, to avoid it we have these + * pre-calculated values + * Access to these two fields is not synchronized in any way - that should work since float read/write are atomic. + * + * values are in Celsius + */ + float iat = NAN; +#if EFI_UNIT_TEST + float mockClt = NAN; +#endif + float clt = NAN; + float auxTemp1 = NAN; + float auxTemp2 = NAN; + + /** + * Oil pressure in kPa + */ + float oilPressure; + + Accelerometer accelerometer; + + float vBatt = 0; + float currentAfr; + /** + * that's fuel in tank - just a gauge + */ + percent_t fuelTankLevel = 0; +}; + +class FuelConsumptionState { +public: + FuelConsumptionState(); + void addData(float durationMs); + void update(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX); + float perSecondConsumption = 0; + float perMinuteConsumption = 0; + float perSecondAccumulator = 0; + float perMinuteAccumulator = 0; + efitick_t accumulatedSecondPrevNt; + efitick_t accumulatedMinutePrevNt; +}; + +class TransmissionState { +public: + TransmissionState(); + gear_e gearSelectorPosition; +}; + +class WarningCodeState { +public: + WarningCodeState(); + void addWarningCode(obd_code_e code); + bool isWarningNow(efitimesec_t now, bool forIndicator DECLARE_ENGINE_PARAMETER_SUFFIX) const; + void clear(); + int warningCounter; + int lastErrorCode; + efitimesec_t timeOfPreviousWarning; + // todo: we need a way to post multiple recent warnings into TS + cyclic_buffer recentWarnings; +}; + +typedef struct { + uint32_t beforeMainTrigger; + uint32_t mainTriggerCallbackTime; + + uint32_t beforeIgnitionSch; + uint32_t ignitionSchTime; + + uint32_t beforeInjectonSch; + uint32_t injectonSchTime; + + uint32_t beforeZeroTest; + uint32_t zeroTestTime; + + uint32_t beforeAdvance; + uint32_t advanceLookupTime; + + uint32_t beforeFuelCalc; + uint32_t fuelCalcTime; + + uint32_t beforeMapAveragingCb; + uint32_t mapAveragingCbTime; + + uint32_t beforeHipCb; + uint32_t hipCbTime; + + uint32_t beforeRpmCb; + uint32_t rpmCbTime; +} monitoring_timestamps_s; + +class FsioState { +public: + FsioState(); + float fsioTimingAdjustment = 0; + float fsioIdleTargetRPMAdjustment = 0; + float servoValues[SERVO_COUNT]; + float fsioLastValue[FSIO_COMMAND_COUNT]; + +#if EFI_ENABLE_ENGINE_WARNING + /** + * Shall we purposely miss on some cylinders in order to attract driver's attention to some problem + * like getting too hot + */ + float isEngineWarning; +#endif /* EFI_ENABLE_ENGINE_WARNING */ + +#if EFI_ENABLE_CRITICAL_ENGINE_STOP + /** + * Shall we stop engine due to some critical condition in order to save the engine + */ + float isCriticalEngineCondition; +#endif /* EFI_ENABLE_CRITICAL_ENGINE_STOP */ +}; + +#endif /* CONTROLLERS_ALGO_ENGINE_PARTS_H_ */