mirror of https://github.com/FOME-Tech/fome-fw.git
trip odometer (#260)
This commit is contained in:
parent
ce26ef8adf
commit
4b354f047b
|
@ -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
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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() {
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -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;
|
||||
};
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
};
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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).
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue