From 4474f9f1c2d9a8ba9574728ae21c3b05304f4c36 Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Sun, 9 May 2021 17:59:06 -0700 Subject: [PATCH] Maf in sensor model (#2672) * init * consumers * hasMafSensor * consumers * remove * remove * s * guard * tiny bit of ram * ram --- firmware/console/status_loop.cpp | 6 ++-- .../controllers/algo/airmass/maf_airmass.cpp | 2 +- firmware/controllers/can/obd2.cpp | 2 +- firmware/controllers/core/fsio_impl.cpp | 2 +- firmware/controllers/engine_controller.cpp | 2 +- .../controllers/gauges/lcd_controller.cpp | 8 ++--- firmware/controllers/math/engine_math.cpp | 2 +- firmware/controllers/sensors/maf.cpp | 21 ------------ firmware/controllers/sensors/maf.h | 6 +--- firmware/init/init.h | 1 + firmware/init/init.mk | 1 + firmware/init/sensor/init_maf.cpp | 34 +++++++++++++++++++ firmware/init/sensor/init_sensors.cpp | 1 + firmware/integration/rusefi_config.txt | 2 +- .../tests/trigger/test_trigger_decoder.cpp | 8 ----- 15 files changed, 50 insertions(+), 48 deletions(-) create mode 100644 firmware/init/sensor/init_maf.cpp diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index 054b0970c7..cfd864e383 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -154,7 +154,7 @@ static int packEngineMode(DECLARE_ENGINE_PARAMETER_SIGNATURE) { } static float getAirFlowGauge(DECLARE_ENGINE_PARAMETER_SIGNATURE) { - return hasMafSensor() ? getRealMaf(PASS_ENGINE_PARAMETER_SIGNATURE) : engine->engineState.airFlow; + return Sensor::get(SensorType::Maf).value_or(engine->engineState.airFlow); } void writeLogLine(Writer& buffer) { @@ -531,9 +531,7 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_ tsOutputChannels->rawOilPressure = Sensor::getRaw(SensorType::OilPressure); tsOutputChannels->rawLowFuelPressure = Sensor::getRaw(SensorType::FuelPressureLow); tsOutputChannels->rawHighFuelPressure = Sensor::getRaw(SensorType::FuelPressureHigh); - - // offset 16 - tsOutputChannels->massAirFlowVoltage = hasMafSensor() ? getMafVoltage(PASS_ENGINE_PARAMETER_SIGNATURE) : 0; + tsOutputChannels->massAirFlowVoltage = Sensor::getRaw(SensorType::Maf); float lambdaValue = Sensor::get(SensorType::Lambda1).value_or(0); tsOutputChannels->lambda = lambdaValue; diff --git a/firmware/controllers/algo/airmass/maf_airmass.cpp b/firmware/controllers/algo/airmass/maf_airmass.cpp index ce263d98a3..42a6c6a09c 100644 --- a/firmware/controllers/algo/airmass/maf_airmass.cpp +++ b/firmware/controllers/algo/airmass/maf_airmass.cpp @@ -6,7 +6,7 @@ EXTERN_ENGINE; AirmassResult MafAirmass::getAirmass(int rpm) { - float maf = getRealMaf(PASS_ENGINE_PARAMETER_SIGNATURE) + engine->engineLoadAccelEnrichment.getEngineLoadEnrichment(PASS_ENGINE_PARAMETER_SIGNATURE); + float maf = Sensor::get(SensorType::Maf).value_or(0) + engine->engineLoadAccelEnrichment.getEngineLoadEnrichment(PASS_ENGINE_PARAMETER_SIGNATURE); return getAirmassImpl(maf, rpm); } diff --git a/firmware/controllers/can/obd2.cpp b/firmware/controllers/can/obd2.cpp index 993a41632f..ae7a411f56 100644 --- a/firmware/controllers/can/obd2.cpp +++ b/firmware/controllers/can/obd2.cpp @@ -156,7 +156,7 @@ static void handleGetDataRequest(const CANRxFrame& rx) { obdSendValue(_1_MODE, pid, 1, Sensor::get(SensorType::Iat).value_or(0) + ODB_TEMP_EXTRA); break; case PID_INTAKE_MAF: - obdSendValue(_1_MODE, pid, 2, getRealMaf(PASS_ENGINE_PARAMETER_SIGNATURE) * 100.0f); // grams/sec (A*256+B)/100 + obdSendValue(_1_MODE, pid, 2, Sensor::get(SensorType::Maf).value_or(0) * 100.0f); // grams/sec (A*256+B)/100 break; case PID_THROTTLE: obdSendValue(_1_MODE, pid, 1, Sensor::get(SensorType::Tps1).value_or(0) * ODB_TPS_BYTE_PERCENT); // (A*100/255) diff --git a/firmware/controllers/core/fsio_impl.cpp b/firmware/controllers/core/fsio_impl.cpp index 21142ab276..73000a93b3 100644 --- a/firmware/controllers/core/fsio_impl.cpp +++ b/firmware/controllers/core/fsio_impl.cpp @@ -135,7 +135,7 @@ FsioResult getEngineValue(le_action_e action DECLARE_ENGINE_PARAMETER_SUFFIX) { case LE_METHOD_RPM: return Sensor::get(SensorType::Rpm).value_or(0); case LE_METHOD_MAF: - return getRealMaf(PASS_ENGINE_PARAMETER_SIGNATURE); + return Sensor::get(SensorType::Maf).value_or(0); case LE_METHOD_MAP: return Sensor::get(SensorType::Map).value_or(0); #if EFI_SHAFT_POSITION_INPUT diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index cc7d5d2b84..2cb09d2eaa 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -702,7 +702,7 @@ void initEngineContoller(DECLARE_ENGINE_PARAMETER_SUFFIX) { * UNUSED_SIZE constants. */ #ifndef RAM_UNUSED_SIZE -#define RAM_UNUSED_SIZE 4000 +#define RAM_UNUSED_SIZE 3900 #endif #ifndef CCM_UNUSED_SIZE #define CCM_UNUSED_SIZE 300 diff --git a/firmware/controllers/gauges/lcd_controller.cpp b/firmware/controllers/gauges/lcd_controller.cpp index 5955810e77..8e50475e30 100644 --- a/firmware/controllers/gauges/lcd_controller.cpp +++ b/firmware/controllers/gauges/lcd_controller.cpp @@ -234,15 +234,15 @@ static void showLine(lcd_line_e line, int /*screenY*/) { } return; case LL_MAF_V: - if (hasMafSensor()) { - lcdPrintf("MAF: %.2fv", getMafVoltage(PASS_ENGINE_PARAMETER_SIGNATURE)); + if (Sensor::hasSensor(SensorType::Maf)) { + lcdPrintf("MAF: %.2fv", Sensor::getRaw(SensorType::Maf)); } else { lcdPrintf("MAF: none"); } return; case LL_MAF_KG_HR: - if (hasMafSensor()) { - lcdPrintf("MAF: %.2f kg/hr", getRealMaf(PASS_ENGINE_PARAMETER_SIGNATURE)); + if (Sensor::hasSensor(SensorType::Maf)) { + lcdPrintf("MAF: %.2f kg/hr", Sensor::get(SensorType::Maf).value_or(0)); } else { lcdPrintf("MAF: none"); } diff --git a/firmware/controllers/math/engine_math.cpp b/firmware/controllers/math/engine_math.cpp index fd0ae531e6..6f44e7259d 100644 --- a/firmware/controllers/math/engine_math.cpp +++ b/firmware/controllers/math/engine_math.cpp @@ -70,7 +70,7 @@ float getEngineLoadT(DECLARE_ENGINE_PARAMETER_SIGNATURE) { case LM_ALPHA_N: return Sensor::get(SensorType::Tps1).value_or(0); case LM_REAL_MAF: - return getRealMaf(PASS_ENGINE_PARAMETER_SIGNATURE); + return Sensor::get(SensorType::Maf).value_or(0); default: firmwareError(CUSTOM_UNKNOWN_ALGORITHM, "Unexpected engine load parameter: %d", engineConfiguration->fuelAlgorithm); return 0; diff --git a/firmware/controllers/sensors/maf.cpp b/firmware/controllers/sensors/maf.cpp index 8cebdcde16..ce9be0c7a5 100644 --- a/firmware/controllers/sensors/maf.cpp +++ b/firmware/controllers/sensors/maf.cpp @@ -1,30 +1,9 @@ #include "global.h" #include "engine.h" -#include "adc_inputs.h" #include "maf.h" EXTERN_ENGINE; -/** - * @return MAF sensor voltage - */ -float getMafVoltage(DECLARE_ENGINE_PARAMETER_SIGNATURE) { - return getVoltageDivided("maf", engineConfiguration->mafAdcChannel PASS_ENGINE_PARAMETER_SUFFIX); -} - -bool hasMafSensor(DECLARE_ENGINE_PARAMETER_SIGNATURE) { - return isAdcChannelValid(engineConfiguration->mafAdcChannel); -} - -/** - * @return kg/hour value - */ -float getRealMaf(DECLARE_ENGINE_PARAMETER_SIGNATURE) { - float volts = getMafVoltage(PASS_ENGINE_PARAMETER_SIGNATURE); - - return interpolate2d(volts, config->mafDecodingBins, config->mafDecoding); -} - static void fillTheRest(persistent_config_s *e, int i) { /** * unrealistic values just to make binary search happy diff --git a/firmware/controllers/sensors/maf.h b/firmware/controllers/sensors/maf.h index 2ea39b4efa..a3e1ba5edf 100644 --- a/firmware/controllers/sensors/maf.h +++ b/firmware/controllers/sensors/maf.h @@ -11,11 +11,7 @@ #pragma once -#include "global.h" - -float getMafVoltage(DECLARE_ENGINE_PARAMETER_SIGNATURE); -bool hasMafSensor(DECLARE_ENGINE_PARAMETER_SIGNATURE); -float getRealMaf(DECLARE_ENGINE_PARAMETER_SIGNATURE); +#include "engine_ptr.h" void setBosch0280218037(persistent_config_s *engineConfiguration); void setBosch0280218004(persistent_config_s *engineConfiguration); diff --git a/firmware/init/init.h b/firmware/init/init.h index 6bda9b0b32..9ef5688fae 100644 --- a/firmware/init/init.h +++ b/firmware/init/init.h @@ -18,6 +18,7 @@ void reconfigureSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE); // Internal init functions for individual systems // Sensor init/config void initVbatt(DECLARE_CONFIG_PARAMETER_SIGNATURE); +void initMaf(DECLARE_CONFIG_PARAMETER_SIGNATURE); void initMap(DECLARE_ENGINE_PARAMETER_SIGNATURE); void initTps(DECLARE_CONFIG_PARAMETER_SIGNATURE); void initOilPressure(DECLARE_CONFIG_PARAMETER_SIGNATURE); diff --git a/firmware/init/init.mk b/firmware/init/init.mk index 3c569b294c..700b604fa3 100644 --- a/firmware/init/init.mk +++ b/firmware/init/init.mk @@ -5,6 +5,7 @@ INIT_SRC_CPP = $(PROJECT_DIR)/init/sensor/init_sensors.cpp \ $(PROJECT_DIR)/init/sensor/init_can_sensors.cpp \ $(PROJECT_DIR)/init/sensor/init_thermistors.cpp \ $(PROJECT_DIR)/init/sensor/init_lambda.cpp \ + $(PROJECT_DIR)/init/sensor/init_maf.cpp \ $(PROJECT_DIR)/init/sensor/init_map.cpp \ $(PROJECT_DIR)/init/sensor/init_flex.cpp \ $(PROJECT_DIR)/init/sensor/init_vbatt.cpp \ diff --git a/firmware/init/sensor/init_maf.cpp b/firmware/init/sensor/init_maf.cpp new file mode 100644 index 0000000000..d49a04d477 --- /dev/null +++ b/firmware/init/sensor/init_maf.cpp @@ -0,0 +1,34 @@ +#include "init.h" +#include "adc_inputs.h" +#include "adc_subscription.h" +#include "engine_configuration.h" +#include "functional_sensor.h" +#include "table_func.h" + +EXTERN_CONFIG; + +static FunctionalSensor maf(SensorType::Maf, /* timeout = */ MS2NT(50)); + +#if !EFI_UNIT_TEST +// extract the type of the elements in the bin/value arrays +using BinType = std::remove_extent_tmafDecodingBins)>; +using ValueType = std::remove_extent_tmafDecoding)>; + +// This function converts volts -> kg/h +static TableFunc + + mafCurve(config->mafDecodingBins, config->mafDecoding); + +void initMaf(DECLARE_CONFIG_PARAMETER_SIGNATURE) { + adc_channel_e channel = CONFIG(mafAdcChannel); + + if (!isAdcChannelValid(channel)) { + return; + } + + maf.setFunction(mafCurve); + + AdcSubscription::SubscribeSensor(maf, channel, /*lowpassCutoff =*/ 50); + maf.Register(); +} +#endif // ! EFI_UNIT_TEST diff --git a/firmware/init/sensor/init_sensors.cpp b/firmware/init/sensor/init_sensors.cpp index 1550a6b988..b058f559cd 100644 --- a/firmware/init/sensor/init_sensors.cpp +++ b/firmware/init/sensor/init_sensors.cpp @@ -25,6 +25,7 @@ void initNewSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE) { #if !EFI_UNIT_TEST initFuelLevel(PASS_CONFIG_PARAMETER_SIGNATURE); + initMaf(PASS_CONFIG_PARAMETER_SIGNATURE); #endif // Init CLI functionality for sensors (mocking) diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index cfe799b58f..e67e1fd619 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -688,7 +688,7 @@ custom spi_device_e 1 bits, U08, @OFFSET@, [0:2], "Off", "SPI1", "SPI2", "SPI3 spi_device_e hip9011SpiDevice; uint8_t failedMapFallback;+This value is only used for speed density fueling calculations.;"kPa", 1, 0, 0, 100, 0 uint8_t unused542;;"unit", 1, 0, 0, 100, 0 - adc_channel_e mafAdcChannel;See hasMafSensor + adc_channel_e mafAdcChannel float globalFuelCorrection;set global_fuel_correction X;"coef", 1, 0.0, 0, 1000.0, 2 diff --git a/unit_tests/tests/trigger/test_trigger_decoder.cpp b/unit_tests/tests/trigger/test_trigger_decoder.cpp index d69f2f4fdd..588f073648 100644 --- a/unit_tests/tests/trigger/test_trigger_decoder.cpp +++ b/unit_tests/tests/trigger/test_trigger_decoder.cpp @@ -672,18 +672,10 @@ static void setTestBug299(EngineTestHelper *eth) { ASSERT_EQ( 1, engine->engineState.running.coolantTemperatureCoefficient) << "cltC"; ASSERT_EQ( 0, engine->engineState.running.injectorLag) << "lag"; - engineConfiguration->mafAdcChannel = EFI_ADC_10; - engine->engineState.mockAdcState.setMockVoltage(EFI_ADC_10, 0 PASS_ENGINE_PARAMETER_SUFFIX); - - ASSERT_EQ( 0, getMafVoltage(PASS_ENGINE_PARAMETER_SIGNATURE)) << "maf"; - ASSERT_EQ( 3000, GET_RPM()) << "setTestBug299: RPM"; assertEqualsM("fuel#1", 1.5, engine->injectionDuration); assertEqualsM("duty for maf=0", 7.5, getInjectorDutyCycle(GET_RPM() PASS_ENGINE_PARAMETER_SUFFIX)); - - engine->engineState.mockAdcState.setMockVoltage(EFI_ADC_10, 3 PASS_ENGINE_PARAMETER_SUFFIX); - ASSERT_EQ( 3, getMafVoltage(PASS_ENGINE_PARAMETER_SIGNATURE)) << "maf"; } static void assertInjectors(const char *msg, int value0, int value1) {