Maf in sensor model (#2672)

* init

* consumers

* hasMafSensor

* consumers

* remove

* remove

* s

* guard

* tiny bit of ram

* ram
This commit is contained in:
Matthew Kennedy 2021-05-09 17:59:06 -07:00 committed by GitHub
parent f0de0d8718
commit 4474f9f1c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 50 additions and 48 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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");
}

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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 \

View File

@ -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_t<decltype(config->mafDecodingBins)>;
using ValueType = std::remove_extent_t<decltype(config->mafDecoding)>;
// This function converts volts -> kg/h
static TableFunc
<BinType, ValueType, MAF_DECODING_COUNT>
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

View File

@ -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)

View File

@ -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

View File

@ -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) {