15#include <peak/dll_interface/peak_dll_interface_util.hpp>
20#include <unordered_map>
62 ,
public std::enable_shared_from_this<NodeMap>
66 using NodeFilterFunction = std::function<bool(
const std::shared_ptr<const nodes::Node>& nodeToFilter)>;
85 friend ClassCreator<ScopedNodeMapLock>;
87 explicit ScopedNodeMapLock(
const std::shared_ptr<NodeMap>& nodeMap, std::adopt_lock_t t);
88 std::shared_ptr<NodeMap> m_nodeMap;
110 bool HasNode(
const std::string& name)
const;
124 template <class NodeType, typename std::enable_if<std::is_base_of<nodes::Node, NodeType>::value,
int>::type = 0>
127 InitializeIfNecessary();
135 return std::dynamic_pointer_cast<NodeType>(m_nodesByName.at(name)) !=
nullptr;
151 std::shared_ptr<nodes::Node>
FindNode(
const std::string& name);
167 template <class NodeType, typename std::enable_if<std::is_base_of<nodes::Node, NodeType>::value,
int>::type = 0>
168 std::shared_ptr<NodeType>
FindNode(
const std::string& name)
170 auto castedNode = std::dynamic_pointer_cast<NodeType>(
FindNode(name));
190 std::shared_ptr<nodes::Node>
TryFindNode(
const std::string& name);
204 template <class NodeType, typename std::enable_if<std::is_base_of<nodes::Node, NodeType>::value,
int>::type = 0>
213 auto castedNode = std::dynamic_pointer_cast<NodeType>(node);
251 std::vector<std::shared_ptr<nodes::Node>>
Nodes()
const;
322 void StoreToFile(
const std::string& filePath)
const;
359 std::unique_ptr<ScopedNodeMapLock>
Lock();
381 std::unique_ptr<ScopedNodeMapLock>
TryLock();
394 return m_backendHandle;
398 std::shared_ptr<nodes::Node> NodeFromHandle(
PEAK_NODE_HANDLE nodeHandle)
const;
400 friend ClassCreator<NodeMap>;
404 void Initialize()
const override;
405 mutable std::vector<std::shared_ptr<nodes::Node>> m_nodes;
406 mutable std::unordered_map<std::string, std::shared_ptr<nodes::Node>> m_nodesByName;
431 : m_backendHandle(nodeMapHandle)
438 return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](
PEAK_BOOL8* hasNode) {
445 InitializeIfNecessary();
447 (void)QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](
PEAK_NODE_HANDLE* nodeHandle) {
449 m_backendHandle, name.c_str(), name.size() + 1, nodeHandle);
452 return m_nodesByName.at(name);
457 InitializeIfNecessary();
459 const auto cNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](
PEAK_NODE_HANDLE* nodeHandle) {
461 m_backendHandle, name.c_str(), name.size() + 1, nodeHandle);
464 if(cNodeHandle ==
nullptr)
469 return m_nodesByName.at(name);
474 CallAndCheckCInterfaceFunction(
480 CallAndCheckCInterfaceFunction(
486 InitializeIfNecessary();
493 if (event ==
nullptr)
498 return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](
PEAK_BOOL8* hasSupportedData) {
500 m_backendHandle, event->m_backendHandle, hasSupportedData);
506 if (event ==
nullptr)
511 CallAndCheckCInterfaceFunction(
517 CallAndCheckCInterfaceFunction([&] {
524 InitializeIfNecessary();
526 CallAndCheckCInterfaceFunction([&] {
528 m_backendHandle, filePath.c_str(), filePath.size() + 1);
535 CallAndCheckCInterfaceFunction(
547 CallAndCheckCInterfaceFunction(
553 return std::make_unique<ClassCreator<ScopedNodeMapLock>>(shared_from_this());
559 CallAndCheckCInterfaceFunction(
567 return std::make_unique<ClassCreator<ScopedNodeMapLock>>(shared_from_this(), std::adopt_lock);
570inline std::shared_ptr<nodes::Node> NodeMap::NodeFromHandle(
PEAK_NODE_HANDLE nodeHandle)
const
572 auto nodeType = QueryNumericFromCInterfaceFunction<PEAK_NODE_TYPE>(
578 auto integerNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_INTEGER_NODE_HANDLE>(
583 return std::make_shared<ClassCreator<nodes::IntegerNode>>(
584 integerNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
587 auto booleanNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_BOOLEAN_NODE_HANDLE>(
592 return std::make_shared<ClassCreator<nodes::BooleanNode>>(
593 booleanNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
596 auto commandNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_COMMAND_NODE_HANDLE>(
601 return std::make_shared<ClassCreator<nodes::CommandNode>>(
602 commandNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
605 auto floatNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_FLOAT_NODE_HANDLE>(
610 return std::make_shared<ClassCreator<nodes::FloatNode>>(
611 floatNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
614 auto stringNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_STRING_NODE_HANDLE>(
619 return std::make_shared<ClassCreator<nodes::StringNode>>(
620 stringNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
623 auto registerNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_REGISTER_NODE_HANDLE>(
628 return std::make_shared<ClassCreator<nodes::RegisterNode>>(
629 registerNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
632 auto categoryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_CATEGORY_NODE_HANDLE>(
637 return std::make_shared<ClassCreator<nodes::CategoryNode>>(
638 categoryNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
641 auto enumerationNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_NODE_HANDLE>(
646 return std::make_shared<ClassCreator<nodes::EnumerationNode>>(
647 enumerationNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
650 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
653 nodeHandle, _enumerationEntryNodeHandle);
656 return std::make_shared<ClassCreator<nodes::EnumerationEntryNode>>(
657 enumerationEntryNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
660 return std::make_shared<ClassCreator<nodes::Node>>(
661 nodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
666inline void NodeMap::Initialize()
const
668 auto numNodes = QueryNumericFromCInterfaceFunction<size_t>([&](
size_t* _numNodes) {
672 for (
size_t x = 0; x < numNodes; ++x)
674 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>(
679 auto node = NodeFromHandle(nodeHandle);
681 m_nodes.emplace_back(node);
682 m_nodesByName.emplace(node->Name(), node);
Represents a GenTL buffer module.
Definition peak_buffer.hpp:87
The exception thrown for passing an invalid argument to a function.
Definition peak_exception.hpp:116
The exception thrown for trying to apply an invalid cast.
Definition peak_exception.hpp:142
ScopedNodeMapLock(ScopedNodeMapLock &&other)=delete
ScopedNodeMapLock & operator=(ScopedNodeMapLock &&other)=delete
ScopedNodeMapLock()=delete
ScopedNodeMapLock & operator=(const ScopedNodeMapLock &other)=delete
ScopedNodeMapLock(const ScopedNodeMapLock &other)=delete
~ScopedNodeMapLock()
Definition peak_node_map.hpp:545
PEAK_NODE_MAP_HANDLE Handle() const
Get the backend handle.
Definition peak_node_map.hpp:392
std::shared_ptr< nodes::Node > FindNode(const std::string &name)
Find a node with the given name.
Definition peak_node_map.hpp:443
bool HasNode(const std::string &name) const
Checks whether the node map contains a node with the given name.
Definition peak_node_map.hpp:436
bool HasEventSupportedData(const std::unique_ptr< Event > &event) const
Checks if the Event contains data corresponding to the NodeMap.
Definition peak_node_map.hpp:491
void StoreToFile(const std::string &filePath) const
Stores the values of streamable nodes to the file at the given file path.
Definition peak_node_map.hpp:515
bool HasNode(const std::string &name)
Checks whether the node map contains a node with the given name and type.
Definition peak_node_map.hpp:125
NodeMap & operator=(const NodeMap &other)=delete
std::unique_ptr< ScopedNodeMapLock > Lock()
Locks a recursive mutex on the NodeMap.
Definition peak_node_map.hpp:551
NodeMap(const NodeMap &other)=delete
void PollNodes(int64_t elapsedTime_ms)
Polls all nodes having a polling time.
Definition peak_node_map.hpp:478
std::shared_ptr< NodeType > TryFindNode(const std::string &name)
Tries to find a node with the given name and type.
Definition peak_node_map.hpp:205
std::vector< std::shared_ptr< nodes::Node > > Nodes() const
Returns the nodes.
Definition peak_node_map.hpp:484
std::function< bool(const std::shared_ptr< const nodes::Node > &nodeToFilter)> NodeFilterFunction
Definition peak_node_map.hpp:66
void UpdateChunkNodes(const std::shared_ptr< Buffer > &buffer)
Updates chunk information in the NodeMap.
Definition peak_buffer.hpp:1026
void InvalidateNodes()
Invalidates all nodes.
Definition peak_node_map.hpp:472
std::shared_ptr< NodeType > FindNode(const std::string &name)
Find a node with the given name and type.
Definition peak_node_map.hpp:168
NodeMap(NodeMap &&other)=delete
void LoadFromFile(const std::string &filePath)
Loads the values of streamable nodes from the file at the given file path.
Definition peak_node_map.hpp:522
bool HasBufferSupportedChunks(const std::shared_ptr< Buffer > &buffer) const
Checks if the Buffer contains chunks corresponding to the NodeMap.
Definition peak_buffer.hpp:1013
std::unique_ptr< ScopedNodeMapLock > TryLock()
Locks a recursive mutex on the NodeMap.
Definition peak_node_map.hpp:556
NodeMap & operator=(NodeMap &&other)=delete
void UpdateEventNodes(const std::unique_ptr< Event > &event)
Updates event information in the NodeMap.
Definition peak_node_map.hpp:504
std::shared_ptr< nodes::Node > TryFindNode(const std::string &name)
Tries to find a node with the given name.
Definition peak_node_map.hpp:455
Represents a GenAPI boolean node.
Definition peak_boolean_node.hpp:34
Represents a GenAPI category node.
Definition peak_category_node.hpp:37
Represents a GenAPI command node.
Definition peak_command_node.hpp:35
Represents a GenAPI enumeration entry node.
Definition peak_enumeration_entry_node.hpp:37
Represents a GenAPI enumeration node.
Definition peak_enumeration_node.hpp:40
Represents a GenAPI float node.
Definition peak_float_node.hpp:48
Represents a GenAPI integer node.
Definition peak_integer_node.hpp:38
Represents a GenAPI node.
Definition peak_node.hpp:128
Represents a GenAPI register node.
Definition peak_register_node.hpp:39
Represents a GenAPI string node.
Definition peak_string_node.hpp:36
The "nodes" namespace contains all GenAPI node types.
Definition peak_boolean_node.hpp:26
The "core" namespace contains the direct GenAPI and GenTL wrapper.
Definition peak_buffer.hpp:34
The "peak" namespace directly contains convenience functionality like the DeviceManager as well as th...
Definition peak_dynamic_loader.h:33
PEAK_C_API PEAK_Node_ToEnumerationEntryNode(PEAK_NODE_HANDLE nodeHandle, PEAK_ENUMERATION_ENTRY_NODE_HANDLE *enumerationEntryNodeHandle)
Casts the given node to an enumeration entry node.
@ PEAK_NODE_TYPE_BOOLEAN
Definition peak_backend.h:287
@ PEAK_NODE_TYPE_FLOAT
Definition peak_backend.h:289
@ PEAK_NODE_TYPE_COMMAND
Definition peak_backend.h:288
@ PEAK_NODE_TYPE_CATEGORY
Definition peak_backend.h:292
@ PEAK_NODE_TYPE_ENUMERATION_ENTRY
Definition peak_backend.h:294
@ PEAK_NODE_TYPE_ENUMERATION
Definition peak_backend.h:293
@ PEAK_NODE_TYPE_STRING
Definition peak_backend.h:290
@ PEAK_NODE_TYPE_INTEGER
Definition peak_backend.h:286
@ PEAK_NODE_TYPE_REGISTER
Definition peak_backend.h:291
PEAK_C_API PEAK_NodeMap_GetNode(PEAK_NODE_MAP_HANDLE nodeMapHandle, size_t index, PEAK_NODE_HANDLE *nodeHandle)
Asks the given node map for the node with the given index.
PEAK_C_API PEAK_Node_ToRegisterNode(PEAK_NODE_HANDLE nodeHandle, PEAK_REGISTER_NODE_HANDLE *registerNodeHandle)
Casts the given node to a register node.
PEAK_C_API PEAK_NodeMap_UpdateEventNodes(PEAK_NODE_MAP_HANDLE nodeMapHandle, PEAK_EVENT_HANDLE eventHandle)
Updates event information in the node map.
PEAK_C_API PEAK_NodeMap_Lock(PEAK_NODE_MAP_HANDLE nodeMapHandle)
Locks a recursive mutex on the NodeMap.
struct PEAK_ENUMERATION_NODE * PEAK_ENUMERATION_NODE_HANDLE
Definition peak_backend.h:461
PEAK_C_API PEAK_NodeMap_GetHasEventSupportedData(PEAK_NODE_MAP_HANDLE nodeMapHandle, PEAK_EVENT_HANDLE eventHandle, PEAK_BOOL8 *hasSupportedData)
Checks if the event contains data corresponding to the node map.
struct PEAK_COMMAND_NODE * PEAK_COMMAND_NODE_HANDLE
Definition peak_backend.h:441
struct PEAK_STRING_NODE * PEAK_STRING_NODE_HANDLE
Definition peak_backend.h:449
PEAK_C_API PEAK_Node_ToBooleanNode(PEAK_NODE_HANDLE nodeHandle, PEAK_BOOLEAN_NODE_HANDLE *booleanNodeHandle)
Casts the given node to a boolean node.
struct PEAK_NODE * PEAK_NODE_HANDLE
Definition peak_backend.h:429
PEAK_C_API PEAK_NodeMap_TryLock(PEAK_NODE_MAP_HANDLE nodeMapHandle, PEAK_BOOL8 *locked)
Tries to Lock a recursive mutex on the NodeMap. Use this to synchronize NodeMap access from multiple ...
PEAK_C_API PEAK_Node_GetType(PEAK_NODE_HANDLE nodeHandle, PEAK_NODE_TYPE *type)
Asks the given node for its type.
int32_t PEAK_NODE_TYPE
Definition peak_backend.h:296
PEAK_C_API PEAK_Node_ToFloatNode(PEAK_NODE_HANDLE nodeHandle, PEAK_FLOAT_NODE_HANDLE *floatNodeHandle)
Casts the given node to a float node.
PEAK_C_API PEAK_NodeMap_GetHasNode(PEAK_NODE_MAP_HANDLE nodeMapHandle, const char *nodeName, size_t nodeNameSize, PEAK_BOOL8 *hasNode)
Checks whether the given node map contains a node with the given name.
PEAK_C_API PEAK_Node_ToIntegerNode(PEAK_NODE_HANDLE nodeHandle, PEAK_INTEGER_NODE_HANDLE *integerNodeHandle)
Casts the given node to an integer node.
PEAK_C_API PEAK_NodeMap_PollNodes(PEAK_NODE_MAP_HANDLE nodeMapHandle, int64_t elapsedTime_ms)
Tells the given node map to poll its nodes.
PEAK_C_API PEAK_NodeMap_StoreToFile(PEAK_NODE_MAP_HANDLE nodeMapHandle, const char *filePath, size_t filePathSize)
Tells the given node map to store the values of its streamable nodes to a file at the given file path...
struct PEAK_FLOAT_NODE * PEAK_FLOAT_NODE_HANDLE
Definition peak_backend.h:445
PEAK_C_API PEAK_Node_ToEnumerationNode(PEAK_NODE_HANDLE nodeHandle, PEAK_ENUMERATION_NODE_HANDLE *enumerationNodeHandle)
Casts the given node to an enumeration node.
PEAK_C_API PEAK_NodeMap_GetNumNodes(PEAK_NODE_MAP_HANDLE nodeMapHandle, size_t *numNodes)
Asks the given node map for its number of nodes.
PEAK_C_API PEAK_NodeMap_FindNode(PEAK_NODE_MAP_HANDLE nodeMapHandle, const char *nodeName, size_t nodeNameSize, PEAK_NODE_HANDLE *nodeHandle)
Tells the given node map to find a node with the given name.
PEAK_C_API PEAK_Node_ToCategoryNode(PEAK_NODE_HANDLE nodeHandle, PEAK_CATEGORY_NODE_HANDLE *categoryNodeHandle)
Casts the given node to a category node.
int8_t PEAK_BOOL8
Definition peak_backend.h:43
struct PEAK_NODE_MAP * PEAK_NODE_MAP_HANDLE
Definition peak_backend.h:425
struct PEAK_ENUMERATION_ENTRY_NODE * PEAK_ENUMERATION_ENTRY_NODE_HANDLE
Definition peak_backend.h:465
struct PEAK_CATEGORY_NODE * PEAK_CATEGORY_NODE_HANDLE
Definition peak_backend.h:457
struct PEAK_REGISTER_NODE * PEAK_REGISTER_NODE_HANDLE
Definition peak_backend.h:453
PEAK_C_API PEAK_Node_ToStringNode(PEAK_NODE_HANDLE nodeHandle, PEAK_STRING_NODE_HANDLE *stringNodeHandle)
Casts the given node to a string node.
PEAK_C_API PEAK_Node_ToCommandNode(PEAK_NODE_HANDLE nodeHandle, PEAK_COMMAND_NODE_HANDLE *commandNodeHandle)
Casts the given node to a command node.
@ PEAK_RETURN_CODE_SUCCESS
Definition peak_backend.h:334
PEAK_C_API PEAK_NodeMap_Unlock(PEAK_NODE_MAP_HANDLE nodeMapHandle)
Unlocks the recursive mutex on the NodeMap.
PEAK_C_API PEAK_NodeMap_InvalidateNodes(PEAK_NODE_MAP_HANDLE nodeMapHandle)
Tells the given node map to invalidate its nodes.
struct PEAK_BOOLEAN_NODE * PEAK_BOOLEAN_NODE_HANDLE
Definition peak_backend.h:437
struct PEAK_INTEGER_NODE * PEAK_INTEGER_NODE_HANDLE
Definition peak_backend.h:433
PEAK_C_API PEAK_NodeMap_LoadFromFile(PEAK_NODE_MAP_HANDLE nodeMapHandle, const char *filePath, size_t filePathSize)
Tells the given node map to load the values of its streamable nodes from a file at the given file pat...
PEAK_C_API PEAK_NodeMap_TryFindNode(PEAK_NODE_MAP_HANDLE nodeMapHandle, const char *nodeName, size_t nodeNameSize, PEAK_NODE_HANDLE *nodeHandle)
Tells the given node map to try to find a node with the given name.
#define PEAK_C_ABI_PREFIX
Definition peak_dll_defines.h:16