Skip to content

Commit 535cca9

Browse files
authored
Merge pull request #68 from c-jimenez/release/v0.8.0
Release/v0.8.0
2 parents 21fc395 + 9321653 commit 535cca9

File tree

13 files changed

+522
-37
lines changed

13 files changed

+522
-37
lines changed

3rdparty/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11

22
# Rapidjson is an header only library
33
add_library(rapidjson INTERFACE)
4+
if("${CMAKE_CXX_STANDARD}" GREATER_EQUAL 17)
5+
# use of std::iterator is deprecated since c++ 17
6+
target_compile_definitions(rapidjson INTERFACE -DRAPIDJSON_NOMEMBERITERATORCLASS=1)
7+
endif()
48
target_include_directories(rapidjson INTERFACE rapidjson/include)
59

610
# Doctest is an header only on library

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
cmake_minimum_required(VERSION 3.13)
66

77
project(OpenOCPP DESCRIPTION "Open Source C++ implementation of the OCPP 1.6 protocol"
8-
VERSION 0.7.0
8+
VERSION 0.8.0
99
)
1010

1111
# Definitions for Version.h file

CMakeLists_native.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
set(WARNING_FLAGS "-Wall -Wextra -Werror")
77

88
# C/C++ flags
9-
set(C_FLAGS "-std=c11")
10-
set(CXX_FLAGS "-std=c++17")
9+
set(CMAKE_C_STANDARD 11)
10+
set(CMAKE_CXX_STANDARD 17)
1111

1212
# Set compiler flags
13-
set(CMAKE_C_FLAGS_DEBUG "${C_FLAGS} ${WARNING_FLAGS} -O0 -g3 -ggdb3")
14-
set(CMAKE_CXX_FLAGS_DEBUG "${CXX_FLAGS} ${WARNING_FLAGS} -O0 -g3 -ggdb3")
15-
set(CMAKE_C_FLAGS_RELEASE "${C_FLAGS} ${WARNING_FLAGS} -O2 -DNDEBUG")
16-
set(CMAKE_CXX_FLAGS_RELEASE "${CXX_FLAGS} ${WARNING_FLAGS} -O2 -DNDEBUG")
13+
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG_INIT} ${WARNING_FLAGS} -O0 -g3 -ggdb3")
14+
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG_INIT} ${WARNING_FLAGS} -O0 -g3 -ggdb3")
15+
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE_INIT} ${WARNING_FLAGS} -O2 -DNDEBUG")
16+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE_INIT} ${WARNING_FLAGS} -O2 -DNDEBUG")

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,12 @@ In the "Owner" column, "S" means that the configuration key behavior is handled
105105
| :---: | :---: | :--- |
106106
| AllowOfflineTxForUnknownId | S | None |
107107
| AuthorizationCacheEnabled | S | None |
108-
| AuthorizeRemoteTxRequests | S | None |
108+
| AuthorizeRemoteTxRequests | U | None |
109109
| BlinkRepeat | U | None |
110110
| ClockAlignedDataInterval | S | None |
111-
| ConnectionTimeOut | S | None |
112-
| ConnectorPhaseRotation | S | None |
113-
| ConnectorPhaseRotationMaxLength | S | None |
111+
| ConnectionTimeOut | U | None |
112+
| ConnectorPhaseRotation | U | None |
113+
| ConnectorPhaseRotationMaxLength | U | None |
114114
| GetConfigurationMaxKeys | S | Must be set to the sum of OCPP configuration keys count (49) + user application configuration keys count to allow to export all the configuration in 1 message |
115115
| HeartbeatInterval | S | Heartbeat are only sent if no messages have been exchanged since HeartbeatInterval seconds |
116116
| LightIntensity | U | None |

