@@ -71,15 +71,13 @@ SmartChargingManager::SmartChargingManager(const ocpp::config::IChargePointConfi
7171SmartChargingManager::~SmartChargingManager () { }
7272
7373/* * @copydoc bool ISmartChargingManager::getSetpoint(unsigned int,
74- ocpp::types::Optional<float>&,
75- unsigned int&,
76- ocpp::types::Optional<float>&,
77- unsigned int&) */
78- bool SmartChargingManager::getSetpoint (unsigned int connector_id,
79- ocpp::types::Optional<float >& charge_point_setpoint,
80- unsigned int & charge_point_number_phases,
81- ocpp::types::Optional<float >& connector_setpoint,
82- unsigned int & connector_number_phases)
74+ ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>&,
75+ ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>&,
76+ ocpp::types::ChargingRateUnitType) */
77+ bool SmartChargingManager::getSetpoint (unsigned int connector_id,
78+ ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& charge_point_setpoint,
79+ ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& connector_setpoint,
80+ ocpp::types::ChargingRateUnitType unit)
8381{
8482 bool ret = false ;
8583
@@ -92,57 +90,36 @@ bool SmartChargingManager::getSetpoint(unsigned int connector_i
9290 {
9391 // Compute charge point setpoint
9492 charge_point_setpoint.clear ();
95- charge_point_number_phases = 3u ; // Default, if not set is 3 phases charging
9693 for (const auto & profile : m_profile_db.chargePointMaxProfiles ())
9794 {
9895 // Check if the profile is active
9996 const ChargingSchedulePeriod* period = nullptr ;
10097 if (isProfileActive (connector, profile.second , period))
10198 {
10299 // Apply setpoint
103- if (period->numberPhases .isSet ())
104- {
105- charge_point_number_phases = period->numberPhases ;
106- }
107- if (profile.second .chargingSchedule .chargingRateUnit == ChargingRateUnitType::A)
108- {
109- charge_point_setpoint = period->limit ;
110- }
111- else
112- {
113- charge_point_setpoint =
114- period->limit / (static_cast <float >(charge_point_number_phases) * m_stack_config.operatingVoltage ());
115- }
100+ fillSetpoint (charge_point_setpoint, unit, profile.second , *period);
116101 break ;
117102 }
118103 }
119104
120105 // Compute connector setpoint if a transaction is active on the connector
121- ocpp::types::ChargingRateUnitType connector_setpoint_unit = ChargingRateUnitType::A;
122106 connector_setpoint.clear ();
123- connector_number_phases = 3u ; // Default, if not set is 3 phases charging
124107 if (connector->transaction_id != 0 )
125108 {
126- computeSetpoint (connector, connector_setpoint, connector_setpoint_unit, connector_number_phases , m_profile_db.txProfiles ());
109+ computeSetpoint (connector, connector_setpoint, unit , m_profile_db.txProfiles ());
127110 if (!connector_setpoint.isSet ())
128111 {
129- computeSetpoint (
130- connector, connector_setpoint, connector_setpoint_unit, connector_number_phases, m_profile_db.txDefaultProfiles ());
112+ computeSetpoint (connector, connector_setpoint, unit, m_profile_db.txDefaultProfiles ());
131113 }
132114 }
133- if (connector_setpoint.isSet () && (connector_setpoint_unit == ChargingRateUnitType::W))
134- {
135- connector_setpoint /= (static_cast <float >(connector_number_phases) * m_stack_config.operatingVoltage ());
136- }
137115
138116 // Connector setpoint cannot be greater than charge point setpoint
139117 if (charge_point_setpoint.isSet ())
140118 {
141- if (!connector_setpoint.isSet () || (connector_setpoint > charge_point_setpoint))
119+ if (!connector_setpoint.isSet () || (connector_setpoint. value (). value > charge_point_setpoint. value (). value ))
142120 {
143121 // Connector setpoint becomes charge point setpoint
144- connector_setpoint = charge_point_setpoint;
145- connector_number_phases = charge_point_number_phases;
122+ connector_setpoint = charge_point_setpoint;
146123 }
147124 }
148125
@@ -445,11 +422,10 @@ void SmartChargingManager::cleanupProfiles()
445422}
446423
447424/* * @brief Compute the setpoint of a given connector with a profile list */
448- void SmartChargingManager::computeSetpoint (Connector* connector,
449- ocpp::types::Optional<float >& connector_setpoint,
450- ocpp::types::ChargingRateUnitType& connector_setpoint_unit,
451- unsigned int & connector_number_phases,
452- const ProfileDatabase::ChargingProfileList& profiles_list)
425+ void SmartChargingManager::computeSetpoint (Connector* connector,
426+ ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& connector_setpoint,
427+ ocpp::types::ChargingRateUnitType unit,
428+ const ProfileDatabase::ChargingProfileList& profiles_list)
453429{
454430 unsigned int level = 0 ;
455431 for (const auto & profile : profiles_list)
@@ -469,16 +445,7 @@ void SmartChargingManager::computeSetpoint(Connector*
469445 if (isProfileActive (connector, profile.second , period))
470446 {
471447 // Apply setpoint
472- connector_setpoint = period->limit ;
473- connector_setpoint_unit = profile.second .chargingSchedule .chargingRateUnit ;
474- if (period->numberPhases .isSet ())
475- {
476- connector_number_phases = period->numberPhases ;
477- }
478- else
479- {
480- connector_number_phases = 3u ; // Default, if not set is 3 phases charging
481- }
448+ fillSetpoint (connector_setpoint, unit, profile.second , *period);
482449 }
483450
484451 // Check connector type
@@ -507,7 +474,7 @@ bool SmartChargingManager::isProfileActive(Connector*
507474
508475 // Check profile validity
509476 DateTime now = DateTime::now ();
510- if ((!profile.validFrom .isSet () || (now >= profile.validFrom )) && (!profile.validTo .isSet () || (now > = profile.validTo )))
477+ if ((!profile.validFrom .isSet () || (now >= profile.validFrom )) && (!profile.validTo .isSet () || (now < = profile.validTo )))
511478 {
512479 // Check profile kind
513480 ChargingProfileKindType kind = profile.chargingProfileKind ;
@@ -611,5 +578,49 @@ bool SmartChargingManager::isProfileActive(Connector*
611578 return ret;
612579}
613580
581+ /* * @brief Fill a setpoint structure with a charging profile and a charging schedule period */
582+ void SmartChargingManager::fillSetpoint (ocpp::types::SmartChargingSetpoint& setpoint,
583+ ocpp::types::ChargingRateUnitType unit,
584+ const ocpp::types::ChargingProfile& profile,
585+ const ocpp::types::ChargingSchedulePeriod& period)
586+ {
587+ setpoint.min_charging_rate = profile.chargingSchedule .minChargingRate ;
588+ if (period.numberPhases .isSet ())
589+ {
590+ setpoint.number_phases = period.numberPhases ;
591+ }
592+ else
593+ {
594+ setpoint.number_phases = 3u ; // Default, if not set is 3 phases charging
595+ }
596+ if (profile.chargingSchedule .chargingRateUnit == unit)
597+ {
598+ setpoint.value = period.limit ;
599+ }
600+ else
601+ {
602+ setpoint.value = convertToUnit (period.limit , unit, setpoint.number_phases );
603+ if (setpoint.min_charging_rate .isSet ())
604+ {
605+ setpoint.min_charging_rate = convertToUnit (setpoint.min_charging_rate , unit, setpoint.number_phases );
606+ }
607+ }
608+ }
609+
610+ /* * @brief Convert charging rate units */
611+ float SmartChargingManager::convertToUnit (float value, ocpp::types::ChargingRateUnitType unit, unsigned int number_phases)
612+ {
613+ float ret;
614+ if (unit == ChargingRateUnitType::A)
615+ {
616+ ret = value / (static_cast <float >(number_phases) * m_stack_config.operatingVoltage ());
617+ }
618+ else
619+ {
620+ ret = value * static_cast <float >(number_phases) * m_stack_config.operatingVoltage ();
621+ }
622+ return ret;
623+ }
624+
614625} // namespace chargepoint
615626} // namespace ocpp
0 commit comments