1+ // SPDX-License-Identifier: Apache-2.0
2+ // Copyright Pionix GmbH and Contributors to EVerest
3+
4+ #pragma once
5+
6+ #include < map>
7+ #include < optional>
8+ #include < string>
9+ #include < vector>
10+
11+ #include < ocpp/v2/ctrlr_component_variables.hpp>
12+
13+ namespace ocpp {
14+ namespace v16 {
15+
16+ // / \brief Represents a mapping from OCPP 1.6 configuration key to OCPP 2.x ComponentVariable
17+ struct V16ToV2Mapping {
18+ std::string v16_key;
19+ v2::ComponentVariable component_variable;
20+ };
21+
22+ // / \brief Static mappings from OCPP 1.6 configuration keys to OCPP 2.x ComponentVariable
23+ static const std::vector<V16ToV2Mapping> OCPP16_TO_V2_MAPPINGS = {
24+ // ============================================================================
25+ // Standard OCPP 1.6 keys
26+ // ============================================================================
27+
28+ {" AllowOfflineTxForUnknownId" , v2::ControllerComponentVariables::OfflineTxForUnknownIdEnabled},
29+ {" AuthorizationCacheEnabled" , v2::ControllerComponentVariables::AuthCacheCtrlrEnabled},
30+ {" AuthorizeRemoteTxRequests" , v2::ControllerComponentVariables::AuthorizeRemoteStart},
31+ {" ClockAlignedDataInterval" , v2::ControllerComponentVariables::AlignedDataInterval},
32+ {" ConnectionTimeOut" , v2::ControllerComponentVariables::EVConnectionTimeOut},
33+ {" HeartbeatInterval" , v2::ControllerComponentVariables::HeartbeatInterval},
34+ {" LocalAuthorizeOffline" , v2::ControllerComponentVariables::LocalAuthorizeOffline},
35+ {" LocalPreAuthorize" , v2::ControllerComponentVariables::LocalPreAuthorize},
36+ {" MaxEnergyOnInvalidId" , v2::ControllerComponentVariables::MaxEnergyOnInvalidId},
37+ {" MeterValuesAlignedData" , v2::ControllerComponentVariables::AlignedDataMeasurands},
38+ {" MeterValuesSampledData" , v2::ControllerComponentVariables::SampledDataTxUpdatedMeasurands},
39+ {" MeterValueSampleInterval" , v2::ControllerComponentVariables::SampledDataTxUpdatedInterval},
40+ {" ResetRetries" , v2::ControllerComponentVariables::ResetRetries},
41+ {" StopTransactionOnInvalidId" , v2::ControllerComponentVariables::StopTxOnInvalidId},
42+ {" StopTxnAlignedData" , v2::ControllerComponentVariables::AlignedDataTxEndedMeasurands},
43+ {" StopTxnSampledData" , v2::ControllerComponentVariables::SampledDataTxEndedMeasurands},
44+ {" TransactionMessageAttempts" , v2::ControllerComponentVariables::MessageAttempts},
45+ {" TransactionMessageRetryInterval" , v2::ControllerComponentVariables::MessageAttemptInterval},
46+ {" WebSocketPingInterval" , v2::ControllerComponentVariables::WebSocketPingInterval},
47+ {" LocalAuthListEnabled" , v2::ControllerComponentVariables::LocalAuthListCtrlrEnabled},
48+ {" ChargeProfileMaxStackLevel" , v2::ControllerComponentVariables::ChargingProfileMaxStackLevel},
49+ {" ChargingScheduleAllowedChargingRateUnit" , v2::ControllerComponentVariables::ChargingScheduleChargingRateUnit},
50+ {" ChargingScheduleMaxPeriods" , v2::ControllerComponentVariables::PeriodsPerSchedule},
51+ {" ConnectorSwitch3to1PhaseSupported" , v2::ControllerComponentVariables::Phases3to1},
52+ {" SupportedFileTransferProtocols" , v2::ControllerComponentVariables::FileTransferProtocols},
53+
54+ // ============================================================================
55+ // Internal configuration keys
56+ // ============================================================================
57+
58+ {" ChargePointId" , v2::ControllerComponentVariables::ChargePointId},
59+ {" ChargeBoxSerialNumber" , v2::ControllerComponentVariables::ChargeBoxSerialNumber},
60+ {" ChargePointModel" , v2::ControllerComponentVariables::ChargePointModel},
61+ {" ChargePointSerialNumber" , v2::ControllerComponentVariables::ChargePointSerialNumber},
62+ {" ChargePointVendor" , v2::ControllerComponentVariables::ChargePointVendor},
63+ {" FirmwareVersion" , v2::ControllerComponentVariables::FirmwareVersion},
64+ {" ICCID" , v2::ControllerComponentVariables::ICCID},
65+ {" IFace" , v2::ControllerComponentVariables::IFace},
66+ {" IMSI" , v2::ControllerComponentVariables::IMSI},
67+ {" MeterSerialNumber" , v2::ControllerComponentVariables::MeterSerialNumber},
68+ {" MeterType" , v2::ControllerComponentVariables::MeterType},
69+ {" SupportedCiphers12" , v2::ControllerComponentVariables::SupportedCiphers12},
70+ {" SupportedCiphers13" , v2::ControllerComponentVariables::SupportedCiphers13},
71+ {" UseTPM" , v2::ControllerComponentVariables::UseTPM},
72+ {" UseTPMSeccLeafCertificate" , v2::ControllerComponentVariables::UseTPMSeccLeafCertificate},
73+ {" RetryBackoffRandomRange" , v2::ControllerComponentVariables::RetryBackOffRandomRange},
74+ {" RetryBackoffRepeatTimes" , v2::ControllerComponentVariables::RetryBackOffRepeatTimes},
75+ {" AuthorizeConnectorZeroOnConnectorOne" , v2::ControllerComponentVariables::AuthorizeConnectorZeroOnConnectorOne},
76+ {" LogMessages" , v2::ControllerComponentVariables::LogMessages},
77+ {" LogMessagesRaw" , v2::ControllerComponentVariables::LogMessagesRaw},
78+ {" LogMessagesFormat" , v2::ControllerComponentVariables::LogMessagesFormat},
79+ {" LogRotation" , v2::ControllerComponentVariables::LogRotation},
80+ {" LogRotationDateSuffix" , v2::ControllerComponentVariables::LogRotationDateSuffix},
81+ {" LogRotationMaximumFileSize" , v2::ControllerComponentVariables::LogRotationMaximumFileSize},
82+ {" LogRotationMaximumFileCount" , v2::ControllerComponentVariables::LogRotationMaximumFileCount},
83+ {" SupportedChargingProfilePurposeTypes" , v2::ControllerComponentVariables::SupportedChargingProfilePurposeTypes},
84+ {" IgnoredProfilePurposesOffline" , v2::ControllerComponentVariables::IgnoredProfilePurposesOffline},
85+ {" MaxCompositeScheduleDuration" , v2::ControllerComponentVariables::MaxCompositeScheduleDuration},
86+ {" CompositeScheduleDefaultLimitAmps" , v2::ControllerComponentVariables::CompositeScheduleDefaultLimitAmps},
87+ {" CompositeScheduleDefaultLimitWatts" , v2::ControllerComponentVariables::CompositeScheduleDefaultLimitWatts},
88+ {" CompositeScheduleDefaultNumberPhases" , v2::ControllerComponentVariables::CompositeScheduleDefaultNumberPhases},
89+ {" SupplyVoltage" , v2::ControllerComponentVariables::SupplyVoltage},
90+ {" WebsocketPingPayload" , v2::ControllerComponentVariables::WebsocketPingPayload},
91+ {" WebsocketPongTimeout" , v2::ControllerComponentVariables::WebsocketPongTimeout},
92+ {" UseSslDefaultVerifyPaths" , v2::ControllerComponentVariables::UseSslDefaultVerifyPaths},
93+ {" VerifyCsmsCommonName" , v2::ControllerComponentVariables::VerifyCsmsCommonName},
94+ {" VerifyCsmsAllowWildcards" , v2::ControllerComponentVariables::VerifyCsmsAllowWildcards},
95+ {" OcspRequestInterval" , v2::ControllerComponentVariables::OcspRequestInterval},
96+ {" SeccLeafSubjectCommonName" , v2::ControllerComponentVariables::ISO15118CtrlrSeccId},
97+ {" SeccLeafSubjectCountry" , v2::ControllerComponentVariables::ISO15118CtrlrCountryName},
98+ {" SeccLeafSubjectOrganization" , v2::ControllerComponentVariables::ISO15118CtrlrOrganizationName},
99+ {" QueueAllMessages" , v2::ControllerComponentVariables::QueueAllMessages},
100+ {" MessageTypesDiscardForQueueing" , v2::ControllerComponentVariables::MessageTypesDiscardForQueueing},
101+ {" MessageQueueSizeThreshold" , v2::ControllerComponentVariables::MessageQueueSizeThreshold},
102+ {" MaxMessageSize" , v2::ControllerComponentVariables::MaxMessageSize},
103+ {" TLSKeylogFile" , v2::ControllerComponentVariables::TLSKeylogFile},
104+ {" EnableTLSKeylog" , v2::ControllerComponentVariables::EnableTLSKeylog},
105+ {" NumberOfConnectors" , v2::ControllerComponentVariables::NumberOfConnectors},
106+
107+ // ============================================================================
108+ // Security Section
109+ // ============================================================================
110+
111+ {" AdditionalRootCertificateCheck" , v2::ControllerComponentVariables::AdditionalRootCertificateCheck},
112+ {" AuthorizationKey" , v2::ControllerComponentVariables::BasicAuthPassword},
113+ {" CertificateSignedMaxChainSize" , v2::ControllerComponentVariables::MaxCertificateChainSize},
114+ {" CpoName" , v2::ControllerComponentVariables::OrganizationName},
115+ {" SecurityProfile" , v2::ControllerComponentVariables::SecurityProfile},
116+ {" CertSigningWaitMinimum" , v2::ControllerComponentVariables::CertSigningWaitMinimum},
117+ {" CertSigningRepeatTimes" , v2::ControllerComponentVariables::CertSigningRepeatTimes},
118+
119+ // ============================================================================
120+ // PnC Section
121+ // ============================================================================
122+
123+ {" ISO15118PnCEnabled" , v2::ControllerComponentVariables::PnCEnabled},
124+ {" CentralContractValidationAllowed" , v2::ControllerComponentVariables::CentralContractValidationAllowed},
125+ {" ContractValidationOffline" , v2::ControllerComponentVariables::ContractValidationOffline},
126+
127+ // ============================================================================
128+ // CostAndPrice Section
129+ // ============================================================================
130+
131+ {" NumberOfDecimalsForCostValues" , v2::ControllerComponentVariables::NumberOfDecimalsForCostValues},
132+ {" TimeOffset" , v2::ControllerComponentVariables::TimeOffset},
133+ {" NextTimeOffsetTransitionDateTime" , v2::ControllerComponentVariables::NextTimeOffsetTransitionDateTime},
134+ {" TimeOffsetNextTransition" , v2::ControllerComponentVariables::TimeOffsetNextTransition},
135+
136+ // ============================================================================
137+ // Mavericks Section - OCPP 1.6 keys without direct OCPP 2.x equivalents
138+ // ============================================================================
139+
140+ {" BlinkRepeat" , v2::ControllerComponentVariables::BlinkRepeat},
141+ {" ConnectorPhaseRotationMaxLength" , v2::ControllerComponentVariables::ConnectorPhaseRotationMaxLength},
142+ {" GetConfigurationMaxKeys" , v2::ControllerComponentVariables::GetConfigurationMaxKeys},
143+ {" LightIntensity" , v2::ControllerComponentVariables::LightIntensity},
144+ {" MinimumStatusDuration" , v2::ControllerComponentVariables::MinimumStatusDuration},
145+ {" StopTransactionOnEVSideDisconnect" , v2::ControllerComponentVariables::StopTransactionOnEVSideDisconnect},
146+ {" SupportedFeatureProfiles" , v2::ControllerComponentVariables::SupportedFeatureProfiles},
147+ {" SupportedFeatureProfilesMaxLength" , v2::ControllerComponentVariables::SupportedFeatureProfilesMaxLength},
148+ {" UnlockConnectorOnEVSideDisconnect" , v2::ControllerComponentVariables::UnlockConnectorOnEVSideDisconnect},
149+ {" ReserveConnectorZeroSupported" , v2::ControllerComponentVariables::ReserveConnectorZeroSupported},
150+ {" HostName" , v2::ControllerComponentVariables::HostName},
151+ {" AllowChargingProfileWithoutStartSchedule" ,
152+ v2::ControllerComponentVariables::AllowChargingProfileWithoutStartSchedule},
153+ {" WaitForStopTransactionsOnResetTimeout" , v2::ControllerComponentVariables::WaitForStopTransactionsOnResetTimeout},
154+ {" StopTransactionIfUnlockNotSupported" , v2::ControllerComponentVariables::StopTransactionIfUnlockNotSupported},
155+ {" MeterPublicKeys" , v2::ControllerComponentVariables::MeterPublicKeys}, // FIXME
156+ {" DisableSecurityEventNotifications" , v2::ControllerComponentVariables::DisableSecurityEventNotifications},
157+ {" ISO15118CertificateManagementEnabled" , v2::ControllerComponentVariables::ISO15118CertificateManagementEnabled},
158+ {" CustomDisplayCostAndPrice" , v2::ControllerComponentVariables::CustomDisplayCostAndPrice},
159+ {" DefaultPrice" , v2::ControllerComponentVariables::DefaultPrice},
160+ {" DefaultPriceText" , v2::ControllerComponentVariables::DefaultPriceText},
161+ {" CustomIdleFeeAfterStop" , v2::ControllerComponentVariables::CustomIdleFeeAfterStop},
162+ {" SupportedLanguages" , v2::ControllerComponentVariables::SupportedLanguages},
163+ {" CustomMultiLanguageMessages" , v2::ControllerComponentVariables::CustomMultiLanguageMessages},
164+ {" Language" , v2::ControllerComponentVariables::Language},
165+ {" WaitForSetUserPriceTimeout" , v2::ControllerComponentVariables::WaitForSetUserPriceTimeout},
166+ };
167+
168+ // / \brief Build a lookup map from OCPP 1.6 key to OCPP 2.x ComponentVariable
169+ // / \return Map of v16_key -> ComponentVariable
170+ inline std::map<std::string, v2::ComponentVariable> build_v16_to_v2_lookup () {
171+ std::map<std::string, v2::ComponentVariable> lookup;
172+ for (const auto & mapping : OCPP16_TO_V2_MAPPINGS) {
173+ lookup[mapping.v16_key ] = mapping.component_variable ;
174+ }
175+ return lookup;
176+ }
177+
178+ // / \brief Get OCPP 2.x ComponentVariable for a given OCPP 1.6 configuration key
179+ // / \param v16_key The OCPP 1.6 configuration key
180+ // / \return Optional ComponentVariable if found
181+ inline std::optional<v2::ComponentVariable> get_v2_component_variable (const std::string& v16_key) {
182+ static const auto lookup = build_v16_to_v2_lookup ();
183+ auto it = lookup.find (v16_key);
184+ if (it != lookup.end ()) {
185+ return it->second ;
186+ }
187+ return std::nullopt ;
188+ }
189+
190+ } // namespace v16
191+ } // namespace ocpp
0 commit comments