PLCnext API Documentation  22.9.0.33
DynamicPortsBuilder.hpp
1 //
3 // Copyright PHOENIX CONTACT Electronics GmbH
4 //
6 #pragma once
7 #include "Arp/System/Core/Arp.h"
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 
13 namespace Arp { namespace Plc { namespace Commons { namespace Meta
14 {
15 
18 {
19 public:
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 
26 private:
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 
31 public:
33  size_t GetMaximumNumberOfPorts() const;
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 
48 private:
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 
55 private:
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 
65 template<typename TProgram, size_t MaxNumPorts>
66 DynamicPortsBuilder 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 
73 template<typename T>
74 void 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:172
ArrayDimensions & GetArrayDimensions(void)
List of array dimensions information
Definition: DataInfo.hpp:202
TypeIdentifier & GetTypeIdentifier(void)
Get type name and namspace.
Definition: DataInfo.hpp:192
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