Skip to content

Commit 6aa9c90

Browse files
committed
add timestamp to StatusNotification.req for v16
Signed-off-by: pietfried <pietgoempel@gmail.com>
1 parent 6ad3712 commit 6aa9c90

File tree

4 files changed

+79
-74
lines changed

4 files changed

+79
-74
lines changed

include/ocpp/v16/charge_point_impl.hpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,8 @@ class ChargePointImpl : ocpp::ChargingStationBase {
202202
MeterValue get_signed_meter_value(const std::string& signed_value, const ReadingContext& context,
203203
const ocpp::DateTime& datetime);
204204
void send_meter_value(int32_t connector, MeterValue meter_value);
205-
void status_notification(int32_t connector, ChargePointErrorCode errorCode, CiString<50> info,
206-
ChargePointStatus status, ocpp::DateTime timestamp);
207-
void status_notification(int32_t connector, ChargePointErrorCode errorCode, ChargePointStatus status);
205+
void status_notification(const int32_t connector, const ChargePointErrorCode errorCode,
206+
const ChargePointStatus status, const ocpp::DateTime& timestamp);
208207
void diagnostic_status_notification(DiagnosticsStatus status);
209208
void firmware_status_notification(FirmwareStatus status);
210209
void log_status_notification(UploadLogStatusEnumType status, int requestId);

include/ocpp/v16/charge_point_state_machine.hpp

+11-8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <string>
1111
#include <vector>
1212

13+
#include <ocpp/common/types.hpp>
1314
#include <ocpp/v16/enums.hpp>
1415

1516
namespace ocpp {
@@ -43,12 +44,13 @@ using FSMDefinition = std::map<FSMState, FSMStateTransitions>;
4344

4445
class ChargePointFSM {
4546
public:
46-
using StatusNotificationCallback = std::function<void(ChargePointStatus status, ChargePointErrorCode error_code)>;
47+
using StatusNotificationCallback = std::function<void(
48+
const ChargePointStatus status, const ChargePointErrorCode error_code, const ocpp::DateTime& timestamp)>;
4749
explicit ChargePointFSM(const StatusNotificationCallback& status_notification_callback, FSMState initial_state);
4850

49-
bool handle_event(FSMEvent event);
50-
bool handle_error(const ChargePointErrorCode& error_code);
51-
bool handle_fault(const ChargePointErrorCode& error_code);
51+
bool handle_event(FSMEvent event, const ocpp::DateTime timestamp);
52+
bool handle_error(const ChargePointErrorCode& error_code, const ocpp::DateTime& timestamp);
53+
bool handle_fault(const ChargePointErrorCode& error_code, const ocpp::DateTime& timestamp);
5254

5355
FSMState get_state() const;
5456

@@ -64,13 +66,14 @@ class ChargePointFSM {
6466
class ChargePointStates {
6567
public:
6668
using ConnectorStatusCallback =
67-
std::function<void(int connector_id, ChargePointErrorCode errorCode, ChargePointStatus status)>;
69+
std::function<void(const int connector_id, const ChargePointErrorCode errorCode, const ChargePointStatus status,
70+
const ocpp::DateTime& timestamp)>;
6871
ChargePointStates(const ConnectorStatusCallback& connector_status_callback);
6972
void reset(std::map<int, ChargePointStatus> connector_status_map);
7073

71-
void submit_event(int connector_id, FSMEvent event);
72-
void submit_fault(int connector_id, const ChargePointErrorCode& error_code);
73-
void submit_error(int connector_id, const ChargePointErrorCode& error_code);
74+
void submit_event(const int connector_id, FSMEvent event, const ocpp::DateTime& timestamp);
75+
void submit_fault(const int connector_id, const ChargePointErrorCode& error_code, const ocpp::DateTime& timestamp);
76+
void submit_error(const int connector_id, const ChargePointErrorCode& error_code, const ocpp::DateTime& timestamp);
7477

7578
ChargePointStatus get_state(int connector_id);
7679

lib/ocpp/v16/charge_point_impl.cpp

+41-42
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,14 @@ ChargePointImpl::ChargePointImpl(const std::string& config, const fs::path& shar
9696
this->v2g_certificate_timer->interval(V2G_CERTIFICATE_TIMER_INTERVAL);
9797
});
9898

99-
this->status = std::make_unique<ChargePointStates>(
100-
[this](int32_t connector, ChargePointErrorCode errorCode, ChargePointStatus status) {
99+
this->status =
100+
std::make_unique<ChargePointStates>([this](const int32_t connector, const ChargePointErrorCode errorCode,
101+
const ChargePointStatus status, const ocpp::DateTime& timestamp) {
101102
this->status_notification_timers.at(connector)->stop();
102103
this->status_notification_timers.at(connector)->timeout(
103-
[this, connector, errorCode, status]() { this->status_notification(connector, errorCode, status); },
104+
[this, connector, errorCode, status, timestamp]() {
105+
this->status_notification(connector, errorCode, status, timestamp);
106+
},
104107
std::chrono::seconds(this->configuration->getMinimumStatusDuration().value_or(0)));
105108
});
106109

@@ -824,7 +827,7 @@ void ChargePointImpl::change_all_connectors_to_unavailable_for_firmware_update()
824827

825828
for (const auto& [connector, availability_status] : connector_availability_status) {
826829
if (connector == 0) {
827-
this->status->submit_event(0, FSMEvent::ChangeAvailabilityToUnavailable);
830+
this->status->submit_event(0, FSMEvent::ChangeAvailabilityToUnavailable, ocpp::DateTime());
828831
} else if (this->disable_evse_callback != nullptr and availability_status == AvailabilityStatus::Accepted) {
829832
this->disable_evse_callback(connector);
830833
}
@@ -903,7 +906,8 @@ void ChargePointImpl::connected_callback() {
903906
// according to spec, a charge point should not send a BootNotification after a reconnect
904907
// still we send StatusNotification.req for all connectors after a reconnect
905908
for (int32_t connector = 0; connector <= this->configuration->getNumberOfConnectors(); connector++) {
906-
this->status_notification(connector, ChargePointErrorCode::NoError, this->status->get_state(connector));
909+
this->status_notification(connector, ChargePointErrorCode::NoError, this->status->get_state(connector),
910+
ocpp::DateTime());
907911
}
908912
break;
909913
}
@@ -1161,7 +1165,8 @@ void ChargePointImpl::handleBootNotificationResponse(ocpp::CallResult<BootNotifi
11611165

11621166
// send initial StatusNotification.req
11631167
for (int32_t connector = 0; connector <= this->configuration->getNumberOfConnectors(); connector++) {
1164-
this->status_notification(connector, ChargePointErrorCode::NoError, this->status->get_state(connector));
1168+
this->status_notification(connector, ChargePointErrorCode::NoError, this->status->get_state(connector),
1169+
ocpp::DateTime());
11651170
}
11661171

11671172
this->message_queue->get_transaction_messages_from_db();
@@ -1259,14 +1264,14 @@ void ChargePointImpl::handleChangeAvailabilityRequest(ocpp::Call<ChangeAvailabil
12591264
this->database_handler->insert_or_update_connector_availability(connector, call.msg.type);
12601265
if (call.msg.type == AvailabilityType::Operative) {
12611266
if (connector == 0) {
1262-
this->status->submit_event(0, FSMEvent::BecomeAvailable);
1267+
this->status->submit_event(0, FSMEvent::BecomeAvailable, ocpp::DateTime());
12631268
} else if (this->enable_evse_callback != nullptr and
12641269
availability_status == AvailabilityStatus::Accepted) {
12651270
this->enable_evse_callback(connector);
12661271
}
12671272
} else {
12681273
if (connector == 0) {
1269-
this->status->submit_event(0, FSMEvent::ChangeAvailabilityToUnavailable);
1274+
this->status->submit_event(0, FSMEvent::ChangeAvailabilityToUnavailable, ocpp::DateTime());
12701275
} else if (this->disable_evse_callback != nullptr and
12711276
availability_status == AvailabilityStatus::Accepted) {
12721277
this->disable_evse_callback(connector);
@@ -1775,13 +1780,13 @@ void ChargePointImpl::handleStopTransactionResponse(const EnhancedMessage<v16::M
17751780
// TODO(kai): check return value
17761781
this->enable_evse_callback(connector);
17771782
}
1778-
this->status->submit_event(connector, FSMEvent::BecomeAvailable);
1783+
this->status->submit_event(connector, FSMEvent::BecomeAvailable, ocpp::DateTime());
17791784
} else {
17801785
if (this->disable_evse_callback != nullptr) {
17811786
// TODO(kai): check return value
17821787
this->disable_evse_callback(connector);
17831788
}
1784-
this->status->submit_event(connector, FSMEvent::ChangeAvailabilityToUnavailable);
1789+
this->status->submit_event(connector, FSMEvent::ChangeAvailabilityToUnavailable, ocpp::DateTime());
17851790
}
17861791
}
17871792
} else {
@@ -2022,10 +2027,12 @@ void ChargePointImpl::handleTriggerMessageRequest(ocpp::Call<TriggerMessageReque
20222027
if (!call.msg.connectorId.has_value()) {
20232028
// send a status notification for every connector
20242029
for (int32_t c = 0; c <= this->configuration->getNumberOfConnectors(); c++) {
2025-
this->status_notification(c, ChargePointErrorCode::NoError, this->status->get_state(c));
2030+
this->status_notification(c, ChargePointErrorCode::NoError, this->status->get_state(c),
2031+
ocpp::DateTime());
20262032
}
20272033
} else {
2028-
this->status_notification(connector, ChargePointErrorCode::NoError, this->status->get_state(connector));
2034+
this->status_notification(connector, ChargePointErrorCode::NoError, this->status->get_state(connector),
2035+
ocpp::DateTime());
20292036
}
20302037
break;
20312038
}
@@ -2135,10 +2142,12 @@ void ChargePointImpl::handleExtendedTriggerMessageRequest(ocpp::Call<ExtendedTri
21352142
if (!call.msg.connectorId.has_value()) {
21362143
// send a status notification for every connector
21372144
for (int32_t c = 0; c <= this->configuration->getNumberOfConnectors(); c++) {
2138-
this->status_notification(c, ChargePointErrorCode::NoError, this->status->get_state(c));
2145+
this->status_notification(c, ChargePointErrorCode::NoError, this->status->get_state(c),
2146+
ocpp::DateTime());
21392147
}
21402148
} else {
2141-
this->status_notification(connector, ChargePointErrorCode::NoError, this->status->get_state(connector));
2149+
this->status_notification(connector, ChargePointErrorCode::NoError, this->status->get_state(connector),
2150+
ocpp::DateTime());
21422151
}
21432152
break;
21442153
}
@@ -2514,23 +2523,13 @@ bool ChargePointImpl::send(CallError call_error) {
25142523
return true;
25152524
}
25162525

2517-
void ChargePointImpl::status_notification(int32_t connector, ChargePointErrorCode errorCode, CiString<50> info,
2518-
ChargePointStatus status, ocpp::DateTime timestamp) {
2519-
StatusNotificationRequest request;
2520-
request.connectorId = connector;
2521-
request.errorCode = errorCode;
2522-
request.info.emplace(info);
2523-
request.status = status;
2524-
request.timestamp.emplace(timestamp);
2525-
ocpp::Call<StatusNotificationRequest> call(request, this->message_queue->createMessageId());
2526-
this->send<StatusNotificationRequest>(call);
2527-
}
2528-
2529-
void ChargePointImpl::status_notification(int32_t connector, ChargePointErrorCode errorCode, ChargePointStatus status) {
2526+
void ChargePointImpl::status_notification(const int32_t connector, const ChargePointErrorCode errorCode,
2527+
const ChargePointStatus status, const ocpp::DateTime& timestamp) {
25302528
StatusNotificationRequest request;
25312529
request.connectorId = connector;
25322530
request.errorCode = errorCode;
25332531
request.status = status;
2532+
request.timestamp = timestamp;
25342533
ocpp::Call<StatusNotificationRequest> call(request, this->message_queue->createMessageId());
25352534
this->send<StatusNotificationRequest>(call);
25362535
}
@@ -3120,17 +3119,17 @@ void ChargePointImpl::on_session_started(int32_t connector, const std::string& s
31203119
if ((this->status->get_state(connector) == ChargePointStatus::Reserved &&
31213120
session_started_reason == SessionStartedReason::Authorized) ||
31223121
this->status->get_state(connector) != ChargePointStatus::Reserved) {
3123-
this->status->submit_event(connector, FSMEvent::UsageInitiated);
3122+
this->status->submit_event(connector, FSMEvent::UsageInitiated, ocpp::DateTime());
31243123
}
31253124
}
31263125

31273126
void ChargePointImpl::on_session_stopped(const int32_t connector, const std::string& session_id) {
31283127
// TODO(piet) fix this when evse manager signals clearance of an error
31293128
if (this->status->get_state(connector) == ChargePointStatus::Faulted) {
3130-
this->status->submit_event(connector, FSMEvent::I1_ReturnToAvailable);
3129+
this->status->submit_event(connector, FSMEvent::I1_ReturnToAvailable, ocpp::DateTime());
31313130
} else if (this->status->get_state(connector) != ChargePointStatus::Reserved &&
31323131
this->status->get_state(connector) != ChargePointStatus::Unavailable) {
3133-
this->status->submit_event(connector, FSMEvent::BecomeAvailable);
3132+
this->status->submit_event(connector, FSMEvent::BecomeAvailable, ocpp::DateTime());
31343133
}
31353134

31363135
if (this->logging->session_logging_active()) {
@@ -3143,7 +3142,7 @@ void ChargePointImpl::on_transaction_started(const int32_t& connector, const std
31433142
std::optional<int32_t> reservation_id, const ocpp::DateTime& timestamp,
31443143
std::optional<std::string> signed_meter_value) {
31453144
if (this->status->get_state(connector) == ChargePointStatus::Reserved) {
3146-
this->status->submit_event(connector, FSMEvent::UsageInitiated);
3145+
this->status->submit_event(connector, FSMEvent::UsageInitiated, ocpp::DateTime());
31473146
}
31483147

31493148
auto meter_values_sample_timer = std::make_unique<Everest::SteadyTimer>(&this->io_service, [this, connector]() {
@@ -3206,7 +3205,7 @@ void ChargePointImpl::on_transaction_stopped(const int32_t connector, const std:
32063205
const auto stop_energy_wh = std::make_shared<StampedEnergyWh>(timestamp, energy_wh_import);
32073206
this->transaction_handler->get_transaction(connector)->add_stop_energy_wh(stop_energy_wh);
32083207

3209-
this->status->submit_event(connector, FSMEvent::TransactionStoppedAndUserActionRequired);
3208+
this->status->submit_event(connector, FSMEvent::TransactionStoppedAndUserActionRequired, ocpp::DateTime());
32103209
this->stop_transaction(connector, reason, id_tag_end);
32113210
this->database_handler->update_transaction(session_id, energy_wh_import, timestamp.to_rfc3339(), id_tag_end,
32123211
reason);
@@ -3317,23 +3316,23 @@ ChargePointImpl::get_filtered_transaction_data(const std::shared_ptr<Transaction
33173316
}
33183317

33193318
void ChargePointImpl::on_suspend_charging_ev(int32_t connector) {
3320-
this->status->submit_event(connector, FSMEvent::PauseChargingEV);
3319+
this->status->submit_event(connector, FSMEvent::PauseChargingEV, ocpp::DateTime());
33213320
}
33223321

33233322
void ChargePointImpl::on_suspend_charging_evse(int32_t connector) {
3324-
this->status->submit_event(connector, FSMEvent::PauseChargingEVSE);
3323+
this->status->submit_event(connector, FSMEvent::PauseChargingEVSE, ocpp::DateTime());
33253324
}
33263325

33273326
void ChargePointImpl::on_resume_charging(int32_t connector) {
3328-
this->status->submit_event(connector, FSMEvent::StartCharging);
3327+
this->status->submit_event(connector, FSMEvent::StartCharging, ocpp::DateTime());
33293328
}
33303329

33313330
void ChargePointImpl::on_error(int32_t connector, const ChargePointErrorCode& error_code) {
3332-
this->status->submit_error(connector, error_code);
3331+
this->status->submit_error(connector, error_code, ocpp::DateTime());
33333332
}
33343333

33353334
void ChargePointImpl::on_fault(int32_t connector, const ChargePointErrorCode& error_code) {
3336-
this->status->submit_fault(connector, error_code);
3335+
this->status->submit_fault(connector, error_code, ocpp::DateTime());
33373336
}
33383337

33393338
void ChargePointImpl::on_log_status_notification(int32_t request_id, std::string log_status) {
@@ -3508,23 +3507,23 @@ void ChargePointImpl::register_is_token_reserved_for_connector_callback(
35083507
}
35093508

35103509
void ChargePointImpl::on_reservation_start(int32_t connector) {
3511-
this->status->submit_event(connector, FSMEvent::ReserveConnector);
3510+
this->status->submit_event(connector, FSMEvent::ReserveConnector, ocpp::DateTime());
35123511
}
35133512

35143513
void ChargePointImpl::on_reservation_end(int32_t connector) {
3515-
this->status->submit_event(connector, FSMEvent::BecomeAvailable);
3514+
this->status->submit_event(connector, FSMEvent::BecomeAvailable, ocpp::DateTime());
35163515
}
35173516

35183517
void ChargePointImpl::on_enabled(int32_t connector) {
3519-
this->status->submit_event(connector, FSMEvent::BecomeAvailable);
3518+
this->status->submit_event(connector, FSMEvent::BecomeAvailable, ocpp::DateTime());
35203519
}
35213520

35223521
void ChargePointImpl::on_disabled(int32_t connector) {
3523-
this->status->submit_event(connector, FSMEvent::ChangeAvailabilityToUnavailable);
3522+
this->status->submit_event(connector, FSMEvent::ChangeAvailabilityToUnavailable, ocpp::DateTime());
35243523
}
35253524

35263525
void ChargePointImpl::on_plugin_timeout(int32_t connector) {
3527-
this->status->submit_event(connector, FSMEvent::TransactionStoppedAndUserActionRequired);
3526+
this->status->submit_event(connector, FSMEvent::TransactionStoppedAndUserActionRequired, ocpp::DateTime());
35283527
}
35293528

35303529
void ChargePointImpl::on_security_event(const std::string& type, const std::string& tech_info) {

0 commit comments

Comments
 (0)