examples/common/simulators/MainMeterSimulator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ std::vector<unsigned int> MainMeterSimulator::getCurrents()
5252
for (auto& meter : m_child_meters)
5353
{
5454
std::vector<unsigned int> child_currents = meter->getCurrents();
55-
for (size_t i = 0; i < child_currents.size(); i++)
55+
for (std::size_t i = 0; i < child_currents.size(); i++)
5656
{
5757
currents[i] += child_currents[i];
5858
}
@@ -67,7 +67,7 @@ std::vector<unsigned int> MainMeterSimulator::getInstantPowers()
6767
for (auto& meter : m_child_meters)
6868
{
6969
std::vector<unsigned int> child_powers = meter->getInstantPowers();
70-
for (size_t i = 0; i < child_powers.size(); i++)
70+
for (std::size_t i = 0; i < child_powers.size(); i++)
7171
{
7272
powers[i] += child_powers[i];
7373
}

src/chargepoint/ChargePoint.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,13 +469,37 @@ ocpp::types::AuthorizationStatus ChargePoint::authorize(unsigned int connector_i
469469
Connector* connector = m_connectors.getConnector(connector_id);
470470
if (connector)
471471
{
472-
// Check for reservation
472+
// Authorize reason
473473
if (connector->status == ChargePointStatus::Reserved)
474474
{
475+
// Authorize request to start a transaction on a reserved connector
475476
ret = m_reservation_manager->isTransactionAllowed(connector_id, id_tag);
476477
}
478+
else if (connector->transaction_id != 0)
479+
{
480+
// Authorize request to stop a transaction
481+
if (id_tag == connector->transaction_id_tag)
482+
{
483+
// Same id tag which did start the transaction
484+
parent_id = connector->transaction_parent_id_tag;
485+
ret = AuthorizationStatus::Accepted;
486+
}
487+
else
488+
{
489+
// Send authorize request to compare the parent id tags
490+
if (!connector->transaction_parent_id_tag.empty())
491+
{
492+
ret = m_authent_manager->authorize(id_tag, parent_id);
493+
if ((ret != AuthorizationStatus::Accepted) || (parent_id != connector->transaction_parent_id_tag))
494+
{
495+
ret = AuthorizationStatus::Invalid;
496+
}
497+
}
498+
}
499+
}
477500
else
478501
{
502+
// Authorize request to start a transaction
479503
ret = m_authent_manager->authorize(id_tag, parent_id);
480504
}
481505
}

src/chargepoint/connector/Connector.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ struct Connector
9393
ocpp::types::DateTime transaction_start;
9494
/** @brief Id tag associated with the transaction */
9595
std::string transaction_id_tag;
96+
/** @brief Parent id tag associated with the transaction */
97+
std::string transaction_parent_id_tag;
9698

9799
// Reservation data
98100

src/chargepoint/connector/Connectors.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ void Connectors::initDatabaseTable()
8080
"[transaction_id_offline] INT,"
8181
"[transaction_start] BIGINT,"
8282
"[transaction_id_tag] VARCHAR(20),"
83+
"[transaction_parent_id_tag] VARCHAR(20),"
8384
"[reservation_id] INT,"
8485
"[reservation_id_tag] VARCHAR(20),"
8586
"[reservation_parent_id_tag] VARCHAR(20),"
@@ -95,10 +96,11 @@ void Connectors::initDatabaseTable()
9596

9697
// Create parametrized queries
9798
m_find_query = m_database.query("SELECT * FROM Connectors WHERE id=?;");
98-
m_insert_query = m_database.query("INSERT INTO Connectors VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
99+
m_insert_query = m_database.query("INSERT INTO Connectors VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
99100
m_update_query = m_database.query("UPDATE Connectors SET [status]=?, [last_notified_status]=?, [transaction_id]=?, "
100-
"[transaction_id_offline]=?, [transaction_start]=?, [transaction_id_tag]=?, [reservation_id]=?, "
101-
"[reservation_id_tag]=?, [reservation_parent_id_tag]=?, [reservation_expiry_date]=? WHERE id=?;");
101+
"[transaction_id_offline]=?, [transaction_start]=?, [transaction_id_tag]=?, "
102+
"[transaction_parent_id_tag]=?, [reservation_id]=?, [reservation_id_tag]=?, "
103+
"[reservation_parent_id_tag]=?, [reservation_expiry_date]=? WHERE id=?;");
102104

103105
// Load the connector state
104106
loadConnectors();
@@ -231,10 +233,11 @@ bool Connectors::loadConnector(Connector& connector)
231233
connector.transaction_id_offline = m_find_query->getInt32(4u);
232234
connector.transaction_start = static_cast<std::time_t>(m_find_query->getInt64(5u));
233235
connector.transaction_id_tag = m_find_query->getString(6u);
234-
connector.reservation_id = m_find_query->getInt32(7u);
235-
connector.reservation_id_tag = m_find_query->getString(8u);
236-
connector.reservation_parent_id_tag = m_find_query->getString(9u);
237-
connector.reservation_expiry_date = static_cast<std::time_t>(m_find_query->getInt64(10u));
236+
connector.transaction_parent_id_tag = m_find_query->getString(7u);
237+
connector.reservation_id = m_find_query->getInt32(8u);
238+
connector.reservation_id_tag = m_find_query->getString(9u);
239+
connector.reservation_parent_id_tag = m_find_query->getString(10u);
240+
connector.reservation_expiry_date = static_cast<std::time_t>(m_find_query->getInt64(11u));
238241

239242
LOG_DEBUG << "Connector " << connector.id << " loaded from database : "
240243
<< "status = " << ChargePointStatusHelper.toString(connector.status)
@@ -243,6 +246,7 @@ bool Connectors::loadConnector(Connector& connector)
243246
<< " - transaction_id_offline = " << connector.transaction_id_offline
244247
<< " - transaction_start = " << connector.transaction_start.str()
245248
<< " - transaction_id_tag = " << connector.transaction_id_tag
249+
<< " - transaction_parent_id_tag = " << connector.transaction_parent_id_tag
246250
<< " - reservation_id = " << connector.reservation_id
247251
<< " - reservation_id_tag = " << connector.reservation_id_tag
248252
<< " - reservation_parent_id_tag = " << connector.reservation_parent_id_tag
@@ -276,11 +280,12 @@ bool Connectors::saveConnector(const Connector& connector)
276280
m_update_query->bind(3u, connector.transaction_id_offline);
277281
m_update_query->bind(4u, connector.transaction_start);
278282
m_update_query->bind(5u, connector.transaction_id_tag);
279-
m_update_query->bind(6u, connector.reservation_id);
280-
m_update_query->bind(7u, connector.reservation_id_tag);
281-
m_update_query->bind(8u, connector.reservation_parent_id_tag);
282-
m_update_query->bind(9u, connector.reservation_expiry_date);
283-
m_update_query->bind(10u, connector.id);
283+
m_update_query->bind(6u, connector.transaction_parent_id_tag);
284+
m_update_query->bind(7u, connector.reservation_id);
285+
m_update_query->bind(8u, connector.reservation_id_tag);
286+
m_update_query->bind(9u, connector.reservation_parent_id_tag);
287+
m_update_query->bind(10u, connector.reservation_expiry_date);
288+
m_update_query->bind(11u, connector.id);
284289
ret = m_update_query->exec();
285290
if (ret)
286291
{
@@ -310,10 +315,11 @@ bool Connectors::createConnector(const Connector& connector)
310315
m_insert_query->bind(4u, connector.transaction_id_offline);
311316
m_insert_query->bind(5u, connector.transaction_start);
312317
m_insert_query->bind(6u, connector.transaction_id_tag);
313-
m_insert_query->bind(7u, connector.reservation_id);
314-
m_insert_query->bind(8u, connector.reservation_id_tag);
315-
m_insert_query->bind(9u, connector.reservation_parent_id_tag);
316-
m_insert_query->bind(10u, connector.reservation_expiry_date);
318+
m_insert_query->bind(7u, connector.transaction_parent_id_tag);
319+
m_insert_query->bind(8u, connector.reservation_id);
320+
m_insert_query->bind(9u, connector.reservation_id_tag);
321+
m_insert_query->bind(10u, connector.reservation_parent_id_tag);
322+
m_insert_query->bind(11u, connector.reservation_expiry_date);
317323
ret = m_insert_query->exec();
318324
if (ret)
319325
{

src/chargepoint/status/StatusManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,10 +372,10 @@ bool StatusManager::handleMessage(const ocpp::messages::ChangeAvailabilityReq& r
372372
status = ChargePointStatus::Available;
373373
}
374374
m_worker_pool.run<void>([this, connector_id, status] { updateConnectorStatus(connector_id, status); });
375-
ret = true;
376375
}
377376

378377
LOG_INFO << "Change availability " << AvailabilityStatusHelper.toString(response.status);
378+
ret = true;
379379
}
380380
else
381381
{

src/chargepoint/transaction/TransactionManager.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,10 @@ ocpp::types::AuthorizationStatus TransactionManager::startTransaction(unsigned i
158158
// Update status from response
159159
{
160160
std::lock_guard<std::mutex> lock(connector->mutex);
161-
connector->transaction_id = start_transaction_conf.transactionId;
162-
connector->transaction_start = start_transaction_req.timestamp;
163-
connector->transaction_id_tag = id_tag;
161+
connector->transaction_id = start_transaction_conf.transactionId;
162+
connector->transaction_start = start_transaction_req.timestamp;
163+
connector->transaction_id_tag = id_tag;
164+
connector->transaction_parent_id_tag = start_transaction_conf.idTagInfo.parentIdTag.value().str();
164165
m_connectors.saveConnector(connector->id);
165166
}
166167

@@ -223,9 +224,10 @@ bool TransactionManager::stopTransaction(unsigned int connector_id, const std::s
223224
// Reset transaction id
224225
{
225226
std::lock_guard<std::mutex> lock(connector->mutex);
226-
connector->transaction_id = 0;
227-
connector->transaction_id_tag = "";
228-
connector->transaction_start = 0;
227+
connector->transaction_id = 0;
228+
connector->transaction_id_tag = "";
229+
connector->transaction_parent_id_tag = "";
230+
connector->transaction_start = 0;
229231
m_connectors.saveConnector(connector->id);
230232
}
231233

0 commit comments

Comments
 (0)