forked from matth-x/MicroOcpp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStatusNotification.cpp
More file actions
110 lines (93 loc) · 3.45 KB
/
Copy pathStatusNotification.cpp
File metadata and controls
110 lines (93 loc) · 3.45 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
// matth-x/ArduinoOcpp
// Copyright Matthias Akstaller 2019 - 2023
// MIT License
#include <ArduinoOcpp/Operations/StatusNotification.h>
#include <ArduinoOcpp/Model/Model.h>
#include <ArduinoOcpp/Debug.h>
#include <string.h>
using ArduinoOcpp::Ocpp16::StatusNotification;
//helper function
namespace ArduinoOcpp {
namespace Ocpp16 {
const char *cstrFromOcppEveState(ChargePointStatus state) {
switch (state) {
case (ChargePointStatus::Available):
return "Available";
case (ChargePointStatus::Preparing):
return "Preparing";
case (ChargePointStatus::Charging):
return "Charging";
case (ChargePointStatus::SuspendedEVSE):
return "SuspendedEVSE";
case (ChargePointStatus::SuspendedEV):
return "SuspendedEV";
case (ChargePointStatus::Finishing):
return "Finishing";
case (ChargePointStatus::Reserved):
return "Reserved";
case (ChargePointStatus::Unavailable):
return "Unavailable";
case (ChargePointStatus::Faulted):
return "Faulted";
default:
AO_DBG_ERR("ChargePointStatus not specified");
(void)0;
/* fall through */
case (ChargePointStatus::NOT_SET):
return "NOT_SET";
}
}
}} //end namespaces
StatusNotification::StatusNotification(int connectorId, ChargePointStatus currentStatus, const Timestamp ×tamp, ErrorData errorData)
: connectorId(connectorId), currentStatus(currentStatus), timestamp(timestamp), errorData(errorData) {
AO_DBG_INFO("New status: %s (connectorId %d)", cstrFromOcppEveState(currentStatus), connectorId);
}
const char* StatusNotification::getOperationType(){
return "StatusNotification";
}
//TODO if the status has changed again when sendReq() is called, abort the operation completely (note: if req is already sent, stick with listening to conf). The ChargePointStatusService will enqueue a new operation itself
std::unique_ptr<DynamicJsonDocument> StatusNotification::createReq() {
auto doc = std::unique_ptr<DynamicJsonDocument>(new DynamicJsonDocument(JSON_OBJECT_SIZE(7) + (JSONDATE_LENGTH + 1)));
JsonObject payload = doc->to<JsonObject>();
payload["connectorId"] = connectorId;
if (errorData.isError) {
if (errorData.errorCode) {
payload["errorCode"] = errorData.errorCode;
}
if (errorData.info) {
payload["info"] = errorData.info;
}
if (errorData.vendorId) {
payload["vendorId"] = errorData.vendorId;
}
if (errorData.vendorErrorCode) {
payload["vendorErrorCode"] = errorData.vendorErrorCode;
}
} else if (currentStatus == ChargePointStatus::NOT_SET) {
AO_DBG_ERR("Reporting undefined status");
payload["errorCode"] = "InternalError";
} else {
payload["errorCode"] = "NoError";
}
payload["status"] = cstrFromOcppEveState(currentStatus);
char timestamp_cstr[JSONDATE_LENGTH + 1] = {'\0'};
timestamp.toJsonString(timestamp_cstr, JSONDATE_LENGTH + 1);
payload["timestamp"] = timestamp_cstr;
return doc;
}
void StatusNotification::processConf(JsonObject payload) {
/*
* Empty payload
*/
}
/*
* For debugging only
*/
void StatusNotification::processReq(JsonObject payload) {
}
/*
* For debugging only
*/
std::unique_ptr<DynamicJsonDocument> StatusNotification::createConf(){
return createEmptyDocument();
}