forked from matth-x/MicroOcpp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStartTransaction.cpp
More file actions
131 lines (103 loc) · 4.32 KB
/
Copy pathStartTransaction.cpp
File metadata and controls
131 lines (103 loc) · 4.32 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
// matth-x/ArduinoOcpp
// Copyright Matthias Akstaller 2019 - 2021
// MIT License
#include <ArduinoOcpp/MessagesV16/StartTransaction.h>
#include <ArduinoOcpp/Core/OcppEngine.h>
#include <ArduinoOcpp/Tasks/Metering/MeteringService.h>
#include <Variants.h>
using ArduinoOcpp::Ocpp16::StartTransaction;
StartTransaction::StartTransaction(int connectorId) : connectorId(connectorId) {
this->idTag = String('\0');
}
StartTransaction::StartTransaction(int connectorId, String &idTag) : connectorId(connectorId) {
this->idTag = String(idTag);
}
const char* StartTransaction::getOcppOperationType(){
return "StartTransaction";
}
void StartTransaction::initiate() {
MeteringService* meteringService = getMeteringService();
if (meteringService != NULL) {
meterStart = meteringService->readEnergyActiveImportRegister(connectorId);
}
OcppTime *ocppTime = getOcppTime();
if (ocppTime) {
otimestamp = ocppTime->getOcppTimestampNow();
} else {
otimestamp = MIN_TIME;
}
if (idTag.isEmpty()) {
ChargePointStatusService *cpss = getChargePointStatusService();
if (cpss != NULL && cpss->existsUnboundAuthorization()) {
this->idTag = String(cpss->getUnboundIdTag());
} else {
//The CP is not authorized. Try anyway, let the CS decide what to do ...
this->idTag = String("A0-00-00-00"); //Use a default payload. In the typical use case of this library, you probably you don't even need Authorization at all
}
}
ChargePointStatusService *cpStatusService = getChargePointStatusService();
if (cpStatusService) {
cpStatusService->bindAuthorization(connectorId);
}
ConnectorStatus *connector = getConnectorStatus(connectorId);
if (connector != NULL){
if (connector->getTransactionId() >= 0) {
Serial.print(F("[StartTransaction] Warning: started transaction while OCPP already presumes a running transaction\n"));
}
connector->setTransactionId(0); //pending
transactionRev = connector->getTransactionWriteCount();
}
if (DEBUG_OUT) Serial.println(F("[StartTransaction] StartTransaction initiated!"));
}
DynamicJsonDocument* StartTransaction::createReq() {
DynamicJsonDocument *doc = new DynamicJsonDocument(JSON_OBJECT_SIZE(5) + (JSONDATE_LENGTH + 1) + (idTag.length() + 1));
JsonObject payload = doc->to<JsonObject>();
payload["connectorId"] = connectorId;
if (meterStart >= 0.f) {
payload["meterStart"] = meterStart;
}
if (otimestamp > MIN_TIME) {
char timestamp[JSONDATE_LENGTH + 1] = {'\0'};
otimestamp.toJsonString(timestamp, JSONDATE_LENGTH + 1);
payload["timestamp"] = timestamp;
}
payload["idTag"] = idTag;
return doc;
}
void StartTransaction::processConf(JsonObject payload) {
const char* idTagInfoStatus = payload["idTagInfo"]["status"] | "Invalid";
int transactionId = payload["transactionId"] | -1;
if (!strcmp(idTagInfoStatus, "Accepted")) {
if (DEBUG_OUT) Serial.print(F("[StartTransaction] Request has been accepted!\n"));
ConnectorStatus *connector = getConnectorStatus(connectorId);
if (connector){
if (transactionRev == connector->getTransactionWriteCount()) {
connector->setTransactionId(transactionId);
}
connector->setTransactionIdSync(transactionId);
}
} else {
Serial.print(F("[StartTransaction] Request has been denied!\n"));
ConnectorStatus *connector = getConnectorStatus(connectorId);
if (connector){
if (transactionRev == connector->getTransactionWriteCount()) {
connector->setTransactionId(-1);
connector->unauthorize();
}
connector->setTransactionIdSync(-1);
}
}
}
void StartTransaction::processReq(JsonObject payload) {
/**
* Ignore Contents of this Req-message, because this is for debug purposes only
*/
}
DynamicJsonDocument* StartTransaction::createConf(){
DynamicJsonDocument* doc = new DynamicJsonDocument(JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2));
JsonObject payload = doc->to<JsonObject>();
JsonObject idTagInfo = payload.createNestedObject("idTagInfo");
idTagInfo["status"] = "Accepted";
payload["transactionId"] = 123456; //sample data for debug purpose
return doc;
}