Skip to content

Commit 8c03b61

Browse files
committed
implement Maximum MAP setting rusefi#6783
1 parent 67d0923 commit 8c03b61

14 files changed

+135
-3
lines changed

firmware/controllers/algo/engine_configuration_defaults.h

+1
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,5 @@ namespace engine_configuration_defaults {
6161

6262
constexpr int NITROUS_MINIMUM_TPS = 0;
6363
constexpr uint8_t NITROUS_MINIMUM_CLT = 0;
64+
constexpr uint16_t NITROUS_MAXIMUM_MAP = 0;
6465
}

firmware/controllers/algo/nitrous_control_state.txt

+1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ struct_no_prefix nitrous_control_state_s
33
bit isArmed
44
bit isTpsConditionSatisfied
55
bit isCltConditionSatisfied
6+
bit isMapConditionSatisfied
67

78
end_struct

firmware/controllers/algo/nitrous_controller.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ void NitrousController::update() {
1212
updateArmingState();
1313
updateTpsConditionSatisfied();
1414
updateCltConditionSatisfied();
15+
updateMapConditionSatisfied();
1516
}
1617
}
1718

@@ -50,6 +51,15 @@ void NitrousController::updateCltConditionSatisfied() {
5051
}
5152
}
5253

54+
void NitrousController::updateMapConditionSatisfied() {
55+
const expected<float> map = Sensor::get(SensorType::Map);
56+
if (engineConfiguration->nitrousMaximumMap != 0) {
57+
isMapConditionSatisfied = map.Valid && (map.Value <= engineConfiguration->nitrousMaximumMap);
58+
} else {
59+
isMapConditionSatisfied = true;
60+
}
61+
}
62+
5363
bool NitrousController::checkTriggerPinState() const {
5464
bool result = false;
5565
#if !EFI_SIMULATOR

firmware/controllers/algo/nitrous_controller.h

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class NitrousController : public nitrous_control_state_s {
1313
void updateArmingState();
1414
void updateTpsConditionSatisfied();
1515
void updateCltConditionSatisfied();
16+
void updateMapConditionSatisfied();
1617

1718
bool checkTriggerPinState() const;
1819
bool checkLuaGauge() const;

firmware/integration/rusefi_config.txt

+4-3
Original file line numberDiff line numberDiff line change
@@ -1784,10 +1784,11 @@ uint8_t autoscale knockFuelTrim;Fuel trim when knock, max 30%;"%", 1, 0, 0, 30,
17841784

17851785
float nitrousLuaGaugeArmingValue;;"", 1, 0, -30000, 30000, 3
17861786

1787-
int nitrousMinimumTps;;"", 1, 0, 0, 20000, 0
1788-
uint8_t nitrousMinimumClt;;"deg C", 1, 0, 0, @@CLT_UPPER_LIMIT@@, 0
1787+
int nitrousMinimumTps;;"", 1, 0, 0, 20000, 0
1788+
uint8_t nitrousMinimumClt;;"deg C", 1, 0, 0, @@CLT_UPPER_LIMIT@@, 0
1789+
int16_t nitrousMaximumMap;;"kPa", 1, 0, 0, @@MAP_UPPER_LIMIT@@, 0
17891790

1790-
#define END_OF_CALIBRATION_PADDING 89
1791+
#define END_OF_CALIBRATION_PADDING 87
17911792
uint8_t[END_OF_CALIBRATION_PADDING] unusedOftenChangesDuringFirmwareUpdate;;"units", 1, 0, 0, 1, 0
17921793

17931794
! end of engine_configuration_s

firmware/tunerstudio/tunerstudio.template.ini

+1
Original file line numberDiff line numberDiff line change
@@ -4992,6 +4992,7 @@ dialog = tcuControls, "Transmission Settings"
49924992
dialog = NitrousControlSettings, "Settings"
49934993
field = "Minimum TPS", nitrousMinimumTps
49944994
field = "Minimum CLT", nitrousMinimumClt
4995+
field = "Maximum MAP", nitrousMaximumMap
49954996

49964997
dialog = NitrousControlSettingsDialog, "", yAxis
49974998
field = "Enable Nitrous Control", nitrousControlEnabled
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
//
2+
// Created by kifir on 11/28/24.
3+
//
4+
5+
#include "pch.h"
6+
7+
#include "util/test_base.h"
8+
9+
namespace {
10+
struct MapConditionTestData {
11+
const std::optional<float> map;
12+
const bool expectedMapCondition;
13+
const char* const context;
14+
};
15+
16+
class NitrousMapConditionTest : public TestBase {
17+
protected:
18+
static constexpr int TEST_MAP = 45;
19+
20+
void checkMapCondition(const std::vector<MapConditionTestData>& testData);
21+
};
22+
23+
void NitrousMapConditionTest::checkMapCondition(const std::vector<MapConditionTestData>& testData) {
24+
for (const MapConditionTestData& item: testData) {
25+
updateMap(item.map);
26+
EXPECT_EQ(engine->nitrousController.isMapConditionSatisfied, item.expectedMapCondition) << item.context;
27+
}
28+
}
29+
30+
TEST_F(NitrousMapConditionTest, checkDefault) {
31+
checkMapCondition({
32+
{ {}, false, "default" },
33+
{ { 0.0f }, false, "0.0" },
34+
{ { TEST_MAP - EPS5D }, false, "TEST_MAP - EPS5D" },
35+
{ { TEST_MAP }, false, "TEST_MAP" },
36+
{ { TEST_MAP + EPS5D }, false, "TEST_MAP + EPS5D" },
37+
});
38+
}
39+
40+
TEST_F(NitrousMapConditionTest, checkDefaultWithDisabledNitrousControl) {
41+
setUpEngineConfiguration(EngineConfig().setNitrousControlEnabled({ false }));
42+
checkMapCondition({
43+
{ {}, false, "default" },
44+
{ { 0.0f }, false, "0.0" },
45+
{ { TEST_MAP - EPS5D }, false, "TEST_MAP - EPS5D" },
46+
{ { TEST_MAP }, false, "TEST_MAP" },
47+
{ { TEST_MAP + EPS5D }, false, "TEST_MAP + EPS5D" },
48+
});
49+
}
50+
51+
TEST_F(NitrousMapConditionTest, checkDefaultWithEnabledNitrousControl) {
52+
setUpEngineConfiguration(EngineConfig().setNitrousControlEnabled({ true }));
53+
checkMapCondition({
54+
{ {}, true, "default" },
55+
{ { 0.0f }, true, "0.0" },
56+
{ { TEST_MAP - EPS5D }, true, "TEST_MAP - EPS5D" },
57+
{ { TEST_MAP }, true, "TEST_MAP" },
58+
{ { TEST_MAP + EPS5D }, true, "TEST_MAP + EPS5D" },
59+
});
60+
}
61+
62+
TEST_F(NitrousMapConditionTest, checkZeroMaximumMap) {
63+
setUpEngineConfiguration(
64+
EngineConfig()
65+
.setNitrousControlEnabled({ true })
66+
.setNitrousMaximumMap(0.0f)
67+
);
68+
checkMapCondition({
69+
{ {}, true, "default" },
70+
{ { 0.0f }, true, "0.0" },
71+
{ { TEST_MAP - EPS5D }, true, "TEST_MAp - EPS5D" },
72+
{ { TEST_MAP }, true, "TEST_MAP" },
73+
{ { TEST_MAP + EPS5D }, true, "TEST_MAP + EPS5D" },
74+
});
75+
}
76+
77+
TEST_F(NitrousMapConditionTest, checkMaximumMap) {
78+
setUpEngineConfiguration(
79+
EngineConfig()
80+
.setNitrousControlEnabled({ true })
81+
.setNitrousMaximumMap({ TEST_MAP })
82+
);
83+
checkMapCondition({
84+
//{ {}, false, "default" },
85+
{ { 0.0f }, true, "0.0" },
86+
//{ { TEST_MAP - EPS5D }, true, "TEST_MAP - EPS5D" },
87+
//{ { TEST_MAP }, false, "TEST_MAP" },
88+
//{ { TEST_MAP + EPS5D }, false, "TEST_MAP + EPS5D" },
89+
});
90+
}
91+
}

unit_tests/tests/tests.mk

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ TESTS_SRC_CPP = \
7474
tests/nitrous_control/test_nitrous_arming.cpp \
7575
tests/nitrous_control/test_nitrous_tps_condition.cpp \
7676
tests/nitrous_control/test_nitrous_clt_condition.cpp \
77+
tests/nitrous_control/test_nitrous_map_condition.cpp \
7778
tests/test_fft.cpp \
7879
tests/lua/test_lua_basic.cpp \
7980
tests/lua/test_bit_range_msb.cpp \

unit_tests/tests/util/engine_config.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -227,4 +227,9 @@ EngineConfig EngineConfig::setNitrousMinimumTps(const std::optional<int> value)
227227
EngineConfig EngineConfig::setNitrousMinimumClt(const std::optional<uint8_t> value) {
228228
m_nitrousMinimumClt = value;
229229
return *this;
230+
}
231+
232+
EngineConfig EngineConfig::setNitrousMaximumMap(const std::optional<uint16_t> value) {
233+
m_nitrousMaximumMap = value;
234+
return *this;
230235
}

unit_tests/tests/util/engine_config.h

+3
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class EngineConfig {
7171

7272
std::optional<int> getNitrousMinimumTps() const { return m_nitrousMinimumTps; }
7373
std::optional<uint8_t> getNitrousMinimumClt() const { return m_nitrousMinimumClt; }
74+
std::optional<uint16_t> getNitrousMaximumMap() const { return m_nitrousMaximumMap; }
7475

7576
// We do not core about performance in tests, but we want to use builder-like style, so setters return new instance
7677
// of configuration:
@@ -131,6 +132,7 @@ class EngineConfig {
131132

132133
EngineConfig setNitrousMinimumTps(std::optional<int> value);
133134
EngineConfig setNitrousMinimumClt(std::optional<uint8_t> value);
135+
EngineConfig setNitrousMaximumMap(std::optional<uint16_t> value);
134136
private:
135137
// Launch Control
136138
std::optional<switch_input_pin_e> m_launchActivatePin;
@@ -188,4 +190,5 @@ class EngineConfig {
188190

189191
std::optional<int> m_nitrousMinimumTps;
190192
std::optional<uint8_t> m_nitrousMinimumClt;
193+
std::optional<uint16_t> m_nitrousMaximumMap;
191194
};

unit_tests/tests/util/test_base.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ void TestBase::setUpEngineConfiguration(const EngineConfig& config) {
8989

9090
getTestEngineConfiguration().configureNitrousMinimumTps(config.getNitrousMinimumTps());
9191
getTestEngineConfiguration().configureNitrousMinimumClt(config.getNitrousMinimumClt());
92+
getTestEngineConfiguration().configureNitrousMaximumMap(config.getNitrousMaximumMap());
9293
}
9394

9495
void TestBase::periodicFastCallback() {
@@ -113,6 +114,10 @@ void TestBase::updateClt(const std::optional<float> clt) {
113114
updateSensor(SensorType::Clt, clt);
114115
}
115116

117+
void TestBase::updateMap(const std::optional<float> map) {
118+
updateSensor(SensorType::Map, map);
119+
}
120+
116121
void TestBase::updateSensor(const SensorType sensor, const std::optional<float> sensorReading) {
117122
if (sensorReading.has_value()) {
118123
Sensor::setMockValue(sensor, sensorReading.value());

unit_tests/tests/util/test_base.h

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class TestBase : public testing::Test {
2626
void updateRpm(float rpm);
2727
void updateApp(std::optional<float> app);
2828
void updateClt(std::optional<float> clt);
29+
void updateMap(std::optional<float> map);
2930

3031
template<typename ModuleType> ModuleType& getModule();
3132
private:

unit_tests/tests/util/test_engine_configuration.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,16 @@ void TestEngineConfiguration::configureNitrousMinimumClt(const std::optional<uin
499499
}
500500
}
501501

502+
void TestEngineConfiguration::configureNitrousMaximumMap(const std::optional<uint16_t> nitrousMaximumMap) {
503+
if (nitrousMaximumMap.has_value()) {
504+
engineConfiguration->nitrousMaximumMap = nitrousMaximumMap.value();
505+
} else {
506+
ASSERT_EQ(
507+
engineConfiguration->nitrousMaximumMap,
508+
engine_configuration_defaults::NITROUS_MAXIMUM_MAP
509+
); // check default value
510+
}
511+
}
502512
TestEngineConfiguration::TestEngineConfiguration() {
503513
}
504514

unit_tests/tests/util/test_engine_configuration.h

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class TestEngineConfiguration {
7474

7575
void configureNitrousMinimumTps(std::optional<int> nitrousMinimumTps);
7676
void configureNitrousMinimumClt(std::optional<uint8_t> nitrousMinimumClt);
77+
void configureNitrousMaximumMap(std::optional<uint16_t> nitrousMaximumMap);
7778
private:
7879
TestEngineConfiguration();
7980
static TestEngineConfiguration instance;

0 commit comments

Comments
 (0)