Skip to content

Commit 11cfb15

Browse files
committed
[chargepoint-status] Add availability field to Connector and update status management
Store Availabitity of connector in database. Availabitity status must be persistent on reboot. Signed-off-by: Joris OFFOUGA <[email protected]>
1 parent 843b84d commit 11cfb15

File tree

3 files changed

+67
-37
lines changed

3 files changed

+67
-37
lines changed

src/chargepoint/connector/Connector.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ struct Connector
3838
Connector(unsigned int _id, ocpp::helpers::ITimerPool& timer_pool)
3939
: id(_id),
4040
mutex(),
41+
availability(ocpp::types::AvailabilityType::Operative),
4142
status(ocpp::types::ChargePointStatus::Available),
4243
error_code(ocpp::types::ChargePointErrorCode::NoError),
4344
status_timestamp(ocpp::types::DateTime::now()),
@@ -66,6 +67,8 @@ struct Connector
6667

6768
// Status notification data
6869

70+
/** @brief Availability */
71+
ocpp::types::AvailabilityType availability;
6972
/** @brief Status */
7073
ocpp::types::ChargePointStatus status;
7174
/** @brief Error code */

src/chargepoint/connector/Connectors.cpp

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ void Connectors::initDatabaseTable()
8585
// Create database
8686
auto query = m_database.query("CREATE TABLE IF NOT EXISTS Connectors ("
8787
"[id] INT UNSIGNED,"
88+
"[availability] INT,"
8889
"[status] INT,"
8990
"[last_notified_status] INT,"
9091
"[transaction_id] INT,"
@@ -105,10 +106,23 @@ void Connectors::initDatabaseTable()
105106
}
106107
}
107108

