PLCnext API Documentation  20.6.0.30321
DataInfoProvider.hpp
1 //
3 // Copyright PHOENIX CONTACT Electronics GmbH
4 //
6 #pragma once
7 #include "Arp/System/Core/Arp.h"
8 #include "Arp/System/Core/Enumerator.hxx"
9 #include "Arp/Plc/Commons/Meta/IDataInfoProvider.hpp"
10 #include "Arp/Plc/Commons/Meta/TypeSystem/DataInfoDeduction.hxx"
11 #include "Arp/Plc/Commons/Esm/ProgramProviderBase.hpp"
12 #include "Arp/Plc/Commons/Meta/ChangeDataInfoProvider.hpp"
13 #include <map>
14 
15 // forwards
16 namespace Arp { namespace Plc { namespace Commons { namespace Esm
17 {
18 class ProgramComponentBase;
19 }}}} // end of namespace Arp::Plc::Commons::Esm
20 
21 namespace Arp { namespace Plc { namespace Commons { namespace Meta
22 {
23 
24 // forwards
25 class ChangeDataInfoProvider;
26 
27 using namespace Arp::Plc::Commons::Esm;
29 
31 {
34 
35 public: // typedefs/usings
36  using Roots = std::map<String, DataInfo>;
37 
38 private: // nested types
39  class RootsEnumerator : public Enumerator<const DataInfo&>
40  {
41  public: // construcion
42  RootsEnumerator(const Roots& roots);
43 
44  public: // Enumerator<DataInfo> operations
45  bool MoveNext(void)override;
46 
47  private:
48  const Roots& roots;
49  Roots::const_iterator currentIterator;
50  Roots::const_iterator endIterator;
51  bool isFirstMove = true;
52  };
53 
54 public: // construction/destruction
56  DataInfoProvider(const char* libraryNamespace, ProgramProviderBase* pProgramProvider = nullptr);
58  DataInfoProvider(const DataInfoProvider& arg) = default;
60  DataInfoProvider(DataInfoProvider&& arg) = default;
62  DataInfoProvider& operator=(const DataInfoProvider& arg) = default;
64  DataInfoProvider& operator=(DataInfoProvider&& arg) = default;
66  ~DataInfoProvider(void) = default;
67 
68 public: // getter properties
69  IDataInfoProvider& GetBackgroundProvider(void);
70 
71 public: // operations
72  void Reset(void);
73  void AddRootInfo(const DataInfo& rootInfo);
74  void RemoveRootInfo(const String& name);
75 
76  template<class T>
77  void AddRoot(const char* name, const T& value);
78 
79 public: // IDataInfoProvider operations
80  IEnumerator<const DataInfo&>::Ptr GetRoots(void)override;
81  DataInfo GetRoot(const String& name)override;
82 
83 private: // methods
84  void SetProgramProvider(ProgramProviderBase* pProgramProvider);
85  void OnProgramAdded(IProgram::Ptr programPtr);
86  void OnProgramRemoved(IProgram::Ptr programPtr);
87  DataInfo CreateDataInfo(const String& name, IProgram& program);
88  TypeIdentifier CreateTypeId(const String& commonTypeName);
89  void AddDataInfo(const DataInfo& dataInfo);
90  void RemoveDataInfo(const String& localVariableName);
91 
92 private: // fields
93  String libraryNamespace;
94  ProgramProviderBase* pProgramProvider = nullptr;
95  Roots roots;
96  ChangeDataInfoProvider backgroundProvider;
97 };
98 
100 // inline methods of class DataInfoProvider
101 
102 inline void DataInfoProvider::AddRootInfo(const DataInfo& rootInfo)
103 {
104  this->AddDataInfo(rootInfo);
105 }
106 
107 inline void DataInfoProvider::RemoveRootInfo(const String& name)
108 {
109  this->roots.erase(name);
110 }
111 
112 template<class T>
113 inline void DataInfoProvider::AddRoot(const char* name, const T& value)
114 {
115  DataInfoDeduction getDataInfo(this->libraryNamespace);
116  this->AddDataInfo(getDataInfo(name, value));
117 }
118 
119 }}}} // end of namespace Arp::Plc::Commons::Meta
Namespace for interfaces and classes of Execution and Sychronization Manager (ESM)
Definition: DataInfoDeduction.hxx:13
Declares the interface of the enumerator pattern, which is leaned on .NET enumerator idiom...
Definition: IEnumerator.hxx:47
Includes name and namespace of type object.
Definition: TypeIdentifier.hpp:21
Definition: DataInfoProvider.hpp:30
Definition: ProgramComponentBase.hpp:22
Definition: ChangeDataInfoProvider.hpp:18
Root namespace for the PLCnext API
Provides detailed informations for the respective data object.
Definition: DataInfo.hpp:31
std::shared_ptr< IProgram > Ptr
Shared pointer type of IProgram.
Definition: IProgram.hpp:22
Definition: DataInfoDeduction.hxx:10
Definition: IDataInfoProvider.hpp:14
This class defines a base class for all enumerator implementations and some predefined enumerators as...
Definition: Enumerator.hxx:21
Interface to implement PLC program to be executed in realtime context.
Definition: IProgram.hpp:18
Definition: ProgramProviderBase.hpp:15