From bf1221d16d1e94724592df630a273d781a022479 Mon Sep 17 00:00:00 2001 From: alxrMironov <30952168+alxrMironov@users.noreply.github.com> Date: Mon, 20 Sep 2021 03:50:11 +0300 Subject: [PATCH] Turbo speed sensor implementation #2935 (#3209) * Add turbocharger speed converter class * Add turbocharger speed converter tests * Add turbocharger speed sensor initialization functions * Add turbocharger speed sensor to initialization Co-authored-by: alxrMironov <330OMcorporative> Co-authored-by: rusefillc <48498823+rusefillc@users.noreply.github.com> --- .../converters/turbocharger_speed_converter.h | 17 +++++ firmware/init/init.h | 2 + firmware/init/init.mk | 1 + firmware/init/sensor/init_sensors.cpp | 3 + .../sensor/init_turbocharger_speed_sensor.cpp | 28 +++++++ .../test_turbocharger_speed_converter.cpp | 75 +++++++++++++++++++ unit_tests/tests/tests.mk | 2 + 7 files changed, 128 insertions(+) create mode 100644 firmware/controllers/sensors/converters/turbocharger_speed_converter.h create mode 100644 firmware/init/sensor/init_turbocharger_speed_sensor.cpp create mode 100644 unit_tests/tests/sensor/test_turbocharger_speed_converter.cpp diff --git a/firmware/controllers/sensors/converters/turbocharger_speed_converter.h b/firmware/controllers/sensors/converters/turbocharger_speed_converter.h new file mode 100644 index 0000000000..5753a82d76 --- /dev/null +++ b/firmware/controllers/sensors/converters/turbocharger_speed_converter.h @@ -0,0 +1,17 @@ +/** + * Frequency to RPM converter for turbocharger pin + */ + +#include "pch.h" +#include "sensor_converter_func.h" + +class TurbochargerSpeedConverter : public SensorConverter { +public: + DECLARE_ENGINE_PTR; + + SensorResult convert(float frequency) const override { + auto speed = frequency * engineConfiguration->turboSpeedSensorMultiplier; + return speed; + } +}; + diff --git a/firmware/init/init.h b/firmware/init/init.h index 424ce7c9dd..4f75d452aa 100644 --- a/firmware/init/init.h +++ b/firmware/init/init.h @@ -32,6 +32,7 @@ void initFuelLevel(DECLARE_CONFIG_PARAMETER_SIGNATURE); void initBaro(DECLARE_CONFIG_PARAMETER_SIGNATURE); void initAuxSensors(DECLARE_CONFIG_PARAMETER_SIGNATURE); void initVehicleSpeedSensor(DECLARE_ENGINE_PARAMETER_SIGNATURE); +void initTurbochargerSpeedSensor(DECLARE_ENGINE_PARAMETER_SIGNATURE); // Sensor reconfiguration void deinitVbatt(); @@ -40,3 +41,4 @@ void deinitThermistors(); void reconfigureOilPressure(DECLARE_CONFIG_PARAMETER_SIGNATURE); void deInitFlexSensor(); void deInitVehicleSpeedSensor(); +void deinitTurbochargerSpeedSensor(); diff --git a/firmware/init/init.mk b/firmware/init/init.mk index 5559b67c11..cd6d9d2417 100644 --- a/firmware/init/init.mk +++ b/firmware/init/init.mk @@ -13,3 +13,4 @@ INIT_SRC_CPP = $(PROJECT_DIR)/init/sensor/init_sensors.cpp \ $(PROJECT_DIR)/init/sensor/init_fuel_level.cpp \ $(PROJECT_DIR)/init/sensor/init_aux.cpp \ $(PROJECT_DIR)/init/sensor/init_vehicle_speed_sensor.cpp \ + $(PROJECT_DIR)/init/sensor/init_turbocharger_speed_sensor.cpp \ diff --git a/firmware/init/sensor/init_sensors.cpp b/firmware/init/sensor/init_sensors.cpp index b33d1d37d3..f05c12b522 100644 --- a/firmware/init/sensor/init_sensors.cpp +++ b/firmware/init/sensor/init_sensors.cpp @@ -64,6 +64,7 @@ void initNewSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE) { initBaro(PASS_CONFIG_PARAMETER_SIGNATURE); initAuxSensors(PASS_CONFIG_PARAMETER_SIGNATURE); initVehicleSpeedSensor(PASS_ENGINE_PARAMETER_SIGNATURE); + initTurbochargerSpeedSensor(PASS_ENGINE_PARAMETER_SIGNATURE); #if !EFI_UNIT_TEST initFuelLevel(PASS_CONFIG_PARAMETER_SIGNATURE); @@ -84,6 +85,7 @@ void stopSensors(DECLARE_CONFIG_PARAMETER_SIGNATURE) { deinitThermistors(); deInitFlexSensor(); deInitVehicleSpeedSensor(); + deinitTurbochargerSpeedSensor(); } void reconfigureSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE) { @@ -94,6 +96,7 @@ void reconfigureSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE) { initThermistors(PASS_CONFIG_PARAMETER_SIGNATURE); initFlexSensor(PASS_CONFIG_PARAMETER_SIGNATURE); initVehicleSpeedSensor(PASS_ENGINE_PARAMETER_SIGNATURE); + initTurbochargerSpeedSensor(PASS_ENGINE_PARAMETER_SIGNATURE); initOldAnalogInputs(PASS_CONFIG_PARAMETER_SIGNATURE); } diff --git a/firmware/init/sensor/init_turbocharger_speed_sensor.cpp b/firmware/init/sensor/init_turbocharger_speed_sensor.cpp new file mode 100644 index 0000000000..22306a9e30 --- /dev/null +++ b/firmware/init/sensor/init_turbocharger_speed_sensor.cpp @@ -0,0 +1,28 @@ +#include "pch.h" + +#include "init.h" +#include "frequency_sensor.h" +#include "turbocharger_speed_converter.h" + +static FrequencySensor turbochargerSpeedSensor(SensorType::VehicleSpeed, MS2NT(500)); +static TurbochargerSpeedConverter turbochargerSpeedConverter; + + +void initTurbochargerSpeedSensor(DECLARE_ENGINE_PARAMETER_SIGNATURE) { + INJECT_ENGINE_REFERENCE(&turbochargerSpeedConverter); + + auto pin = CONFIG(turboSpeedSensorInputPin); + + // Nothing to do if no sensor configured + if (!isBrainPinValid(pin)) { + return; + } + + turbochargerSpeedSensor.setFunction(turbochargerSpeedConverter); + turbochargerSpeedSensor.init(pin, "tcss"); + turbochargerSpeedSensor.Register(); +} + +void deinitTurbochargerSpeedSensor() { + turbochargerSpeedSensor.deInit(); +} \ No newline at end of file diff --git a/unit_tests/tests/sensor/test_turbocharger_speed_converter.cpp b/unit_tests/tests/sensor/test_turbocharger_speed_converter.cpp new file mode 100644 index 0000000000..482eb54eaa --- /dev/null +++ b/unit_tests/tests/sensor/test_turbocharger_speed_converter.cpp @@ -0,0 +1,75 @@ +#include "pch.h" +#include "turbocharger_speed_converter.h" + +static constexpr engine_type_e ENGINE_TEST_HELPER = TEST_ENGINE; + +class TurbochargerSpeedConverterTest : public ::testing::Test { + +public: + TurbochargerSpeedConverter dut; + + TurbochargerSpeedConverterTest(){ + + } + + void SetUp() override { + WITH_ENGINE_TEST_HELPER(ENGINE_TEST_HELPER); + INJECT_ENGINE_REFERENCE(&dut); + } + + void SetCoef(float new_coef) { + dut.engineConfiguration->turboSpeedSensorMultiplier = new_coef; + } + + float GetFrequencyBySpeedAndCoef(float speed, float coef) { + return (speed / coef); + } + + void TestForSpeedWithCoef(float expectedSpeed, float coef) + { + SetCoef(coef); + auto inputFreq = GetFrequencyBySpeedAndCoef(expectedSpeed, coef); + auto result = dut.convert(inputFreq); + ASSERT_TRUE(result.Valid); + ASSERT_NEAR(expectedSpeed, result.Value, 0.01f); + } +}; + +/* + * Converter must return valid and expected result for setted coef + */ +TEST_F(TurbochargerSpeedConverterTest, returnExpectedResultForSettedCoef) { + + TestForSpeedWithCoef(0.0f, 0.5f); + TestForSpeedWithCoef(0.5f, 0.5f); + TestForSpeedWithCoef(10.0f, 0.5f); + TestForSpeedWithCoef(0.0f, 10.0f); + TestForSpeedWithCoef(0.5f, 10.0f); + TestForSpeedWithCoef(10.0f, 10.0f); +} + +/* + * Converter must always return strong float zero if coef == 0.0f + */ +TEST_F(TurbochargerSpeedConverterTest, zeroCoefReturnsZeroSpeedOnAnyInput) { + + SetCoef(0.0f); + + { + auto result = dut.convert(0.0f); + ASSERT_TRUE(result.Valid); + ASSERT_FLOAT_EQ(0.0f, result.Value); + } + + { + auto result = dut.convert(0.5f); + ASSERT_TRUE(result.Valid); + ASSERT_FLOAT_EQ(0.0f, result.Value); + } + + { + auto result = dut.convert(10.0f); + ASSERT_TRUE(result.Valid); + ASSERT_FLOAT_EQ(0.0f, result.Value); + } +} \ No newline at end of file diff --git a/unit_tests/tests/tests.mk b/unit_tests/tests/tests.mk index f612f41075..833df499f8 100644 --- a/unit_tests/tests/tests.mk +++ b/unit_tests/tests/tests.mk @@ -85,6 +85,8 @@ TESTS_SRC_CPP = \ tests/trigger/test_all_triggers.cpp \ tests/test_stepper.cpp \ tests/sensor/test_frequency_sensor.cpp \ + tests/sensor/test_turbocharger_speed_converter.cpp \ tests/sensor/test_vehicle_speed_converter.cpp +