0.5.0
Loading...
Searching...
No Matches
NodeRegistry.cpp
Go to the documentation of this file.
1// This file is part of INSTINCT, the INS Toolkit for Integrated
2// Navigation Concepts and Training by the Institute of Navigation of
3// the University of Stuttgart, Germany.
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9#include "NodeRegistry.hpp"
10
11#include "util/Logger.hpp"
12
14#include "NodeData/NodeData.hpp"
15
16#include <string>
17
18/* -------------------------------------------------------------------------------------------------------- */
19/* Private Members */
20/* -------------------------------------------------------------------------------------------------------- */
21
22namespace NAV::NodeRegistry
23{
24namespace
25{
26
27/// List of all registered nodes.
28/// Key: category, Value: Nodes
29std::map<std::string, std::vector<NodeInfo>> _registeredNodes;
30
31/// List of all registered node data types.
32/// Key: NodeData.type(), Value: parentTypes()
33std::map<std::string, std::vector<std::string>> _registeredNodeDataTypes;
34
35/* -------------------------------------------------------------------------------------------------------- */
36/* Private Function Declarations */
37/* -------------------------------------------------------------------------------------------------------- */
38
39/// @brief Registers a Node with the NodeManager
40/// @tparam T Node Class to register
41template<std::derived_from<Node> T>
42void registerNodeType()
43{
44 NodeInfo info;
45 info.constructor = []() { return new T(); }; // NOLINT(cppcoreguidelines-owning-memory)
46 info.type = T::typeStatic();
47
48 T obj;
49 for (const InputPin& pin : obj.inputPins)
50 {
51 info.pinInfoList.emplace_back(pin.kind, pin.type, pin.dataIdentifier);
52 }
53 for (const OutputPin& pin : obj.outputPins)
54 {
55 info.pinInfoList.emplace_back(pin.kind, pin.type, pin.dataIdentifier);
56 }
57
58 _registeredNodes[T::category()].push_back(info);
59}
60
61/// @brief Register a NodeData with the NodeManager
62/// @tparam T NodeData Class to register
63template<std::derived_from<NodeData> T>
64void registerNodeDataType()
65{
66 _registeredNodeDataTypes[T::type()] = T::parentTypes();
67}
68
69} // namespace
70} // namespace NAV::NodeRegistry
71
72/* -------------------------------------------------------------------------------------------------------- */
73/* Function Definitions */
74/* -------------------------------------------------------------------------------------------------------- */
75
77{
78 if (pin == nullptr)
79 {
80 return true;
81 }
82
84 for (const auto& pinInfo : this->pinInfoList)
85 {
86 const std::vector<std::string>& startPinDataIdentifier = pin->kind == Pin::Kind::Input ? pinInfo.dataIdentifier : pin->dataIdentifier;
87 const std::vector<std::string>& endPinDataIdentifier = pin->kind == Pin::Kind::Input ? pin->dataIdentifier : pinInfo.dataIdentifier;
88 const std::string& startPinParentNodeType = pin->kind == Pin::Kind::Input ? this->type : pin->parentNode->type();
89
90 if (pinInfo.kind == searchPinKind && pinInfo.type == pin->type)
91 {
92 if ((pinInfo.type == Pin::Type::Flow
93 && NAV::NodeRegistry::NodeDataTypeAnyIsChildOf(startPinDataIdentifier, endPinDataIdentifier))
94 || (pinInfo.type == Pin::Type::Delegate
95 && std::ranges::find(endPinDataIdentifier, startPinParentNodeType) != endPinDataIdentifier.end())
96 || ((pinInfo.type == Pin::Type::Object || pinInfo.type == Pin::Type::Matrix) // NOLINT(misc-redundant-expression) - false positive warning
97 && Pin::dataIdentifierHaveCommon(startPinDataIdentifier, endPinDataIdentifier))
98 || pinInfo.type == Pin::Type::Bool || pinInfo.type == Pin::Type::Int || pinInfo.type == Pin::Type::Float || pinInfo.type == Pin::Type::String)
99 {
100 return true;
101 }
102 }
103 }
104
105 return false;
106}
107
108const std::map<std::string, std::vector<NAV::NodeRegistry::NodeInfo>>& NAV::NodeRegistry::RegisteredNodes()
109{
110 return _registeredNodes;
111}
112
113bool NAV::NodeRegistry::NodeDataTypeAnyIsChildOf(const std::vector<std::string>& childTypes, const std::vector<std::string>& parentTypes)
114{
115 for (const auto& childType : childTypes)
116 {
117 for (const auto& parentType : parentTypes)
118 {
119 if (childType == parentType)
120 {
121 return true;
122 }
123 for (const auto& [dataType, parentTypes] : _registeredNodeDataTypes)
124 {
125 if (dataType == childType)
126 {
127 for (const auto& parentTypeOfChild : parentTypes)
128 {
129 if (NodeDataTypeAnyIsChildOf({ parentTypeOfChild }, { parentType }))
130 {
131 return true;
132 }
133 }
134 }
135 }
136 }
137 }
138
139 return false;
140}
141
142std::vector<std::string> NAV::NodeRegistry::GetParentNodeDataTypes(const std::string& type)
143{
144 std::vector<std::string> returnTypes;
145 if (_registeredNodeDataTypes.contains(type))
146 {
147 const auto& parentTypes = _registeredNodeDataTypes.at(type);
148
149 // Add all the immediate parents
150 if (!parentTypes.empty())
151 {
152 returnTypes.insert(returnTypes.end(), parentTypes.begin(), parentTypes.end());
153 }
154
155 // Add parents of parents
156 for (const auto& parentType : parentTypes)
157 {
158 auto parentParentTypes = GetParentNodeDataTypes(parentType);
159 if (!parentParentTypes.empty())
160 {
161 returnTypes.insert(returnTypes.end(), parentParentTypes.begin(), parentParentTypes.end());
162 }
163 }
164 }
165
166 return returnTypes;
167}
168
169// Utility
171#include "Nodes/Utility/Demo.hpp"
176// Converter
182// Data Link
183#if __linux__ || __APPLE__
185#endif
188// Data Logger
196// Data Processor
208// Data Provider
230// Data Simulator
233// Plotting
235// State
237// Experimental
241
243{
244 LOG_TRACE("called");
245
247
248 // Utility
249 registerNodeType<Combiner>();
250 registerNodeType<Demo>();
251 registerNodeType<GroupBox>();
252 registerNodeType<Merger>();
253 registerNodeType<Terminator>();
254 registerNodeType<TimeWindow>();
255 // Converter
256 registerNodeType<RtklibPosConverter>();
257 registerNodeType<UartPacketConverter>();
258 registerNodeType<UbloxGnssObsConverter>();
259 registerNodeType<UbloxGnssOrbitCollector>();
260 registerNodeType<VectorNavBinaryConverter>();
261 // Data Link
262#if __linux__ || __APPLE__
263 registerNodeType<MavlinkSend>();
264#endif
265 registerNodeType<UdpSend>();
266 registerNodeType<UdpRecv>();
267 // Data Logger
268 registerNodeType<CsvLogger>();
269 registerNodeType<KmlLogger>();
270 registerNodeType<MatrixLogger>();
271 registerNodeType<RinexObsLogger>();
272 registerNodeType<UartDataLogger>();
273 registerNodeType<VectorNavDataLogger>();
274 registerNodeType<WiFiObsLogger>();
275 // Data Processor
276 registerNodeType<AllanDeviation>();
277 registerNodeType<ErrorModel>();
278 registerNodeType<GnssAnalyzer>();
279 registerNodeType<RealTimeKinematic>();
280 registerNodeType<SinglePointPositioning>();
281 registerNodeType<ImuIntegrator>();
282 registerNodeType<LooselyCoupledKF>();
283 registerNodeType<LowPassFilter>();
284 registerNodeType<PressToHgt>();
285 registerNodeType<ImuFusion>();
286 registerNodeType<WiFiPositioning>();
287 // Data Provider
288 registerNodeType<CsvFile>();
289 registerNodeType<RinexNavFile>();
290 registerNodeType<RinexObsFile>();
291 registerNodeType<EmlidFile>();
292 registerNodeType<RtklibPosFile>();
293 registerNodeType<NmeaFile>();
294 registerNodeType<UbloxFile>();
295 registerNodeType<EmlidSensor>();
296 registerNodeType<UbloxSensor>();
297 registerNodeType<ImuFile>();
298 registerNodeType<KvhFile>();
299 registerNodeType<VectorNavFile>();
300 registerNodeType<KvhSensor>();
301 registerNodeType<Navio2Sensor>();
302 registerNodeType<VectorNavSensor>();
303 registerNodeType<UlogFile>();
304 registerNodeType<PosVelAttFile>();
305 registerNodeType<MultiImuFile>();
306 registerNodeType<EspressifSensor>();
307 registerNodeType<ArubaSensor>();
308 registerNodeType<WiFiObsFile>();
309 // Data Simulator
310 registerNodeType<ImuSimulator>();
311 registerNodeType<BaroSimulator>();
312 // Experimental
313 // registerNodeType<NAV::experimental::ARMA>();
314 // registerNodeType<NAV::experimental::SkydelNetworkStream>();
315 // registerNodeType<NAV::experimental::Delay>();
316 // Plotting
317 registerNodeType<Plot>();
318 // State
319 registerNodeType<PosVelAttInitializer>();
320
322}
323
340#include "NodeData/State/Pos.hpp"
345
348
350{
351 registerNodeDataType<NodeData>();
352 // General
353 registerNodeDataType<DynamicData>();
354 registerNodeDataType<StringObs>();
355 // GNSS
356 registerNodeDataType<EmlidObs>();
357 registerNodeDataType<GnssCombination>();
358 registerNodeDataType<GnssObs>();
359 registerNodeDataType<RtklibPosObs>();
360 registerNodeDataType<RtkSolution>();
361 registerNodeDataType<SppSolution>();
362 registerNodeDataType<UbloxObs>();
363 // IMU
364 registerNodeDataType<ImuObs>();
365 registerNodeDataType<ImuObsSimulated>();
366 registerNodeDataType<ImuObsWDelta>();
367 registerNodeDataType<KvhObs>();
368 registerNodeDataType<VectorNavBinaryOutput>();
369 // State
370 registerNodeDataType<InsGnssLCKFSolution>();
371 registerNodeDataType<Pos>();
372 registerNodeDataType<PosVel>();
373 registerNodeDataType<PosVelAtt>();
374 // WiFi
375 registerNodeDataType<WiFiObs>();
376 registerNodeDataType<WiFiPositioningSolution>();
377 // Barometer
378 registerNodeDataType<BaroPressObs>();
379 registerNodeDataType<BaroHgt>();
380}
381
382std::vector<std::string> NAV::NodeRegistry::GetStaticDataDescriptors(const std::vector<std::string>& dataIdentifier)
383{
384 // ATTENTION: Entries need to be in correct inheritance order (deepest inheritance first)
385
386 // NodeData
395 // Pos
405 // ImuObs
410 // Barometer
413
414 return {};
415}
416
417bool NAV::NodeRegistry::TypeHasDynamicData(const std::string& type)
418{
419 return type == DynamicData::type()
420 || type == GnssCombination::type()
421 || type == GnssObs::type()
422 || type == RtkSolution::type()
423 || type == SppSolution::type()
424 || type == VectorNavBinaryOutput::type();
425}
426
427std::shared_ptr<NAV::NodeData> NAV::NodeRegistry::CopyNodeData(const std::shared_ptr<const NodeData>& nodeData)
428{
429 if (nodeData == nullptr) { return nullptr; }
430
431 // General
432 if (nodeData->getType() == DynamicData::type()) { return std::make_shared<DynamicData>(*std::static_pointer_cast<const DynamicData>(nodeData)); }
433 if (nodeData->getType() == StringObs::type()) { return std::make_shared<StringObs>(*std::static_pointer_cast<const StringObs>(nodeData)); }
434 // GNSS
435 if (nodeData->getType() == EmlidObs::type()) { return std::make_shared<EmlidObs>(*std::static_pointer_cast<const EmlidObs>(nodeData)); }
436 if (nodeData->getType() == GnssCombination::type()) { return std::make_shared<GnssCombination>(*std::static_pointer_cast<const GnssCombination>(nodeData)); }
437 if (nodeData->getType() == GnssObs::type()) { return std::make_shared<GnssObs>(*std::static_pointer_cast<const GnssObs>(nodeData)); }
438 if (nodeData->getType() == RtklibPosObs::type()) { return std::make_shared<RtklibPosObs>(*std::static_pointer_cast<const RtklibPosObs>(nodeData)); }
439 if (nodeData->getType() == RtkSolution::type()) { return std::make_shared<RtkSolution>(*std::static_pointer_cast<const RtkSolution>(nodeData)); }
440 if (nodeData->getType() == SppSolution::type()) { return std::make_shared<SppSolution>(*std::static_pointer_cast<const SppSolution>(nodeData)); }
441 if (nodeData->getType() == UbloxObs::type()) { return std::make_shared<UbloxObs>(*std::static_pointer_cast<const UbloxObs>(nodeData)); }
442 // IMU
443 if (nodeData->getType() == ImuObs::type()) { return std::make_shared<ImuObs>(*std::static_pointer_cast<const ImuObs>(nodeData)); }
444 if (nodeData->getType() == ImuObsSimulated::type()) { return std::make_shared<ImuObsSimulated>(*std::static_pointer_cast<const ImuObsSimulated>(nodeData)); }
445 if (nodeData->getType() == ImuObsWDelta::type()) { return std::make_shared<ImuObsWDelta>(*std::static_pointer_cast<const ImuObsWDelta>(nodeData)); }
446 if (nodeData->getType() == KvhObs::type()) { return std::make_shared<KvhObs>(*std::static_pointer_cast<const KvhObs>(nodeData)); }
447 if (nodeData->getType() == VectorNavBinaryOutput::type()) { return std::make_shared<VectorNavBinaryOutput>(*std::static_pointer_cast<const VectorNavBinaryOutput>(nodeData)); }
448 // State
449 if (nodeData->getType() == InsGnssLCKFSolution::type()) { return std::make_shared<InsGnssLCKFSolution>(*std::static_pointer_cast<const InsGnssLCKFSolution>(nodeData)); }
450 if (nodeData->getType() == InsGnssTCKFSolution::type()) { return std::make_shared<InsGnssTCKFSolution>(*std::static_pointer_cast<const InsGnssTCKFSolution>(nodeData)); }
451 if (nodeData->getType() == Pos::type()) { return std::make_shared<Pos>(*std::static_pointer_cast<const Pos>(nodeData)); }
452 if (nodeData->getType() == PosVel::type()) { return std::make_shared<PosVel>(*std::static_pointer_cast<const PosVel>(nodeData)); }
453 if (nodeData->getType() == PosVelAtt::type()) { return std::make_shared<PosVelAtt>(*std::static_pointer_cast<const PosVelAtt>(nodeData)); }
454 // WiFi
455 if (nodeData->getType() == WiFiObs::type()) { return std::make_shared<WiFiObs>(*std::static_pointer_cast<const WiFiObs>(nodeData)); }
456 if (nodeData->getType() == WiFiPositioningSolution::type()) { return std::make_shared<WiFiPositioningSolution>(*std::static_pointer_cast<const WiFiPositioningSolution>(nodeData)); }
457 // Barometer
458 if (nodeData->getType() == BaroPressObs::type()) { return std::make_shared<BaroPressObs>(*std::static_pointer_cast<const BaroPressObs>(nodeData)); }
459 if (nodeData->getType() == BaroHgt::type()) { return std::make_shared<BaroHgt>(*std::static_pointer_cast<const BaroHgt>(nodeData)); }
460
461 return nullptr;
462}
ARMA Node.
Computes Allan Deviation.
Aruba Sensor Class.
Barometric Height Storage Class.
Barometric Pressure Storage Class.
Barometer observation simulator.
Calculates differences between signals.
CSV File reader.
Data Logger for CSV files.
Delay Node.
Demo Node which demonstrates all capabilities.
Dynamic Data container.
File Reader for Emlid log files.
Emlid Observation Class.
Emlid Sensor Class.
Adds errors (biases and noise) to measurements.
Espressif Sensor Class.
Allows creation of GNSS measurement combinations.
GNSS measurement combinations.
GNSS Observation messages.
Group Box.
File Reader for Imu log files.
Combines signals of sensors that provide the same signal-type to one signal.
Integrates ImuObs Data.
Data storage class for simulated IMU observations.
Data storage class for one VectorNavImu observation.
Parent Class for all IMU Observations.
Imu Observation Simulator.
Loosely-coupled Kalman Filter INS/GNSS errors.
Tightly-coupled Kalman Filter INS/GNSS errors.
Data Logger for Pos data as KML (Keyhole Markup Language) files (input for Google Earth)
File Reader for Kvh log files.
Data storage class for one KVH Imu observation.
KVH Sensors.
Utility class for logging to console and file.
#define LOG_TRACE
Detailled info to trace the execution of the program. Should not be called on functions which receive...
Definition Logger.hpp:65
Kalman Filter class for the loosely coupled INS/GNSS integration.
Filters incoming data.
Data Logger for matrices.
Merger Node.
File reader for Multi-IMU data log files.
Navio2 Sensors.
File Reader for NMEA files.
Abstract NodeData Class.
Utility class which specifies available nodes.
Node Class.
Plots data into ImPlot Windows.
PosVelAtt File Reader.
Position, Velocity, Attitude Initializer from GPS and IMU data.
Position, Velocity and Attitude Storage Class.
Position and Velocity Storage Class.
Position Storage Class.
Pressure to height converter.
Real-Time Kinematic (RTK) carrier-phase DGNSS.
File reader for RINEX Navigation messages.
File reader for RINEX Observation messages.
Logger for GnssObs to RINEX observation files.
RTK Node/Algorithm output.
Convert RTKLib pos files into PosVel.
File Reader for RTKLIB Pos files.
RTKLIB Pos Observation Class.
Single Point Positioning (SPP) / Code Phase Positioning.
Node receiving UDP packages from the Skydel GNSS simulator Instinct plugin.
SPP Algorithm output.
Wrapper for String Messages.
Terminator for open signals. Mainly used for test flows.
Limits measurement data from any source to a user-defined timewindow.
Data Logger for Uart packets.
Decrypts Uart packets.
File Reader for ubx files.
Convert UbloxObs into GnssObs.
Collects UBX-RXM-SFRBX messages and provides the Orbit information.
ublox Observation Class
Ublox Sensor Class.
File Reader for ULog files.
Converts VectorNavBinaryOutput.
Binary Outputs from VectorNav Sensors.
Data Logger for VectorNav observations.
File Reader for Vector Nav log files.
Vector Nav Sensors.
WiFiObs File Reader.
Data Logger for WiFi observations.
Espressif Observation Class.
WiFi Positioning Algorithm output.
WiFi Positioning.
static std::string type()
Returns the type of the data class.
Definition BaroHgt.hpp:28
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
Definition BaroHgt.hpp:45
static std::string type()
Returns the type of the data class.
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
static std::string type()
Returns the type of the data class.
static std::string type()
Returns the type of the data class.
Definition EmlidObs.hpp:30
static std::string type()
Returns the type of the data class.
static std::string type()
Returns the type of the data class.
Definition GnssObs.hpp:150
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
static std::string type()
Returns the type of the data class.
static std::string type()
Returns the type of the data class.
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
static std::string type()
Returns the type of the data class.
Definition ImuObs.hpp:33
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
Definition ImuObs.hpp:50
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
static std::string type()
Returns the type of the data class.
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
static std::string type()
Returns the type of the data class.
static std::string type()
Returns the type of the data class.
Definition KvhObs.hpp:39
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
Definition KvhObs.hpp:56
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
Definition NodeData.hpp:56
static bool _autostartWorker
Flag which prevents the worker to be autostarted if false.
Definition Node.hpp:451
virtual std::string type() const =0
String representation of the Class Type.
Pins in the GUI for information exchange.
Definition Pin.hpp:43
Node * parentNode
Reference to the parent node.
Definition Pin.hpp:307
std::vector< std::string > dataIdentifier
One or multiple Data Identifiers (Unique name which is used for data flows)
Definition Pin.hpp:305
Type type
Type of the Pin.
Definition Pin.hpp:301
static bool dataIdentifierHaveCommon(const std::vector< std::string > &a, const std::vector< std::string > &b)
Checks if the first list of data identifiers has a common entry with the second.
Definition Pin.cpp:59
Kind kind
Kind of the Pin (Input/Output)
Definition Pin.hpp:303
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
Definition PosVelAtt.hpp:48
static std::string type()
Returns the type of the data class.
Definition PosVelAtt.hpp:29
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
Definition PosVel.hpp:46
static std::string type()
Returns the type of the data class.
Definition PosVel.hpp:27
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
Definition Pos.hpp:53
static std::string type()
Returns the type of the data class.
Definition Pos.hpp:36
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
static std::string type()
Returns the type of the data class.
static std::string type()
Returns the type of the data class.
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
static std::string type()
Returns the type of the data class.
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
static std::string type()
Returns the type of the data class.
Definition StringObs.hpp:33
static std::string type()
Returns the type of the data class.
Definition UbloxObs.hpp:30
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
static std::string type()
Returns the type of the data class.
static std::string type()
Returns the type of the data class.
Definition WiFiObs.hpp:27
static std::vector< std::string > GetStaticDataDescriptors()
Returns a vector of data descriptors.
static std::string type()
Returns the type of the data class.
Sends a navigation solution via the MAVLink protocol.
bool NodeDataTypeAnyIsChildOf(const std::vector< std::string > &childTypes, const std::vector< std::string > &parentTypes)
Checks if any of the provided child types is a child of any of the provided parent types.
const std::map< std::string, std::vector< NodeInfo > > & RegisteredNodes()
Reference to List of all registered Nodes.
std::vector< std::string > GetParentNodeDataTypes(const std::string &type)
Get the Parent Node Data Types of the specified Node Data Type.
void RegisterNodeDataTypes()
Register all available NodeData types for the program.
bool TypeHasDynamicData(const std::string &type)
Wether the specified Node Data Type can have dynamic data.
void RegisterNodeTypes()
Register all available Node types for the program.
std::vector< std::string > GetStaticDataDescriptors(const std::vector< std::string > &dataIdentifier)
Returns a vector of data descriptors for the pin data identifiers.
std::shared_ptr< NodeData > CopyNodeData(const std::shared_ptr< const NodeData > &nodeData)
Creates a copy of the data.
Holds information for registered nodes.
std::function< Node *()> constructor
Constructor.
std::string type
Class Type of the node.
bool hasCompatiblePin(const Pin *pin) const
Checks if the node has a pin which can be linked.
std::vector< PinInfo > pinInfoList
List of port data types.
Kind of the Pin (Input/Output)
Definition Pin.hpp:165
@ Input
Input Pin.
Definition Pin.hpp:171
@ Output
Output Pin.
Definition Pin.hpp:170
@ Delegate
Reference to the Node object.
Definition Pin.hpp:59
@ Matrix
Matrix Object.
Definition Pin.hpp:58
@ Int
Integer Number.
Definition Pin.hpp:54
@ Float
Floating Point Number.
Definition Pin.hpp:55
@ String
std::string
Definition Pin.hpp:56
@ Flow
NodeData Trigger.
Definition Pin.hpp:52
@ Bool
Boolean.
Definition Pin.hpp:53
@ Object
Generic Object.
Definition Pin.hpp:57
Asynchronous data link - receiver node.
Asynchronous data link - sender node.