109+
// Migration for availability field
110+
auto check_db = m_database.query("SELECT [availability] FROM Connectors WHERE TRUE;");
111+
if (check_db) {
112+
if (!check_db->exec()) {
113+
resetConnectors();
114+
}
115+
} else {
116+
auto drop_table = m_database.query("DROP TABLE IF EXISTS Connectors;");
117+
if (drop_table && drop_table->exec()) {
118+
initDatabaseTable();
119+
}
120+
}
121+
108122
// Create parametrized queries
109123
m_find_query = m_database.query("SELECT * FROM Connectors WHERE id=?;");
110-
m_insert_query = m_database.query("INSERT INTO Connectors VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
111-
m_update_query = m_database.query("UPDATE Connectors SET [status]=?, [last_notified_status]=?, [transaction_id]=?, "
124+
m_insert_query = m_database.query("INSERT INTO Connectors VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
125+
m_update_query = m_database.query("UPDATE Connectors SET [availability]=?, [status]=?, [last_notified_status]=?, [transaction_id]=?, "
112126
"[transaction_id_offline]=?, [transaction_start]=?, [transaction_id_tag]=?, "
113127
"[transaction_parent_id_tag]=?, [reservation_id]=?, [reservation_id_tag]=?, "
114128
"[reservation_parent_id_tag]=?, [reservation_expiry_date]=? WHERE id=?;");
@@ -237,20 +251,22 @@ bool Connectors::loadConnector(Connector& connector)
237251
ret = m_find_query->hasRows();
238252
if (ret)
239253
{
240-
connector.status = static_cast<ChargePointStatus>(m_find_query->getInt32(1u));
241-
connector.last_notified_status = static_cast<ChargePointStatus>(m_find_query->getInt32(2u));
242-
connector.transaction_id = m_find_query->getInt32(3u);
243-
connector.transaction_id_offline = m_find_query->getInt32(4u);
244-
connector.transaction_start = static_cast<std::time_t>(m_find_query->getInt64(5u));
245-
connector.transaction_id_tag = m_find_query->getString(6u);
246-
connector.transaction_parent_id_tag = m_find_query->getString(7u);
247-
connector.reservation_id = m_find_query->getInt32(8u);
248-
connector.reservation_id_tag = m_find_query->getString(9u);
249-
connector.reservation_parent_id_tag = m_find_query->getString(10u);
250-
connector.reservation_expiry_date = static_cast<std::time_t>(m_find_query->getInt64(11u));
254+
connector.availability = static_cast<AvailabilityType>(m_find_query->getInt32(1u));
255+
connector.status = static_cast<ChargePointStatus>(m_find_query->getInt32(2u));
256+
connector.last_notified_status = static_cast<ChargePointStatus>(m_find_query->getInt32(3u));
257+
connector.transaction_id = m_find_query->getInt32(4u);
258+
connector.transaction_id_offline = m_find_query->getInt32(5u);
259+
connector.transaction_start = static_cast<std::time_t>(m_find_query->getInt64(6u));
260+
connector.transaction_id_tag = m_find_query->getString(7u);
261+
connector.transaction_parent_id_tag = m_find_query->getString(8u);
262+
connector.reservation_id = m_find_query->getInt32(9u);
263+
connector.reservation_id_tag = m_find_query->getString(10u);
264+
connector.reservation_parent_id_tag = m_find_query->getString(11u);
265+
connector.reservation_expiry_date = static_cast<std::time_t>(m_find_query->getInt64(12u));
251266

252267
LOG_DEBUG << "Connector " << connector.id << " loaded from database : "
253-
<< "status = " << ChargePointStatusHelper.toString(connector.status)
268+
<< "availability = " << AvailabilityTypeHelper.toString(connector.availability)
269+
<< " - status = " << ChargePointStatusHelper.toString(connector.status)
254270
<< " - last_notified_status = " << ChargePointStatusHelper.toString(connector.last_notified_status)
255271
<< " - transaction_id = " << connector.transaction_id
256272
<< " - transaction_id_offline = " << connector.transaction_id_offline
@@ -284,18 +300,19 @@ bool Connectors::saveConnector(const Connector& connector)
284300

285301
if (m_update_query)
286302
{
287-
m_update_query->bind(0u, static_cast<int>(connector.status));
288-
m_update_query->bind(1u, static_cast<int>(connector.last_notified_status));
289-
m_update_query->bind(2u, connector.transaction_id);
290-
m_update_query->bind(3u, connector.transaction_id_offline);
291-
m_update_query->bind(4u, static_cast<int64_t>(connector.transaction_start));
292-
m_update_query->bind(5u, connector.transaction_id_tag);
293-
m_update_query->bind(6u, connector.transaction_parent_id_tag);
294-
m_update_query->bind(7u, connector.reservation_id);
295-
m_update_query->bind(8u, connector.reservation_id_tag);
296-
m_update_query->bind(9u, connector.reservation_parent_id_tag);
297-
m_update_query->bind(10u, static_cast<int64_t>(connector.reservation_expiry_date));
298-
m_update_query->bind(11u, connector.id);
303+
m_update_query->bind(0u, static_cast<int>(connector.availability));
304+
m_update_query->bind(1u, static_cast<int>(connector.status));
305+
m_update_query->bind(2u, static_cast<int>(connector.last_notified_status));
306+
m_update_query->bind(3u, connector.transaction_id);
307+
m_update_query->bind(4u, connector.transaction_id_offline);
308+
m_update_query->bind(5u, static_cast<int64_t>(connector.transaction_start));
309+
m_update_query->bind(6u, connector.transaction_id_tag);
310+
m_update_query->bind(7u, connector.transaction_parent_id_tag);
311+
m_update_query->bind(8u, connector.reservation_id);
312+
m_update_query->bind(9u, connector.reservation_id_tag);
313+
m_update_query->bind(10u, connector.reservation_parent_id_tag);
314+
m_update_query->bind(11u, static_cast<int64_t>(connector.reservation_expiry_date));
315+
m_update_query->bind(12u, connector.id);
299316
ret = m_update_query->exec();
300317
if (ret)
301318
{
@@ -319,17 +336,18 @@ bool Connectors::createConnector(const Connector& connector)
319336
if (m_insert_query)
320337
{
321338
m_insert_query->bind(0u, connector.id);
322-
m_insert_query->bind(1u, static_cast<int>(connector.status));
323-
m_insert_query->bind(2u, static_cast<int>(connector.last_notified_status));
324-
m_insert_query->bind(3u, connector.transaction_id);
325-
m_insert_query->bind(4u, connector.transaction_id_offline);
326-
m_insert_query->bind(5u, static_cast<int64_t>(connector.transaction_start));
327-
m_insert_query->bind(6u, connector.transaction_id_tag);
328-
m_insert_query->bind(7u, connector.transaction_parent_id_tag);
329-
m_insert_query->bind(8u, connector.reservation_id);
330-
m_insert_query->bind(9u, connector.reservation_id_tag);
331-
m_insert_query->bind(10u, connector.reservation_parent_id_tag);
332-
m_insert_query->bind(11u, static_cast<int64_t>(connector.reservation_expiry_date));
339+
m_insert_query->bind(1u, static_cast<int>(connector.availability));
340+
m_insert_query->bind(2u, static_cast<int>(connector.status));
341+
m_insert_query->bind(3u, static_cast<int>(connector.last_notified_status));
342+
m_insert_query->bind(4u, connector.transaction_id);
343+
m_insert_query->bind(5u, connector.transaction_id_offline);
344+
m_insert_query->bind(6u, static_cast<int64_t>(connector.transaction_start));
345+
m_insert_query->bind(7u, connector.transaction_id_tag);
346+
m_insert_query->bind(8u, connector.transaction_parent_id_tag);
347+
m_insert_query->bind(9u, connector.reservation_id);
348+
m_insert_query->bind(10u, connector.reservation_id_tag);
349+
m_insert_query->bind(11u, connector.reservation_parent_id_tag);
350+
m_insert_query->bind(12u, static_cast<int64_t>(connector.reservation_expiry_date));
333351
ret = m_insert_query->exec();
334352
if (ret)
335353
{

src/chargepoint/status/StatusManager.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,15 @@ bool StatusManager::handleMessage(const ocpp::messages::ChangeAvailabilityReq& r
373373
status = ChargePointStatus::Available;
374374
}
375375

376+
// Update Connector Availability
377+
Connector* connector = m_connectors.getConnector(connector_id);
378+
if (connector)
379+
{
380+
std::lock_guard<std::mutex> lock(connector->mutex);
381+
connector->availability = static_cast<ocpp::types::AvailabilityType>(request.type);
382+
m_connectors.saveConnector(connector->id);
383+
}
384+
376385
// In the case the ChangeAvailability.req contains ConnectorId = 0, the status change applies to the Charge Point and all Connectors.
377386
if (connector_id == 0)
378387
{

0 commit comments

Comments
 (0)