ocpp 0.24.1
A C++ implementation of the Open Charge Point Protocol
charge_point_state_machine.hpp
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2020 - 2023 Pionix GmbH and Contributors to EVerest
3#ifndef OCPP_V16_CHARGE_POINT_STATE_MACHINE_HPP
4#define OCPP_V16_CHARGE_POINT_STATE_MACHINE_HPP
5
6#include <functional>
7#include <map>
8#include <memory>
9#include <mutex>
10#include <string>
11#include <vector>
12
13#include <ocpp/common/types.hpp>
14#include <ocpp/v16/ocpp_enums.hpp>
15
16namespace ocpp {
17namespace v16 {
18
19enum class FSMEvent {
20 BecomeAvailable,
21 UsageInitiated,
22 StartCharging,
23 PauseChargingEV,
24 PauseChargingEVSE,
25 ReserveConnector,
26 TransactionStoppedAndUserActionRequired,
27 ChangeAvailabilityToUnavailable,
28 ReservationEnd,
29 // FaultDetected - note: this event is handled via a separate function
30 I1_ReturnToAvailable,
31 I2_ReturnToPreparing,
32 I3_ReturnToCharging,
33 I4_ReturnToSuspendedEV,
34 I5_ReturnToSuspendedEVSE,
35 I6_ReturnToFinishing,
36 I7_ReturnToReserved,
37 I8_ReturnToUnavailable,
38};
39
41struct ErrorInfo {
42 std::string uuid; // uuid
43 ChargePointErrorCode error_code;
44 bool is_fault;
46 std::optional<CiString<50>> info;
47 std::optional<CiString<255>> vendor_id;
48 std::optional<CiString<50>> vendor_error_code;
49 DateTime timestamp; // timestamp
50
51 ErrorInfo(const std::string uuid, const ChargePointErrorCode error_code, const bool is_fault);
52 ErrorInfo(const std::string uuid, const ChargePointErrorCode error_code, const bool is_fault,
53 const std::optional<std::string> info);
54 ErrorInfo(const std::string uuid, const ChargePointErrorCode error_code, const bool is_fault,
55 const std::optional<std::string> info, const std::optional<std::string> vendor_id);
56 ErrorInfo(const std::string uuid, const ChargePointErrorCode error_code, const bool is_fault,
57 const std::optional<std::string> info, const std::optional<std::string> vendor_id,
58 const std::optional<std::string> vendor_error_code);
59};
60
61using FSMState = ChargePointStatus;
62
63using FSMStateTransitions = std::map<FSMEvent, FSMState>;
64
65using FSMDefinition = std::map<FSMState, FSMStateTransitions>;
66
68public:
69 using StatusNotificationCallback = std::function<void(
70 const ChargePointStatus status, const ChargePointErrorCode error_code, const ocpp::DateTime& timestamp,
71 const std::optional<CiString<50>>& info, const std::optional<CiString<255>>& vendor_id,
72 const std::optional<CiString<50>>& vendor_error_code)>;
73 explicit ChargePointFSM(const StatusNotificationCallback& status_notification_callback, FSMState initial_state);
74
75 bool handle_event(FSMEvent event, const ocpp::DateTime timestamp, const std::optional<CiString<50>>& info);
76 bool handle_error(const ErrorInfo& error_info);
77 bool handle_error_cleared(const std::string uuid);
78 bool handle_all_errors_cleared();
79 void trigger_status_notification();
80
81 FSMState get_state();
82 std::optional<ErrorInfo> get_latest_error();
83
84private:
85 StatusNotificationCallback status_notification_callback;
86 // track current state
87
88 FSMState state;
89 std::unordered_map<std::string, ErrorInfo> active_errors;
90
91 bool is_faulted();
92};
93
95public:
96 using ConnectorStatusCallback = std::function<void(
97 const int connector_id, const ChargePointErrorCode errorCode, const ChargePointStatus status,
98 const ocpp::DateTime& timestamp, const std::optional<CiString<50>>& info,
99 const std::optional<CiString<255>>& vendor_id, const std::optional<CiString<50>>& vendor_error_code)>;
100 ChargePointStates(const ConnectorStatusCallback& connector_status_callback);
101 void reset(std::map<int, ChargePointStatus> connector_status_map);
102
103 void submit_event(const int connector_id, FSMEvent event, const ocpp::DateTime& timestamp,
104 const std::optional<CiString<50>>& info = std::nullopt);
105 void submit_error(const int connector_id, const ErrorInfo& error_info);
106 void submit_error_cleared(const int connector_id, const std::string uuid);
107 void submit_all_errors_cleared(const int32_t connector_id);
108 void trigger_status_notification(const int connector_id);
109 void trigger_status_notifications();
110
111 ChargePointStatus get_state(int connector_id);
112 std::optional<ErrorInfo> get_latest_error(int connector_id);
113
114private:
115 ConnectorStatusCallback connector_status_callback;
116
117 std::unique_ptr<ChargePointFSM> state_machine_connector_zero;
118 std::vector<ChargePointFSM> state_machines;
119 std::mutex state_machines_mutex;
120};
121
122} // namespace v16
123} // namespace ocpp
124
125#endif // OCPP_V16_CHARGE_POINT_STATE_MACHINE_HPP
Contains a DateTime implementation that can parse and create RFC 3339 compatible strings.
Definition: types.hpp:109
Definition: charge_point_state_machine.hpp:67
Definition: charge_point_state_machine.hpp:94
Contains all relevant information to handle errros in OCPP1.6.
Definition: charge_point_state_machine.hpp:41
DateTime timestamp
defined by OCPP1.6
Definition: charge_point_state_machine.hpp:49
std::optional< CiString< 50 > > info
Definition: charge_point_state_machine.hpp:46
std::optional< CiString< 255 > > vendor_id
defined by OCPP1.6
Definition: charge_point_state_machine.hpp:47
std::optional< CiString< 50 > > vendor_error_code
defined by OCPP1.6
Definition: charge_point_state_machine.hpp:48
bool is_fault
defined by OCPP1.6
Definition: charge_point_state_machine.hpp:44