gear detection in to the sensor model

This commit is contained in:
Matthew Kennedy 2023-04-01 23:08:06 -07:00
parent cb7c3e72ba
commit 82794403f8
8 changed files with 17 additions and 13 deletions

View File

@ -433,7 +433,7 @@ static void updateVehicleSpeed() {
#if EFI_VEHICLE_SPEED #if EFI_VEHICLE_SPEED
engine->outputChannels.vehicleSpeedKph = Sensor::getOrZero(SensorType::VehicleSpeed); engine->outputChannels.vehicleSpeedKph = Sensor::getOrZero(SensorType::VehicleSpeed);
engine->outputChannels.speedToRpmRatio = engine->module<GearDetector>()->getGearboxRatio(); engine->outputChannels.speedToRpmRatio = engine->module<GearDetector>()->getGearboxRatio();
engine->outputChannels.detectedGear = engine->module<GearDetector>()->getCurrentGear(); engine->outputChannels.detectedGear = Sensor::getOrZero(SensorType::DetectedGear);
#endif /* EFI_VEHICLE_SPEED */ #endif /* EFI_VEHICLE_SPEED */
} }

View File

@ -67,7 +67,7 @@ expected<float> readGppwmChannel(gppwm_channel_e channel) {
case GPPWM_GppwmOutput4: case GPPWM_GppwmOutput4:
return (float)engine->outputChannels.gppwmOutput[3]; return (float)engine->outputChannels.gppwmOutput[3];
case GPPWM_DetectedGear: case GPPWM_DetectedGear:
return engine->module<GearDetector>()->getCurrentGear(); return Sensor::get(SensorType::DetectedGear);
} }
return unexpected; return unexpected;

View File

@ -4,6 +4,11 @@ static constexpr float geometricMean(float x, float y) {
return sqrtf(x * y); return sqrtf(x * y);
} }
GearDetector::GearDetector()
: StoredValueSensor(SensorType::DetectedGear, MS2NT(100))
{
}
void GearDetector::onConfigurationChange(engine_configuration_s const * /*previousConfig*/) { void GearDetector::onConfigurationChange(engine_configuration_s const * /*previousConfig*/) {
// Compute gear thresholds between gears // Compute gear thresholds between gears
@ -44,7 +49,8 @@ void GearDetector::onSlowCallback() {
float ratio = computeGearboxRatio(); float ratio = computeGearboxRatio();
m_gearboxRatio = ratio; m_gearboxRatio = ratio;
m_currentGear = determineGearFromRatio(ratio); auto gear = determineGearFromRatio(ratio);
setValidValue(gear, getTimeNowNt());
} }
size_t GearDetector::determineGearFromRatio(float ratio) const { size_t GearDetector::determineGearFromRatio(float ratio) const {
@ -124,7 +130,3 @@ float GearDetector::getRpmInGear(size_t gear) const {
float GearDetector::getGearboxRatio() const { float GearDetector::getGearboxRatio() const {
return m_gearboxRatio; return m_gearboxRatio;
} }
size_t GearDetector::getCurrentGear() const {
return m_currentGear;
}

View File

@ -1,15 +1,15 @@
#pragma once #pragma once
class GearDetector : public EngineModule { class GearDetector : public EngineModule, public StoredValueSensor {
public: public:
GearDetector();
void onSlowCallback() override; void onSlowCallback() override;
void onConfigurationChange(engine_configuration_s const * /*previousConfig*/) override; void onConfigurationChange(engine_configuration_s const * /*previousConfig*/) override;
float getGearboxRatio() const; float getGearboxRatio() const;
// Returns 0 for neutral, 1 for 1st, 5 for 5th, etc. // Returns 0 for neutral, 1 for 1st, 5 for 5th, etc.
size_t getCurrentGear() const;
size_t determineGearFromRatio(float ratio) const; size_t determineGearFromRatio(float ratio) const;
float getRpmInGear(size_t gear) const; float getRpmInGear(size_t gear) const;

View File

@ -861,7 +861,7 @@ void configureRusefiLuaHooks(lua_State* l) {
#if EFI_VEHICLE_SPEED #if EFI_VEHICLE_SPEED
lua_register(l, "getCurrentGear", [](lua_State* l) { lua_register(l, "getCurrentGear", [](lua_State* l) {
lua_pushinteger(l, engine->module<GearDetector>()->getCurrentGear()); lua_pushinteger(l, Sensor::getOrZero(SensorType::DetectedGear));
return 1; return 1;
}); });

View File

@ -89,6 +89,8 @@ enum class SensorType : unsigned char {
MapSlow2, MapSlow2,
MapFast2, MapFast2,
DetectedGear,
// analog voltage inputs for Lua // analog voltage inputs for Lua
AuxAnalog1, AuxAnalog1,
AuxAnalog2, AuxAnalog2,

View File

@ -41,7 +41,7 @@ void TransmissionControllerBase::measureShiftTime(gear_e gear) {
} }
float TransmissionControllerBase::isShiftCompleted() { float TransmissionControllerBase::isShiftCompleted() {
if (m_shiftTime && m_shiftTimeGear == engine->module<GearDetector>()->getCurrentGear()) { if (m_shiftTime && m_shiftTimeGear == Sensor::getOrZero(SensorType::DetectedGear)) {
m_shiftTime = false; m_shiftTime = false;
return m_shiftTimer.getElapsedSeconds(); return m_shiftTimer.getElapsedSeconds();
} else { } else {

View File

@ -12,7 +12,7 @@ float GetGearRatioFor(float revPerKm, float axle, float kph, float rpm) {
GearDetector dut; GearDetector dut;
dut.onSlowCallback(); dut.onSlowCallback();
return dut.getGearboxRatio(); return dut.get().value_or(0);
} }
TEST(GearDetector, ComputeGearRatio) { TEST(GearDetector, ComputeGearRatio) {