diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index 8d4fd510d1..d63e0dc299 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -458,7 +458,7 @@ static void updateVehicleSpeed() { #if EFI_VEHICLE_SPEED engine->outputChannels.vehicleSpeedKph = Sensor::getOrZero(SensorType::VehicleSpeed); engine->outputChannels.speedToRpmRatio = engine->module()->getGearboxRatio(); - engine->outputChannels.detectedGear = engine->module()->getCurrentGear(); + engine->outputChannels.detectedGear = Sensor::getOrZero(SensorType::DetectedGear); #endif /* EFI_VEHICLE_SPEED */ } diff --git a/firmware/controllers/actuators/gppwm/gppwm_channel.cpp b/firmware/controllers/actuators/gppwm/gppwm_channel.cpp index b4023ee79f..701628ffdd 100644 --- a/firmware/controllers/actuators/gppwm/gppwm_channel.cpp +++ b/firmware/controllers/actuators/gppwm/gppwm_channel.cpp @@ -68,7 +68,7 @@ expected readGppwmChannel(gppwm_channel_e channel) { return (float)engine->outputChannels.gppwmOutput[3]; case GPPWM_DetectedGear: #if EFI_VEHICLE_SPEED - return engine->module()->getCurrentGear(); + return Sensor::get(SensorType::DetectedGear); #else return 0; #endif // EFI_VEHICLE_SPEED diff --git a/firmware/controllers/algo/gear_detector.cpp b/firmware/controllers/algo/gear_detector.cpp index 95d87ebfba..1edeaf1670 100644 --- a/firmware/controllers/algo/gear_detector.cpp +++ b/firmware/controllers/algo/gear_detector.cpp @@ -4,6 +4,11 @@ static constexpr float geometricMean(float x, float y) { return sqrtf(x * y); } +GearDetector::GearDetector() + : StoredValueSensor(SensorType::DetectedGear, MS2NT(100)) +{ +} + void GearDetector::onConfigurationChange(engine_configuration_s const * /*previousConfig*/) { // Compute gear thresholds between gears @@ -44,7 +49,8 @@ void GearDetector::onSlowCallback() { float ratio = computeGearboxRatio(); m_gearboxRatio = ratio; - m_currentGear = determineGearFromRatio(ratio); + auto gear = determineGearFromRatio(ratio); + setValidValue(gear, getTimeNowNt()); } size_t GearDetector::determineGearFromRatio(float ratio) const { @@ -124,7 +130,3 @@ float GearDetector::getRpmInGear(size_t gear) const { float GearDetector::getGearboxRatio() const { return m_gearboxRatio; } - -size_t GearDetector::getCurrentGear() const { - return m_currentGear; -} diff --git a/firmware/controllers/algo/gear_detector.h b/firmware/controllers/algo/gear_detector.h index 0761279121..b6753426aa 100644 --- a/firmware/controllers/algo/gear_detector.h +++ b/firmware/controllers/algo/gear_detector.h @@ -1,15 +1,15 @@ #pragma once -class GearDetector : public EngineModule { +class GearDetector : public EngineModule, public StoredValueSensor { public: + GearDetector(); + void onSlowCallback() override; void onConfigurationChange(engine_configuration_s const * /*previousConfig*/) override; float getGearboxRatio() const; // Returns 0 for neutral, 1 for 1st, 5 for 5th, etc. - size_t getCurrentGear() const; - size_t determineGearFromRatio(float ratio) const; float getRpmInGear(size_t gear) const; diff --git a/firmware/controllers/lua/lua_hooks.cpp b/firmware/controllers/lua/lua_hooks.cpp index 6de5bb4723..1e86edf677 100644 --- a/firmware/controllers/lua/lua_hooks.cpp +++ b/firmware/controllers/lua/lua_hooks.cpp @@ -861,7 +861,7 @@ void configureRusefiLuaHooks(lua_State* l) { #if EFI_VEHICLE_SPEED lua_register(l, "getCurrentGear", [](lua_State* l) { - lua_pushinteger(l, engine->module()->getCurrentGear()); + lua_pushinteger(l, Sensor::getOrZero(SensorType::DetectedGear)); return 1; }); diff --git a/firmware/controllers/sensors/sensor_type.h b/firmware/controllers/sensors/sensor_type.h index 542ee6bef9..b2a48bfd24 100644 --- a/firmware/controllers/sensors/sensor_type.h +++ b/firmware/controllers/sensors/sensor_type.h @@ -90,6 +90,8 @@ enum class SensorType : unsigned char { MapSlow2, MapFast2, + DetectedGear, + // analog voltage inputs for Lua AuxAnalog1, AuxAnalog2, diff --git a/firmware/controllers/tcu/tcu.cpp b/firmware/controllers/tcu/tcu.cpp index 384a8d6eea..bdc7440ae6 100644 --- a/firmware/controllers/tcu/tcu.cpp +++ b/firmware/controllers/tcu/tcu.cpp @@ -41,7 +41,7 @@ void TransmissionControllerBase::measureShiftTime(gear_e gear) { } float TransmissionControllerBase::isShiftCompleted() { - if (m_shiftTime && m_shiftTimeGear == engine->module()->getCurrentGear()) { + if (m_shiftTime && m_shiftTimeGear == Sensor::getOrZero(SensorType::DetectedGear)) { m_shiftTime = false; return m_shiftTimer.getElapsedSeconds(); } else { diff --git a/unit_tests/tests/test_gear_detector.cpp b/unit_tests/tests/test_gear_detector.cpp index e6731b28c2..839f62600f 100644 --- a/unit_tests/tests/test_gear_detector.cpp +++ b/unit_tests/tests/test_gear_detector.cpp @@ -12,7 +12,7 @@ float GetGearRatioFor(float revPerKm, float axle, float kph, float rpm) { GearDetector dut; dut.onSlowCallback(); - return dut.getGearboxRatio(); + return dut.get().value_or(0); } TEST(GearDetector, ComputeGearRatio) {