diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index ac3050a250..0f84b429e3 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -512,11 +512,14 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_ // offset 16 tsOutputChannels->massAirFlowVoltage = hasMafSensor() ? getMafVoltage(PASS_ENGINE_PARAMETER_SIGNATURE) : 0; - // offset 20 - float lambdaValue = Sensor::get(SensorType::Lambda).value_or(0); + float lambdaValue = Sensor::get(SensorType::Lambda1).value_or(0); tsOutputChannels->lambda = lambdaValue; tsOutputChannels->airFuelRatio = lambdaValue * ENGINE(engineState.stoichiometricRatio); + float lambda2Value = Sensor::get(SensorType::Lambda2).value_or(0); + tsOutputChannels->lambda2 = lambda2Value; + tsOutputChannels->airFuelRatio2 = lambda2Value * ENGINE(engineState.stoichiometricRatio); + // offset 24 tsOutputChannels->engineLoad = getEngineLoadT(PASS_ENGINE_PARAMETER_SIGNATURE); diff --git a/firmware/controllers/can/can_verbose.cpp b/firmware/controllers/can/can_verbose.cpp index ac21d80b4b..5b9edafe8a 100644 --- a/firmware/controllers/can/can_verbose.cpp +++ b/firmware/controllers/can/can_verbose.cpp @@ -118,7 +118,7 @@ struct Sensors2 { }; static void populateFrame(Sensors2& msg) { - msg.afr = Sensor::get(SensorType::Lambda).value_or(0) * 14.7f; + msg.afr = Sensor::get(SensorType::Lambda1).value_or(0) * 14.7f; msg.oilPressure = Sensor::get(SensorType::OilPressure).value_or(-1); msg.vvtPos = engine->triggerCentral.getVVTPosition(); msg.vbatt = getVBatt(); diff --git a/firmware/controllers/can/obd2.cpp b/firmware/controllers/can/obd2.cpp index 7a7d442a2a..9ee3789378 100644 --- a/firmware/controllers/can/obd2.cpp +++ b/firmware/controllers/can/obd2.cpp @@ -157,7 +157,7 @@ static void handleGetDataRequest(const CANRxFrame& rx) { obdSendValue(_1_MODE, pid, 1, Sensor::get(SensorType::Tps1).value_or(0) * ODB_TPS_BYTE_PERCENT); // (A*100/255) break; case PID_FUEL_AIR_RATIO_1: { - float lambda = Sensor::get(SensorType::Lambda).value_or(0); + float lambda = Sensor::get(SensorType::Lambda1).value_or(0); // phi = 1 / lambda float phi = clampF(0, 1 / lambda, 1.99f); diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index 92499a0557..630002edf4 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -710,7 +710,7 @@ void initEngineContoller(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) * UNUSED_SIZE constants. */ #ifndef RAM_UNUSED_SIZE -#define RAM_UNUSED_SIZE 3400 +#define RAM_UNUSED_SIZE 3300 #endif #ifndef CCM_UNUSED_SIZE #define CCM_UNUSED_SIZE 2800 diff --git a/firmware/controllers/gauges/lcd_controller.cpp b/firmware/controllers/gauges/lcd_controller.cpp index 907dd51c5e..73bc72a9d3 100644 --- a/firmware/controllers/gauges/lcd_controller.cpp +++ b/firmware/controllers/gauges/lcd_controller.cpp @@ -220,8 +220,8 @@ static void showLine(lcd_line_e line, int /*screenY*/) { return; #endif case LL_AFR: - if (Sensor::hasSensor(SensorType::Lambda)) { - lcdPrintf("AFR: %.2f", Sensor::get(SensorType::Lambda).value_or(0)); + if (Sensor::hasSensor(SensorType::Lambda1)) { + lcdPrintf("AFR: %.2f", Sensor::get(SensorType::Lambda1).value_or(0)); } else { lcdPrintf("AFR: none"); } diff --git a/firmware/controllers/math/closed_loop_fuel.cpp b/firmware/controllers/math/closed_loop_fuel.cpp index 8349036ba4..a4edd81398 100644 --- a/firmware/controllers/math/closed_loop_fuel.cpp +++ b/firmware/controllers/math/closed_loop_fuel.cpp @@ -71,7 +71,7 @@ bool shouldUpdateCorrection(DECLARE_ENGINE_PARAMETER_SIGNATURE) { // Pause (but don't reset) correction if the AFR is off scale. // It's probably a transient and poorly tuned transient correction - auto afr = Sensor::get(SensorType::Lambda).value_or(0) * 14.7f; + auto afr = Sensor::get(SensorType::Lambda1).value_or(0) * 14.7f; if (!afr || afr < (cfg.minAfr * 0.1f) || afr > (cfg.maxAfr * 0.1f)) { return false; } diff --git a/firmware/controllers/math/closed_loop_fuel_cell.cpp b/firmware/controllers/math/closed_loop_fuel_cell.cpp index 3892c3145d..1c91bacd35 100644 --- a/firmware/controllers/math/closed_loop_fuel_cell.cpp +++ b/firmware/controllers/math/closed_loop_fuel_cell.cpp @@ -49,7 +49,7 @@ float ClosedLoopFuelCellBase::getAdjustment() const { } float ClosedLoopFuelCellImpl::getLambdaError(DECLARE_ENGINE_PARAMETER_SIGNATURE) const { - auto lambda = Sensor::get(SensorType::Lambda); + auto lambda = Sensor::get(SensorType::Lambda1); // Failed sensor -> no error if (!lambda) { diff --git a/firmware/controllers/sensors/sensor.cpp b/firmware/controllers/sensors/sensor.cpp index 7b873d2b0c..09093f1fde 100644 --- a/firmware/controllers/sensors/sensor.cpp +++ b/firmware/controllers/sensors/sensor.cpp @@ -34,7 +34,8 @@ static const char* s_sensorNames[] = { "Aux Temp 1", "Aux Temp 2", - "Lambda", + "Lambda 1", + "Lambda 2", "Wastegate Position", "Idle Valve Position", diff --git a/firmware/controllers/sensors/sensor_type.h b/firmware/controllers/sensors/sensor_type.h index 7676548f52..477d2d712a 100644 --- a/firmware/controllers/sensors/sensor_type.h +++ b/firmware/controllers/sensors/sensor_type.h @@ -52,7 +52,8 @@ enum class SensorType : unsigned char { AuxTemp1, AuxTemp2, - Lambda, + Lambda1, + Lambda2, WastegatePosition, IdlePosition, diff --git a/firmware/init/sensor/init_lambda.cpp b/firmware/init/sensor/init_lambda.cpp index e9b029fbc5..f1f22aa5fe 100644 --- a/firmware/init/sensor/init_lambda.cpp +++ b/firmware/init/sensor/init_lambda.cpp @@ -18,14 +18,15 @@ struct GetAfrWrapper { static GetAfrWrapper afrWrapper; -static FunctionPointerSensor lambdaSensor(SensorType::Lambda, +static FunctionPointerSensor lambdaSensor(SensorType::Lambda1, []() { return afrWrapper.getLambda(); }); #if EFI_CAN_SUPPORT #include "AemXSeriesLambda.h" -static AemXSeriesWideband aem(0, SensorType::Lambda); +static AemXSeriesWideband aem1(0, SensorType::Lambda1); +static AemXSeriesWideband aem2(1, SensorType::Lambda2); #endif void initLambda(DECLARE_ENGINE_PARAMETER_SIGNATURE) { @@ -33,7 +34,8 @@ void initLambda(DECLARE_ENGINE_PARAMETER_SIGNATURE) { #if EFI_CAN_SUPPORT if (CONFIG(enableAemXSeries)) { - registerCanSensor(aem); + registerCanSensor(aem1); + registerCanSensor(aem2); return; } diff --git a/unit_tests/tests/sensor/test_sensor_init.cpp b/unit_tests/tests/sensor/test_sensor_init.cpp index a66d88de64..fe37d36e28 100644 --- a/unit_tests/tests/sensor/test_sensor_init.cpp +++ b/unit_tests/tests/sensor/test_sensor_init.cpp @@ -215,6 +215,6 @@ TEST(SensorInit, Lambda) { initLambda(PASS_ENGINE_PARAMETER_SIGNATURE); - auto s = Sensor::getSensorOfType(SensorType::Lambda); + auto s = Sensor::getSensorOfType(SensorType::Lambda1); ASSERT_NE(nullptr, s); } diff --git a/unit_tests/tests/test_stft.cpp b/unit_tests/tests/test_stft.cpp index f9237fa0d1..55648f4682 100644 --- a/unit_tests/tests/test_stft.cpp +++ b/unit_tests/tests/test_stft.cpp @@ -87,12 +87,12 @@ TEST(ClosedLoopFuel, afrLimits) { engineConfiguration->stft.minAfr = 100; // 10.0 AFR engineConfiguration->stft.maxAfr = 180; // 18.0 AFR - Sensor::setMockValue(SensorType::Lambda, 0.1f); + Sensor::setMockValue(SensorType::Lambda1, 0.1f); EXPECT_FALSE(shouldUpdateCorrection(PASS_ENGINE_PARAMETER_SIGNATURE)); - Sensor::setMockValue(SensorType::Lambda, 1.0f); + Sensor::setMockValue(SensorType::Lambda1, 1.0f); EXPECT_TRUE(shouldUpdateCorrection(PASS_ENGINE_PARAMETER_SIGNATURE)); - Sensor::setMockValue(SensorType::Lambda, 2.0f); + Sensor::setMockValue(SensorType::Lambda1, 2.0f); EXPECT_FALSE(shouldUpdateCorrection(PASS_ENGINE_PARAMETER_SIGNATURE)); }