forked from matth-x/MicroOcpp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathArduinoOcpp_c.cpp
More file actions
359 lines (294 loc) · 12.3 KB
/
ArduinoOcpp_c.cpp
File metadata and controls
359 lines (294 loc) · 12.3 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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
#include "ArduinoOcpp_c.h"
#include "ArduinoOcpp.h"
#include <ArduinoOcpp/Debug.h>
ArduinoOcpp::OcppSocket *ocppSocket = nullptr;
void ao_initialize(AOcppSocket *osock, float V_eff, struct AO_FilesystemOpt fsopt) {
if (!osock) {
AO_DBG_ERR("osock is null");
}
ocppSocket = reinterpret_cast<ArduinoOcpp::OcppSocket*>(osock);
ArduinoOcpp::FilesystemOpt adaptFsopt = fsopt;
OCPP_initialize(*ocppSocket, V_eff, adaptFsopt);
}
void ao_deinitialize() {
OCPP_deinitialize();
}
void ao_loop() {
OCPP_loop();
}
/*
* Helper functions for transforming callback functions from C-style to C++style
*/
ArduinoOcpp::PollResult<bool> adaptScl(enum OptionalBool v) {
if (v == OptionalTrue) {
return true;
} else if (v == OptionalFalse) {
return false;
} else if (v == OptionalNone) {
return ArduinoOcpp::PollResult<bool>::Await();
} else {
AO_DBG_ERR("illegal argument");
return false;
}
}
enum TxTrigger_t adaptScl(ArduinoOcpp::TxTrigger v) {
return v == ArduinoOcpp::TxTrigger::Active ? TxTrigger_t::TxTrg_Active : TxTrigger_t::TxTrg_Inactive;
}
ArduinoOcpp::TxEnableState adaptScl(enum TxEnableState_t v) {
if (v == TxEna_Pending) {
return ArduinoOcpp::TxEnableState::Pending;
} else if (v == TxEna_Active) {
return ArduinoOcpp::TxEnableState::Active;
} else if (v == TxEna_Inactive) {
return ArduinoOcpp::TxEnableState::Inactive;
} else {
AO_DBG_ERR("illegal argument");
return ArduinoOcpp::TxEnableState::Inactive;
}
}
std::function<bool()> adaptFn(InputBool fn) {
return fn;
}
std::function<bool()> adaptFn(unsigned int connectorId, InputBool_m fn) {
return [fn, connectorId] () {return fn(connectorId);};
}
std::function<const char*()> adaptFn(InputString fn) {
return fn;
}
std::function<const char*()> adaptFn(unsigned int connectorId, InputString_m fn) {
return [fn, connectorId] () {return fn(connectorId);};
}
std::function<float()> adaptFn(InputFloat fn) {
return fn;
}
std::function<float()> adaptFn(unsigned int connectorId, InputFloat_m fn) {
return [fn, connectorId] () {return fn(connectorId);};
}
std::function<int()> adaptFn(InputInt fn) {
return fn;
}
std::function<int()> adaptFn(unsigned int connectorId, InputInt_m fn) {
return [fn, connectorId] () {return fn(connectorId);};
}
std::function<void(float)> adaptFn(OutputFloat fn) {
return fn;
}
std::function<void(float)> adaptFn(unsigned int connectorId, OutputFloat_m fn) {
return [fn, connectorId] (float value) {return fn(connectorId, value);};
}
std::function<void(void)> adaptFn(void (*fn)(void)) {
return fn;
}
#ifndef AO_RECEIVE_PAYLOAD_BUFSIZE
#define AO_RECEIVE_PAYLOAD_BUFSIZE 512
#endif
char ao_recv_payload_buff [AO_RECEIVE_PAYLOAD_BUFSIZE] = {'\0'};
std::function<void(JsonObject)> adaptFn(OnOcppMessage fn) {
if (!fn) return nullptr;
return [fn] (JsonObject payload) {
auto len = serializeJson(payload, ao_recv_payload_buff, AO_RECEIVE_PAYLOAD_BUFSIZE);
if (len <= 0) {
AO_DBG_WARN("Received payload buffer exceeded. Continue without payload");
}
fn(len > 0 ? ao_recv_payload_buff : "", len);
};
}
std::function<void(JsonObject)> adaptFn(const char *idTag_cstr, OnAuthorize fn) {
if (!fn) return nullptr;
std::string idTag = idTag_cstr ? idTag_cstr : "undefined";
return [fn, idTag] (JsonObject payload) {
auto len = serializeJson(payload, ao_recv_payload_buff, AO_RECEIVE_PAYLOAD_BUFSIZE);
if (len <= 0) {
AO_DBG_WARN("Received payload buffer exceeded. Continue without payload");
}
fn(idTag.c_str(), len > 0 ? ao_recv_payload_buff : "", len);
};
}
ArduinoOcpp::OnReceiveErrorListener adaptFn(OnOcppError fn) {
if (!fn) return nullptr;
return [fn] (const char *code, const char *description, JsonObject details) {
auto len = serializeJson(details, ao_recv_payload_buff, AO_RECEIVE_PAYLOAD_BUFSIZE);
if (len <= 0) {
AO_DBG_WARN("Received payload buffer exceeded. Continue without payload");
}
fn(code, description, len > 0 ? ao_recv_payload_buff : "", len);
};
}
std::function<ArduinoOcpp::PollResult<bool>()> adaptFn(PollBool fn) {
return [fn] () {return adaptScl(fn());};
}
std::function<ArduinoOcpp::PollResult<bool>()> adaptFn(unsigned int connectorId, PollBool_m fn) {
return [fn, connectorId] () {return adaptScl(fn(connectorId));};
}
std::function<ArduinoOcpp::TxEnableState(ArduinoOcpp::TxTrigger)> adaptFn(TxStepInOut fn) {
if (!fn) return nullptr;
return [fn] (ArduinoOcpp::TxTrigger trigger) -> ArduinoOcpp::TxEnableState {
auto res = fn(adaptScl(trigger));
return adaptScl(res);
};
}
std::function<ArduinoOcpp::TxEnableState(ArduinoOcpp::TxTrigger)> adaptFn(unsigned int connectorId, TxStepInOut_m fn) {
if (!fn) return nullptr;
return [fn, connectorId] (ArduinoOcpp::TxTrigger trigger) -> ArduinoOcpp::TxEnableState {
auto res = fn(connectorId, adaptScl(trigger));
return adaptScl(res);
};
}
void ao_bootNotification(const char *chargePointModel, const char *chargePointVendor, OnOcppMessage onConfirmation, OnOcppAbort onAbort, OnOcppTimeout onTimeout, OnOcppError onError) {
bootNotification(chargePointModel, chargePointVendor, adaptFn(onConfirmation), adaptFn(onAbort), adaptFn(onTimeout), adaptFn(onError));
}
void ao_bootNotification_full(const char *payloadJson, OnOcppMessage onConfirmation, OnOcppAbort onAbort, OnOcppTimeout onTimeout, OnOcppError onError) {
auto payload = std::unique_ptr<DynamicJsonDocument>(new DynamicJsonDocument(JSON_OBJECT_SIZE(9) + 230 + 9)); // BootNotification has at most 9 attributes with at most 230 chars + null terminators
auto err = deserializeJson(*payload, payloadJson);
if (err) {
AO_DBG_ERR("Could not process input: %s", err.c_str());
(void)0;
}
bootNotification(std::move(payload), adaptFn(onConfirmation), adaptFn(onAbort), adaptFn(onTimeout), adaptFn(onError));
}
void ao_authorize(const char *idTag, OnAuthorize onConfirmation, OnOcppAbort onAbort, OnOcppTimeout onTimeout, OnOcppError onError) {
authorize(idTag, adaptFn(idTag, onConfirmation), adaptFn(onAbort), adaptFn(onTimeout), adaptFn(onError));
}
void ao_beginTransaction(const char *idTag) {
ao_beginTransaction(idTag);
}
void ao_beginTransaction_m(unsigned int connectorId, const char *idTag) {
beginTransaction(idTag, 1);
}
bool ao_endTransaction(const char *reason) {
return endTransaction(reason);
}
bool ao_endTransaction_m(unsigned int connectorId, const char *reason) {
return endTransaction(reason, connectorId);
}
bool ao_isTransactionRunning() {
return isTransactionRunning();
}
bool ao_isTransactionRunning_m(unsigned int connectorId) {
return isTransactionRunning(connectorId);
}
bool ao_ocppPermitsCharge() {
return ocppPermitsCharge();
}
bool ao_ocppPermitsCharge_m(unsigned int connectorId) {
return ocppPermitsCharge(connectorId);
}
void ao_setConnectorPluggedInput(InputBool pluggedInput) {
setConnectorPluggedInput(adaptFn(pluggedInput));
}
void ao_setConnectorPluggedInput_m(unsigned int connectorId, InputBool_m pluggedInput) {
setConnectorPluggedInput(adaptFn(connectorId, pluggedInput), connectorId);
}
void ao_setEnergyMeterInput(InputInt energyInput) {
setEnergyMeterInput(adaptFn(energyInput));
}
void ao_setEnergyMeterInput_m(unsigned int connectorId, InputInt_m energyInput) {
setEnergyMeterInput(adaptFn(connectorId, energyInput), connectorId);
}
void ao_setPowerMeterInput(InputFloat powerInput) {
setPowerMeterInput(adaptFn(powerInput));
}
void ao_setPowerMeterInput_m(unsigned int connectorId, InputFloat_m powerInput) {
setPowerMeterInput(adaptFn(connectorId, powerInput), connectorId);
}
void ao_setSmartChargingOutput(OutputFloat chargingLimitOutput) {
setSmartChargingOutput(adaptFn(chargingLimitOutput));
}
void ao_setSmartChargingOutput_m(unsigned int connectorId, OutputFloat_m chargingLimitOutput) {
setSmartChargingOutput(adaptFn(connectorId, chargingLimitOutput), connectorId);
}
void ao_setEvReadyInput(InputBool evReadyInput) {
setEvReadyInput(adaptFn(evReadyInput));
}
void ao_setEvReadyInput_m(unsigned int connectorId, InputBool_m evReadyInput) {
setEvReadyInput(adaptFn(connectorId, evReadyInput), connectorId);
}
void ao_setEvseReadyInput(InputBool evseReadyInput) {
setEvseReadyInput(adaptFn(evseReadyInput));
}
void ao_setEvseReadyInput_m(unsigned int connectorId, InputBool_m evseReadyInput) {
setEvseReadyInput(adaptFn(connectorId, evseReadyInput), connectorId);
}
void ao_addErrorCodeInput(InputString errorCodeInput) {
addErrorCodeInput(adaptFn(errorCodeInput));
}
void ao_addErrorCodeInput_m(unsigned int connectorId, InputString_m errorCodeInput) {
addErrorCodeInput(adaptFn(connectorId, errorCodeInput), connectorId);
}
void ao_addMeterValueInputInt(InputInt valueInput, const char *measurand, const char *unit, const char *location, const char *phase) {
addMeterValueInput(adaptFn(valueInput), measurand, unit, location, phase, 1);
}
void ao_addMeterValueInputInt_m(unsigned int connectorId, InputInt_m valueInput, const char *measurand, const char *unit, const char *location, const char *phase) {
addMeterValueInput(adaptFn(connectorId, valueInput), measurand, unit, location, phase, connectorId);
}
void ao_addMeterValueInput(MeterValueInput *meterValueInput) {
ao_addMeterValueInput_m(1, meterValueInput);
}
void ao_addMeterValueInput_m(unsigned int connectorId, MeterValueInput *meterValueInput) {
auto svs = std::unique_ptr<ArduinoOcpp::SampledValueSampler>(
reinterpret_cast<ArduinoOcpp::SampledValueSampler*>(meterValueInput));
addMeterValueInput(std::move(svs), connectorId);
}
void ao_setOnUnlockConnectorInOut(PollBool onUnlockConnectorInOut) {
setOnUnlockConnectorInOut(adaptFn(onUnlockConnectorInOut));
}
void ao_setOnUnlockConnectorInOut_m(unsigned int connectorId, PollBool_m onUnlockConnectorInOut) {
setOnUnlockConnectorInOut(adaptFn(connectorId, onUnlockConnectorInOut), connectorId);
}
void ao_setConnectorLockInOut(TxStepInOut lockConnectorInOut) {
setConnectorLockInOut(adaptFn(lockConnectorInOut));
}
void ao_setConnectorLockInOut_m(unsigned int connectorId, TxStepInOut_m lockConnectorInOut) {
setConnectorLockInOut(adaptFn(connectorId, lockConnectorInOut), connectorId);
}
void ao_setTxBasedMeterInOut(TxStepInOut txMeterInOut) {
setTxBasedMeterInOut(adaptFn(txMeterInOut));
}
void ao_setTxBasedMeterInOut_m(unsigned int connectorId, TxStepInOut_m txMeterInOut) {
setTxBasedMeterInOut(adaptFn(connectorId, txMeterInOut), connectorId);
}
bool ao_isOperative() {
return isOperative();
}
bool ao_isOperative_m(unsigned int connectorId) {
return isOperative(connectorId);
}
int ao_getTransactionId() {
return getTransactionId();
}
int ao_getTransactionId_m(unsigned int connectorId) {
return getTransactionId(connectorId);
}
const char *ao_getTransactionIdTag() {
return getTransactionIdTag();
}
const char *ao_getTransactionIdTag_m(unsigned int connectorId) {
return getTransactionIdTag(connectorId);
}
void ao_setOnResetRequest(OnOcppMessage onRequest) {
setOnResetRequest(adaptFn(onRequest));
}
void ao_set_console_out_c(void (*console_out)(const char *msg)) {
ao_set_console_out(console_out);
}
OcppHandle *getOcppHandle() {
return reinterpret_cast<OcppHandle*>(getOcppEngine());
}
void ao_onRemoteStartTransactionSendConf(OnOcppMessage onSendConf) {
setOnRemoteStopTransactionSendConf(adaptFn(onSendConf));
}
void ao_onRemoteStopTransactionSendConf(OnOcppMessage onSendConf) {
setOnRemoteStopTransactionSendConf(adaptFn(onSendConf));
}
void ao_onRemoteStopTransactionRequest(OnOcppMessage onRequest) {
setOnRemoteStopTransactionReceiveReq(adaptFn(onRequest));
}
void ao_onResetSendConf(OnOcppMessage onSendConf) {
setOnResetSendConf(adaptFn(onSendConf));
}
void ao_startTransaction(const char *idTag, OnOcppMessage onConfirmation, OnOcppAbort onAbort, OnOcppTimeout onTimeout, OnOcppError onError) {
startTransaction(idTag, adaptFn(onConfirmation), adaptFn(onAbort), adaptFn(onTimeout), adaptFn(onError));
}
void ao_stopTransaction(OnOcppMessage onConfirmation, OnOcppAbort onAbort, OnOcppTimeout onTimeout, OnOcppError onError) {
stopTransaction(adaptFn(onConfirmation), adaptFn(onAbort), adaptFn(onTimeout), adaptFn(onError));
}