diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index 13863bdc1c..bde1bd4b7e 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -611,11 +611,7 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_ tsOutputChannels->currentTargetAfr = ENGINE(engineState.targetAFR); tsOutputChannels->targetLambda = ENGINE(engineState.targetLambda); - if (hasMapSensor(PASS_ENGINE_PARAMETER_SIGNATURE)) { - float mapValue = getMap(PASS_ENGINE_PARAMETER_SIGNATURE); - // offset 40 - tsOutputChannels->manifoldAirPressure = mapValue; - } + tsOutputChannels->manifoldAirPressure = Sensor::get(SensorType::Map).value_or(0); #if EFI_DYNO_VIEW tsOutputChannels->VssAcceleration = getDynoviewAcceleration(PASS_ENGINE_PARAMETER_SIGNATURE); diff --git a/firmware/controllers/actuators/boost_control.cpp b/firmware/controllers/actuators/boost_control.cpp index 9aa80944e7..16aea27014 100644 --- a/firmware/controllers/actuators/boost_control.cpp +++ b/firmware/controllers/actuators/boost_control.cpp @@ -14,7 +14,6 @@ #include "engine.h" #include "boost_control.h" #include "sensor.h" -#include "map.h" #include "pin_repository.h" #include "pwm_generator_logic.h" #include "pid_auto_tune.h" @@ -57,13 +56,7 @@ int BoostController::getPeriodMs() { } expected BoostController::observePlant() const { - float map = getMap(PASS_ENGINE_PARAMETER_SIGNATURE); - - if (cisnan(map)) { - return unexpected; - } - - return map; + return Sensor::get(SensorType::Map); } expected BoostController::getSetpoint() const { diff --git a/firmware/controllers/actuators/gppwm/gppwm_channel.cpp b/firmware/controllers/actuators/gppwm/gppwm_channel.cpp index d9cc91650f..afcf4d769c 100644 --- a/firmware/controllers/actuators/gppwm/gppwm_channel.cpp +++ b/firmware/controllers/actuators/gppwm/gppwm_channel.cpp @@ -6,7 +6,6 @@ #include "table_helper.h" #include "expected.h" #include "sensor.h" -#include "map.h" #include "engine_math.h" EXTERN_ENGINE; @@ -16,13 +15,7 @@ expected readGppwmChannel(gppwm_channel_e channel DECLARE_ENGINE_PARAMETE case GPPWM_Tps: return Sensor::get(SensorType::Tps1); case GPPWM_Map: { - float map = getMap(PASS_ENGINE_PARAMETER_SIGNATURE); - - if (cisnan(map)) { - return unexpected; - } - - return map; + return Sensor::get(SensorType::Map); } case GPPWM_Clt: return Sensor::get(SensorType::Clt); diff --git a/firmware/controllers/algo/airmass/airmass.cpp b/firmware/controllers/algo/airmass/airmass.cpp index b47a8aac5c..a7116ee2db 100644 --- a/firmware/controllers/algo/airmass/airmass.cpp +++ b/firmware/controllers/algo/airmass/airmass.cpp @@ -1,6 +1,5 @@ #include "airmass.h" #include "sensor.h" -#include "map.h" EXTERN_ENGINE; @@ -9,7 +8,7 @@ AirmassModelBase::AirmassModelBase(const ValueProvider3D& veTable) : m_veTable(& float AirmassModelBase::getVeLoadAxis(float passedLoad) const { switch(CONFIG(veOverrideMode)) { case VE_None: return passedLoad; - case VE_MAP: return getMap(PASS_ENGINE_PARAMETER_SIGNATURE); + case VE_MAP: return Sensor::get(SensorType::Map).value_or(0); case VE_TPS: return Sensor::get(SensorType::Tps1).value_or(0); default: return 0; } diff --git a/firmware/controllers/can/can_verbose.cpp b/firmware/controllers/can/can_verbose.cpp index 5b9edafe8a..32eb52fca2 100644 --- a/firmware/controllers/can/can_verbose.cpp +++ b/firmware/controllers/can/can_verbose.cpp @@ -97,7 +97,7 @@ struct Sensors1 { }; static void populateFrame(Sensors1& msg) { - msg.map = getMap(); + msg.map = Sensor::get(SensorType::Map).value_or(0); msg.clt = Sensor::get(SensorType::Clt).value_or(0) + PACK_ADD_TEMPERATURE; msg.iat = Sensor::get(SensorType::Iat).value_or(0) + PACK_ADD_TEMPERATURE; diff --git a/firmware/controllers/sensors/map.h b/firmware/controllers/sensors/map.h index 8c9789bf5a..9ee24a9098 100644 --- a/firmware/controllers/sensors/map.h +++ b/firmware/controllers/sensors/map.h @@ -6,7 +6,10 @@ #pragma once -#include "engine_configuration.h" +#include "engine_ptr.h" + +class Logging; +struct air_pressure_sensor_config_s; void initMapDecoder(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX); diff --git a/firmware/init/init.h b/firmware/init/init.h index 20937400ba..7a1ee8d415 100644 --- a/firmware/init/init.h +++ b/firmware/init/init.h @@ -19,6 +19,7 @@ void reconfigureSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE); // Internal init functions for individual systems // Sensor init/config +void initMap(DECLARE_ENGINE_PARAMETER_SIGNATURE); void initTps(DECLARE_CONFIG_PARAMETER_SIGNATURE); void initOilPressure(DECLARE_CONFIG_PARAMETER_SIGNATURE); void initThermistors(DECLARE_CONFIG_PARAMETER_SIGNATURE); diff --git a/firmware/init/init.mk b/firmware/init/init.mk index e54179f8d4..652b034b5b 100644 --- a/firmware/init/init.mk +++ b/firmware/init/init.mk @@ -5,3 +5,4 @@ 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_map.cpp \ diff --git a/firmware/init/sensor/init_map.cpp b/firmware/init/sensor/init_map.cpp new file mode 100644 index 0000000000..47ee9327ce --- /dev/null +++ b/firmware/init/sensor/init_map.cpp @@ -0,0 +1,26 @@ +#include "map.h" +#include "function_pointer_sensor.h" +#include "engine.h" + +EXTERN_ENGINE; + +struct GetMapWrapper { + DECLARE_ENGINE_PTR; + + float getMap() { + return ::getMap(PASS_ENGINE_PARAMETER_SIGNATURE); + } +}; + +static GetMapWrapper mapWrapper; + +static FunctionPointerSensor mapSensor(SensorType::Map, +[]() { + return mapWrapper.getMap(); +}); + +void initMap(DECLARE_ENGINE_PARAMETER_SIGNATURE) { + INJECT_ENGINE_REFERENCE(&mapWrapper); + + mapSensor.Register(); +} diff --git a/firmware/init/sensor/init_sensors.cpp b/firmware/init/sensor/init_sensors.cpp index ffbc273337..e93756d3e4 100644 --- a/firmware/init/sensor/init_sensors.cpp +++ b/firmware/init/sensor/init_sensors.cpp @@ -13,6 +13,7 @@ void initNewSensors(Logging* logger DECLARE_ENGINE_PARAMETER_SUFFIX) { initCanSensors(); #endif + initMap(PASS_ENGINE_PARAMETER_SIGNATURE); initTps(PASS_CONFIG_PARAMETER_SIGNATURE); initOilPressure(PASS_CONFIG_PARAMETER_SIGNATURE); initThermistors(PASS_CONFIG_PARAMETER_SIGNATURE); diff --git a/unit_tests/tests/sensor/test_sensor_init.cpp b/unit_tests/tests/sensor/test_sensor_init.cpp index fe37d36e28..68c8200ed1 100644 --- a/unit_tests/tests/sensor/test_sensor_init.cpp +++ b/unit_tests/tests/sensor/test_sensor_init.cpp @@ -218,3 +218,15 @@ TEST(SensorInit, Lambda) { auto s = Sensor::getSensorOfType(SensorType::Lambda1); ASSERT_NE(nullptr, s); } + +TEST(SensorInit, Map) { + WITH_ENGINE_TEST_HELPER(TEST_ENGINE); + + initMap(PASS_ENGINE_PARAMETER_SIGNATURE); + + auto s = Sensor::getSensorOfType(SensorType::Map); + ASSERT_NE(nullptr, s); + + engine->mockMapValue = 55; + EXPECT_FLOAT_EQ(55.0f, Sensor::get(SensorType::Map).value_or(0)); +} diff --git a/unit_tests/tests/test_boost.cpp b/unit_tests/tests/test_boost.cpp index 10b8649be6..8d16829f56 100644 --- a/unit_tests/tests/test_boost.cpp +++ b/unit_tests/tests/test_boost.cpp @@ -40,12 +40,12 @@ TEST(BoostControl, ObservePlant) { BoostController bc; INJECT_ENGINE_REFERENCE(&bc); - engine->mockMapValue = NAN; + Sensor::resetMockValue(SensorType::Map); // Check that invalid MAP returns unexpected EXPECT_EQ(bc.observePlant(), unexpected); // Test valid MAP value - engine->mockMapValue = 150.0f; + Sensor::setMockValue(SensorType::Map, 150); EXPECT_FLOAT_EQ(bc.observePlant().value_or(0), 150.0f); }