CVB++ 14.1
enumeration_node.hpp
1#pragma once
2
3#include "../global.hpp"
4
5#include "integer_base_node.hpp"
6#include "value_node.hpp"
7
9#include "_detail/ihas_value_config.hpp"
10#include "_detail/iconfigurable_register_node.hpp"
11#include "_detail/iconfigurable_command_node.hpp"
13
14namespace Cvb
15{
16CVB_BEGIN_INLINE_NS
17namespace GevServer
18{
20
23 : public SelectorNode
25 , public Private::IHasValueConfig<IntegerBaseNodePtr>
27{
28public:
29 explicit EnumerationNode(HandleGuard<Node> &&guard) : SelectorNode(std::move(guard)) {}
30
41 static EnumerationNodePtr Create(const String &name, const GevServer::Namespace &nameSpace)
42 {
43 String okName = EnsureNodeNameOnly(name);
44 return std::make_shared<EnumerationNode>(HandleGuard<Node>(
45 CExports::CreateGSEnumerationNodeTyped(okName.data(), static_cast<CExports::TGSNamespace>(nameSpace))));
46 }
47
62 static EnumerationNodePtr Create(const String &name) { return Create(ParseName(name), ParseNamespace(name)); }
63
69 {
70 auto value = GetTerminalRegisterNode<EnumerationNode, IntegerBaseNodePtr>(
71 this, [](Node *node) { return dynamic_cast<Private::IConfigurableRegisterNode*>(node) ? true : false; });
72 if (value == nullptr)
74 else
75 return value->AccessMode();
76 }
77
84 {
85 auto value = GetTerminalRegisterNode<EnumerationNode, IntegerBaseNodePtr>(
86 this, [](Node *node) { return dynamic_cast<Private::IConfigurableRegisterNode*>(node) ? true : false; });
87 if (value == nullptr)
89 else
90 return value->CacheMode();
91 }
92
98 template <class Rep, class Period> std::chrono::duration<Rep, Period> PollingTime() const
99 {
100 auto value = GetTerminalRegisterNode<EnumerationNode, IntegerBaseNodePtr>(this, [](Node *node) {
101 auto isRegisterNode = dynamic_cast<Private::IConfigurableRegisterNode*>(node);
102 auto isCommandNode = dynamic_cast<Private::IConfigurableCommandNode *>(node);
103 return (isRegisterNode || isCommandNode) ? true : false;
104 });
105 if (value == nullptr)
107 else
108 return value->template PollingTime<Rep, Period>();
109 }
110
117 std::vector<EnumEntryNodePtr> Entries() const { return GetDependentNodes<EnumEntryNode>(NodeList::Child); }
118
119 IntegerBaseNodePtr ValueConfigAsNode() const override;
120
130 template <class T> T ValueConfig() const
131 {
132 throw std::runtime_error("requested value config type must be derived from GSIntergerBaseNode "
133 "or be of type int64_t");
134 }
135
149
150 template <class T> void SetValueConfig(const T & /*value*/)
151 {
152 throw std::runtime_error("requested value config type must be derived from "
153 "IntegerBaseNode or be of type std::int64_t");
154 }
155
157
161 String Value() const { return ToString(); }
162
164
168 std::int64_t NumericValue() const { return GetInfoAsInt(NodeInfo::Value); }
169
171
175 void SetValue(const String &value) { FromString(value); }
176
181 void FromString(const String &value) override
182 {
183 NativeCall([&]() { return CExports::GSNSetAsStringTyped(Handle(), value.data()); });
184 }
185
190 String ToString() const override
191 {
192 auto bufferSize = NativeCall<size_t>(
193 [&](size_t &size) { return CExports::GSNGetAsStringTyped(Handle(), reinterpret_cast<Char *>(0), size); });
194 bufferSize += sizeof(Char);
195 std::vector<Char> buffer(bufferSize);
196 NativeCall([&]() { return CExports::GSNGetAsStringTyped(Handle(), buffer.data(), bufferSize); });
197 return buffer.data();
198 }
199};
200
201template <> inline std::int64_t EnumerationNode::ValueConfig<std::int64_t>() const
202{
203 return GetInfoAsInt(NodeInfo::Value);
204}
205
206template <> inline void EnumerationNode::SetValueConfig<std::int64_t>(const std::int64_t &value)
207{
208 SetInfoAsInt(NodeInfo::Value, value);
209}
210}
211CVB_END_INLINE_NS
212}
A GenApi::EnumerationNode that is configurable.
Definition: enumeration_node.hpp:27
void SetValue(const String &value)
Sets the symbolic value of this enumeration.
Definition: enumeration_node.hpp:175
String Value() const
Gets the symbolic value of this enumeration.
Definition: enumeration_node.hpp:161
void SetValueConfig(const T &)
Sets the value configuration of this enumeration node.
Definition: enumeration_node.hpp:150
void FromString(const String &value) override
Same as assigning value to Value.
Definition: enumeration_node.hpp:181
std::vector< EnumEntryNodePtr > Entries() const
Gets all enum entries of this enumeration.
Definition: enumeration_node.hpp:117
GenApi::CacheMode CacheMode() const override
Gets the cache mode by querying all ValueConfigs for it.
Definition: enumeration_node.hpp:83
T ValueConfig() const
Gets the value configuration of this enumeration node.
Definition: enumeration_node.hpp:130
GenApi::AccessMode AccessMode() const override
Gets the access mode by querying all ValueConfigs for it.
Definition: enumeration_node.hpp:68
static EnumerationNodePtr Create(const String &name, const GevServer::Namespace &nameSpace)
Creates a new EnumerationNode with the given name and nameSpace .
Definition: enumeration_node.hpp:41
static EnumerationNodePtr Create(const String &name)
Creates a new EnumerationNode with the given name .
Definition: enumeration_node.hpp:62
std::int64_t NumericValue() const
Gets the numeric value of this enumeration.
Definition: enumeration_node.hpp:168
String ToString() const override
Same as getting the Value.
Definition: enumeration_node.hpp:190
std::chrono::duration< Rep, Period > PollingTime() const
Gets the polling time by querying all ValueConfigs for it.
Definition: enumeration_node.hpp:98
Basic GevServer node for device feature access.
Definition: decl_node.hpp:36
static GevServer::Namespace ParseNamespace(const String &name)
Gets the Namespace from the given name .
Definition: decl_node.hpp:567
static String EnsureNodeNameOnly(const String &name)
Throws if the given name has a namespace prefix.
Definition: decl_node.hpp:540
static String ParseName(const String &name)
Gets the name part of the given node name .
Definition: decl_node.hpp:588
void * Handle() const noexcept
Classic API node handle.
Definition: decl_node.hpp:100
Groups other nodes that are dependent on this one.
Definition: selector_node.hpp:24
CacheMode
Defines how the value is cached.
Definition: genapi.hpp:220
@ NoCache
No caching used.
AccessMode
Access possibility of the node.
Definition: genapi.hpp:185
@ ReadWrite
Node can be read and written to.
Namespace
The possible name spaces a node can be in.
Definition: gevserver.hpp:147
@ Value
Accesses the value configuration.
Root namespace for the Image Manager interface.
Definition: c_barcode.h:24
char Char
Character type for wide characters or unicode characters.
Definition: string.hpp:70