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 = blockHeaderLength);
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
443
444// =============================================================================
445// IODWriteMultiple (Index 0xE040)
446// =============================================================================
447
450{
452 std::uint16_t seqNum = 0;
453
455 std::uint32_t api = 0;
456
458 std::uint16_t slot = 0;
459
461 std::uint16_t subslot = 0;
462
464 std::uint16_t index = 0;
465
467 std::uint32_t status = 0;
468
470 std::uint16_t additionalValue1 = 0;
471
473 std::uint16_t additionalValue2 = 0;
474
477 [[nodiscard]] bool Success() const
478 {
479 return status == 0;
480 }
481};
482
487{
488 public:
490 static constexpr std::uint16_t writeMultipleIndex = 0xE040;
491
493 static constexpr std::uint16_t writeMultipleBlockType = 0x0008;
494
498 explicit IODWriteMultipleBuilder(std::array<std::uint8_t, uuidLenght> arUuid, std::uint16_t seqNum = 0)
500 {
501 }
502
510 IODWriteMultipleBuilder& AddWrite(std::uint16_t slot, std::uint16_t subslot, std::uint16_t index,
511 Bytes data, std::uint32_t api = 0);
512
515 [[nodiscard]] Bytes Build() const;
516
517 private:
526 [[nodiscard]] Bytes BuildWriteBlock(std::uint16_t seq, std::uint32_t api, std::uint16_t slot, std::uint16_t subslot,
527 std::uint16_t index, const Bytes& data) const;
528
532 [[nodiscard]] Bytes BuildHeader(std::size_t blocksLen) const;
533
535 std::array<std::uint8_t, uuidLenght> arUuid{};
536
538 std::uint16_t seqNum = 0;
539
541 struct Write
542 {
544 std::uint32_t api;
546 std::uint16_t slot;
548 std::uint16_t subslot;
550 std::uint16_t index;
553 };
554
556 std::vector<Write> writes;
557};
558
562std::vector<WriteMultipleResult> ParseWriteMultipleResponse(const Bytes& data);
563
564// =============================================================================
565// ExpectedSubmodule Structures (0x0104)
566// =============================================================================
567
568enum class ModuleType : std::uint16_t
569{
570 None = 0,
571 InputOnly = 1,
572 OutputOnly = 2,
574};
575
578{
580 std::uint16_t dataDescription = 1;
581
583 std::uint16_t submoduleDataLength = 0;
584
586 std::uint8_t lengthIocs = 1;
587
589 std::uint8_t lengthIops = 1;
590
593 [[nodiscard]] Bytes ToBytes() const;
594};
595
598{
600 std::uint16_t subslotNumber = 0;
601
603 std::uint32_t submoduleIdentNumber = 0;
604
606 std::uint16_t submoduleProperties = 0;
607
609 std::vector<ExpectedSubmoduleDataDescription> dataDescriptions;
610
613 [[nodiscard]] std::uint16_t SubmoduleType() const
614 {
615 return submoduleProperties & 0x03;
616 }
617
620 [[nodiscard]] Bytes ToBytes() const;
621};
624{
626 std::uint32_t api = 0;
627
629 std::uint16_t slotNumber = 0;
630
632 std::uint32_t moduleIdentNumber = 0;
633
635 std::uint16_t moduleProperties = 0;
636
638 std::vector<ExpectedSubmodule> submodules;
639
642 [[nodiscard]] Bytes ToBytes() const;
643};
644
647{
649 std::uint32_t api = 0;
650
652 std::vector<ExpectedSubmoduleSlot> slots;
653
656 [[nodiscard]] Bytes ToBytes() const;
657};
658
673{
674 public:
676 static constexpr std::uint16_t expectedSubmoduleBlockReqBlockType = 0x0104;
677
688 ExpectedSubmoduleBlockReq& AddSubmodule(std::uint32_t api, std::uint16_t slot, std::uint16_t subslot,
689 std::uint32_t moduleIdent, std::uint32_t submoduleIdent,
690 std::uint16_t submoduleType = 0, std::uint16_t inputLength = 0,
691 std::uint16_t outputLength = 0);
692
693 void Clear();
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:673
Bytes ToBytes() const
Serialize the complete block to raw bytes.
Definition blocks.cpp:958
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:878
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:676
Builder for IODWriteMultipleReq packets (index 0xE040).
Definition blocks.h:487
IODWriteMultipleBuilder(std::array< std::uint8_t, uuidLenght > arUuid, std::uint16_t seqNum=0)
Construct a builder for the given AR.
Definition blocks.h:498
Bytes BuildHeader(std::size_t blocksLen) const
Serialize the outer IODWriteMultipleReq header.
Definition blocks.cpp:713
static constexpr std::uint16_t writeMultipleBlockType
Block type used for each nested write block.
Definition blocks.h:493
Bytes Build() const
Build the complete IODWriteMultipleReq packet.
Definition blocks.cpp:733
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:683
static constexpr std::uint16_t writeMultipleIndex
Record data index for WriteMultiple (0xE040).
Definition blocks.h:490
std::vector< Write > writes
Queued write operations, in the order they'll be serialized.
Definition blocks.h:556
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:690
std::uint16_t seqNum
Starting sequence number for the outer header.
Definition blocks.h:538
std::array< std::uint8_t, uuidLenght > arUuid
AR UUID the writes belong to.
Definition blocks.h:535
ModuleDiffBlock ParseModuleDiffBlock(const Bytes &data)
Parse a ModuleDiffBlock (0x8104) from raw bytes.
Definition blocks.cpp:609
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:199
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:130
std::vector< WriteMultipleResult > ParseWriteMultipleResponse(const Bytes &data)
Parse an IODWriteMultipleRes into individual per-write results.
Definition blocks.cpp:756
PDRealData ParsePdRealData(const Bytes &data)
Parse a complete PDRealData (0xF841) response.
Definition blocks.cpp:328
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:422
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:114
std::optional< PortStatistics > ParsePortStatistics(const Bytes &data, std::size_t offset=0)
Parse a PDPortStatistic (0x0251) block body.
Definition blocks.cpp:529
InterfaceInfo ParsePdInterfaceDataReal(const Bytes &data, std::size_t offset=0, std::size_t blockHeaderSize=blockHeaderLength)
Parse a PDInterfaceDataReal (0x0240) block body.
Definition blocks.cpp:145
BlockType
PROFINET block types.
Definition indices.h:89
@ RealIdentificationData
Real identification data block.
constexpr int blockHeaderLength
Constant lenght of a blockHeader.
Definition protocol.h:58
std::string String2Ip(std::span< const std::uint8_t > ipBytes)
Format raw IPv4 address bytes as a dotted string.
Definition util.cpp:206
std::vector< std::uint8_t > Bytes
Generic byte buffer alias used throughout the library for raw wire data.
Definition protocol.h:55
std::string Mac2String(const MacAddress &mac)
Format a MAC address as a colon-separated string.
Definition util.cpp:188
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:76
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:647
std::vector< ExpectedSubmoduleSlot > slots
Expected slots within this module.
Definition blocks.h:652
Bytes ToBytes() const
Serialize this API entry to raw bytes.
Definition blocks.cpp:855
std::uint32_t api
API number.
Definition blocks.h:649
Describes I/O data for a submodule (one direction: Input or Output).
Definition blocks.h:578
std::uint16_t submoduleDataLength
Length in bytes of this direction's cyclic data.
Definition blocks.h:583
std::uint8_t lengthIops
Length in bytes of the IOPS (provider status) trailer.
Definition blocks.h:589
std::uint8_t lengthIocs
Length in bytes of the IOCS (consumer status) trailer.
Definition blocks.h:586
std::uint16_t dataDescription
Data direction: 1 = Input, 2 = Output.
Definition blocks.h:580
Bytes ToBytes() const
Serialize this description to raw bytes.
Definition blocks.cpp:809
One slot with in an api submodule.
Definition blocks.h:624
std::uint16_t slotNumber
Slot number.
Definition blocks.h:629
std::uint32_t moduleIdentNumber
Expected module ident number.
Definition blocks.h:632
std::vector< ExpectedSubmodule > submodules
Expected submodules within this module.
Definition blocks.h:638
std::uint32_t api
API number.
Definition blocks.h:626
Bytes ToBytes() const
Serialize this api submodule slot.
Definition blocks.cpp:833
std::uint16_t moduleProperties
Module property flags.
Definition blocks.h:635
Expected submodule within a slot.
Definition blocks.h:598
std::uint16_t SubmoduleType() const
SubmoduleProperties.Type extracted from SubmoduleProperties.
Definition blocks.h:613
std::vector< ExpectedSubmoduleDataDescription > dataDescriptions
Data descriptions for this submodule's cyclic data (one per active direction).
Definition blocks.h:609
Bytes ToBytes() const
Serialize this submodule entry to raw bytes.
Definition blocks.cpp:819
std::uint16_t subslotNumber
Subslot number.
Definition blocks.h:600
std::uint16_t submoduleProperties
Submodule property flags (encodes the I/O direction type).
Definition blocks.h:606
std::uint32_t submoduleIdentNumber
Expected submodule ident number.
Definition blocks.h:603
std::uint16_t subslot
Subslot number.
Definition blocks.h:548
std::uint16_t index
Record data index to write.
Definition blocks.h:550
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:570
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:589
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:565
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:561
Difference info for a single submodule.
Definition blocks.h:353
std::string StateName() const
Human-readable name for SubmoduleState.
Definition blocks.cpp:551
std::uint16_t subslotNumber
Subslot number.
Definition blocks.h:355
bool IsOk() const
Whether this submodule matches the expected configuration.
Definition blocks.cpp:556
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:87
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:97
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:81
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:450
std::uint16_t subslot
Subslot number.
Definition blocks.h:461
std::uint32_t api
API number.
Definition blocks.h:455
std::uint32_t status
PNIO status code (0 = success).
Definition blocks.h:467
std::uint16_t index
Record data index written.
Definition blocks.h:464
bool Success() const
Whether this individual write succeeded.
Definition blocks.h:477
std::uint16_t additionalValue1
Additional status value 1 (device-specific).
Definition blocks.h:470
std::uint16_t seqNum
Sequence number of this write within the batch.
Definition blocks.h:452
std::uint16_t additionalValue2
Additional status value 2 (device-specific).
Definition blocks.h:473
std::uint16_t slot
Slot number.
Definition blocks.h:458