Skip to content

Commit 073eb19

Browse files
committed
keeping track of TxID when offline
1 parent 2542160 commit 073eb19

14 files changed

Lines changed: 59 additions & 31 deletions

platformio.ini

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ framework = arduino
1717
lib_deps =
1818
ArduinoJson@6.17.2
1919
WebSockets@2.2.0
20-
ivanseidel/LinkedList @ 0.0.0-alpha+sha.dac3874d28
21-
Time@1.6
2220
build_flags =
2321
-D USE_FACADE=true
2422
monitor_speed = 115200

src/ArduinoOcpp.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ OcppTime *ocppTime;
4444
#define OCPP_ID_OF_CONNECTOR 1
4545
#define OCPP_ID_OF_CP 0
4646
boolean OCPP_initialized = false;
47+
boolean OCPP_booted = false; //if BootNotification succeeded
4748

4849
#if 0 //moved to OcppConnection
4950
/*
@@ -158,12 +159,17 @@ void OCPP_loop() {
158159
return;
159160
}
160161

161-
Serial.print('.');
162-
delay(70);
163-
164162
//webSocket.loop(); //moved to Core/OcppSocket
165163
ocppEngine_loop(); //mandatory
166164

165+
if (!OCPP_booted) {
166+
if (chargePointStatusService->isBooted()) {
167+
OCPP_booted = true;
168+
} else {
169+
return; //wait until the first BootNotification succeeded
170+
}
171+
}
172+
167173
if (onLimitChange != NULL) {
168174
smartChargingService->loop(); //optional
169175
}
@@ -310,15 +316,15 @@ void startTransaction(OnReceiveConfListener onConf, OnAbortListener onAbort, OnT
310316
if (timeout)
311317
startTransaction->setTimeout(timeout);
312318
else
313-
startTransaction->setTimeout(new FixedTimeout(20000));
319+
startTransaction->setTimeout(new SuppressedTimeout());
314320
}
315321

316322
void startTransaction(String &idTag, OnReceiveConfListener onConf) {
317323
OcppOperation *startTransaction = makeOcppOperation(
318324
new StartTransaction(OCPP_ID_OF_CONNECTOR, idTag));
319325
initiateOcppOperation(startTransaction);
320326
startTransaction->setOnReceiveConfListener(onConf);
321-
startTransaction->setTimeout(new FixedTimeout(20000));
327+
startTransaction->setTimeout(new SuppressedTimeout());
322328
}
323329

324330
void stopTransaction(OnReceiveConfListener onConf, OnAbortListener onAbort, OnTimeoutListener onTimeout, OnReceiveErrorListener onError, Timeout *timeout) {

src/ArduinoOcpp/Core/OcppConnection.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ void OcppConnection::initiateOcppOperation(OcppOperation *o){
100100
return;
101101
}
102102
initiatedOcppOperations.push_back(o);
103+
o->setInitiated();
103104
}
104105

105106
bool OcppConnection::processOcppSocketInputTXT(const char* payload, size_t length) {

src/ArduinoOcpp/Core/OcppEngine.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ void ocppEngine_initialize(OcppSocket *ocppSocket){
4444

4545
void initiateOcppOperation(OcppOperation *o) {
4646
mConnection->initiateOcppOperation(o);
47-
o->setInitiated();
4847
}
4948

5049
void ocppEngine_loop() {

src/ArduinoOcpp/Core/OcppMessage.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const char* OcppMessage::getOcppOperationType(){
1616
}
1717

1818
void OcppMessage::initiate() {
19-
//callback after initiateOcppOperation(anyMsg)
19+
//called after initiateOcppOperation(anyMsg)
2020
}
2121

2222
DynamicJsonDocument* OcppMessage::createReq() {

src/ArduinoOcpp/MessagesV16/MeterValues.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,11 @@ DynamicJsonDocument* MeterValues::createReq() {
8080
}
8181
}
8282

83-
if (transactionId >= 0) {
84-
payload["transactionId"] = transactionId;
83+
ConnectorStatus *connector = getConnectorStatus(connectorId);
84+
if (connector) {
85+
if (connector->getTransactionIdSync() >= 0) {
86+
payload["transactionId"] = connector->getTransactionIdSync();
87+
}
8588
}
8689

8790
return doc;

src/ArduinoOcpp/MessagesV16/StartTransaction.cpp

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,6 @@ void StartTransaction::initiate() {
3535
otimestamp = MIN_TIME;
3636
}
3737

38-
ChargePointStatusService *cpss = getChargePointStatusService();
39-
if (cpss != NULL) {
40-
if (cpss->existsUnboundAuthorization()) {
41-
this->idTag = String(cpss->getUnboundIdTag());
42-
} else {
43-
//The CP is not authorized. Try anyway, let the CS decide what to do ...
44-
this->idTag = String("A0-00-00-00");
45-
}
46-
} else {
47-
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
48-
}
49-
5038
if (idTag.isEmpty()) {
5139
ChargePointStatusService *cpss = getChargePointStatusService();
5240
if (cpss != NULL && cpss->existsUnboundAuthorization()) {
@@ -64,10 +52,13 @@ void StartTransaction::initiate() {
6452

6553
ConnectorStatus *connector = getConnectorStatus(connectorId);
6654
if (connector != NULL){
55+
if (connector->getTransactionId() >= 0) {
56+
Serial.print(F("[StartTransaction] Warning: started transaction while OCPP already presumes a running transaction\n"));
57+
}
6758
connector->setTransactionId(0); //pending
59+
transactionRev = connector->getTransactionWriteCount();
6860
}
6961

70-
7162
if (DEBUG_OUT) Serial.println(F("[StartTransaction] StartTransaction initiated!"));
7263
}
7364

@@ -101,14 +92,20 @@ void StartTransaction::processConf(JsonObject payload) {
10192

10293
ConnectorStatus *connector = getConnectorStatus(connectorId);
10394
if (connector){
104-
connector->setTransactionId(transactionId);
95+
if (transactionRev == connector->getTransactionWriteCount()) {
96+
connector->setTransactionId(transactionId);
97+
}
98+
connector->setTransactionIdSync(transactionId);
10599
}
106100
} else {
107101
Serial.print(F("[StartTransaction] Request has been denied!\n"));
108102
ConnectorStatus *connector = getConnectorStatus(connectorId);
109103
if (connector){
110-
connector->setTransactionId(-1);
111-
connector->unauthorize();
104+
if (transactionRev == connector->getTransactionWriteCount()) {
105+
connector->setTransactionId(-1);
106+
connector->unauthorize();
107+
}
108+
connector->setTransactionIdSync(-1);
112109
}
113110
}
114111
}

src/ArduinoOcpp/MessagesV16/StartTransaction.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class StartTransaction : public OcppMessage {
1919
float meterStart = -1.0f;
2020
OcppTimestamp otimestamp;
2121
String idTag = String('\0');
22+
uint16_t transactionRev = 0;
2223
public:
2324
StartTransaction(int connectorId);
2425

src/ArduinoOcpp/MessagesV16/StopTransaction.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ void StopTransaction::initiate() {
3636

3737
ConnectorStatus *connector = getConnectorStatus(connectorId);
3838
if (connector != NULL){
39-
transactionId = connector->getTransactionId(); //for req message
4039
connector->setTransactionId(-1); //immediate end of transaction
4140
connector->unauthorize();
4241
}
@@ -58,8 +57,11 @@ DynamicJsonDocument* StopTransaction::createReq() {
5857
otimestamp.toJsonString(timestamp, JSONDATE_LENGTH + 1);
5958
payload["timestamp"] = timestamp;
6059
}
61-
62-
payload["transactionId"] = transactionId;
60+
ConnectorStatus *connector = getConnectorStatus(connectorId);
61+
if (connector != NULL){
62+
payload["transactionId"] = connector->getTransactionIdSync();
63+
connector->setTransactionIdSync(-1);
64+
}
6365

6466
return doc;
6567
}

src/ArduinoOcpp/MessagesV16/StopTransaction.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ class StopTransaction : public OcppMessage {
1616
int connectorId = 1;
1717
float meterStop = -1.0f;
1818
OcppTimestamp otimestamp;
19-
int transactionId = -1;
2019
public:
2120
StopTransaction();
2221

0 commit comments

Comments
 (0)