CVB++ 15.0
Loading...
Searching...
No Matches
detail_node.hpp
1#pragma once
2
3#include "../../_cexports/c_gen_api.h"
4
5#include "../../global.hpp"
6#include "../../exception.hpp"
7
8#include "../_decl/decl_node.hpp"
9#include "../_decl/decl_node_map.hpp"
10#include "../boolean_node.hpp"
11#include "../category_node.hpp"
12#include "../command_node.hpp"
13#include "../enumeration_node.hpp"
14#include "../enum_entry_node.hpp"
15#include "../float_reg_node.hpp"
16#include "../float_node.hpp"
17#include "../int_reg_node.hpp"
18#include "../integer_node.hpp"
19#include "../string_reg_node.hpp"
20#include "../string_node.hpp"
21#include "../port_node.hpp"
22#include "../register_node.hpp"
23
24namespace Cvb
25{
26
27 CVB_BEGIN_INLINE_NS
28
29 namespace GenApi
30 {
31
32 inline NodePtr Node::FromName(const NodeMapPtr &nodeMap, const String &name)
33 {
34
35 CExports::NODEMAP handle = nullptr;
36 auto resultGet = CExports::NMGetNodeTyped(nodeMap->Handle(), name.c_str(), handle);
37 if (resultGet < 0)
38 std::rethrow_exception(CvbException::FromCvbResult(resultGet, "failed to get node"));
39
40 HandleGuard<Node> guard(handle);
41
42 CExports::TNodeType nodeType = CExports::NT_Invalid;
43 auto resultType = CExports::NType(handle, nodeType);
44 if (resultType < 0)
45 std::rethrow_exception(CvbException::FromCvbResult(resultGet, "failed to get node type"));
46
47 CExports::cvbint64_t value = 0;
48 bool isRegister =
49 CExports::NInfoAsInteger(guard.Handle(), static_cast<CExports::TNodeInfo>(NodeInfo::RegisterLength), value)
50 >= 0
51 && value > 0;
52
53 NodePtr node;
54 switch (nodeType)
55 {
56
57 case CExports::NT_Invalid:
58 case CExports::NT_Unknown:
59 throw std::runtime_error("invalid node type");
60
61 case CExports::NT_Boolean:
62 node = std::make_shared<BooleanNode>(std::move(guard));
63 break;
64
65 case CExports::NT_Category:
66 node = std::make_shared<CategoryNode>(std::move(guard));
67 break;
68
69 case CExports::NT_Command:
70 node = std::make_shared<CommandNode>(std::move(guard));
71 break;
72
73 case CExports::NT_Enumeration:
74 node = std::make_shared<EnumerationNode>(std::move(guard));
75 break;
76
77 case CExports::NT_EnumEntry:
78 node = std::make_shared<EnumEntryNode>(std::move(guard));
79 break;
80
81 case CExports::NT_Float:
82 if (isRegister)
83 node = std::make_shared<FloatRegNode>(std::move(guard));
84 else
85 node = std::make_shared<FloatNode>(std::move(guard));
86 break;
87
88 case CExports::NT_Integer:
89 if (isRegister)
90 node = std::make_shared<IntRegNode>(std::move(guard));
91 else
92 node = std::make_shared<IntegerNode>(std::move(guard));
93 break;
94
95 case CExports::NT_String:
96 if (isRegister)
97 node = std::make_shared<StringRegNode>(std::move(guard));
98 else
99 node = std::make_shared<StringNode>(std::move(guard));
100 break;
101
102 case CExports::NT_Port:
103 node = std::make_shared<PortNode>(std::move(guard));
104 break;
105
106 default:
107 if (isRegister)
108 node = std::make_shared<RegisterNode>(std::move(guard));
109 else
110 node = std::shared_ptr<Node>(new Node(std::move(guard)));
111 break;
112 }
113
114 node->nodeMap_ = nodeMap;
115
116 int resultRegister = CExports::NRegisterUpdate(handle, Node::UpdatedCallback, node.get(), node->cbID_);
117 if (resultRegister < 0)
118 std::rethrow_exception(CvbException::FromCvbResult(resultRegister, "failed to register updated handler"));
119
120 return node;
121 }
122
124 {
125 auto aliasName = GetInfoAsString(NodeInfo::AliasName);
126 if (aliasName.empty())
127 return NodePtr();
128
129 return nodeMap_->Node(aliasName);
130 }
131
133 {
134 auto holder = Internal::CbCarrier<void(Node &)>::Create(handler);
135 return updatedCarrierContainer_.Register(holder);
136 }
137
138 inline void Node::UnregisterEventUpdated(EventCookie eventCookie) noexcept
139 {
140 updatedCarrierContainer_.Unregister(eventCookie);
141 }
142
143 template <class T>
144 inline std::vector<std::shared_ptr<T>> Node::GetDependentNodes(NodeList type) const
145 {
146 int numNodes = GetDependentNodeCount(type);
147 std::vector<std::shared_ptr<T>> dependentNodes(static_cast<std::size_t>(numNodes));
148
149 for (int i = 0; i < numNodes; ++i)
150 {
151 auto nodeName = NativeCall<String>([&](String &value) {
152 std::size_t bufferSize = 0;
153 auto bufferSizeResult = CExports::NListTyped(Handle(), static_cast<CExports::TNodeList>(type), i,
154 reinterpret_cast<Char *>(0), bufferSize);
155 if (bufferSizeResult < 0)
156 return bufferSizeResult;
157
158 std::vector<Char> buffer(bufferSize);
159 auto bufferResult =
160 CExports::NListTyped(Handle(), static_cast<CExports::TNodeList>(type), i, buffer.data(), bufferSize);
161 if (bufferResult < 0)
162 return bufferResult;
163
164 value = String(buffer.data());
165 return bufferResult;
166 });
167 dependentNodes[i] = nodeMap_->Node<T>(nodeName);
168 }
169 return dependentNodes;
170 }
171
172 } // namespace GenApi
173
174 CVB_END_INLINE_NS
175
176} // namespace Cvb
EventCookie RegisterEventUpdated(std::function< void(Node &)> handler)
Register a listener to node updated event.
Definition detail_node.hpp:132
void UnregisterEventUpdated(EventCookie eventCookie) noexcept
Manually unregister a listener to the node updated event.
Definition detail_node.hpp:138
NodePtr AliasNode() const
Gets the node, that is an alias value for this node.
Definition detail_node.hpp:123
void * Handle() const noexcept
Classic API node handle.
Definition decl_node.hpp:71
Namespace for GenApi based device configuration.
Definition decl_fw_updater.hpp:29
std::shared_ptr< Node > NodePtr
Convenience shared pointer for Node.
Definition genapi.hpp:71
std::shared_ptr< NodeMap > NodeMapPtr
Convenience shared pointer for NodeMap.
Definition genapi.hpp:27
Root namespace for the Image Manager interface.
Definition version.hpp:11
char Char
Character type for wide characters or unicode characters.
Definition string.hpp:63
std::string String
String for wide characters or unicode characters.
Definition string.hpp:49