trip odometer (#260)

This commit is contained in:
Matthew Kennedy 2023-09-25 13:16:17 -07:00 committed by GitHub
parent ce26ef8adf
commit 4b354f047b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 85 additions and 97 deletions

View File

@ -17,7 +17,6 @@
#include "mre_meta.h"
#include "proteus_meta.h"
#include "hellen_meta.h"
#include "odometer.h"
#include "defaults.h"
#if EFI_ELECTRONIC_THROTTLE_BODY

View File

@ -526,8 +526,8 @@ static void updateFuelCorrections() {
}
static void updateFuelResults() {
engine->outputChannels.fuelFlowRate = engine->engineState.fuelConsumption.getConsumptionGramPerSecond();
engine->outputChannels.totalFuelConsumption = engine->engineState.fuelConsumption.getConsumedGrams();
engine->outputChannels.fuelFlowRate = engine->module<TripOdometer>()->getConsumptionGramPerSecond();
engine->outputChannels.totalFuelConsumption = engine->module<TripOdometer>()->getConsumedGrams();
}
static void updateFuelInfo() {

View File

@ -24,7 +24,7 @@ CONTROLLERS_ALGO_SRC_CPP = $(PROJECT_DIR)/controllers/algo/advance_map.cpp \
$(PROJECT_DIR)/controllers/algo/fuel/fuel_computer.cpp \
$(PROJECT_DIR)/controllers/algo/fuel/injector_model.cpp \
$(PROJECT_DIR)/controllers/algo/fuel/dfco.cpp \
$(PROJECT_DIR)/controllers/algo/odometer.cpp \
$(PROJECT_DIR)/controllers/algo/trip_odometer.cpp \
$(PROJECT_DIR)/controllers/algo/defaults/default_base_engine.cpp \
$(PROJECT_DIR)/controllers/algo/defaults/default_cranking.cpp \
$(PROJECT_DIR)/controllers/algo/defaults/default_fuel.cpp \

View File

@ -51,6 +51,7 @@
#include "throttle_model.h"
#include "lambda_monitor.h"
#include "vvt.h"
#include "trip_odometer.h"
#ifndef EFI_UNIT_TEST
#error EFI_UNIT_TEST must be defined!
@ -150,6 +151,7 @@ public:
Mockable<WallFuelController>,
#if EFI_VEHICLE_SPEED
GearDetector,
TripOdometer,
#endif // EFI_VEHICLE_SPEED
KnockController,
SensorChecker,

View File

@ -77,27 +77,6 @@ bool WarningCodeState::isWarningNow(ObdCode code) const {
return !warn->LastTriggered.hasElapsedSec(maxI(3, engineConfiguration->warningPeriod));
}
void FuelConsumptionState::consumeFuel(float grams, efitick_t nowNt) {
m_consumedGrams += grams;
float elapsedSecond = m_timer.getElapsedSecondsAndReset(nowNt);
// If it's been a long time since last injection, ignore this pulse
if (elapsedSecond > 0.2f) {
m_rate = 0;
} else {
m_rate = grams / elapsedSecond;
}
}
float FuelConsumptionState::getConsumedGrams() const {
return m_consumedGrams;
}
float FuelConsumptionState::getConsumptionGramPerSecond() const {
return m_rate;
}
EngineState::EngineState() {
timeSinceLastTChargeK = getTimeNowNt();
}

View File

@ -24,20 +24,6 @@ struct SensorsState {
Accelerometer accelerometer;
};
class FuelConsumptionState {
public:
void consumeFuel(float grams, efitick_t nowNt);
float getConsumedGrams() const;
float getConsumptionGramPerSecond() const;
private:
float m_consumedGrams = 0;
float m_rate = 0;
Timer m_timer;
};
class TransmissionState {
public:
gear_e gearSelectorPosition;

View File

@ -32,8 +32,6 @@ public:
// Per-injection fuel mass, including TPS accel enrich
float injectionMass[MAX_CYLINDER_COUNT] = {0};
FuelConsumptionState fuelConsumption;
Timer crankingTimer;
WarningCodeState warnings;

View File

@ -1,24 +0,0 @@
#include "pch.h"
#include "odometer.h"
//static odometer_state odometerCopies[2];
void setCrc(odometer_state *state) {
state->crc = crc32(state, 4);
}
void validate(odometer_state *state) {
int crc = crc32(state, 4);
if (state->crc != crc)
state->totalMeters = 0;
}
void initOdometer() {
}

View File

@ -1,19 +0,0 @@
#pragma once
#ifndef EE_PAGE_SIZE
#define EE_PAGE_SIZE 32
#endif
#ifndef EE_SIZE
#define EE_SIZE 4096
#endif
#ifndef EE_U2CD
#define EE_U2CD I2CD3
#endif
struct odometer_state {
int totalMeters;
int crc;
};

View File

@ -0,0 +1,52 @@
#include "pch.h"
void TripOdometer::reset() {
m_consumedGrams = 0;
m_consumedRemainder = 0;
m_distanceMeters = 0;
m_distanceRemainder = 0;
}
void TripOdometer::consumeFuel(float grams, efitick_t nowNt) {
m_consumedRemainder += grams;
while (m_consumedRemainder > 1) {
m_consumedRemainder--;
m_consumedGrams++;
}
m_consumedGrams += grams;
float elapsedSecond = m_timer.getElapsedSecondsAndReset(nowNt);
// If it's been a long time since last injection, ignore this pulse
if (elapsedSecond > 0.2f) {
m_rate = 0;
} else {
m_rate = grams / elapsedSecond;
}
}
uint32_t TripOdometer::getConsumedGrams() const {
return m_consumedGrams;
}
float TripOdometer::getConsumptionGramPerSecond() const {
return m_rate;
}
void TripOdometer::onSlowCallback() {
float meterPerSecond = Sensor::getOrZero(SensorType::VehicleSpeed) / 3.6f;
float metersThisTick = meterPerSecond * (SLOW_CALLBACK_PERIOD_MS / 1000.0f);
m_distanceRemainder += metersThisTick;
while (m_distanceRemainder > 1.0f) {
m_distanceMeters++;
m_distanceRemainder--;
}
}
uint32_t TripOdometer::getDistanceMeters() const {
return m_distanceMeters;
}

View File

@ -0,0 +1,23 @@
#pragma once
class TripOdometer : public EngineModule {
public:
void onSlowCallback() override;
void reset();
void consumeFuel(float grams, efitick_t nowNt);
uint32_t getConsumedGrams() const;
float getConsumptionGramPerSecond() const;
uint32_t getDistanceMeters() const;
private:
uint32_t m_consumedGrams = 0;
float m_consumedRemainder = 0;
float m_rate = 0;
uint32_t m_distanceMeters = 0;
float m_distanceRemainder = 0;
Timer m_timer;
};

View File

@ -153,8 +153,8 @@ struct Fueling2 {
};
static void populateFrame(Fueling2& msg) {
msg.fuelConsumedGram = engine->engineState.fuelConsumption.getConsumedGrams();
msg.fuelFlowRate = engine->engineState.fuelConsumption.getConsumptionGramPerSecond();
msg.fuelConsumedGram = engine->module<TripOdometer>()->getConsumedGrams();
msg.fuelFlowRate = engine->module<TripOdometer>()->getConsumptionGramPerSecond();
for (size_t i = 0; i < 2; i++) {
msg.fuelTrim[i] = 100.0f * (engine->stftCorrection[i] - 1.0f);

View File

@ -163,7 +163,7 @@ static void handleGetDataRequest(const CANRxFrame& rx, size_t busIndex) {
obdSendPacket(1, pid, 4, scaled << 16, busIndex);
break;
} case PID_FUEL_RATE: {
float gPerSecond = engine->engineState.fuelConsumption.getConsumptionGramPerSecond();
float gPerSecond = engine->module<TripOdometer>()->getConsumptionGramPerSecond();
float gPerHour = gPerSecond * 3600;
float literPerHour = gPerHour * 0.00139f;
obdSendValue(_1_MODE, pid, 2, literPerHour * 20.0f, busIndex); // L/h. (A*256+B)/20

View File

@ -99,7 +99,7 @@ void InjectionEvent::onTriggerTooth(int rpm, efitick_t nowNt, float currentPhase
warning(ObdCode::CUSTOM_TOO_LONG_FUEL_INJECTION, "Too long fuel injection %.2fms", injectionDuration);
}
getEngineState()->fuelConsumption.consumeFuel(injectionMassGrams * numberOfInjections, nowNt);
engine->module<TripOdometer>()->consumeFuel(injectionMassGrams * numberOfInjections, nowNt);
if (this->cylinderNumber == 0) {
engine->outputChannels.actualLastInjection = injectionDuration;

View File

@ -24,7 +24,6 @@
#include "sensor_chart.h"
#include "serial_hw.h"
#include "idle_thread.h"
#include "odometer.h"
#include "kline.h"
#if EFI_PROD_CODE
@ -440,12 +439,6 @@ void initHardware() {
return;
}
#if STM32_I2C_USE_I2C3
if (engineConfiguration->useEeprom) {
i2cStart(&EE_U2CD, &i2cfg);
}
#endif // STM32_I2C_USE_I2C3
boardInitHardware();
#if HAL_USE_ADC

View File

@ -415,7 +415,7 @@ bit disableFan2WhenStopped;Inhibit operation of this fan while the engine is not
bit enableTrailingSparks;Enable secondary spark outputs that fire after the primary (rotaries, twin plug engines).
bit etb_use_two_wires;TLE7209 uses two-wire mode. TLE9201 and VNH2SP30 do NOT use two wire mode.
bit isDoubleSolenoidIdle;Subaru/BMW style where default valve position is somewhere in the middle. First solenoid opens it more while second can close it more than default position.
bit useEeprom
bit unused88b11
bit useTLE8888_cranking_hack;
bit kickStartCranking
bit useSeparateIdleTablesForCrankingTaper;This uses separate ignition timing and VE tables not only for idle conditions, also during the postcranking-to-idle taper transition (See also afterCrankingIACtaperDuration).

View File

@ -4366,7 +4366,6 @@ dialog = tcuControls, "Transmission Settings"
dialog = parkingLot, "Experimental/Broken"
field = "I understand ECU Locking", yesUnderstandLocking
field = "Tune read/write password", tuneHidingKey, { yesUnderstandLocking == 1 }
field = useEeprom, useEeprom
field = "#System hacks"
field = "Global fuel correction", globalFuelCorrection
field = "MAP Averaging Logic @", mapAveragingSchedulingAtIndex