PROFINET IO Controller Stack 1.0.0
Modern C++ implementation of a PROFINET IO Controller stack
Loading...
Searching...
No Matches
blocks.h
Go to the documentation of this file.
1
13
14#pragma once
15
16#include <array>
17#include <cstdint>
18#include <optional>
19#include <string>
20#include <vector>
21
22#include "profinet/protocol.h"
23
25{
26
27// =============================================================================
28// Data Classes
29// =============================================================================
30
33{
36
38 std::uint16_t blockLength = 0;
39
41 std::uint8_t versionHigh = 0;
42
44 std::uint8_t versionLow = 0;
45
48 [[nodiscard]] std::uint16_t BodyLength() const
49 {
50 return blockLength >= 2 ? static_cast<std::uint16_t>(blockLength - 2) : 0;
51 }
52
55 [[nodiscard]] std::string TypeName() const;
56};
57
60{
62 std::uint16_t slot = 0;
63
65 std::uint16_t subslot = 0;
66
68 std::uint32_t api = 0;
69
71 std::uint32_t moduleIdent = 0;
72
74 std::uint32_t submoduleIdent = 0;
75
77 std::vector<std::string> blocks;
78
81 [[nodiscard]] std::string ToString() const;
82
88 bool operator==(const SlotInfo&) const = default;
89};
90
93{
95 std::string portId;
96
98 std::string chassisId;
99
101 std::array<std::uint8_t, macAddressLength> macAddress{};
102
105 [[nodiscard]] std::string MacStr() const
106 {
107 return Mac2String(macAddress);
108 }
114 bool operator==(const PeerInfo&) const = default;
115};
116
119{
121 std::uint16_t slot = 0;
122
124 std::uint16_t subslot = 0;
125
127 std::string portId;
128
130 std::uint16_t mauType = 0;
131
133 std::uint8_t linkStatePort = 0;
134
136 std::uint8_t linkStateLink = 0;
137
139 std::uint32_t mediaType = 0;
140
142 std::vector<PeerInfo> peers;
143
145 std::uint32_t domainBoundary = 0;
146
148 std::uint32_t multicastBoundary = 0;
149
152 [[nodiscard]] std::string MauTypeName() const;
153
156 [[nodiscard]] std::string LinkState() const;
157
163 bool operator==(const PortInfo&) const = default;
164};
165
168{
170 std::string chassisId;
171
173 std::array<std::uint8_t, macAddressLength> macAddress{};
174
176 std::array<std::uint8_t, 4> ipAddress{};
177
179 std::array<std::uint8_t, 4> subnetMask{};
180
182 std::array<std::uint8_t, 4> gateway{};
183
186 [[nodiscard]] std::string MacStr() const
187 {
188 return Mac2String(macAddress);
189 }
190
193 [[nodiscard]] std::string IpStr() const
194 {
195 return String2Ip(ipAddress.data(), 4);
196 }
197
200 [[nodiscard]] std::string SubnetStr() const
201 {
202 return String2Ip(subnetMask.data(), 4);
203 }
204
207 [[nodiscard]] std::string GatewayStr() const
208 {
209 return String2Ip(gateway.data(), 4);
210 }
216 bool operator==(const InterfaceInfo&) const = default;
217};
218
221{
223 std::vector<SlotInfo> slots;
224
226 std::optional<InterfaceInfo> interface;
227
229 std::vector<PortInfo> ports;
230
232 std::vector<std::tuple<std::uint32_t, std::uint16_t, std::uint16_t, Bytes>> rawBlocks;
233
239 bool operator==(const PDRealData&) const = default;
240};
241
244{
246 std::vector<SlotInfo> slots;
247
249 std::pair<std::uint8_t, std::uint8_t> version{1, 0};
250};
251
252// =============================================================================
253// Parsing Functions
254// =============================================================================
255
261std::pair<BlockHeader, std::size_t> ParseBlockHeader(const Bytes& data, std::size_t offset = 0);
262
266inline std::size_t Align4(std::size_t offset)
267{
268 return (offset + 3) & ~static_cast<std::size_t>(3);
269}
270
277std::tuple<std::uint32_t, std::uint16_t, std::uint16_t, std::size_t> ParseMultipleBlockHeader(
278 const Bytes& data, std::size_t offset = 0);
279
287InterfaceInfo ParsePdInterfaceDataReal(const Bytes& data, std::size_t offset = 0,
288 std::size_t blockHeaderSize = blockHeaderLenght);
289
298PortInfo ParsePdPortDataReal(const Bytes& data, std::size_t offset = 0, std::uint16_t slot = 0,
299 std::uint16_t subslot = 0);
300
307PDRealData ParsePdRealData(const Bytes& data);
308
315
318{
320 std::uint16_t counterStatus = 0;
321
323 std::uint32_t inOctets = 0;
324
326 std::uint32_t outOctets = 0;
327
329 std::uint32_t inDiscards = 0;
330
332 std::uint32_t outDiscards = 0;
333
335 std::uint32_t inErrors = 0;
336
338 std::uint32_t outErrors = 0;
339};
340
345std::optional<PortStatistics> ParsePortStatistics(const Bytes& data, std::size_t offset = 0);
346
347// =============================================================================
348// ModuleDiffBlock (0x8104) - Response showing module/submodule differences
349// =============================================================================
350
353{
355 std::uint16_t subslotNumber = 0;
356
358 std::uint32_t submoduleIdentNumber = 0;
359
361 std::uint16_t submoduleState = 0;
362
365 [[nodiscard]] std::string StateName() const;
366
369 [[nodiscard]] bool IsOk() const;
370
376 bool operator==(const ModuleDiffSubmodule&) const = default;
377};
378
381{
383 std::uint32_t api = 0;
384
386 std::uint16_t slotNumber = 0;
387
389 std::uint32_t moduleIdentNumber = 0;
390
392 std::uint16_t moduleState = 0;
393
395 std::vector<ModuleDiffSubmodule> submodules;
396
399 [[nodiscard]] std::string StateName() const;
400
403 [[nodiscard]] bool IsProper() const;
404
410 bool operator==(const ModuleDiffModule&) const = default;
411};
412
415{
417 std::vector<ModuleDiffModule> modules;
418
421 [[nodiscard]] bool AllOk() const;
422
426 [[nodiscard]] std::vector<std::tuple<std::uint16_t, std::uint16_t, std::string>> GetMismatches() const;
427
433 bool operator==(const ModuleDiffBlock&) const = default;
434};
435
444
445// =============================================================================
446// IODWriteMultiple (Index 0xE040)
447// =============================================================================
448
451{
453 std::uint16_t seqNum = 0;
454
456 std::uint32_t api = 0;
457
459 std::uint16_t slot = 0;
460
462 std::uint16_t subslot = 0;
463
465 std::uint16_t index = 0;
466
468 std::uint32_t status = 0;
469
471 std::uint16_t additionalValue1 = 0;
472
474 std::uint16_t additionalValue2 = 0;
475
478 [[nodiscard]] bool Success() const
479 {
480 return status == 0;
481 }
482};
483
488{
489 public:
491 static constexpr std::uint16_t writeMultipleIndex = 0xE040;
492
494 static constexpr std::uint16_t writeMultipleBlockType = 0x0008;
495
499 explicit IODWriteMultipleBuilder(std::array<std::uint8_t, uuidLenght> arUuid, std::uint16_t seqNum = 0)
501 {
502 }
503
511 IODWriteMultipleBuilder& AddWrite(std::uint16_t slot, std::uint16_t subslot, std::uint16_t index,
512 Bytes data, std::uint32_t api = 0);
513
516 [[nodiscard]] Bytes Build() const;
517
518 private:
527 [[nodiscard]] Bytes BuildWriteBlock(std::uint16_t seq, std::uint32_t api, std::uint16_t slot, std::uint16_t subslot,
528 std::uint16_t index, const Bytes& data) const;
529
533 [[nodiscard]] Bytes BuildHeader(std::size_t blocksLen) const;
534
536 std::array<std::uint8_t, uuidLenght> arUuid{};
537
539 std::uint16_t seqNum = 0;
540
542 struct Write
543 {
545 std::uint32_t api;
547 std::uint16_t slot;
549 std::uint16_t subslot;
551 std::uint16_t index;
554 };
555
557 std::vector<Write> writes;
558};
559
563std::vector<WriteMultipleResult> ParseWriteMultipleResponse(const Bytes& data);
564
565// =============================================================================
566// ExpectedSubmodule Structures (0x0104)
567// =============================================================================
568
569enum class ModuleType : std::uint16_t
570{
571 None = 0,
572 InputOnly = 1,
573 OutputOnly = 2,
575};
576
579{
581 std::uint16_t dataDescription = 1;
582
584 std::uint16_t submoduleDataLength = 0;
585
587 std::uint8_t lengthIocs = 1;
588
590 std::uint8_t lengthIops = 1;
591
594 [[nodiscard]] Bytes ToBytes() const;
595};
596
599{
601 std::uint16_t subslotNumber = 0;
602
604 std::uint32_t submoduleIdentNumber = 0;
605
607 std::uint16_t submoduleProperties = 0;
608
610 std::vector<ExpectedSubmoduleDataDescription> dataDescriptions;
611
614 [[nodiscard]] std::uint16_t SubmoduleType() const
615 {
616 return submoduleProperties & 0x03;
617 }
618
621 [[nodiscard]] Bytes ToBytes() const;
622};
625{
627 std::uint32_t api = 0;
628
630 std::uint16_t slotNumber = 0;
631
633 std::uint32_t moduleIdentNumber = 0;
634
636 std::uint16_t moduleProperties = 0;
637
639 std::vector<ExpectedSubmodule> submodules;
640
643 [[nodiscard]] Bytes ToBytes() const;
644};
645
648{
650 std::uint32_t api = 0;
651
653 std::vector<ExpectedSubmoduleSlot> slots;
654
657 [[nodiscard]] Bytes ToBytes() const;
658};
659
675{
676 public:
678 static constexpr std::uint16_t expectedSubmoduleBlockReqBlockType = 0x0104;
679
690 ExpectedSubmoduleBlockReq& AddSubmodule(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot,
691 std::uint32_t moduleIdent, std::uint32_t submoduleIdent,
692 std::uint16_t submoduleType = 0, std::uint16_t inputLength = 0,
693 std::uint16_t outputLength = 0);
694
697 [[nodiscard]] Bytes ToBytes() const;
698
699 private:
701 std::vector<ExpectedSubmoduleAPI> apis;
702};
703
704} // namespace profinet::blocks
ExpectedSubmoduleBlockReq (0x0104) builder.
Definition blocks.h:675
Bytes ToBytes() const
Serialize the complete block to raw bytes.
Definition blocks.cpp:934
ExpectedSubmoduleBlockReq & AddSubmodule(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint32_t moduleIdent, std::uint32_t submoduleIdent, std::uint16_t submoduleType=0, std::uint16_t inputLength=0, std::uint16_t outputLength=0)
Add a single submodule.
Definition blocks.cpp:860
std::vector< ExpectedSubmoduleAPI > apis
APIs added so far, each with its own module/submodule list.
Definition blocks.h:701
static constexpr std::uint16_t expectedSubmoduleBlockReqBlockType
Block type identifier for ExpectedSubmoduleBlockReq.
Definition blocks.h:678
Builder for IODWriteMultipleReq packets (index 0xE040).
Definition blocks.h:488
IODWriteMultipleBuilder(std::array< std::uint8_t, uuidLenght > arUuid, std::uint16_t seqNum=0)
Construct a builder for the given AR.
Definition blocks.h:499
Bytes BuildHeader(std::size_t blocksLen) const
Serialize the outer IODWriteMultipleReq header.
Definition blocks.cpp:697
static constexpr std::uint16_t writeMultipleBlockType
Block type used for each nested write block.
Definition blocks.h:494
Bytes Build() const
Build the complete IODWriteMultipleReq packet.
Definition blocks.cpp:717
IODWriteMultipleBuilder & AddWrite(std::uint16_t slot, std::uint16_t subslot, std::uint16_t index, Bytes data, std::uint32_t api=0)
Add a write operation.
Definition blocks.cpp:667
static constexpr std::uint16_t writeMultipleIndex
Record data index for WriteMultiple (0xE040).
Definition blocks.h:491
std::vector< Write > writes
Queued write operations, in the order they'll be serialized.
Definition blocks.h:557
Bytes BuildWriteBlock(std::uint16_t seq, std::uint32_t api, std::uint16_t slot, std::uint16_t subslot, std::uint16_t index, const Bytes &data) const
Serialize a single nested write block.
Definition blocks.cpp:674
std::uint16_t seqNum
Starting sequence number for the outer header.
Definition blocks.h:539
std::array< std::uint8_t, uuidLenght > arUuid
AR UUID the writes belong to.
Definition blocks.h:536
ModuleDiffBlock ParseModuleDiffBlock(const Bytes &data)
Parse a ModuleDiffBlock (0x8104) from raw bytes.
Definition blocks.cpp:593
PortInfo ParsePdPortDataReal(const Bytes &data, std::size_t offset=0, std::uint16_t slot=0, std::uint16_t subslot=0)
Parse a PDPortDataReal (0x020F) block body.
Definition blocks.cpp:191
std::tuple< std::uint32_t, std::uint16_t, std::uint16_t, std::size_t > ParseMultipleBlockHeader(const Bytes &data, std::size_t offset=0)
Parse a MultipleBlockHeader (0x0400) body.
Definition blocks.cpp:125
InterfaceInfo ParsePdInterfaceDataReal(const Bytes &data, std::size_t offset=0, std::size_t blockHeaderSize=blockHeaderLenght)
Parse a PDInterfaceDataReal (0x0240) block body.
Definition blocks.cpp:140
std::vector< WriteMultipleResult > ParseWriteMultipleResponse(const Bytes &data)
Parse an IODWriteMultipleRes into individual per-write results.
Definition blocks.cpp:740
PDRealData ParsePdRealData(const Bytes &data)
Parse a complete PDRealData (0xF841) response.
Definition blocks.cpp:313
std::size_t Align4(std::size_t offset)
Round an offset up to the next 4-byte boundary.
Definition blocks.h:266
RealIdentificationData ParseRealIdentificationData(const Bytes &data)
Parse a RealIdentificationData (0xF000 or 0x0013) response.
Definition blocks.cpp:407
std::pair< BlockHeader, std::size_t > ParseBlockHeader(const Bytes &data, std::size_t offset=0)
Parse a 6-byte PROFINET block header at an offset.
Definition blocks.cpp:109
std::optional< PortStatistics > ParsePortStatistics(const Bytes &data, std::size_t offset=0)
Parse a PDPortStatistic (0x0251) block body.
Definition blocks.cpp:514
BlockType
PROFINET block types.
Definition indices.h:91
@ Unknown
Unknown / Initialize value.
@ RealIdentificationData
Real identification data block.
std::string String2Ip(std::span< const std::uint8_t > ipBytes)
Format raw IPv4 address bytes as a dotted string.
Definition util.cpp:214
std::vector< std::uint8_t > Bytes
Generic byte buffer alias used throughout the library for raw wire data.
Definition protocol.h:52
constexpr int blockHeaderLenght
Constant lenght of a blockHeader.
Definition protocol.h:55
std::string Mac2String(const MacAddress &mac)
Format a MAC address as a colon-separated string.
Definition util.cpp:196
PROFINET protocol wire-format structures and serialization helpers.
PROFINET block header (6 bytes).
Definition blocks.h:33
std::uint16_t BodyLength() const
Length of the block body, excluding the version bytes.
Definition blocks.h:48
BlockType blockType
Block type identifier.
Definition blocks.h:35
std::uint16_t blockLength
Length in bytes of the block body, including the 2 version bytes.
Definition blocks.h:38
std::string TypeName() const
Human-readable name for BlockType.
Definition blocks.cpp:71
std::uint8_t versionHigh
Block format major version.
Definition blocks.h:41
std::uint8_t versionLow
Block format minor version.
Definition blocks.h:44
Expected submodules for a specific API/slot.
Definition blocks.h:648
std::vector< ExpectedSubmoduleSlot > slots
Expected slots within this module.
Definition blocks.h:653
Bytes ToBytes() const
Serialize this API entry to raw bytes.
Definition blocks.cpp:837
std::uint32_t api
API number.
Definition blocks.h:650
Describes I/O data for a submodule (one direction: Input or Output).
Definition blocks.h:579
std::uint16_t submoduleDataLength
Length in bytes of this direction's cyclic data.
Definition blocks.h:584
std::uint8_t lengthIops
Length in bytes of the IOPS (provider status) trailer.
Definition blocks.h:590
std::uint8_t lengthIocs
Length in bytes of the IOCS (consumer status) trailer.
Definition blocks.h:587
std::uint16_t dataDescription
Data direction: 1 = Input, 2 = Output.
Definition blocks.h:581
Bytes ToBytes() const
Serialize this description to raw bytes.
Definition blocks.cpp:791
One slot with in an api submodule.
Definition blocks.h:625
std::uint16_t slotNumber
Slot number.
Definition blocks.h:630
std::uint32_t moduleIdentNumber
Expected module ident number.
Definition blocks.h:633
std::vector< ExpectedSubmodule > submodules
Expected submodules within this module.
Definition blocks.h:639
std::uint32_t api
API number.
Definition blocks.h:627
Bytes ToBytes() const
Serialize this api submodule slot.
Definition blocks.cpp:815
std::uint16_t moduleProperties
Module property flags.
Definition blocks.h:636
Expected submodule within a slot.
Definition blocks.h:599
std::uint16_t SubmoduleType() const
SubmoduleProperties.Type extracted from SubmoduleProperties.
Definition blocks.h:614
std::vector< ExpectedSubmoduleDataDescription > dataDescriptions
Data descriptions for this submodule's cyclic data (one per active direction).
Definition blocks.h:610
Bytes ToBytes() const
Serialize this submodule entry to raw bytes.
Definition blocks.cpp:801
std::uint16_t subslotNumber
Subslot number.
Definition blocks.h:601
std::uint16_t submoduleProperties
Submodule property flags (encodes the I/O direction type).
Definition blocks.h:607
std::uint32_t submoduleIdentNumber
Expected submodule ident number.
Definition blocks.h:604
std::uint16_t subslot
Subslot number.
Definition blocks.h:549
std::uint16_t index
Record data index to write.
Definition blocks.h:551
Interface information from PDInterfaceDataReal (0x0240).
Definition blocks.h:168
std::array< std::uint8_t, 4 > gateway
Interface IPv4 default gateway.
Definition blocks.h:182
std::string GatewayStr() const
Format Gateway as a dotted string.
Definition blocks.h:207
std::string chassisId
LLDP chassis ID.
Definition blocks.h:170
std::array< std::uint8_t, 4 > subnetMask
Interface IPv4 subnet mask.
Definition blocks.h:179
std::array< std::uint8_t, macAddressLength > macAddress
Interface MAC address.
Definition blocks.h:173
bool operator==(const InterfaceInfo &) const =default
Compares two InterfaceInfo for equality.
std::array< std::uint8_t, 4 > ipAddress
Interface IPv4 address.
Definition blocks.h:176
std::string MacStr() const
Format MacAddress as a colon-separated string.
Definition blocks.h:186
std::string IpStr() const
Format IpAddress as a dotted string.
Definition blocks.h:193
std::string SubnetStr() const
Format SubnetMask as a dotted string.
Definition blocks.h:200
Parsed ModuleDiffBlock (0x8104).
Definition blocks.h:415
std::vector< ModuleDiffModule > modules
Modules described by this block.
Definition blocks.h:417
bool AllOk() const
Whether every module and submodule matches the expected configuration.
Definition blocks.cpp:554
bool operator==(const ModuleDiffBlock &) const =default
Compares two ModuleDiffBlock for equality.
std::vector< std::tuple< std::uint16_t, std::uint16_t, std::string > > GetMismatches() const
List every non-OK module/submodule.
Definition blocks.cpp:573
Difference info for a single module (slot).
Definition blocks.h:381
std::vector< ModuleDiffSubmodule > submodules
Submodules within this module.
Definition blocks.h:395
std::uint32_t api
API number.
Definition blocks.h:383
bool operator==(const ModuleDiffModule &) const =default
Compares two ModuleDiffModule for equality.
std::uint16_t moduleState
Module state (see MODULE_STATE_* constants).
Definition blocks.h:392
bool IsProper() const
Whether this module matches the expected configuration.
Definition blocks.cpp:549
std::uint16_t slotNumber
Slot number.
Definition blocks.h:386
std::uint32_t moduleIdentNumber
Actual module ident number found by the device.
Definition blocks.h:389
std::string StateName() const
Human-readable name for ModuleState.
Definition blocks.cpp:545
Difference info for a single submodule.
Definition blocks.h:353
std::string StateName() const
Human-readable name for SubmoduleState.
Definition blocks.cpp:536
std::uint16_t subslotNumber
Subslot number.
Definition blocks.h:355
bool IsOk() const
Whether this submodule matches the expected configuration.
Definition blocks.cpp:540
bool operator==(const ModuleDiffSubmodule &) const =default
Compares two ModuleDiffSubmodule for equality.
std::uint32_t submoduleIdentNumber
Actual submodule ident number found by the device.
Definition blocks.h:358
std::uint16_t submoduleState
Submodule state (see SUBMODULE_STATE_* constants).
Definition blocks.h:361
Parsed PDRealData (0xF841) structure.
Definition blocks.h:221
std::optional< InterfaceInfo > interface
Interface information, if a PDInterfaceDataReal block was found.
Definition blocks.h:226
bool operator==(const PDRealData &) const =default
Compares two PDRealData for equality.
std::vector< SlotInfo > slots
Slots discovered in the response.
Definition blocks.h:223
std::vector< PortInfo > ports
Port information for each port found.
Definition blocks.h:229
std::vector< std::tuple< std::uint32_t, std::uint16_t, std::uint16_t, Bytes > > rawBlocks
Raw (api, slot, subslot, MultipleBlockHeader payload) tuples, one per slot.
Definition blocks.h:232
LLDP peer information from PDPortDataReal.
Definition blocks.h:93
bool operator==(const PeerInfo &) const =default
Compares two PeerInfo for equality.
std::string portId
Peer's LLDP port ID.
Definition blocks.h:95
std::array< std::uint8_t, macAddressLength > macAddress
Peer's MAC address.
Definition blocks.h:101
std::string chassisId
Peer's LLDP chassis ID.
Definition blocks.h:98
std::string MacStr() const
Format MacAddress as a colon-separated string.
Definition blocks.h:105
Port information from PDPortDataReal (0x020F).
Definition blocks.h:119
bool operator==(const PortInfo &) const =default
Compares two PortInfo for equality.
std::uint32_t multicastBoundary
Multicast boundary flags.
Definition blocks.h:148
std::string portId
LLDP port ID.
Definition blocks.h:127
std::string MauTypeName() const
Human-readable name for MauType.
Definition blocks.cpp:82
std::uint16_t mauType
MAU type (media attachment unit) code.
Definition blocks.h:130
std::uint16_t slot
Slot number.
Definition blocks.h:121
std::uint32_t domainBoundary
Domain boundary flags.
Definition blocks.h:145
std::vector< PeerInfo > peers
LLDP peers discovered on this port.
Definition blocks.h:142
std::uint8_t linkStatePort
Port-level link state.
Definition blocks.h:133
std::uint32_t mediaType
Media type code.
Definition blocks.h:139
std::uint16_t subslot
Subslot number.
Definition blocks.h:124
std::string LinkState() const
Human-readable name for LinkStateLink.
Definition blocks.cpp:92
std::uint8_t linkStateLink
Link-level link state.
Definition blocks.h:136
Parsed PDPortStatistic (0x0251) counters.
Definition blocks.h:318
std::uint32_t outDiscards
Transmitted discarded frame count.
Definition blocks.h:332
std::uint32_t outOctets
Transmitted octet count.
Definition blocks.h:326
std::uint32_t inErrors
Received error frame count.
Definition blocks.h:335
std::uint32_t inDiscards
Received discarded frame count.
Definition blocks.h:329
std::uint32_t inOctets
Received octet count.
Definition blocks.h:323
std::uint32_t outErrors
Transmitted error frame count.
Definition blocks.h:338
std::uint16_t counterStatus
Counter validity status.
Definition blocks.h:320
Parsed RealIdentificationData (0xF000/0x0013) structure.
Definition blocks.h:244
std::vector< SlotInfo > slots
Populated slots/subslots.
Definition blocks.h:246
std::pair< std::uint8_t, std::uint8_t > version
Block format version (determines v1.0 vs v1.1 layout).
Definition blocks.h:249
Slot/subslot discovered from a device.
Definition blocks.h:60
std::uint32_t moduleIdent
Module ident number.
Definition blocks.h:71
std::vector< std::string > blocks
Names of nested blocks found for this slot (e.g. "PDPortDataReal").
Definition blocks.h:77
std::uint32_t submoduleIdent
Submodule ident number.
Definition blocks.h:74
std::string ToString() const
Human-readable summary of this slot.
Definition blocks.cpp:76
std::uint32_t api
API number.
Definition blocks.h:68
std::uint16_t slot
Slot number.
Definition blocks.h:62
std::uint16_t subslot
Subslot number.
Definition blocks.h:65
bool operator==(const SlotInfo &) const =default
Compares two SlotInfo for equality.
Result of a single write within a WriteMultiple operation.
Definition blocks.h:451
std::uint16_t subslot
Subslot number.
Definition blocks.h:462
std::uint32_t api
API number.
Definition blocks.h:456
std::uint32_t status
PNIO status code (0 = success).
Definition blocks.h:468
std::uint16_t index
Record data index written.
Definition blocks.h:465
bool Success() const
Whether this individual write succeeded.
Definition blocks.h:478
std::uint16_t additionalValue1
Additional status value 1 (device-specific).
Definition blocks.h:471
std::uint16_t seqNum
Sequence number of this write within the batch.
Definition blocks.h:453
std::uint16_t additionalValue2
Additional status value 2 (device-specific).
Definition blocks.h:474
std::uint16_t slot
Slot number.
Definition blocks.h:459