2015-07-10 06:01:56 -07:00
|
|
|
/**
|
|
|
|
* @file engine.h
|
|
|
|
*
|
|
|
|
* @date May 21, 2014
|
2019-01-08 21:53:54 -08:00
|
|
|
* @author Andrey Belomutskiy, (c) 2012-2019
|
2015-07-10 06:01:56 -07:00
|
|
|
*/
|
2016-08-01 19:04:24 -07:00
|
|
|
#ifndef H_ENGINE_H_
|
|
|
|
#define H_ENGINE_H_
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2016-02-06 09:02:24 -08:00
|
|
|
#include "global.h"
|
2019-01-27 21:44:30 -08:00
|
|
|
#include "globalaccess.h"
|
2016-02-06 09:02:24 -08:00
|
|
|
#include "pid.h"
|
2015-07-10 06:01:56 -07:00
|
|
|
#include "rpm_calculator.h"
|
|
|
|
#include "event_registry.h"
|
|
|
|
#include "trigger_structure.h"
|
|
|
|
#include "table_helper.h"
|
|
|
|
#include "listener_array.h"
|
|
|
|
#include "accel_enrichment.h"
|
2015-09-13 14:02:44 -07:00
|
|
|
#include "trigger_central.h"
|
2019-04-15 18:02:42 -07:00
|
|
|
#include "local_version_holder.h"
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2019-01-08 21:53:54 -08:00
|
|
|
#if EFI_SIGNAL_EXECUTOR_ONE_TIMER
|
|
|
|
// PROD real firmware uses this implementation
|
2019-03-29 06:11:13 -07:00
|
|
|
#include "single_timer_executor.h"
|
2019-01-08 21:53:54 -08:00
|
|
|
#endif /* EFI_SIGNAL_EXECUTOR_ONE_TIMER */
|
|
|
|
#if EFI_SIGNAL_EXECUTOR_SLEEP
|
2019-01-08 22:07:50 -08:00
|
|
|
#include "signal_executor_sleep.h"
|
2019-01-08 21:53:54 -08:00
|
|
|
#endif /* EFI_SIGNAL_EXECUTOR_SLEEP */
|
|
|
|
#if EFI_UNIT_TEST
|
|
|
|
#include "global_execution_queue.h"
|
|
|
|
#endif /* EFI_UNIT_TEST */
|
|
|
|
|
2016-01-23 15:01:40 -08:00
|
|
|
#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);
|
2019-01-15 17:24:36 -08:00
|
|
|
int getMockAdcValue(int hwChannel) const;
|
2016-01-23 15:01:40 -08:00
|
|
|
};
|
|
|
|
|
2016-11-30 19:06:43 -08:00
|
|
|
#define MAX_INJECTION_OUTPUT_COUNT INJECTION_PIN_COUNT
|
|
|
|
|
2015-07-10 06:01:56 -07:00
|
|
|
/**
|
|
|
|
* This class knows about when to inject fuel
|
|
|
|
*/
|
|
|
|
class FuelSchedule {
|
|
|
|
public:
|
|
|
|
FuelSchedule();
|
|
|
|
/**
|
|
|
|
* this method schedules all fuel events for an engine cycle
|
|
|
|
*/
|
2017-05-15 20:33:22 -07:00
|
|
|
void addFuelEvents(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
2018-07-28 11:15:42 -07:00
|
|
|
bool addFuelEventsForCylinder(int cylinderIndex DECLARE_ENGINE_PARAMETER_SUFFIX);
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2016-11-30 19:06:43 -08:00
|
|
|
InjectionEvent elements[MAX_INJECTION_OUTPUT_COUNT];
|
|
|
|
bool isReady;
|
2016-01-24 23:03:01 -08:00
|
|
|
|
2015-07-10 06:01:56 -07:00
|
|
|
private:
|
|
|
|
void clear();
|
|
|
|
};
|
|
|
|
|
|
|
|
class ThermistorMath {
|
|
|
|
public:
|
2016-12-21 15:01:56 -08:00
|
|
|
void setConfig(thermistor_conf_s *config);
|
2016-12-22 11:02:38 -08:00
|
|
|
void prepareThermistorCurve(thermistor_conf_s *tc);
|
2019-01-15 17:24:36 -08:00
|
|
|
float getKelvinTemperatureByResistance(float resistance) const;
|
2019-01-13 20:25:15 -08:00
|
|
|
float s_h_a = 0;
|
|
|
|
float s_h_b = 0;
|
|
|
|
float s_h_c = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
private:
|
2019-01-13 20:25:15 -08:00
|
|
|
thermistor_conf_s currentConfig = {};
|
2015-07-10 06:01:56 -07:00
|
|
|
};
|
|
|
|
|
2017-08-17 06:10:22 -07:00
|
|
|
class Accelerometer {
|
|
|
|
public:
|
2019-01-13 20:44:26 -08:00
|
|
|
float x = 0; // G value
|
|
|
|
float y = 0;
|
|
|
|
float z = 0;
|
2017-08-17 06:10:22 -07:00
|
|
|
};
|
|
|
|
|
2017-03-06 23:24:57 -08:00
|
|
|
class SensorsState {
|
2015-07-10 06:01:56 -07:00
|
|
|
public:
|
2017-03-06 23:24:57 -08:00
|
|
|
SensorsState();
|
2015-07-10 06:01:56 -07:00
|
|
|
/**
|
2016-02-06 09:02:24 -08:00
|
|
|
* Performance optimization:
|
|
|
|
* log() function needed for thermistor logic is relatively heavy, to avoid it we have these
|
|
|
|
* pre-calculated values
|
2015-07-10 06:01:56 -07:00
|
|
|
* Access to these two fields is not synchronized in any way - that should work since float read/write are atomic.
|
2016-02-06 09:02:24 -08:00
|
|
|
*
|
|
|
|
* values are in Celsius
|
2015-07-10 06:01:56 -07:00
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
float iat = NAN;
|
2019-01-19 19:09:37 -08:00
|
|
|
#if EFI_UNIT_TEST
|
|
|
|
float mockClt = NAN;
|
|
|
|
#endif
|
2019-01-19 19:31:55 -08:00
|
|
|
float clt = NAN;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2017-11-15 11:30:13 -08:00
|
|
|
/**
|
|
|
|
* Oil pressure in kPa
|
|
|
|
*/
|
|
|
|
float oilPressure;
|
|
|
|
|
2017-08-17 06:10:22 -07:00
|
|
|
Accelerometer accelerometer;
|
|
|
|
|
2019-01-19 19:31:55 -08:00
|
|
|
float vBatt = 0;
|
2017-03-06 23:24:57 -08:00
|
|
|
float currentAfr;
|
|
|
|
/**
|
|
|
|
* that's fuel in tank - just a gauge
|
|
|
|
*/
|
2019-03-14 10:28:51 -07:00
|
|
|
percent_t fuelTankLevel = 0;
|
2017-03-06 23:24:57 -08:00
|
|
|
};
|
|
|
|
|
2017-05-24 04:35:44 -07:00
|
|
|
class FuelConsumptionState {
|
|
|
|
public:
|
|
|
|
FuelConsumptionState();
|
|
|
|
void addData(float durationMs);
|
2017-12-31 17:13:04 -08:00
|
|
|
void update(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX);
|
2019-01-13 20:44:26 -08:00
|
|
|
float perSecondConsumption = 0;
|
|
|
|
float perMinuteConsumption = 0;
|
|
|
|
float perSecondAccumulator = 0;
|
|
|
|
float perMinuteAccumulator = 0;
|
2017-12-31 16:25:59 -08:00
|
|
|
efitick_t accumulatedSecondPrevNt;
|
|
|
|
efitick_t accumulatedMinutePrevNt;
|
2017-05-24 04:35:44 -07:00
|
|
|
};
|
|
|
|
|
2017-08-03 19:30:47 -07:00
|
|
|
class TransmissionState {
|
|
|
|
public:
|
|
|
|
TransmissionState();
|
|
|
|
gear_e gearSelectorPosition;
|
|
|
|
};
|
|
|
|
|
2019-01-11 06:58:48 -08:00
|
|
|
class WarningCodeState {
|
|
|
|
public:
|
|
|
|
WarningCodeState();
|
|
|
|
void addWarningCode(obd_code_e code);
|
2019-01-15 17:24:36 -08:00
|
|
|
bool isWarningNow(efitimesec_t now, bool forIndicator DECLARE_ENGINE_PARAMETER_SUFFIX) const;
|
2019-01-11 06:58:48 -08:00
|
|
|
void clear();
|
|
|
|
int warningCounter;
|
|
|
|
int lastErrorCode;
|
|
|
|
efitimesec_t timeOfPreviousWarning;
|
|
|
|
// todo: we need a way to post multiple recent warnings into TS
|
2019-01-12 18:36:50 -08:00
|
|
|
cyclic_buffer<int, 8> recentWarnings;
|
2019-01-11 06:58:48 -08:00
|
|
|
};
|
2017-05-24 04:35:44 -07:00
|
|
|
|
2017-03-06 23:24:57 -08:00
|
|
|
class EngineState {
|
|
|
|
public:
|
|
|
|
EngineState();
|
2017-05-15 20:33:22 -07:00
|
|
|
void periodicFastCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
|
|
|
void updateSlowSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
2018-09-29 09:16:36 -07:00
|
|
|
void updateTChargeK(int rpm, float tps DECLARE_ENGINE_PARAMETER_SUFFIX);
|
2017-03-06 23:24:57 -08:00
|
|
|
|
2017-05-24 04:35:44 -07:00
|
|
|
FuelConsumptionState fuelConsumption;
|
2017-03-06 23:01:17 -08:00
|
|
|
|
2019-01-13 20:44:26 -08:00
|
|
|
efitick_t crankingTime = 0;
|
|
|
|
efitick_t timeSinceCranking = 0;
|
2016-12-06 20:03:39 -08:00
|
|
|
|
2019-01-11 06:58:48 -08:00
|
|
|
WarningCodeState warnings;
|
2016-07-13 16:03:06 -07:00
|
|
|
|
2017-01-05 18:12:06 -08:00
|
|
|
/**
|
2018-08-29 04:43:21 -07:00
|
|
|
* speed-density logic, calculated air mass in grams
|
2017-01-05 18:12:06 -08:00
|
|
|
*/
|
2019-01-13 20:44:26 -08:00
|
|
|
float airMass = 0;
|
2018-09-29 09:16:36 -07:00
|
|
|
/**
|
|
|
|
* speed-density logic, calculated air flow in kg/h for tCharge Air-Interp. method
|
|
|
|
*/
|
2019-01-13 20:44:26 -08:00
|
|
|
float airFlow = 0;
|
2015-12-02 17:10:06 -08:00
|
|
|
|
2019-01-13 20:44:26 -08:00
|
|
|
float engineNoiseHipLevel = 0;
|
2016-01-01 14:02:49 -08:00
|
|
|
|
2019-01-13 20:44:26 -08:00
|
|
|
float auxValveStart = 0;
|
|
|
|
float auxValveEnd = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
ThermistorMath iatCurve;
|
|
|
|
ThermistorMath cltCurve;
|
|
|
|
|
2015-09-06 18:02:46 -07:00
|
|
|
/**
|
|
|
|
* MAP averaging angle start, in relation to 'mapAveragingSchedulingAtIndex' trigger index index
|
|
|
|
*/
|
|
|
|
angle_t mapAveragingStart[INJECTION_PIN_COUNT];
|
2019-01-13 20:44:26 -08:00
|
|
|
angle_t mapAveragingDuration = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
// spark-related
|
2019-01-13 20:44:26 -08:00
|
|
|
floatms_t sparkDwell = 0;
|
|
|
|
angle_t timingAdvance = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* ignition dwell duration as crankshaft angle
|
2018-07-24 17:22:16 -07:00
|
|
|
* NAN if engine is stopped
|
2015-07-10 06:01:56 -07:00
|
|
|
*/
|
2019-01-13 20:44:26 -08:00
|
|
|
angle_t dwellAngle = NAN;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2019-01-13 20:44:26 -08:00
|
|
|
angle_t cltTimingCorrection = 0;
|
2017-01-05 18:12:06 -08:00
|
|
|
|
2015-07-10 06:01:56 -07:00
|
|
|
// fuel-related;
|
2019-01-13 20:44:26 -08:00
|
|
|
float iatFuelCorrection = 0;
|
|
|
|
float cltFuelCorrection = 0;
|
|
|
|
float postCrankingFuelCorrection = 0;
|
|
|
|
float fuelCutoffCorrection = 0;
|
|
|
|
efitick_t coastingFuelCutStartTime = 0;
|
2016-02-06 09:02:24 -08:00
|
|
|
/**
|
2018-01-17 16:18:48 -08:00
|
|
|
* injectorLag(VBatt)
|
2016-02-06 09:02:24 -08:00
|
|
|
*
|
|
|
|
* this value depends on a slow-changing VBatt value, so
|
|
|
|
* we update it once in a while
|
|
|
|
*/
|
2019-01-13 20:44:26 -08:00
|
|
|
floatms_t injectorLag = 0;
|
2016-02-06 09:02:24 -08:00
|
|
|
|
2016-02-06 13:02:41 -08:00
|
|
|
/**
|
|
|
|
* See useWarmupPidAfr
|
|
|
|
*/
|
2016-02-06 09:02:24 -08:00
|
|
|
Pid warmupAfrPid;
|
2019-01-13 20:44:26 -08:00
|
|
|
float warmupTargetAfr = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2019-01-13 20:44:26 -08:00
|
|
|
float baroCorrection = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
// speed density
|
2018-09-29 09:16:36 -07:00
|
|
|
// Rate-of-change limiter is applied to degrees, so we store both Kelvin and degrees.
|
2019-01-13 20:44:26 -08:00
|
|
|
float tCharge = 0;
|
|
|
|
float tChargeK = 0;
|
2018-09-29 09:16:36 -07:00
|
|
|
efitick_t timeSinceLastTChargeK;
|
|
|
|
|
2019-01-13 20:44:26 -08:00
|
|
|
float currentVE = 0;
|
|
|
|
float targetAFR = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2019-01-13 20:44:26 -08:00
|
|
|
int vssEventCounter = 0;
|
|
|
|
int totalLoggedBytes = 0;
|
2017-02-09 09:03:46 -08:00
|
|
|
|
|
|
|
|
2015-12-02 17:10:06 -08:00
|
|
|
/**
|
|
|
|
* pre-calculated value from simple fuel lookup
|
|
|
|
*/
|
2019-01-13 20:44:26 -08:00
|
|
|
floatms_t baseTableFuel = 0;
|
2015-12-02 17:10:06 -08:00
|
|
|
/**
|
2017-01-19 12:03:17 -08:00
|
|
|
* Raw fuel injection duration produced by current fuel algorithm, without any correction
|
2015-12-02 17:10:06 -08:00
|
|
|
*/
|
2019-01-13 20:44:26 -08:00
|
|
|
floatms_t baseFuel = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2017-01-22 14:03:31 -08:00
|
|
|
/**
|
|
|
|
* closed-loop fuel correction
|
|
|
|
*/
|
2019-01-13 20:44:26 -08:00
|
|
|
floatms_t fuelPidCorrection = 0;
|
2017-01-22 14:03:31 -08:00
|
|
|
|
2015-12-26 09:03:13 -08:00
|
|
|
/**
|
2016-05-23 18:01:32 -07:00
|
|
|
* Total fuel with CLT, IAT and TPS acceleration corrections per cycle,
|
|
|
|
* as squirt duration.
|
|
|
|
* Without injector lag.
|
2016-09-09 21:02:11 -07:00
|
|
|
* @see baseFuel
|
2016-05-23 18:01:32 -07:00
|
|
|
* @see actualLastInjection
|
2015-12-26 09:03:13 -08:00
|
|
|
*/
|
2019-01-13 20:44:26 -08:00
|
|
|
floatms_t runningFuel = 0;
|
2015-12-26 09:03:13 -08:00
|
|
|
|
2016-01-30 19:03:36 -08:00
|
|
|
/**
|
|
|
|
* TPS acceleration: extra fuel amount
|
|
|
|
*/
|
2019-01-13 20:44:26 -08:00
|
|
|
floatms_t tpsAccelEnrich = 0;
|
2015-12-26 09:03:13 -08:00
|
|
|
|
2019-01-13 20:44:26 -08:00
|
|
|
angle_t injectionOffset = 0;
|
2016-01-23 15:01:40 -08:00
|
|
|
|
2019-04-12 19:07:03 -07:00
|
|
|
#if EFI_ENABLE_MOCK_ADC
|
2016-01-23 15:01:40 -08:00
|
|
|
MockAdcState mockAdcState;
|
2016-01-26 17:02:45 -08:00
|
|
|
#endif /* EFI_ENABLE_MOCK_ADC */
|
2015-07-10 06:01:56 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
class RpmCalculator;
|
|
|
|
|
|
|
|
#define MAF_DECODING_CACHE_SIZE 256
|
|
|
|
|
|
|
|
#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;
|
|
|
|
|
2019-01-05 20:48:37 -08:00
|
|
|
class FsioState {
|
|
|
|
public:
|
|
|
|
FsioState();
|
2019-01-19 19:31:55 -08:00
|
|
|
float fsioTimingAdjustment = 0;
|
|
|
|
float fsioIdleTargetRPMAdjustment = 0;
|
2019-01-19 18:10:58 -08:00
|
|
|
float servoValues[SERVO_COUNT];
|
2019-01-19 19:09:37 -08:00
|
|
|
float fsioLastValue[FSIO_COMMAND_COUNT];
|
2019-01-19 18:10:58 -08:00
|
|
|
|
2019-01-05 20:48:37 -08:00
|
|
|
#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 */
|
|
|
|
};
|
|
|
|
|
2019-01-14 07:58:38 -08:00
|
|
|
/**
|
|
|
|
* I am not sure if this needs to be configurable.
|
|
|
|
*
|
|
|
|
* Also technically the whole feature might be implemented as cranking fuel coefficient curve by TPS.
|
|
|
|
*/
|
|
|
|
// todo: not great location for these
|
|
|
|
#define CLEANUP_MODE_TPS 90
|
|
|
|
#define STEPPER_PARKING_TPS CLEANUP_MODE_TPS
|
2019-01-05 20:48:37 -08:00
|
|
|
|
2015-07-10 06:01:56 -07:00
|
|
|
class Engine {
|
|
|
|
public:
|
|
|
|
Engine(persistent_config_s *config);
|
2016-12-18 07:02:38 -08:00
|
|
|
Engine();
|
|
|
|
void setConfig(persistent_config_s *config);
|
2017-05-15 20:33:22 -07:00
|
|
|
injection_mode_e getCurrentInjectionMode(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
2016-12-18 07:02:38 -08:00
|
|
|
|
2017-05-24 04:57:58 -07:00
|
|
|
InjectionSignalPair fuelActuators[INJECTION_PIN_COUNT];
|
2016-12-18 07:02:38 -08:00
|
|
|
IgnitionEventList ignitionEvents;
|
|
|
|
|
2019-01-15 18:51:09 -08:00
|
|
|
int getGlobalConfigurationVersion(void) const;
|
2019-02-02 23:33:33 -08:00
|
|
|
/**
|
|
|
|
* true if a recent configuration change has changed any of the trigger settings which
|
|
|
|
* we have not adjusted for yet
|
|
|
|
*/
|
|
|
|
bool isTriggerConfigChanged = false;
|
2019-04-15 18:02:42 -07:00
|
|
|
LocalVersionHolder triggerVersion;
|
2019-01-15 18:51:09 -08:00
|
|
|
|
2019-01-08 21:53:54 -08:00
|
|
|
// a pointer with interface type would make this code nicer but would carry extra runtime
|
|
|
|
// cost to resolve pointer, we use instances as a micro optimization
|
|
|
|
#if EFI_SIGNAL_EXECUTOR_ONE_TIMER
|
2019-01-08 22:07:50 -08:00
|
|
|
SingleTimerExecutor executor;
|
2019-01-08 21:53:54 -08:00
|
|
|
#endif
|
|
|
|
#if EFI_SIGNAL_EXECUTOR_SLEEP
|
2019-01-08 22:07:50 -08:00
|
|
|
SleepExecutor executor;
|
2019-01-08 21:53:54 -08:00
|
|
|
#endif
|
|
|
|
#if EFI_UNIT_TEST
|
|
|
|
TestExecutor executor;
|
|
|
|
#endif
|
2016-01-25 09:01:30 -08:00
|
|
|
|
2019-04-12 19:07:03 -07:00
|
|
|
#if EFI_ENGINE_CONTROL
|
2016-12-18 09:03:48 -08:00
|
|
|
FuelSchedule injectionEvents;
|
|
|
|
#endif /* EFI_ENGINE_CONTROL */
|
2016-02-06 07:01:34 -08:00
|
|
|
|
2016-12-18 09:03:48 -08:00
|
|
|
WallFuel wallFuel;
|
2019-01-05 20:33:04 -08:00
|
|
|
bool needToStopEngine(efitick_t nowNt);
|
2019-01-19 19:31:55 -08:00
|
|
|
bool etbAutoTune = false;
|
2016-01-26 20:01:44 -08:00
|
|
|
/**
|
|
|
|
* That's the list of pending spark firing events
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
IgnitionEvent *iHead = NULL;
|
2016-01-30 19:03:36 -08:00
|
|
|
/**
|
|
|
|
* this is based on isEngineChartEnabled and engineSnifferRpmThreshold settings
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
bool isEngineChartEnabled = false;
|
2016-01-30 19:03:36 -08:00
|
|
|
/**
|
|
|
|
* this is based on sensorChartMode and sensorSnifferRpmThreshold settings
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
sensor_chart_e sensorChartMode = SC_OFF;
|
2016-01-31 16:01:34 -08:00
|
|
|
/**
|
|
|
|
* based on current RPM and isAlternatorControlEnabled setting
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
bool isAlternatorControlEnabled = false;
|
2016-01-26 20:01:44 -08:00
|
|
|
|
2019-01-19 19:31:55 -08:00
|
|
|
bool isCltBroken = false;
|
2019-01-14 05:57:08 -08:00
|
|
|
bool slowCallBackWasInvoked = false;
|
2017-05-11 05:32:08 -07:00
|
|
|
|
2017-05-01 19:33:20 -07:00
|
|
|
|
|
|
|
// floatms_t callToPitEndTime;
|
|
|
|
|
|
|
|
/**
|
2017-05-04 14:03:23 -07:00
|
|
|
* remote telemetry: if not zero, time to stop flashing 'CALL FROM PIT STOP' light
|
2017-05-01 19:33:20 -07:00
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
efitime_t callFromPitStopEndTime = 0;
|
2017-07-26 17:27:08 -07:00
|
|
|
|
|
|
|
// timestamp of most recent time RPM hard limit was triggered
|
2019-01-19 19:31:55 -08:00
|
|
|
efitime_t rpmHardLimitTimestamp = 0;
|
2017-05-01 19:33:20 -07:00
|
|
|
|
2019-01-14 09:21:26 -08:00
|
|
|
// todo: should be a field on some other class, not Engine?
|
|
|
|
bool isInitializingTrigger = false;
|
|
|
|
|
2017-02-24 16:20:33 -08:00
|
|
|
/**
|
|
|
|
* This flag indicated a big enough problem that engine control would be
|
|
|
|
* prohibited if this flag is set to true.
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
bool withError = false;
|
2017-02-24 16:20:33 -08:00
|
|
|
|
2015-07-10 06:01:56 -07:00
|
|
|
RpmCalculator rpmCalculator;
|
2019-01-19 19:31:55 -08:00
|
|
|
persistent_config_s *config = NULL;
|
2019-01-04 21:11:17 -08:00
|
|
|
/**
|
|
|
|
* we use funny unique name to make sure that compiler is not confused between global variable and class member
|
2019-01-04 21:57:09 -08:00
|
|
|
* todo: this variable is probably a sign of some problem, should we even have it?
|
2019-01-04 21:11:17 -08:00
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
engine_configuration_s *engineConfigurationPtr = NULL;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* this is about 'stopengine' command
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
efitick_t stopEngineRequestTimeNt = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2016-01-30 19:03:36 -08:00
|
|
|
/**
|
|
|
|
* always 360 or 720, never zero
|
|
|
|
*/
|
2016-01-14 21:01:42 -08:00
|
|
|
angle_t engineCycle;
|
|
|
|
|
2015-12-31 10:02:19 -08:00
|
|
|
AccelEnrichmemnt engineLoadAccelEnrichment;
|
2015-07-10 06:01:56 -07:00
|
|
|
AccelEnrichmemnt tpsAccelEnrichment;
|
|
|
|
|
2015-09-13 14:02:44 -07:00
|
|
|
TriggerCentral triggerCentral;
|
|
|
|
|
2015-07-10 06:01:56 -07:00
|
|
|
/**
|
2016-10-12 22:02:02 -07:00
|
|
|
* Each individual fuel injection duration for current engine cycle, without wall wetting
|
|
|
|
* including everything including injector lag, both cranking and running
|
2017-11-06 19:29:39 -08:00
|
|
|
* @see getInjectionDuration()
|
2015-07-10 06:01:56 -07:00
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
floatms_t injectionDuration = 0;
|
2016-01-02 22:01:37 -08:00
|
|
|
/**
|
|
|
|
* fuel injection time correction to account for wall wetting effect, for current cycle
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
floatms_t wallFuelCorrection = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2015-08-23 20:02:37 -07:00
|
|
|
/**
|
|
|
|
* This one with wall wetting accounted for, used for logging.
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
floatms_t actualLastInjection = 0;
|
2015-08-23 20:02:37 -07:00
|
|
|
|
2017-05-15 20:33:22 -07:00
|
|
|
void periodicFastCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
2019-01-14 07:58:38 -08:00
|
|
|
void periodicSlowCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
2017-05-15 20:33:22 -07:00
|
|
|
void updateSlowSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
2018-12-25 18:18:14 -08:00
|
|
|
void initializeTriggerShape(Logging *logger DECLARE_ENGINE_PARAMETER_SUFFIX);
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2019-01-19 19:31:55 -08:00
|
|
|
bool clutchUpState = false;
|
|
|
|
bool clutchDownState = false;
|
|
|
|
bool brakePedalState = false;
|
2019-01-26 21:02:58 -08:00
|
|
|
bool acSwitchState = false;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2019-01-19 19:31:55 -08:00
|
|
|
bool isRunningPwmTest = false;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2018-03-18 09:15:51 -07:00
|
|
|
|
2019-01-05 20:48:37 -08:00
|
|
|
FsioState fsioState;
|
|
|
|
|
2015-07-10 06:01:56 -07:00
|
|
|
/**
|
|
|
|
* Are we experiencing knock right now?
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
bool knockNow = false;
|
2015-07-10 06:01:56 -07:00
|
|
|
/**
|
|
|
|
* Have we experienced knock since engine was started?
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
bool knockEver = false;
|
2015-07-10 06:01:56 -07:00
|
|
|
/**
|
|
|
|
* KnockCount is directly proportional to the degrees of ignition
|
|
|
|
* advance removed
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
int knockCount = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2019-01-19 19:31:55 -08:00
|
|
|
float knockVolts = 0;
|
2015-07-11 13:01:31 -07:00
|
|
|
|
2019-01-19 19:31:55 -08:00
|
|
|
bool knockDebug = false;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2019-01-19 19:31:55 -08:00
|
|
|
efitimeus_t timeOfLastKnockEvent = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* are we running any kind of functional test? this affect
|
|
|
|
* some areas
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
bool isTestMode = false;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* pre-calculated offset for given sequence index within engine cycle
|
|
|
|
* (not cylinder ID)
|
|
|
|
*/
|
2018-07-24 17:40:44 -07:00
|
|
|
angle_t ignitionPositionWithinEngineCycle[IGNITION_PIN_COUNT];
|
2015-07-10 06:01:56 -07:00
|
|
|
/**
|
|
|
|
* pre-calculated reference to which output pin should be used for
|
|
|
|
* given sequence index within engine cycle
|
2016-01-16 14:02:38 -08:00
|
|
|
* todo: update documentation
|
2015-07-10 06:01:56 -07:00
|
|
|
*/
|
2016-01-16 14:02:38 -08:00
|
|
|
int ignitionPin[IGNITION_PIN_COUNT];
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2019-01-27 23:29:13 -08:00
|
|
|
// Store current ignition mode for prepareIgnitionPinIndices()
|
|
|
|
ignition_mode_e ignitionModeForPinIndices = Force_4_bytes_size_ignition_mode;
|
|
|
|
|
2017-11-20 12:01:48 -08:00
|
|
|
/**
|
|
|
|
* this is invoked each time we register a trigger tooth signal
|
|
|
|
*/
|
|
|
|
void onTriggerSignalEvent(efitick_t nowNt);
|
2015-07-10 06:01:56 -07:00
|
|
|
EngineState engineState;
|
2017-03-06 23:24:57 -08:00
|
|
|
SensorsState sensors;
|
2019-01-19 19:31:55 -08:00
|
|
|
efitick_t lastTriggerToothEventTimeNt = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This coefficient translates ADC value directly into voltage adjusted according to
|
2018-11-03 06:44:34 -07:00
|
|
|
* voltage divider configuration with just one multiplication. This is a future (?) performance optimization.
|
2015-07-10 06:01:56 -07:00
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
float adcToVoltageInputDividerCoefficient = NAN;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This field is true if we are in 'cylinder cleanup' state right now
|
|
|
|
* see isCylinderCleanupEnabled
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
bool isCylinderCleanupMode = false;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* value of 'triggerShape.getLength()'
|
|
|
|
* pre-calculating this value is a performance optimization
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
uint32_t engineCycleEventCount = 0;
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* fast spark dwell time interpolation helper
|
|
|
|
* todo: finish the implementation and
|
|
|
|
*/
|
|
|
|
Table2D<DWELL_CURVE_SIZE> sparkTable;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* fast kg/hour MAF decoding lookup table with ~0.2 volt step
|
|
|
|
* This table is build based on MAF decoding curve
|
|
|
|
*/
|
|
|
|
float mafDecodingLookup[MAF_DECODING_CACHE_SIZE];
|
|
|
|
|
2019-01-04 21:57:09 -08:00
|
|
|
void preCalculate(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
void watchdog();
|
2017-06-24 22:35:46 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Needed by EFI_MAIN_RELAY_CONTROL to shut down the engine correctly.
|
|
|
|
*/
|
|
|
|
void checkShutdown();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Allows to finish some long-term shutdown procedures (stepper motor parking etc.)
|
|
|
|
Returns true if some operations are in progress on background.
|
|
|
|
*/
|
|
|
|
bool isInShutdownMode();
|
2015-07-10 06:01:56 -07:00
|
|
|
|
|
|
|
monitoring_timestamps_s m;
|
|
|
|
|
2019-01-04 21:57:09 -08:00
|
|
|
void knockLogic(float knockVolts DECLARE_ENGINE_PARAMETER_SUFFIX);
|
2015-07-10 06:01:56 -07:00
|
|
|
void printKnockState(void);
|
|
|
|
|
|
|
|
private:
|
|
|
|
/**
|
|
|
|
* By the way:
|
|
|
|
* 'cranking' means engine is not stopped and the rpm are below crankingRpm
|
|
|
|
* 'running' means RPM are above crankingRpm
|
|
|
|
* 'spinning' means the engine is not stopped
|
|
|
|
*/
|
2019-01-19 19:31:55 -08:00
|
|
|
bool isSpinning = false;
|
2019-01-19 18:10:58 -08:00
|
|
|
void reset();
|
2015-07-10 06:01:56 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 6 crossing over 50% TPS means pressing and releasing three times
|
|
|
|
*/
|
|
|
|
#define PUMPS_TO_PRIME 6
|
|
|
|
|
|
|
|
class StartupFuelPumping {
|
|
|
|
public:
|
|
|
|
StartupFuelPumping();
|
2017-05-15 20:33:22 -07:00
|
|
|
void update(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
2015-07-10 06:01:56 -07:00
|
|
|
bool isTpsAbove50;
|
|
|
|
int pumpsCounter;
|
|
|
|
private:
|
2017-05-15 18:25:32 -07:00
|
|
|
void setPumpsCounter(int newValue);
|
2015-07-10 06:01:56 -07:00
|
|
|
};
|
|
|
|
|
2017-05-15 20:33:22 -07:00
|
|
|
void prepareShapes(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
|
|
|
void resetConfigurationExt(Logging * logger, engine_type_e engineType DECLARE_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
void applyNonPersistentConfiguration(Logging * logger DECLARE_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
void prepareOutputSignals(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
2018-02-03 07:48:35 -08:00
|
|
|
|
2017-08-31 04:53:41 -07:00
|
|
|
void validateConfiguration(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
2019-01-19 19:09:37 -08:00
|
|
|
void doScheduleStopEngine(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
2015-07-10 06:01:56 -07:00
|
|
|
|
2019-01-20 20:38:41 -08:00
|
|
|
typedef void (*configuration_callback_t)(Engine*);
|
|
|
|
|
2016-08-01 19:04:24 -07:00
|
|
|
#endif /* H_ENGINE_H_ */
|