Skip to content

Commit 95b438b

Browse files
authored
Merge pull request #245 from jorisoffouga/fix/MeterValueSampleInterval
[metervalues] Enhance MeterValuesManager to support dynamic meter val…
2 parents 1576298 + 94ded41 commit 95b438b

File tree

3 files changed

+70
-16
lines changed

3 files changed

+70
-16
lines changed

src/chargepoint/metervalues/MeterValuesManager.cpp

Lines changed: 66 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,13 @@ MeterValuesManager::MeterValuesManager(ocpp::config::IOcppConfig& ocp
7373

7474
// Register configuration change handler
7575
config_manager.registerConfigChangedListener("ClockAlignedDataInterval", *this);
76+
config_manager.registerConfigChangedListener("MeterValueSampleInterval", *this);
7677

7778
// Start clock aligned and sample timers
7879
configureClockAlignedTimer();
79-
for (const Connector* connector : m_connectors.getConnectors())
80+
for (Connector* connector : m_connectors.getConnectors())
8081
{
82+
connector->meter_values_timer.setCallback(std::bind(&MeterValuesManager::processSampled, this, connector->id));
8183
if (connector->transaction_id != 0)
8284
{
8385
startSampledMeterValues(connector->id);
@@ -131,7 +133,6 @@ void MeterValuesManager::startSampledMeterValues(unsigned int connector_id)
131133
if (connector)
132134
{
133135
// Start meter value timer for the connector
134-
connector->meter_values_timer.setCallback(std::bind(&MeterValuesManager::processSampled, this, connector_id));
135136
connector->meter_values_timer.start(interval);
136137
}
137138
}
@@ -235,23 +236,74 @@ bool MeterValuesManager::onTriggerMessage(ocpp::types::MessageTriggerEnumType
235236
/** @copydoc void IConfigChangedListener::configurationValueChanged(const std::string&) */
236237
void MeterValuesManager::configurationValueChanged(const std::string& key)
237238
{
238-
// No need to check key, only ClockAlignedDataInterval is monitored
239-
(void)key;
240-
241-
// Check new value
242-
std::chrono::seconds interval = m_ocpp_config.clockAlignedDataInterval();
243-
if (interval == std::chrono::seconds(0))
239+
if (key == "metervaluesampleinterval")
240+
{
241+
// Check new value
242+
std::chrono::seconds interval = m_ocpp_config.meterValueSampleInterval();
243+
for (Connector* connector : m_connectors.getConnectors())
244+
{
245+
if (interval == std::chrono::seconds(0))
246+
{
247+
// Disable meter values
248+
connector->meter_values_timer.stop();
249+
LOG_INFO << "Meter values disabled on connector " << connector->id;
250+
}
251+
else if (connector->status == ocpp::types::ChargePointStatus::Charging)
252+
{
253+
configureMeterValueSampleTimer(connector->id, interval);
254+
}
255+
}
256+
}else if (key == "clockaligneddatainterval")
244257
{
245-
// Disable clock aligned values
246-
m_clock_aligned_timer.stop();
258+
// Check new value
259+
std::chrono::seconds interval = m_ocpp_config.clockAlignedDataInterval();
260+
if (interval == std::chrono::seconds(0))
261+
{
262+
// Disable clock aligned values
263+
m_clock_aligned_timer.stop();
247264

248-
LOG_INFO << "Clock aligned meter values disabled";
265+
LOG_INFO << "Clock aligned meter values disabled";
266+
}
267+
else
268+
{
269+
// Reconfigure clock aligned timer
270+
configureClockAlignedTimer();
271+
}
249272
}
250-
else
273+
}
274+
275+
/** @brief Configure meter value sample timer */
276+
void MeterValuesManager::configureMeterValueSampleTimer(const unsigned int connector_id, const std::chrono::seconds interval)
277+
{
278+
Connector* connector = m_connectors.getConnector(connector_id);
279+
280+
if (!connector) {
281+
return;
282+
}
283+
284+
// Reconfigure meter value timer
285+
// Stop timer
286+
connector->meter_values_timer.stop();
287+
288+
LOG_INFO << "Configure meter values on connector " << connector->id << " : interval in seconds = " << interval.count();
289+
290+
// Compute next due date
291+
time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
292+
struct tm aligned_time_tm;
293+
#ifdef _MSC_VER
294+
localtime_s(&aligned_time_tm, &now);
295+
#else // _MSC_VER
296+
localtime_r(&now, &aligned_time_tm);
297+
#endif // _MSC_VER
298+
aligned_time_tm.tm_min = 0;
299+
aligned_time_tm.tm_sec = 0;
300+
time_t aligned_time = std::mktime(&aligned_time_tm);
301+
while (aligned_time <= now)
251302
{
252-
// Reconfigure clock aligned timer
253-
configureClockAlignedTimer();
303+
aligned_time += interval.count();
254304
}
305+
std::chrono::seconds next_due_interval = std::chrono::seconds(aligned_time - now);
306+
connector->meter_values_timer.start(std::chrono::milliseconds(next_due_interval));
255307
}
256308

257309
/** @brief Configure clock-aligned timer */

src/chargepoint/metervalues/MeterValuesManager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ class MeterValuesManager : public IMeterValuesManager,
134134
/** @brief Query to insert a meter value associated to a transaction */
135135
std::unique_ptr<ocpp::database::Database::Query> m_insert_query;
136136

137+
/** @brief Configure the meter value sample timer */
138+
void configureMeterValueSampleTimer(const unsigned int connector_id, const std::chrono::seconds interval);
137139
/** @brief Configure clock-aligned timer */
138140
void configureClockAlignedTimer(void);
139141
/** @brief Process clock-aligned meter values */

tests/chargepoint/metervalues/test_metervalues.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,14 +582,14 @@ TEST_SUITE("Metervalues component")
582582

583583
// Disable clock aligned values
584584
ocpp_config.setConfigValue("ClockAlignedDataInterval", "0");
585-
meter_mgr.configurationValueChanged("ClockAlignedDataInterval");
585+
meter_mgr.configurationValueChanged("clockaligneddatainterval");
586586

587587
// Check periodic timer configuration
588588
CHECK_FALSE(periodic_timer->isStarted());
589589

590590
// Re-enable clock aligned values
591591
ocpp_config.setConfigValue("ClockAlignedDataInterval", "100");
592-
meter_mgr.configurationValueChanged("ClockAlignedDataInterval");
592+
meter_mgr.configurationValueChanged("clockaligneddatainterval");
593593

594594
// Check periodic timer configuration
595595
CHECK(periodic_timer->isStarted());

0 commit comments

Comments
 (0)