PLCnext API Documentation 23.6.0.37
DynamicPortsBuilder.hpp
1
2//
3// Copyright PHOENIX CONTACT Electronics GmbH
4//
6#pragma once
8#include "Arp/Plc/Commons/DataTypeEnum.hpp"
9#include "Arp/Plc/Commons/Meta/TypeSystem/DataInfoDeduction.hxx"
10#include "Arp/Plc/Commons/Meta/TypeSystem/TypeDefinition.hpp"
11#include <array>
12
13namespace Arp { namespace Plc { namespace Commons { namespace Meta
14{
15
18{
19public:
22 template<typename TProgram, size_t MaxNumPorts>
23 static DynamicPortsBuilder Create(const String& libraryNamespace, const String& programInstanceName,
24 std::array<byte*, MaxNumPorts>& ports, size_t portsOffset);
25
26private:
27 DynamicPortsBuilder(const String& libraryNamespace, const String& programTypeName,
28 const String& programInstanceName, size_t programSize, size_t programAlign, size_t portsOffset,
29 size_t maximumNumberOfPorts, byte** ports);
30
31public:
34
36 size_t GetNumberOfPorts() const;
37
39 const TypeSystem::TypeDefinition& GetTypeDefinition() const;
40
45 template<typename T>
46 void AddPort(const String& portName, T& value, StandardAttribute standardAttributes);
47
48private:
49 void AddPort(const String& name, DataTypeEnum dataType, const String& typeName, size_t size, size_t alignment,
50 const ArrayDimensions& dimensions, StandardAttribute standardAttributes, byte* pValue);
51 void CheckNumberOfPorts() const;
52 void CheckName(const String& name) const;
53 void CheckDataType(const String& name, const String& typeName, DataTypeEnum dataType) const;
54
55private:
56 TypeSystem::TypeDefinition typeDefinition;
57 String libraryNamespace;
58 String programTypeName;
59 String programInstanceName;
60 size_t portsOffset;
61 size_t maximumNumberOfPorts;
62 byte** ports;
63};
64
65template<typename TProgram, size_t MaxNumPorts>
66DynamicPortsBuilder DynamicPortsBuilder::Create(const String& libraryNamespace, const String& programInstanceName,
67 std::array<byte*, MaxNumPorts>& ports, size_t portsOffset)
68{
69 return DynamicPortsBuilder(libraryNamespace, CommonTypeName<TProgram>(), programInstanceName, sizeof(TProgram),
70 alignof(TProgram), portsOffset, MaxNumPorts, ports.data());
71}
72
73template<typename T>
74void DynamicPortsBuilder::AddPort(const String& portName, T& value, StandardAttribute standardAttributes)
75{
77
78 DataInfoDeduction deduction(libraryNamespace);
79 DataInfo dataInfo = deduction(portName, value);
80 this->AddPort(portName, dataInfo.GetDataType(), dataInfo.GetTypeIdentifier().GetName(), sizeof(T), alignof(T),
81 dataInfo.GetArrayDimensions(), standardAttributes, reinterpret_cast<byte*>(&value));
82}
83
84}}}} // end of namespace Arp::Plc::Commons::Meta
This (meta programming) class provides the typename according the CLS (common language specification)...
Definition: CommonTypeName.hxx:30
Definition: DataTypeEnum.hpp:16
Provide array information.
Definition: ArrayDimensions.hpp:18
Provides detailed informations for the respective data object.
Definition: DataInfo.hpp:32
DataTypeEnum & GetDataType(void)
The data type of this instance.
Definition: DataInfo.hpp:173
ArrayDimensions & GetArrayDimensions(void)
List of array dimensions information
Definition: DataInfo.hpp:203
TypeIdentifier & GetTypeIdentifier(void)
Get type name and namspace.
Definition: DataInfo.hpp:193
Provides the infrastructure for dynamic port provision
Definition: DynamicPortsBuilder.hpp:18
size_t GetMaximumNumberOfPorts() const
< summary>Returns the maximum number of dynamic ports to provide
static DynamicPortsBuilder Create(const String &libraryNamespace, const String &programInstanceName, std::array< byte *, MaxNumPorts > &ports, size_t portsOffset)
Definition: DynamicPortsBuilder.hpp:66
void AddPort(const String &portName, T &value, StandardAttribute standardAttributes)
Adds a variable as dynamic port
Definition: DynamicPortsBuilder.hpp:74
size_t GetNumberOfPorts() const
summary>Returns the type definition for the program
const String & GetName(void) const
Get type name of the corresponding object.
Definition: DataInfoDeduction.hxx:14
Defines the meta information of a type
Definition: TypeDefinition.hpp:23
Namespace for the type information of the Meta component
Definition: DataInfoDeduction.hxx:11
StandardAttribute
Standard attributes to types
Definition: StandardAttribute.hpp:18
Root namespace for the PLCnext API