ifw-fnd 2.0.1
 
Loading...
Searching...
No Matches
iCommAdapter.hpp
Go to the documentation of this file.
1
39
40#pragma once
41
42#include <algorithm>
43#include <atomic>
44#include <chrono>
45#include <cstdint>
46#include <functional>
47#include <memory>
48#include <optional>
49#include <string>
50#include <utility>
51#include <variant>
52#include <vector>
53
54namespace ifw::fnd::defs {
55
56 // Contract version. Bumps on additive evolution are silent for callers
57 // (they keep compiling); breaking bumps require a coordinated
58 // migration across all implementers and consumers.
59 inline constexpr std::uint32_t kCommAdapterContractVersion = 1;
60
61 using Address = std::string;
62 using RequestId = std::string;
63
64 // =========================================================================
65 // PropertyMap — escape hatch for protocol-specific knobs.
66 //
67 // Contiguous storage avoids per-entry heap allocs / fragmentation for the
68 // typical <10-entry case, WHILE preserving map semantics (unique keys
69 // and a lookup API). This keeps the performance win without silently
70 // allowing duplicate keys the way a raw vector<pair> would.
71 // =========================================================================
73 public:
74 using value_type = std::pair<std::string, std::string>;
75 using storage = std::vector<value_type>;
76 using iterator = storage::iterator;
77 using const_iterator = storage::const_iterator;
78
79 PropertyMap() = default;
80 PropertyMap(std::initializer_list<value_type> init) {
81 for (const auto& kv : init) Set(kv.first, kv.second);
82 }
83
84 // Insert or overwrite. Guarantees key uniqueness.
85 void Set(std::string key, std::string val) {
86 auto it = Find(key);
87 if (it != m_items.end()) it->second = std::move(val);
88 else m_items.emplace_back(std::move(key), std::move(val));
89 }
90
91 const std::string* Get(std::string_view key) const {
92 auto it = Find(key);
93 return it == m_items.end() ? nullptr : &it->second;
94 }
95
96 std::string GetOr(std::string_view key,
97 std::string_view fallback) const {
98 auto* v = Get(key);
99 return v ? *v : std::string(fallback);
100 }
101
102 bool Contains(std::string_view key) const {
103 return Find(key) != m_items.end();
104 }
105
106 bool Erase(std::string_view key) {
107 auto it = Find(key);
108 if (it == m_items.end()) return false;
109 m_items.erase(it);
110 return true;
111 }
112
113 bool Empty() const { return m_items.empty(); }
114 std::size_t Size() const { return m_items.size(); }
115 void Reserve(std::size_t n) { m_items.reserve(n); }
116
117 // Range-for support — lowercase to match the std::begin/std::end
118 // contract that range-for desugars to.
119 iterator begin() { return m_items.begin(); }
120 iterator end() { return m_items.end(); }
121 const_iterator begin() const { return m_items.begin(); }
122 const_iterator end() const { return m_items.end(); }
123
124 private:
125 const_iterator Find(std::string_view key) const {
126 return std::find_if(m_items.begin(), m_items.end(),
127 [&](const value_type& kv) {
128 return kv.first == key;
129 });
130 }
131 iterator Find(std::string_view key) {
132 return std::find_if(m_items.begin(), m_items.end(),
133 [&](const value_type& kv) {
134 return kv.first == key;
135 });
136 }
137 storage m_items;
138 };
139
140 // =========================================================================
141 // RegistrationToken — RAII handle for one-off observer registration.
142 //
143 // Used for observers that don't have a natural identity (the
144 // connection-state handler is the canonical case). NOT used for
145 // subscriptions — those are identified by node Address; see Subscribe().
146 // Move-only; Reset() detaches early.
147 // =========================================================================
148 class [[nodiscard]] RegistrationToken {
149 public:
150 using UnregisterCallback = std::function<void()>;
151
152 RegistrationToken() = default;
154 : m_on_destruct(std::move(on_destruct)) {}
155 ~RegistrationToken() { if (m_on_destruct) m_on_destruct(); }
156
160 RegistrationToken& operator=(RegistrationToken&&) noexcept = default;
161
162 void Reset() { m_on_destruct = nullptr; }
163
164 private:
165 UnregisterCallback m_on_destruct;
166 };
167
168 // =========================================================================
169 // Cooperative cancellation — the seam off which async + abort hangs.
170 //
171 // Sync adapters that cannot interrupt a blocking call MAY ignore it but
172 // must say so. Carrying this in RequestOptions from v1 means a later
173 // ReadAsync() addition does not require changing the sync API.
174 // =========================================================================
176 public:
177 CancellationToken() = default;
178 explicit CancellationToken(std::shared_ptr<std::atomic_bool> flag)
179 : m_flag(std::move(flag)) {}
180 bool Cancelled() const {
181 return m_flag && m_flag->load(std::memory_order_acquire);
182 }
183 private:
184 std::shared_ptr<std::atomic_bool> m_flag;
185 };
186
188 public:
190 : m_flag(std::make_shared<std::atomic_bool>(false)) {}
192 return CancellationToken(m_flag);
193 }
194 void Cancel() { m_flag->store(true, std::memory_order_release); }
195 bool Cancelled() const {
196 return m_flag->load(std::memory_order_acquire);
197 }
198 private:
199 std::shared_ptr<std::atomic_bool> m_flag;
200 };
201
202 // =========================================================================
203 // Status — protocol-agnostic outcome classification.
204 // =========================================================================
221
222 // =========================================================================
223 // Value — universal payload.
224 // * monostate = empty / no-value (write-only nodes, failed reads,
225 // defaults).
226 // * vector<uint8_t> = raw byte blob / register block.
227 // * vector<bool> = boolean ARRAY (distinct from a blob). Kept
228 // despite the proxy-reference quirk so a Boolean[] from e.g. OPC UA
229 // has an honest type rather than being conflated with a byte blob.
230 // Treat with the usual vector<bool> care (no element addresses);
231 // convert at the adapter edge.
232 //
233 // The order of alternatives is part of the ABI when interfacing with
234 // the implementation layer (variant converters use std::variant::index()
235 // numerically). APPEND-ONLY — never reorder existing entries.
236 // =========================================================================
237 using Value = std::variant<
238 std::monostate,
239 bool,
240 std::int32_t,
241 std::uint32_t,
242 std::int64_t,
243 std::uint64_t,
244 float,
245 double,
246 std::string,
247 std::vector<std::uint8_t>,
248 std::vector<bool>,
249 std::vector<std::int32_t>,
250 std::vector<std::uint32_t>,
251 std::vector<std::int64_t>,
252 std::vector<std::uint64_t>,
253 std::vector<float>,
254 std::vector<double>,
255 std::vector<std::string>,
257 std::int16_t,
258 std::uint16_t,
259 std::int8_t,
260 std::uint8_t,
261 std::vector<std::int16_t>,
262 std::vector<std::uint16_t>,
263 std::vector<std::int8_t>>;
264
265 // Base for all per-call results. Transport/batch-level status. Per-item
266 // structs carry their own status, independent of this, so a batch can
267 // succeed overall with some items failed.
268 struct Result {
270 std::string message;
271 explicit operator bool() const { return status == Status::Ok; }
272 };
273
275 std::chrono::milliseconds timeout{5000};
276 std::optional<RequestId> request_id;
277 std::optional<CancellationToken> cancellation;
278 PropertyMap properties; // protocol-specific request knobs
279 };
280
281 struct DataValue {
284 std::string message;
285 // Single universal timestamp; protocols with extra clocks (e.g.
286 // OPC UA server_timestamp) record them in `properties` under
287 // documented keys.
288 std::optional<std::chrono::system_clock::time_point> timestamp;
290 };
291
293 std::string endpoint;
294 // auth / security / tuning — any scheme fits here.
296 };
297
305
314
317 std::optional<ConnectionInfo> info;
318 };
319
320 // Fired on the adapter's internal thread when the link transitions.
321 // RESUBSCRIPTION CONTRACT: unless an adapter documents otherwise,
322 // subscriptions DO NOT survive a Faulted transition; on recovery the
323 // caller must resubscribe. Handler must be non-blocking and must not
324 // call Configure / Connect / Disconnect.
332 std::function<void(const ConnectionStateChange&)>;
333
334 // =========================================================================
335 // Discover — find connectable endpoints (pre-connection). All
336 // protocol-specific request knobs go through options.properties; there
337 // is no second bag.
338 // =========================================================================
340 std::optional<std::string> query;
342 };
344 std::string endpoint;
345 std::string protocol;
346 std::string name;
348 };
350 std::vector<DiscoveredEndpoint> endpoints;
351 };
352
353 // =========================================================================
354 // Browse — inspect the address space of a CONNECTED endpoint.
355 //
356 // cursor / has_more page large address spaces: pass the returned
357 // cursor back to continue.
358 //
359 // `include_values = true` instructs the adapter to also populate
360 // NodeDescriptor::value for each leaf node, where supported. This
361 // covers the "scan everything and tell me what's there" use case
362 // (e.g. GenICam feature enumeration with current values) in a single
363 // round trip; with false (the default) Browse is metadata-only and
364 // cheap.
365 // =========================================================================
367 std::optional<Address> root;
368 bool recursive = false;
369 bool include_values = false;
370 std::optional<std::string> cursor;
372 };
375 std::string name;
376 std::optional<Address> parent;
377 bool has_children = false;
378 // Present iff BrowseRequest::include_values was true AND the node
379 // carries a readable value. Absent for category/container nodes
380 // and write-only leaves.
381 std::optional<DataValue> value;
382 PropertyMap properties; // "access", "type", "display_name", ...
383 };
385 std::vector<NodeDescriptor> nodes;
386 std::optional<std::string> cursor;
387 bool has_more = false;
388 };
389
390 // =========================================================================
391 // Read
392 // =========================================================================
397 struct ReadRequest {
398 std::vector<ReadItem> items;
400 };
401 struct ReadItemResult : Result { // independent of batch status
403 std::optional<DataValue> data;
404 };
406 std::vector<ReadItemResult> items;
407 };
408
409 // =========================================================================
410 // Write — batch items are INDEPENDENT and NON-ATOMIC unless documented;
411 // inspect per-item results.
412 // =========================================================================
419 std::vector<WriteItem> items;
421 };
422 struct WriteItemResult : Result { // independent of batch status
424 };
426 std::vector<WriteItemResult> items;
427 };
428
429 // =========================================================================
430 // Call (method / command / RPC) — optional capability.
431 //
432 // "Call" is the neutral verb across protocols: OPC UA calls Methods,
433 // Modbus calls function codes, REST calls endpoints, DDS issues
434 // request/reply. "Method" was considered but is OPC UA-specific
435 // vocabulary; this contract is protocol-agnostic.
436 // =========================================================================
438 std::string name; // may be empty for positional protocols
440 };
441 struct CallRequest {
443 std::vector<CallArgument> input_arguments;
445 };
447 std::string name;
449 };
451 std::vector<CallArgumentResult> output_arguments;
452 };
453
454 // =========================================================================
455 // Subscribe / Unsubscribe.
456 //
457 // Subscriptions are identified by node Address. The adapter manages
458 // server-side subscription containers internally; the caller never sees
459 // them.
460 //
461 // HANDLER BINDING (per-node):
462 // Each node carries its OWN handler binding — the one supplied in the
463 // Subscribe() call that subscribed it. Two Subscribe() calls with
464 // disjoint node sets therefore install two independent handlers, and
465 // notifications for each node are routed to the handler that asked
466 // for that node. This lets multiple consumers share one adapter
467 // without stepping on each other.
468 //
469 // Re-subscribing an already-subscribed node REPLACES its handler and
470 // options. Other nodes' bindings are left intact. Callers that need
471 // FAN-OUT (the same node delivered to several consumers) build a
472 // small dispatcher on top — the adapter holds exactly one handler
473 // per (adapter, node).
474 //
475 // SUBSCRIPTION HANDLER THREADING CONTRACT (binding):
476 // * Invoked on the adapter's internal delivery thread(s), not the
477 // caller's.
478 // * Must be non-blocking and must not throw.
479 // * Unsubscribe(...) from within the handler is SAFE; honored after
480 // the current invocation returns; no re-entry afterwards.
481 // * Connect / Disconnect / Configure from within the handler is NOT
482 // safe.
483 // * After Unsubscribe / UnsubscribeAll / Disconnect returns, no
484 // further invocations for the affected nodes occur and any
485 // in-flight invocation has completed (these calls block until
486 // drained).
487 // * Backpressure default: drop oldest; adapters may offer alternatives
488 // via SubscribeOpts::properties.
489 // =========================================================================
491 // Backpressure: protocol-agnostic, every adapter can honor these.
492 std::uint32_t queue_size{1};
493 bool discard_oldest{true};
494
495 // Protocol-specific tuning (e.g. OPC UA sampling_interval_ms,
496 // publishing_interval_ms; Modbus poll_interval_ms; ...). Documented
497 // keys per adapter.
499 };
500
505 using SubscriptionHandler = std::function<void(const Notification&)>;
506
511 std::vector<SubscribeItemResult> items;
512 };
513
518 std::vector<UnsubscribeItemResult> items;
519 };
520
521 // =========================================================================
522 // Capabilities — runtime feature negotiation. Lets backends honestly say
523 // "I don't do Browse" rather than every adapter being forced to stub
524 // every operation.
525 // =========================================================================
527 bool discover = false;
528 bool browse = false;
529 bool read = false;
530 bool write = false;
531 bool call = false;
532 bool subscribe = false;
533 bool batch = false;
534 bool cancellation = false;
537 };
538
539 // =========================================================================
540 // ICommAdapter — the interface.
541 //
542 // LIFECYCLE CONTRACT:
543 // * Configure only while Disconnected (else InvalidState).
544 // * Connect requires a prior successful Configure (else InvalidState).
545 // * Connect / Disconnect are idempotent w.r.t. target state and block
546 // until it is reached or failure is determined.
547 // * Data ops require Connected (else NotConnected).
548 // * Unimplemented optional ops return Status::Unsupported; consult
549 // GetCapabilities() to avoid relying on them.
550 //
551 // SYNC-ONLY NOTE:
552 // This v1 surface is synchronous. Future async additions (ReadAsync,
553 // WriteAsync, ...) are pure additions that coexist with the sync
554 // methods. The CancellationToken field in RequestOptions exists from
555 // day one so sync calls are interruptible AND so adding async later
556 // does not require a contract break.
557 // =========================================================================
559 public:
560 virtual ~ICommAdapter() = default;
561
562 virtual std::uint32_t GetContractVersion() const {
564 }
565
566 [[nodiscard]] virtual Capabilities GetCapabilities() const = 0;
567
568 // ----- Lifecycle -----
569 [[nodiscard]] virtual Result
570 Configure(const ConnectionOptions& options) = 0;
571 [[nodiscard]] virtual Result Connect() = 0;
572 [[nodiscard]] virtual Result Disconnect() = 0;
573 [[nodiscard]] virtual ConnectionStatus GetConnectionStatus() const = 0;
574 virtual bool IsConnected() const = 0;
575
576 // RAII registration: unregistration is guaranteed when the returned
577 // token leaves scope (or via Reset()). See ConnectionStateHandler
578 // contract.
579 [[nodiscard]] virtual RegistrationToken
581
582 // ----- Synchronous data plane -----
583 [[nodiscard]] virtual DiscoverResult
584 Discover(const DiscoverRequest& request) = 0;
585 [[nodiscard]] virtual BrowseResult
586 Browse(const BrowseRequest& request) = 0;
587 [[nodiscard]] virtual ReadResult
588 Read(const ReadRequest& request) = 0;
589 [[nodiscard]] virtual WriteResult
590 Write(const WriteRequest& request) = 0;
591 [[nodiscard]] virtual CallResult
592 Call(const CallRequest& request) = 0;
593
594 // ----- Pub / Sub (per-node identity, no SubscriptionId in public API) -----
595
596 // Subscribe to data changes on one or more nodes. The supplied
597 // handler is bound to each of the `nodes` for the duration of
598 // their subscription (per-node binding — see the section comment
599 // above). Re-subscribing an already-subscribed node replaces its
600 // handler and options; other nodes' bindings are untouched.
601 //
602 // Per-node statuses appear in the returned `items` vector; the
603 // overall Result reflects transport-level errors only.
604 [[nodiscard]] virtual SubscribeResult
605 Subscribe(const std::vector<Address>& nodes,
606 SubscriptionHandler handler,
607 const SubscribeOpts& opts = {}) = 0;
608
609 // Unsubscribe one or more nodes. Nodes that were not subscribed are
610 // silently ignored (idempotent). Per-node statuses returned.
611 [[nodiscard]] virtual UnsubscribeResult
612 Unsubscribe(const std::vector<Address>& nodes) = 0;
613
614 // Convenience: drop all subscriptions in one call. Equivalent to
615 // calling Unsubscribe() with the full set of currently-subscribed
616 // nodes.
617 [[nodiscard]] virtual Result UnsubscribeAll() = 0;
618 };
619
620} // namespace ifw::fnd::defs
void Cancel()
Definition iCommAdapter.hpp:194
CancellationToken Token() const
Definition iCommAdapter.hpp:191
CancellationSource()
Definition iCommAdapter.hpp:189
bool Cancelled() const
Definition iCommAdapter.hpp:195
Definition iCommAdapter.hpp:175
CancellationToken(std::shared_ptr< std::atomic_bool > flag)
Definition iCommAdapter.hpp:178
bool Cancelled() const
Definition iCommAdapter.hpp:180
Definition iCommAdapter.hpp:558
virtual Result UnsubscribeAll()=0
virtual Result Disconnect()=0
virtual UnsubscribeResult Unsubscribe(const std::vector< Address > &nodes)=0
virtual DiscoverResult Discover(const DiscoverRequest &request)=0
virtual Result Connect()=0
virtual bool IsConnected() const =0
virtual CallResult Call(const CallRequest &request)=0
virtual ReadResult Read(const ReadRequest &request)=0
virtual RegistrationToken SetConnectionStateHandler(ConnectionStateHandler handler)=0
virtual std::uint32_t GetContractVersion() const
Definition iCommAdapter.hpp:562
virtual Capabilities GetCapabilities() const =0
virtual SubscribeResult Subscribe(const std::vector< Address > &nodes, SubscriptionHandler handler, const SubscribeOpts &opts={})=0
virtual WriteResult Write(const WriteRequest &request)=0
virtual BrowseResult Browse(const BrowseRequest &request)=0
virtual Result Configure(const ConnectionOptions &options)=0
virtual ~ICommAdapter()=default
virtual ConnectionStatus GetConnectionStatus() const =0
Definition iCommAdapter.hpp:72
std::size_t Size() const
Definition iCommAdapter.hpp:114
std::pair< std::string, std::string > value_type
Definition iCommAdapter.hpp:74
iterator end()
Definition iCommAdapter.hpp:120
PropertyMap(std::initializer_list< value_type > init)
Definition iCommAdapter.hpp:80
storage::const_iterator const_iterator
Definition iCommAdapter.hpp:77
std::string GetOr(std::string_view key, std::string_view fallback) const
Definition iCommAdapter.hpp:96
iterator begin()
Definition iCommAdapter.hpp:119
void Set(std::string key, std::string val)
Definition iCommAdapter.hpp:85
std::vector< value_type > storage
Definition iCommAdapter.hpp:75
bool Contains(std::string_view key) const
Definition iCommAdapter.hpp:102
const_iterator end() const
Definition iCommAdapter.hpp:122
bool Empty() const
Definition iCommAdapter.hpp:113
bool Erase(std::string_view key)
Definition iCommAdapter.hpp:106
void Reserve(std::size_t n)
Definition iCommAdapter.hpp:115
storage::iterator iterator
Definition iCommAdapter.hpp:76
const_iterator begin() const
Definition iCommAdapter.hpp:121
const std::string * Get(std::string_view key) const
Definition iCommAdapter.hpp:91
Definition iCommAdapter.hpp:148
~RegistrationToken()
Definition iCommAdapter.hpp:155
std::function< void()> UnregisterCallback
Definition iCommAdapter.hpp:150
RegistrationToken & operator=(const RegistrationToken &)=delete
RegistrationToken(const RegistrationToken &)=delete
RegistrationToken(RegistrationToken &&) noexcept=default
void Reset()
Definition iCommAdapter.hpp:162
RegistrationToken(UnregisterCallback on_destruct)
Definition iCommAdapter.hpp:153
Definition iCommAdapter.hpp:54
std::function< void(const ConnectionStateChange &)> ConnectionStateHandler
Definition iCommAdapter.hpp:331
constexpr std::uint32_t kCommAdapterContractVersion
Definition iCommAdapter.hpp:59
std::string RequestId
Definition iCommAdapter.hpp:62
ConnectionState
Definition iCommAdapter.hpp:298
@ Disconnecting
Definition iCommAdapter.hpp:302
@ Faulted
Definition iCommAdapter.hpp:303
@ Connected
Definition iCommAdapter.hpp:301
@ Connecting
Definition iCommAdapter.hpp:300
@ Disconnected
Definition iCommAdapter.hpp:299
std::variant< std::monostate, bool, std::int32_t, std::uint32_t, std::int64_t, std::uint64_t, float, double, std::string, std::vector< std::uint8_t >, std::vector< bool >, std::vector< std::int32_t >, std::vector< std::uint32_t >, std::vector< std::int64_t >, std::vector< std::uint64_t >, std::vector< float >, std::vector< double >, std::vector< std::string >, PropertyMap, std::int16_t, std::uint16_t, std::int8_t, std::uint8_t, std::vector< std::int16_t >, std::vector< std::uint16_t >, std::vector< std::int8_t > > Value
Definition iCommAdapter.hpp:237
std::string Address
Definition iCommAdapter.hpp:61
Status
Definition iCommAdapter.hpp:205
@ AlreadyConnected
Definition iCommAdapter.hpp:209
@ TypeMismatch
Definition iCommAdapter.hpp:214
@ NotFound
Definition iCommAdapter.hpp:212
@ NotConnected
Definition iCommAdapter.hpp:208
@ InternalError
Definition iCommAdapter.hpp:219
@ BadRequest
Definition iCommAdapter.hpp:211
@ Cancelled
Definition iCommAdapter.hpp:216
@ Ok
Definition iCommAdapter.hpp:206
@ TransportError
Definition iCommAdapter.hpp:218
@ Unsupported
Definition iCommAdapter.hpp:215
@ Timeout
Definition iCommAdapter.hpp:207
@ AccessDenied
Definition iCommAdapter.hpp:213
@ RemoteError
Definition iCommAdapter.hpp:217
@ InvalidState
Definition iCommAdapter.hpp:210
std::function< void(const Notification &)> SubscriptionHandler
Definition iCommAdapter.hpp:505
Definition iCommAdapter.hpp:366
std::optional< std::string > cursor
Definition iCommAdapter.hpp:370
RequestOptions options
Definition iCommAdapter.hpp:371
bool include_values
Definition iCommAdapter.hpp:369
bool recursive
Definition iCommAdapter.hpp:368
std::optional< Address > root
Definition iCommAdapter.hpp:367
Definition iCommAdapter.hpp:384
std::vector< NodeDescriptor > nodes
Definition iCommAdapter.hpp:385
bool has_more
Definition iCommAdapter.hpp:387
std::optional< std::string > cursor
Definition iCommAdapter.hpp:386
Definition iCommAdapter.hpp:446
std::string name
Definition iCommAdapter.hpp:447
DataValue data
Definition iCommAdapter.hpp:448
Definition iCommAdapter.hpp:437
Value value
Definition iCommAdapter.hpp:439
std::string name
Definition iCommAdapter.hpp:438
Definition iCommAdapter.hpp:441
std::vector< CallArgument > input_arguments
Definition iCommAdapter.hpp:443
RequestOptions options
Definition iCommAdapter.hpp:444
Address method
Definition iCommAdapter.hpp:442
Definition iCommAdapter.hpp:450
std::vector< CallArgumentResult > output_arguments
Definition iCommAdapter.hpp:451
Definition iCommAdapter.hpp:526
bool batch
Definition iCommAdapter.hpp:533
bool write
Definition iCommAdapter.hpp:530
bool browse
Definition iCommAdapter.hpp:528
bool cancellation
Definition iCommAdapter.hpp:534
PropertyMap properties
Definition iCommAdapter.hpp:536
bool discover
Definition iCommAdapter.hpp:527
bool call
Definition iCommAdapter.hpp:531
bool connection_state_events
Definition iCommAdapter.hpp:535
bool subscribe
Definition iCommAdapter.hpp:532
bool read
Definition iCommAdapter.hpp:529
Definition iCommAdapter.hpp:306
PropertyMap properties
Definition iCommAdapter.hpp:312
std::string protocol
Definition iCommAdapter.hpp:308
std::string adapter_name
Definition iCommAdapter.hpp:309
std::uint32_t contract_version
Definition iCommAdapter.hpp:311
std::string adapter_version
Definition iCommAdapter.hpp:310
std::string endpoint
Definition iCommAdapter.hpp:307
Definition iCommAdapter.hpp:292
std::string endpoint
Definition iCommAdapter.hpp:293
PropertyMap properties
Definition iCommAdapter.hpp:295
Definition iCommAdapter.hpp:325
ConnectionState current
Definition iCommAdapter.hpp:327
Status reason
Definition iCommAdapter.hpp:328
ConnectionState previous
Definition iCommAdapter.hpp:326
std::string message
Definition iCommAdapter.hpp:329
Definition iCommAdapter.hpp:315
ConnectionState state
Definition iCommAdapter.hpp:316
std::optional< ConnectionInfo > info
Definition iCommAdapter.hpp:317
Definition iCommAdapter.hpp:281
std::optional< std::chrono::system_clock::time_point > timestamp
Definition iCommAdapter.hpp:288
PropertyMap properties
Definition iCommAdapter.hpp:289
Value value
Definition iCommAdapter.hpp:282
std::string message
Definition iCommAdapter.hpp:284
Status status
Definition iCommAdapter.hpp:283
Definition iCommAdapter.hpp:339
std::optional< std::string > query
Definition iCommAdapter.hpp:340
RequestOptions options
Definition iCommAdapter.hpp:341
Definition iCommAdapter.hpp:349
std::vector< DiscoveredEndpoint > endpoints
Definition iCommAdapter.hpp:350
Definition iCommAdapter.hpp:343
PropertyMap properties
Definition iCommAdapter.hpp:347
std::string endpoint
Definition iCommAdapter.hpp:344
std::string protocol
Definition iCommAdapter.hpp:345
std::string name
Definition iCommAdapter.hpp:346
Definition iCommAdapter.hpp:373
std::optional< Address > parent
Definition iCommAdapter.hpp:376
std::optional< DataValue > value
Definition iCommAdapter.hpp:381
PropertyMap properties
Definition iCommAdapter.hpp:382
Address address
Definition iCommAdapter.hpp:374
std::string name
Definition iCommAdapter.hpp:375
bool has_children
Definition iCommAdapter.hpp:377
Definition iCommAdapter.hpp:501
Address address
Definition iCommAdapter.hpp:502
DataValue data
Definition iCommAdapter.hpp:503
Definition iCommAdapter.hpp:401
std::optional< DataValue > data
Definition iCommAdapter.hpp:403
Address address
Definition iCommAdapter.hpp:402
Definition iCommAdapter.hpp:393
PropertyMap properties
Definition iCommAdapter.hpp:395
Address address
Definition iCommAdapter.hpp:394
Definition iCommAdapter.hpp:397
std::vector< ReadItem > items
Definition iCommAdapter.hpp:398
RequestOptions options
Definition iCommAdapter.hpp:399
Definition iCommAdapter.hpp:405
std::vector< ReadItemResult > items
Definition iCommAdapter.hpp:406
Definition iCommAdapter.hpp:274
std::chrono::milliseconds timeout
Definition iCommAdapter.hpp:275
std::optional< RequestId > request_id
Definition iCommAdapter.hpp:276
PropertyMap properties
Definition iCommAdapter.hpp:278
std::optional< CancellationToken > cancellation
Definition iCommAdapter.hpp:277
Definition iCommAdapter.hpp:268
std::string message
Definition iCommAdapter.hpp:270
Status status
Definition iCommAdapter.hpp:269
Definition iCommAdapter.hpp:507
Address address
Definition iCommAdapter.hpp:508
Definition iCommAdapter.hpp:490
bool discard_oldest
Definition iCommAdapter.hpp:493
PropertyMap properties
Definition iCommAdapter.hpp:498
std::uint32_t queue_size
Definition iCommAdapter.hpp:492
Definition iCommAdapter.hpp:510
std::vector< SubscribeItemResult > items
Definition iCommAdapter.hpp:511
Definition iCommAdapter.hpp:514
Address address
Definition iCommAdapter.hpp:515
Definition iCommAdapter.hpp:517
std::vector< UnsubscribeItemResult > items
Definition iCommAdapter.hpp:518
Definition iCommAdapter.hpp:422
Address address
Definition iCommAdapter.hpp:423
Definition iCommAdapter.hpp:413
Address address
Definition iCommAdapter.hpp:414
Value value
Definition iCommAdapter.hpp:415
PropertyMap properties
Definition iCommAdapter.hpp:416
Definition iCommAdapter.hpp:418
std::vector< WriteItem > items
Definition iCommAdapter.hpp:419
RequestOptions options
Definition iCommAdapter.hpp:420
Definition iCommAdapter.hpp:425
std::vector< WriteItemResult > items
Definition iCommAdapter.hpp:426