rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
controllers
actuators
ac_control.cpp
Go to the documentation of this file.
1
#include "
pch.h
"
2
3
#include "
ac_control.h
"
4
#include "
deadband.h
"
5
#include "
max_limit_with_hysteresis.h
"
6
7
namespace
{
8
// Deadbands to prevent rapid switching on/off of AC
9
Deadband<200>
maxRpmDeadband;
10
Deadband<5>
maxCltDeadband;
11
Deadband<5>
maxTpsDeadband;
12
Deadband<AcController::PRESSURE_DEADBAND_WIDTH>
minPressureDeadband;
13
MaxLimitWithHysteresis
acPressureEnableHysteresis;
14
}
15
16
bool
AcController::getAcState
() {
17
auto
rpm =
Sensor::getOrZero
(
SensorType::Rpm
);
18
19
engineTooSlow
= rpm < 500;
20
21
if
(
engineTooSlow
) {
22
return
false
;
23
}
24
25
auto
maxRpm =
engineConfiguration
->maxAcRpm;
26
engineTooFast
= maxRpm != 0 && maxRpmDeadband.gt(rpm, maxRpm);
27
if
(
engineTooFast
) {
28
return
false
;
29
}
30
31
auto
clt
=
Sensor::get
(
SensorType::Clt
);
32
33
noClt
= !
clt
;
34
// No AC with failed CLT
35
if
(
noClt
) {
36
return
false
;
37
}
38
39
// Engine too hot, disable
40
auto
maxClt =
engineConfiguration
->maxAcClt;
41
engineTooHot
= (maxClt != 0) && maxCltDeadband.gt(
clt
.Value, maxClt);
42
if
(
engineTooHot
) {
43
return
false
;
44
}
45
46
// TPS too high, disable
47
auto
maxTps =
engineConfiguration
->maxAcTps;
48
tpsTooHigh
= maxTps != 0 && maxTpsDeadband.gt(
Sensor::getOrZero
(
SensorType::Tps1
), maxTps);
49
if
(
tpsTooHigh
) {
50
return
false
;
51
}
52
53
const
auto
acPressure
=
Sensor::get
(
SensorType::AcPressure
);
54
if
(
acPressure
.Valid) {
55
const
auto
minAcPressure =
static_cast<
float
>
(
engineConfiguration
->minAcPressure);
56
acPressureTooLow
= minPressureDeadband.lt(
acPressure
.Value, minAcPressure);
57
if
(
acPressureTooLow
) {
58
return
false
;
59
}
60
61
const
auto
maxAcPressure =
static_cast<
float
>
(
engineConfiguration
->maxAcPressure);
62
acPressureTooHigh
= acPressureEnableHysteresis.checkIfLimitIsExceeded(
63
acPressure
.Value,
64
maxAcPressure,
65
engineConfiguration
->acPressureEnableHyst
66
);
67
if
(
acPressureTooHigh
) {
68
return
false
;
69
}
70
}
71
72
if
(
isDisabledByLua
) {
73
return
false
;
74
}
75
76
// All conditions allow AC, simply pass thru switch
77
return
acButtonState
;
78
}
79
80
void
AcController::onSlowCallback
() {
81
bool
isEnabled =
getAcState
();
82
83
m_acEnabled
= isEnabled;
84
85
if
(!isEnabled) {
86
// reset the timer if AC is off
87
m_timeSinceNoAc
.reset();
88
}
89
90
float
acDelay =
engineConfiguration
->acDelay;
91
if
(acDelay == 0) {
92
// Without delay configured, enable immediately
93
acCompressorState
= isEnabled;
94
}
else
{
95
acCompressorState
= isEnabled &&
m_timeSinceNoAc
.hasElapsedSec(acDelay);
96
}
97
98
enginePins
.
acRelay
.
setValue
(
acCompressorState
);
99
}
100
101
bool
AcController::isAcEnabled
()
const
{
102
return
m_acEnabled
;
103
}
ac_control.h
AcController::m_timeSinceNoAc
Timer m_timeSinceNoAc
Definition
ac_control.h:21
AcController::isAcEnabled
virtual bool isAcEnabled() const
Definition
ac_control.cpp:101
AcController::onSlowCallback
void onSlowCallback() override
Definition
ac_control.cpp:80
AcController::getAcState
bool getAcState()
Definition
ac_control.cpp:16
Deadband
Definition
deadband.h:13
EnginePins::acRelay
RegisteredOutputPin acRelay
Definition
efi_gpio.h:90
MaxLimitWithHysteresis
Definition
max_limit_with_hysteresis.h:10
OutputPin::setValue
void setValue(const char *msg, int logicValue, bool isForce=false)
Definition
efi_gpio.cpp:604
Sensor::get
virtual SensorResult get() const =0
Sensor::getOrZero
static float getOrZero(SensorType type)
Definition
sensor.h:83
deadband.h
enginePins
EnginePins enginePins
Definition
efi_gpio.cpp:24
engineConfiguration
static constexpr engine_configuration_s * engineConfiguration
Definition
engine_configuration.h:81
clt
static CCM_OPTIONAL FunctionalSensor clt(SensorType::Clt, MS2NT(10))
max_limit_with_hysteresis.h
pch.h
SensorType::Clt
@ Clt
SensorType::Rpm
@ Rpm
SensorType::AcPressure
@ AcPressure
SensorType::Tps1
@ Tps1
acPressure
acPressure("A/C pressure", SensorCategory.SENSOR_INPUTS, FieldType.INT, 812, 1.0, 0.0, 0.0, "kPa")
ac_control_s::engineTooHot
bool engineTooHot
Definition
ac_control_generated.h:38
ac_control_s::noClt
bool noClt
Definition
ac_control_generated.h:34
ac_control_s::engineTooSlow
bool engineTooSlow
Definition
ac_control_generated.h:26
ac_control_s::acCompressorState
bool acCompressorState
Definition
ac_control_generated.h:50
ac_control_s::isDisabledByLua
bool isDisabledByLua
Definition
ac_control_generated.h:46
ac_control_s::m_acEnabled
bool m_acEnabled
Definition
ac_control_generated.h:22
ac_control_s::acPressureTooLow
bool acPressureTooLow
Definition
ac_control_generated.h:54
ac_control_s::tpsTooHigh
bool tpsTooHigh
Definition
ac_control_generated.h:42
ac_control_s::acPressureTooHigh
bool acPressureTooHigh
Definition
ac_control_generated.h:58
ac_control_s::acButtonState
int8_t acButtonState
Definition
ac_control_generated.h:12
ac_control_s::engineTooFast
bool engineTooFast
Definition
ac_control_generated.h:30
Generated on Fri Dec 12 2025 01:56:09 for rusEFI by
1.9.8