-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathchargingrelaycontroller.cpp
More file actions
149 lines (127 loc) · 4.99 KB
/
chargingrelaycontroller.cpp
File metadata and controls
149 lines (127 loc) · 4.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include "chargingrelaycontroller.h"
#include "canbusnodedetector.h"
#include "leafobcharger.h"
#include "lim.h"
#include "openinverter/params.h"
#include <QDir>
#include <QLoggingCategory>
#include <QTimer>
static void initGpio(Gpio& pin, Gpio::Direction direction = Gpio::DirectionOutput)
{
if (!QDir(pin.gpioDirectory()).exists())
pin.exportGpio();
if (pin.direction() != direction)
pin.setDirection(direction);
pin.setValue(Gpio::ValueLow);
}
ChargingRelayController::ChargingRelayController(QObject* parent)
: QObject(parent),
m_gpio2(2),
m_gpio3(3),
m_gpio4(4),
m_gpio14(14),
m_gpio15(15)
{
QLoggingCategory::setFilterRules("Gpio.debug=false");
initGpio(m_gpio2);
initGpio(m_gpio3);
initGpio(m_gpio4);
initGpio(m_gpio14);
initGpio(m_gpio15);
QTimer* t = new QTimer(this);
connect(t, &QTimer::timeout, this, &ChargingRelayController::deductChargingMode);
connect(t, &QTimer::timeout, this, &ChargingRelayController::fakeChargeFlap);
t->start(250);
}
void ChargingRelayController::deductChargingMode()
{
bool lim_plug_det = Param::GetBool(Param::PlugDet);
int obc_charge_status = Param::GetInt(Param::OBC_Charge_Status);
bool obc_plug_det = obc_charge_status == 2 || obc_charge_status == 4 || obc_charge_status == 12;
int pilot_typ = Param::GetInt(Param::PilotTyp);
int pilot_lim = Param::GetInt(Param::PilotLim);
int cable_lim = Param::GetInt(Param::CableLim);
bool pilot_typ_ac = pilot_typ == 1 || pilot_typ == 2;
int ccs_state = Param::GetInt(Param::CCS_State);
// LIM says plug detected -> state 0 is AC - DC otherwise
if (lim_plug_det || pilot_typ_ac)
setChargingMode(pilot_typ_ac ? ChargingMode::LeafOBCharger : ChargingMode::LIM);
// onboard charger says it could charge or not
else
setChargingMode(obc_plug_det ? ChargingMode::LeafOBCharger : ChargingMode::LIM);
bool fakeChademo = (lim_plug_det && !pilot_typ_ac && !pilot_lim && !cable_lim) || ccs_state >= 1;
setChademoProximity(fakeChademo);
setChargerStart1(fakeChademo && ccs_state >= 2 && ccs_state <= 8);
setChargerStart2(fakeChademo && ccs_state >= 2 && ccs_state <= 7);
}
ChargingRelayController::ChargingMode ChargingRelayController::chargingMode() const
{
return const_cast<ChargingRelayController*>(this)->m_gpio15.value() == Gpio::ValueHigh ? ChargingMode::LIM : ChargingMode::LeafOBCharger;
}
void ChargingRelayController::setChargingMode(ChargingMode mode)
{
if (chargingMode() == mode)
return;
qDebug() << "Set charging mode to" << (mode == ChargingMode::LIM ? "LIM" : "Leaf onboard charger");
m_gpio15.setValue(mode == ChargingMode::LIM ? Gpio::ValueHigh : Gpio::ValueLow);
}
void ChargingRelayController::fakeChargeFlap()
{
bool lim_plug_det = Param::GetBool(Param::PlugDet);
int battery_I = Param::GetInt(Param::idc);
int obc_charge_status = Param::GetInt(Param::OBC_Charge_Status);
bool obc_plug_det = obc_charge_status == 2 || obc_charge_status == 4 || obc_charge_status == 12;
if (lim_plug_det || obc_plug_det)
setChargeFlapOpen(true); // plug inserted... well.. must be open
if (battery_I == 0)
setChargeFlapOpen(true); // car is standing still -> set it to open; maybe we want to charge
if (battery_I < 0 && !lim_plug_det && !obc_plug_det)
setChargeFlapOpen(false); // we are driving -> charge flag should be closed. Now run your weld test, LIM!
}
bool ChargingRelayController::chademoProximity() const
{
return const_cast<ChargingRelayController*>(this)->m_gpio4.value() == Gpio::ValueHigh;
}
void ChargingRelayController::setChademoProximity(bool proximity)
{
// we need to unset charger start 1 first
if (!proximity && isChargerStart1Set())
return;
if (proximity == chademoProximity())
return;
// qDebug() << "set Chademo proximity" << proximity;
m_gpio4.setValue(proximity ? Gpio::ValueHigh : Gpio::ValueLow);
}
void ChargingRelayController::setChargeFlapOpen(bool open)
{
if (isChargeFlapOpen() == open)
return;
m_gpio2.setValue(open ? Gpio::ValueHigh : Gpio::ValueLow);
}
bool ChargingRelayController::isChargeFlapOpen() const
{
return const_cast<ChargingRelayController*>(this)->m_gpio2.value() == Gpio::ValueHigh;
}
void ChargingRelayController::setChargerStart1(bool set)
{
// we need to unset charger start 2 first
if (!set && isChargerStart2Set())
return;
if (isChargerStart1Set() == set)
return;
m_gpio3.setValue(set ? Gpio::ValueHigh : Gpio::ValueLow);
}
bool ChargingRelayController::isChargerStart1Set() const
{
return const_cast<ChargingRelayController*>(this)->m_gpio3.value() == Gpio::ValueHigh;
}
void ChargingRelayController::setChargerStart2(bool set)
{
if (isChargerStart2Set() == set)
return;
m_gpio14.setValue(set ? Gpio::ValueHigh : Gpio::ValueLow);
}
bool ChargingRelayController::isChargerStart2Set() const
{
return const_cast<ChargingRelayController*>(this)->m_gpio14.value() == Gpio::ValueHigh;
}