Skip to content

Commit 1440c49

Browse files
committed
[ocpp20] Allow multiple instances of same variable in device model
1 parent 89929e2 commit 1440c49

File tree

2 files changed

+108
-92
lines changed

2 files changed

+108
-92
lines changed

src/ocpp20/chargepoint/devicemodel/DeviceModelLoader.cpp

Lines changed: 107 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,19 @@ void DeviceModelLoader::loadDeviceModel(const rapidjson::Document& device_model_
255255
}
256256

257257
// Add to list of variables
258-
component.variables[var.name] = std::move(var);
258+
const Variable& cvar = var;
259+
auto iter_var = component.variables.find(var.name);
260+
if (iter_var != component.variables.end())
261+
{
262+
263+
iter_var->second[cvar.instance.value()] = std::move(var);
264+
}
265+
else
266+
{
267+
std::map<std::string, Variable> vars;
268+
vars[cvar.instance.value()] = std::move(var);
269+
component.variables[vars.begin()->second.name] = std::move(vars);
270+
}
259271
}
260272

261273
// Add to list of components
@@ -281,120 +293,124 @@ void DeviceModelLoader::saveDeviceModel(rapidjson::Document& device_model_doc)
281293

282294
// For each variable
283295
rapidjson::Value variables_json(rapidjson::kArrayType);
284-
for (const auto& [_, var] : component.variables)
296+
for (const auto& [_, vars] : component.variables)
285297
{
286-
rapidjson::Value var_json(rapidjson::kObjectType);
287-
288-
// Name
289-
var_json.AddMember(rapidjson::StringRef("name"), rapidjson::Value(var.name.c_str(), allocator).Move(), allocator);
290-
291-
// EVSE id
292-
if (var.evse.isSet())
293-
{
294-
var_json.AddMember(rapidjson::StringRef("evse"), rapidjson::Value(var.evse.value()).Move(), allocator);
295-
}
296-
297-
// Connector id
298-
if (var.connector.isSet())
298+
for (const auto& [_, var] : vars)
299299
{
300-
var_json.AddMember(rapidjson::StringRef("connector"), rapidjson::Value(var.connector.value()).Move(), allocator);
301-
}
300+
rapidjson::Value var_json(rapidjson::kObjectType);
302301

303-
// Instance
304-
if (var.instance.isSet())
305-
{
306-
var_json.AddMember(
307-
rapidjson::StringRef("instance"), rapidjson::Value(var.instance.value().c_str(), allocator).Move(), allocator);
308-
}
309-
310-
// Attributes
311-
{
312-
rapidjson::Value var_attributes_json(rapidjson::kObjectType);
313-
314-
// Type
315-
if (var.attributes.type.isSet())
316-
{
317-
var_attributes_json.AddMember(
318-
rapidjson::StringRef("type"),
319-
rapidjson::Value(AttributeEnumTypeHelper.toString(var.attributes.type.value()).c_str(), allocator).Move(),
320-
allocator);
321-
}
302+
// Name
303+
var_json.AddMember(rapidjson::StringRef("name"), rapidjson::Value(var.name.c_str(), allocator).Move(), allocator);
322304

323-
// Mutability
324-
if (var.attributes.mutability.isSet())
305+
// EVSE id
306+
if (var.evse.isSet())
325307
{
326-
var_attributes_json.AddMember(
327-
rapidjson::StringRef("mutability"),
328-
rapidjson::Value(MutabilityEnumTypeHelper.toString(var.attributes.mutability.value()).c_str(), allocator).Move(),
329-
allocator);
308+
var_json.AddMember(rapidjson::StringRef("evse"), rapidjson::Value(var.evse.value()).Move(), allocator);
330309
}
331310

332-
// Persistent flag
333-
if (var.attributes.persistent.isSet())
311+
// Connector id
312+
if (var.connector.isSet())
334313
{
335-
var_attributes_json.AddMember(
336-
rapidjson::StringRef("persistent"), rapidjson::Value(var.attributes.persistent.value()).Move(), allocator);
314+
var_json.AddMember(rapidjson::StringRef("connector"), rapidjson::Value(var.connector.value()).Move(), allocator);
337315
}
338316

339-
// Constant flag
340-
if (var.attributes.constant.isSet())
317+
// Instance
318+
if (var.instance.isSet())
341319
{
342-
var_attributes_json.AddMember(
343-
rapidjson::StringRef("constant"), rapidjson::Value(var.attributes.constant.value()).Move(), allocator);
320+
var_json.AddMember(
321+
rapidjson::StringRef("instance"), rapidjson::Value(var.instance.value().c_str(), allocator).Move(), allocator);
344322
}
345323

346-
var_json.AddMember(rapidjson::StringRef("attributes"), var_attributes_json.Move(), allocator);
347-
}
348-
349-
// Characteristics
350-
{
351-
rapidjson::Value var_chars_json(rapidjson::kObjectType);
352-
353-
// Data type
354-
var_chars_json.AddMember(
355-
rapidjson::StringRef("data_type"),
356-
rapidjson::Value(DataEnumTypeHelper.toString(var.characteristics.dataType).c_str(), allocator).Move(),
357-
allocator);
358-
359-
// Unit
360-
if (var.characteristics.unit.isSet())
324+
// Attributes
361325
{
362-
var_chars_json.AddMember(rapidjson::StringRef("unit"),
363-
rapidjson::Value(var.characteristics.unit.value().c_str(), allocator).Move(),
364-
allocator);
326+
rapidjson::Value var_attributes_json(rapidjson::kObjectType);
327+
328+
// Type
329+
if (var.attributes.type.isSet())
330+
{
331+
var_attributes_json.AddMember(
332+
rapidjson::StringRef("type"),
333+
rapidjson::Value(AttributeEnumTypeHelper.toString(var.attributes.type.value()).c_str(), allocator).Move(),
334+
allocator);
335+
}
336+
337+
// Mutability
338+
if (var.attributes.mutability.isSet())
339+
{
340+
var_attributes_json.AddMember(
341+
rapidjson::StringRef("mutability"),
342+
rapidjson::Value(MutabilityEnumTypeHelper.toString(var.attributes.mutability.value()).c_str(), allocator)
343+
.Move(),
344+
allocator);
345+
}
346+
347+
// Persistent flag
348+
if (var.attributes.persistent.isSet())
349+
{
350+
var_attributes_json.AddMember(
351+
rapidjson::StringRef("persistent"), rapidjson::Value(var.attributes.persistent.value()).Move(), allocator);
352+
}
353+
354+
// Constant flag
355+
if (var.attributes.constant.isSet())
356+
{
357+
var_attributes_json.AddMember(
358+
rapidjson::StringRef("constant"), rapidjson::Value(var.attributes.constant.value()).Move(), allocator);
359+
}
360+
361+
var_json.AddMember(rapidjson::StringRef("attributes"), var_attributes_json.Move(), allocator);
365362
}
366363

367-
// Min limit
368-
if (var.characteristics.minLimit.isSet())
364+
// Characteristics
369365
{
370-
var_chars_json.AddMember(
371-
rapidjson::StringRef("min_limit"), rapidjson::Value(var.characteristics.minLimit.value()).Move(), allocator);
372-
}
366+
rapidjson::Value var_chars_json(rapidjson::kObjectType);
373367

374-
// Max limit
375-
if (var.characteristics.maxLimit.isSet())
376-
{
368+
// Data type
377369
var_chars_json.AddMember(
378-
rapidjson::StringRef("max_limit"), rapidjson::Value(var.characteristics.maxLimit.value()).Move(), allocator);
379-
}
370+
rapidjson::StringRef("data_type"),
371+
rapidjson::Value(DataEnumTypeHelper.toString(var.characteristics.dataType).c_str(), allocator).Move(),
372+
allocator);
380373

381-
// Values list
382-
if (var.characteristics.valuesList.isSet())
383-
{
384-
var_chars_json.AddMember(rapidjson::StringRef("values_list"),
385-
rapidjson::Value(var.characteristics.valuesList.value().c_str(), allocator).Move(),
374+
// Unit
375+
if (var.characteristics.unit.isSet())
376+
{
377+
var_chars_json.AddMember(rapidjson::StringRef("unit"),
378+
rapidjson::Value(var.characteristics.unit.value().c_str(), allocator).Move(),
379+
allocator);
380+
}
381+
382+
// Min limit
383+
if (var.characteristics.minLimit.isSet())
384+
{
385+
var_chars_json.AddMember(
386+
rapidjson::StringRef("min_limit"), rapidjson::Value(var.characteristics.minLimit.value()).Move(), allocator);
387+
}
388+
389+
// Max limit
390+
if (var.characteristics.maxLimit.isSet())
391+
{
392+
var_chars_json.AddMember(
393+
rapidjson::StringRef("max_limit"), rapidjson::Value(var.characteristics.maxLimit.value()).Move(), allocator);
394+
}
395+
396+
// Values list
397+
if (var.characteristics.valuesList.isSet())
398+
{
399+
var_chars_json.AddMember(rapidjson::StringRef("values_list"),
400+
rapidjson::Value(var.characteristics.valuesList.value().c_str(), allocator).Move(),
401+
allocator);
402+
}
403+
404+
// Supports monitoring flag
405+
var_chars_json.AddMember(rapidjson::StringRef("supports_monitoring"),
406+
rapidjson::Value(var.characteristics.supportsMonitoring).Move(),
386407
allocator);
387-
}
388408

389-
// Supports monitoring flag
390-
var_chars_json.AddMember(rapidjson::StringRef("supports_monitoring"),
391-
rapidjson::Value(var.characteristics.supportsMonitoring).Move(),
392-
allocator);
409+
var_json.AddMember(rapidjson::StringRef("characteristics"), var_chars_json.Move(), allocator);
410+
}
393411

394-
var_json.AddMember(rapidjson::StringRef("characteristics"), var_chars_json.Move(), allocator);
412+
variables_json.PushBack(var_json.Move(), allocator);
395413
}
396-
397-
variables_json.PushBack(var_json.Move(), allocator);
398414
}
399415
component_json.AddMember(rapidjson::StringRef("variables"), variables_json.Move(), allocator);
400416

src/ocpp20/chargepoint/devicemodel/DeviceModelLoader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ struct Component
5757
/** @brief Name */
5858
std::string name;
5959
/** @brief Variables */
60-
std::map<std::string, Variable> variables;
60+
std::map<std::string, std::map<std::string, Variable>> variables;
6161
};
6262

6363
/** @brief Helper class to load/store the device model */

0 commit comments

Comments
 (0)