Motion Master 6.0.0-alpha.50
Next-generation motion control software
Loading...
Searching...
No Matches
fieldbus_driver.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <chrono>
5#include <cstddef>
6#include <cstdint>
7#include <expected>
8#include <functional>
9#include <mutex>
10#include <optional>
11#include <span>
12#include <string>
13#include <string_view>
14#include <vector>
15
16namespace mm::comm {
17
28inline constexpr std::size_t kMaxProcessImageBytes = 32768;
29
34enum class EtherCatState : uint16_t {
35 Init = 0x01,
36 PreOp = 0x02,
37 Boot = 0x03,
38 SafeOp = 0x04,
39 Op = 0x08,
40};
41
47inline EtherCatState alState(uint16_t alStatus) {
48 return static_cast<EtherCatState>(alStatus & 0x000Fu);
49}
50
52inline bool alHasError(uint16_t alStatus) { return (alStatus & 0x0010u) != 0; }
53
55inline std::string_view toString(EtherCatState state) {
56 switch (state) {
58 return "INIT";
60 return "PRE-OP";
62 return "BOOT";
64 return "SAFE-OP";
66 return "OP";
67 }
68 return "UNKNOWN";
69}
70
84inline int workingCounterContribution(EtherCatState state, bool hasOutputs, bool hasInputs) {
85 switch (state) {
87 return (hasOutputs ? 2 : 0) + (hasInputs ? 1 : 0);
89 return hasInputs ? 1 : 0;
90 default:
91 return 0;
92 }
93}
94
96struct SlaveInfo {
97 std::string name;
98 uint32_t vendorId = 0;
99 uint32_t productCode = 0;
100 uint32_t revisionNumber = 0;
101 uint32_t serialNumber = 0;
102};
103
117struct OdEntry {
118 uint16_t index = 0;
119 uint8_t subindex = 0;
120 uint16_t objectCode = 0;
121 uint16_t dataType = 0;
122 uint16_t bitLength = 0;
123 uint16_t access = 0;
124 std::string name;
125 std::optional<uint32_t> unit;
126 std::optional<std::vector<uint8_t>> defaultValue;
127 std::optional<std::vector<uint8_t>> minValue;
128 std::optional<std::vector<uint8_t>> maxValue;
129};
130
137struct SlaveIo {
138 uint16_t slavePosition = 0;
139 uint32_t outputOffset = 0;
140 uint32_t outputBytes = 0;
141 uint32_t inputOffset = 0;
142 uint32_t inputBytes = 0;
143};
144
155struct PdoLayout {
156 uint32_t outputBytes = 0;
157 uint32_t inputBytes = 0;
158 std::vector<SlaveIo> slaves;
159 int expectedWkc = 0;
160};
161
167 uint8_t index = 0;
168 uint16_t physicalStart = 0;
169 uint16_t length = 0;
170 uint32_t flags = 0;
171 uint8_t type = 0;
172};
173
180 uint8_t index = 0;
181 uint32_t logicalStart = 0;
182 uint16_t length = 0;
183 uint8_t logicalStartBit = 0;
184 uint8_t logicalEndBit = 0;
185 uint16_t physicalStart = 0;
186 uint8_t physicalStartBit = 0;
187 uint8_t type = 0;
188 uint8_t active = 0;
189};
190
193 uint16_t writeLength = 0;
194 uint16_t writeOffset = 0;
195 uint16_t readLength = 0;
196 uint16_t readOffset = 0;
197 uint16_t protocols = 0;
199 // Per-protocol capability detail bytes as advertised in EEPROM (ECT_*DETAILS), refining the
200 // supported-protocol bits above. Raw bytes — the meaning of each bit is decoded by the client
201 // (CoE has a rich flag set; FoE/EoE are essentially an enable bit; SoE is a channel count). An
202 // advertisement, not a guarantee (see the CoE Complete-Access note in the parameter path).
203 uint8_t coeDetails = 0;
204 uint8_t foeDetails = 0;
205 uint8_t eoeDetails = 0;
206 uint8_t soeDetails = 0;
207};
208
214struct DcConfig {
215 bool capable = false;
216 bool active = false;
217 int32_t propagationDelay = 0;
218 int32_t cycleTime = 0;
219 int32_t shift = 0;
220};
221
229 uint16_t slavePosition = 0;
230 uint16_t configuredAddress = 0;
231 uint16_t aliasAddress = 0;
232 uint16_t outputBits = 0;
233 uint16_t inputBits = 0;
236 std::vector<SyncManagerConfig> syncManagers;
237 std::vector<FmmuConfig> fmmus;
238};
239
248 bool linkUp = false;
249 bool loopClosed = false;
250 bool communication = false;
251 uint8_t invalidFrame = 0;
252 uint8_t rxError = 0;
253 uint8_t forwardedError = 0;
255 uint8_t lostLink = 0;
256};
257
266 uint16_t slavePosition = 0;
267 std::array<PortDiagnostics, 4> ports;
270 uint8_t pdiError = 0;
274 uint8_t pdiWatchdog = 0;
275};
276
291 uint16_t slavePosition = 0;
292 bool dcCapable = false;
293 bool referenceClock = false;
294 int32_t propagationDelay = 0;
296 0;
299};
300
310 bool enabled = false;
311 bool running = false;
313 std::chrono::nanoseconds timeout{0};
314 uint16_t divider = 0;
315 uint16_t ticks = 0;
316};
317
344 public:
345 virtual ~FieldbusDriver() = default;
346
352 virtual std::expected<void, std::string> init() = 0;
353
361 virtual std::expected<int, std::string> scan() = 0;
362
365 virtual SlaveInfo slaveInfo(uint16_t position) const = 0;
366
373 virtual uint16_t slaveState(uint16_t position) const = 0;
374
389 virtual std::expected<void, std::string> configureProcessData() = 0;
390
397
412 virtual std::vector<SlaveConfig> busConfig() const { return {}; }
413
429 virtual int exchangeProcessData(std::span<const uint8_t> outputs, std::span<uint8_t> inputs) = 0;
430
439 virtual void stop() = 0;
440
459 uint16_t alStatus = 0;
460 uint16_t alStatusCode = 0;
461 };
462
474 virtual std::expected<std::vector<SlaveStateRaw>, std::string> readStates(
475 const std::vector<uint16_t>& positions) = 0;
476
493 virtual std::expected<std::vector<SlaveDiagnostics>, std::string> readDiagnostics(
494 const std::vector<uint16_t>& /*positions*/) {
495 return std::unexpected("diagnostics not supported by this transport");
496 }
497
516 virtual std::expected<std::vector<DcSyncDiagnostics>, std::string> readDcSync(
517 const std::vector<uint16_t>& /*positions*/) {
518 return std::unexpected("distributed-clock diagnostics not supported by this transport");
519 }
520
542 virtual std::expected<std::vector<uint8_t>, std::string> readSdo(uint16_t slavePosition,
543 uint16_t index,
544 uint8_t subindex) = 0;
545
563 virtual std::expected<std::vector<uint8_t>, std::string> readSdoComplete(
564 uint16_t /*slavePosition*/, uint16_t /*index*/) {
565 return std::unexpected("complete access not supported by this driver");
566 }
567
581 virtual std::expected<void, std::string> writeSdo(uint16_t slavePosition, uint16_t index,
582 uint8_t subindex,
583 std::span<const uint8_t> data) = 0;
584
597 virtual std::expected<std::vector<OdEntry>, std::string> readObjectDictionary(
598 uint16_t slavePosition) = 0;
599
617 virtual std::expected<std::vector<uint8_t>, std::string> readSii(uint16_t /*slavePosition*/) {
618 return std::unexpected("SII (EEPROM) read not supported by this transport");
619 }
620
638 virtual std::expected<void, std::string> writeSii(uint16_t /*slavePosition*/,
639 std::span<const uint8_t> /*data*/) {
640 return std::unexpected("SII (EEPROM) write not supported by this transport");
641 }
642
654 virtual std::expected<std::vector<uint8_t>, std::string> readFile(
655 uint16_t slavePosition, const std::string& filename) = 0;
656
669 virtual std::expected<void, std::string> writeFile(uint16_t slavePosition,
670 const std::string& filename,
671 std::span<const uint8_t> data) = 0;
672
683 virtual std::expected<void, std::string> readRegister(uint16_t slavePosition, uint16_t address,
684 std::span<uint8_t> data) = 0;
685
696 virtual std::expected<void, std::string> writeRegister(uint16_t slavePosition, uint16_t address,
697 std::span<const uint8_t> data) = 0;
698
714 virtual std::expected<ProcessDataWatchdogConfig, std::string> processDataWatchdog(
715 uint16_t /*slavePosition*/) {
716 return std::unexpected("process-data watchdog not supported by this transport");
717 }
718
740 virtual std::expected<ProcessDataWatchdogConfig, std::string> setProcessDataWatchdog(
741 uint16_t /*slavePosition*/, std::chrono::nanoseconds /*timeout*/) {
742 return std::unexpected("process-data watchdog not supported by this transport");
743 }
744
767 virtual void transitionToState(
768 const std::vector<uint16_t>& positions, std::optional<EtherCatState> requiredState,
769 EtherCatState targetState, std::chrono::steady_clock::duration timeout,
770 std::chrono::steady_clock::duration resendInterval = std::chrono::seconds(2),
771 std::function<void()> tick = nullptr, std::function<bool()> shouldAbort = nullptr) = 0;
772
773 protected:
791 mutable std::mutex controlPlaneMutex_;
792};
793
794} // namespace mm::comm
Abstract interface for an EtherCAT fieldbus driver.
Definition fieldbus_driver.h:343
virtual std::expected< std::vector< uint8_t >, std::string > readSii(uint16_t)
Reads the raw Slave Information Interface (SII / EEPROM) image of a slave.
Definition fieldbus_driver.h:617
virtual std::expected< void, std::string > writeRegister(uint16_t slavePosition, uint16_t address, std::span< const uint8_t > data)=0
Writes bytes to an ESC register via a Configured-Address Write (FPWR) datagram.
virtual std::expected< std::vector< SlaveStateRaw >, std::string > readStates(const std::vector< uint16_t > &positions)=0
Reads the current AL Status for each slave in positions.
virtual SlaveInfo slaveInfo(uint16_t position) const =0
Returns the immutable identity fields for the slave at position.
virtual std::expected< void, std::string > writeSdo(uint16_t slavePosition, uint16_t index, uint8_t subindex, std::span< const uint8_t > data)=0
Writes an object dictionary entry to a slave (CoE SDO download).
virtual uint16_t slaveState(uint16_t position) const =0
Returns the last-known AL status for a slave without any bus I/O.
virtual std::expected< void, std::string > readRegister(uint16_t slavePosition, uint16_t address, std::span< uint8_t > data)=0
Reads bytes from an ESC register via a Configured-Address Read (FPRD) datagram.
virtual ~FieldbusDriver()=default
virtual std::expected< std::vector< uint8_t >, std::string > readSdo(uint16_t slavePosition, uint16_t index, uint8_t subindex)=0
Reads an object dictionary entry via CoE SDO upload.
virtual std::expected< std::vector< DcSyncDiagnostics >, std::string > readDcSync(const std::vector< uint16_t > &)
Reads live distributed-clock synchronisation status for each slave in positions.
Definition fieldbus_driver.h:516
virtual void transitionToState(const std::vector< uint16_t > &positions, std::optional< EtherCatState > requiredState, EtherCatState targetState, std::chrono::steady_clock::duration timeout, std::chrono::steady_clock::duration resendInterval=std::chrono::seconds(2), std::function< void()> tick=nullptr, std::function< bool()> shouldAbort=nullptr)=0
Commands a set of devices to targetState and blocks until all arrive or timeout elapses.
virtual std::expected< void, std::string > configureProcessData()=0
Maps the process data and lays out the IOmap (one-time, control-plane).
virtual void stop()=0
Closes the network interface, releasing the master context.
virtual std::expected< void, std::string > writeSii(uint16_t, std::span< const uint8_t >)
Writes a raw SII (EEPROM) image to a slave.
Definition fieldbus_driver.h:638
virtual int exchangeProcessData(std::span< const uint8_t > outputs, std::span< uint8_t > inputs)=0
Exchanges one cycle of process data: sends outputs, receives into inputs.
virtual std::expected< void, std::string > writeFile(uint16_t slavePosition, const std::string &filename, std::span< const uint8_t > data)=0
Writes a file to the slave via File over EtherCAT (FoE).
std::mutex controlPlaneMutex_
Definition fieldbus_driver.h:791
virtual std::vector< SlaveConfig > busConfig() const
Returns the static ESC configuration of every slave, as last programmed by the master.
Definition fieldbus_driver.h:412
virtual std::expected< std::vector< uint8_t >, std::string > readFile(uint16_t slavePosition, const std::string &filename)=0
Reads a file from the slave via File over EtherCAT (FoE).
virtual std::expected< std::vector< uint8_t >, std::string > readSdoComplete(uint16_t, uint16_t)
Reads an entire object in one CoE SDO upload using Complete Access.
Definition fieldbus_driver.h:563
virtual std::expected< ProcessDataWatchdogConfig, std::string > setProcessDataWatchdog(uint16_t, std::chrono::nanoseconds)
Sets the process-data (sync-manager) watchdog timeout of one slave.
Definition fieldbus_driver.h:740
virtual std::expected< void, std::string > init()=0
Opens the network interface and initialises the master context.
virtual std::expected< int, std::string > scan()=0
Scans the bus for slaves and configures their sync managers and FMMUs.
virtual std::expected< std::vector< OdEntry >, std::string > readObjectDictionary(uint16_t slavePosition)=0
Enumerates the entire CoE object dictionary of a slave via SDO Info.
virtual std::expected< std::vector< SlaveDiagnostics >, std::string > readDiagnostics(const std::vector< uint16_t > &)
Reads live link-quality and watchdog diagnostics for each slave in positions.
Definition fieldbus_driver.h:493
virtual std::expected< ProcessDataWatchdogConfig, std::string > processDataWatchdog(uint16_t)
Reads the process-data (sync-manager) watchdog configuration of one slave.
Definition fieldbus_driver.h:714
virtual PdoLayout processDataLayout()=0
Returns the current process-data layout established by configureProcessData.
Definition al_status_codes.cc:5
bool alHasError(uint16_t alStatus)
Returns whether the AL Status error indicator (bit 4 of register 0x0130) is set.
Definition fieldbus_driver.h:52
int workingCounterContribution(EtherCatState state, bool hasOutputs, bool hasInputs)
Working-counter contribution of one slave for a given AL state and PDO presence.
Definition fieldbus_driver.h:84
EtherCatState
EtherCAT Application Layer state values.
Definition fieldbus_driver.h:34
@ PreOp
PRE-OPERATIONAL — mailbox communication active.
@ Op
OPERATIONAL — full PDO exchange.
@ Init
INIT — reset state, no communication.
@ Boot
BOOT — firmware download mode.
@ SafeOp
SAFE-OPERATIONAL — inputs only; outputs ignored.
EtherCatState alState(uint16_t alStatus)
Extracts the AL state (bits 3:0) from a raw AL Status register value (0x0130).
Definition fieldbus_driver.h:47
constexpr std::size_t kMaxProcessImageBytes
Maximum size in bytes of the combined process-data image (all outputs + all inputs).
Definition fieldbus_driver.h:28
std::string_view toString(EtherCatState state)
Human-readable name of an AL state, for log and error messages.
Definition fieldbus_driver.h:55
Distributed-clock configuration for a slave.
Definition fieldbus_driver.h:214
int32_t propagationDelay
Measured propagation delay (ns).
Definition fieldbus_driver.h:217
bool active
SYNC0 generation enabled.
Definition fieldbus_driver.h:216
int32_t cycleTime
DC cycle time (ns).
Definition fieldbus_driver.h:218
bool capable
Slave has distributed-clock hardware.
Definition fieldbus_driver.h:215
int32_t shift
Shift from the cycle-modulus boundary (ns).
Definition fieldbus_driver.h:219
Live distributed-clock synchronisation status for one slave, read from its ESC.
Definition fieldbus_driver.h:290
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:291
int32_t propagationDelay
System-time delay / propagation delay (0x0928), ns.
Definition fieldbus_driver.h:294
bool referenceClock
This slave is the DC reference clock (first DC-capable).
Definition fieldbus_driver.h:293
int32_t systemTimeDifference
Definition fieldbus_driver.h:295
bool dcCapable
Slave has distributed-clock hardware (cached hasdc).
Definition fieldbus_driver.h:292
One slave's AL Status and AL Status Code registers — the "where" and the "why".
Definition fieldbus_driver.h:458
uint16_t alStatusCode
AL Status Code register 0x0134: error reason; 0 when no error.
Definition fieldbus_driver.h:460
uint16_t alStatus
AL Status register 0x0130: state (bits 3:0) + error bit 4.
Definition fieldbus_driver.h:459
One FMMU's configuration as programmed on a slave's ESC.
Definition fieldbus_driver.h:179
uint8_t logicalStartBit
Start bit within the first logical byte.
Definition fieldbus_driver.h:183
uint16_t physicalStart
Physical ESC start address (ties the FMMU to a Sync Manager).
Definition fieldbus_driver.h:185
uint8_t index
FMMU number (0..3).
Definition fieldbus_driver.h:180
uint8_t logicalEndBit
End bit within the last logical byte.
Definition fieldbus_driver.h:184
uint8_t active
Non-zero when the FMMU is active.
Definition fieldbus_driver.h:188
uint16_t length
Mapped length in bytes.
Definition fieldbus_driver.h:182
uint8_t type
ESC FMMU type: 1=read (inputs/TxPDO), 2=write (outputs/RxPDO).
Definition fieldbus_driver.h:187
uint32_t logicalStart
Logical (bus-wide) start address.
Definition fieldbus_driver.h:181
uint8_t physicalStartBit
Start bit within the first physical byte.
Definition fieldbus_driver.h:186
Mailbox configuration for a slave (the CoE/FoE/EoE/SoE transport windows).
Definition fieldbus_driver.h:192
uint8_t coeDetails
CoE details (ECT_COEDET_*: SDO/Info/PDO-Assign/Config/Upload/CA).
Definition fieldbus_driver.h:203
uint16_t readOffset
Read mailbox physical ESC offset.
Definition fieldbus_driver.h:196
uint16_t writeLength
Write (master→slave) mailbox length in bytes; 0 if no mailbox.
Definition fieldbus_driver.h:193
uint8_t soeDetails
SoE details / channel count.
Definition fieldbus_driver.h:206
uint8_t foeDetails
FoE details (bit 0 = enabled).
Definition fieldbus_driver.h:204
uint16_t protocols
Definition fieldbus_driver.h:197
uint8_t eoeDetails
EoE details (bit 0 = enabled).
Definition fieldbus_driver.h:205
uint16_t readLength
Read (slave→master) mailbox length in bytes.
Definition fieldbus_driver.h:195
uint16_t writeOffset
Write mailbox physical ESC offset.
Definition fieldbus_driver.h:194
Schema of a single object dictionary entry uploaded from a slave.
Definition fieldbus_driver.h:117
std::optional< std::vector< uint8_t > > defaultValue
Raw default-value bytes, if available.
Definition fieldbus_driver.h:126
uint16_t access
ObjAccess bitfield (read/write per AL state).
Definition fieldbus_driver.h:123
std::optional< std::vector< uint8_t > > maxValue
Raw maximum-value bytes, if available.
Definition fieldbus_driver.h:128
uint16_t index
CoE object index.
Definition fieldbus_driver.h:118
std::optional< std::vector< uint8_t > > minValue
Raw minimum-value bytes, if available.
Definition fieldbus_driver.h:127
uint16_t objectCode
OTYPE_VAR / OTYPE_ARRAY / OTYPE_RECORD (ETG.1000.6 §5).
Definition fieldbus_driver.h:120
std::optional< uint32_t > unit
ETG.1004 unit code, if available.
Definition fieldbus_driver.h:125
uint8_t subindex
CoE object subindex.
Definition fieldbus_driver.h:119
uint16_t dataType
ETG.1020 data type code (e.g. 0x0007 = UNSIGNED32).
Definition fieldbus_driver.h:121
std::string name
Textual description.
Definition fieldbus_driver.h:124
uint16_t bitLength
Bit length of the entry.
Definition fieldbus_driver.h:122
Layout of the process-data images, produced by configureProcessData.
Definition fieldbus_driver.h:155
int expectedWkc
Working counter when every slave exchanges (outputs×2 + inputs).
Definition fieldbus_driver.h:159
std::vector< SlaveIo > slaves
Per-slave windows, in bus order.
Definition fieldbus_driver.h:158
uint32_t inputBytes
Size of the input image (slave→master).
Definition fieldbus_driver.h:157
uint32_t outputBytes
Size of the output image (master→slave).
Definition fieldbus_driver.h:156
Per-port link state and error counters decoded from a slave's ESC.
Definition fieldbus_driver.h:247
bool loopClosed
Loop closed on this port (no downstream slave, or port disabled).
Definition fieldbus_driver.h:249
bool communication
Stable communication established on this port (DL Status).
Definition fieldbus_driver.h:250
bool linkUp
Physical link detected on this port (DL Status link bit).
Definition fieldbus_driver.h:248
uint8_t lostLink
Lost-link counter: link-down events on this port (0x0310+).
Definition fieldbus_driver.h:255
uint8_t forwardedError
Definition fieldbus_driver.h:253
uint8_t rxError
Physical-layer RX error counter: RX_ER from the PHY (0x0301+).
Definition fieldbus_driver.h:252
uint8_t invalidFrame
Invalid-frame counter: frames with a bad FCS/structure (0x0300+).
Definition fieldbus_driver.h:251
Process-data (sync-manager) watchdog configuration of one slave.
Definition fieldbus_driver.h:309
std::chrono::nanoseconds timeout
Decoded timeout: ticks × 40 ns × (divider + 2).
Definition fieldbus_driver.h:313
uint16_t divider
Raw 0x0400 divider (shared with the PDI watchdog).
Definition fieldbus_driver.h:314
uint16_t ticks
Raw 0x0420 process-data watchdog time register.
Definition fieldbus_driver.h:315
bool enabled
False when the time register (0x0420) is zero.
Definition fieldbus_driver.h:310
bool running
Definition fieldbus_driver.h:311
Static ESC configuration snapshot for one slave, captured by configureProcessData.
Definition fieldbus_driver.h:228
uint16_t configuredAddress
Station (configured) address assigned during scan.
Definition fieldbus_driver.h:230
std::vector< FmmuConfig > fmmus
Configured FMMUs, by index.
Definition fieldbus_driver.h:237
std::vector< SyncManagerConfig > syncManagers
Configured Sync Managers, by index.
Definition fieldbus_driver.h:236
uint16_t aliasAddress
Configured station alias from EEPROM.
Definition fieldbus_driver.h:231
uint16_t outputBits
Mapped output (master→slave) bits.
Definition fieldbus_driver.h:232
DcConfig dc
Distributed-clock configuration.
Definition fieldbus_driver.h:235
MailboxConfig mailbox
Mailbox transport windows + advertised protocol details.
Definition fieldbus_driver.h:234
uint16_t inputBits
Mapped input (slave→master) bits.
Definition fieldbus_driver.h:233
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:229
Decoded health diagnostics for one slave, read live from its ESC registers.
Definition fieldbus_driver.h:265
uint8_t pdiError
Definition fieldbus_driver.h:270
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:266
uint8_t processingUnitError
Definition fieldbus_driver.h:268
std::array< PortDiagnostics, 4 > ports
Per-port link state and error counters (ports 0–3).
Definition fieldbus_driver.h:267
uint8_t processDataWatchdog
Definition fieldbus_driver.h:272
uint8_t pdiWatchdog
PDI watchdog expirations (0x0443).
Definition fieldbus_driver.h:274
Immutable identity fields read from a slave's EEPROM during configuration.
Definition fieldbus_driver.h:96
std::string name
Human-readable name from SII.
Definition fieldbus_driver.h:97
uint32_t revisionNumber
Revision number.
Definition fieldbus_driver.h:100
uint32_t productCode
Product code (EEprom ID field).
Definition fieldbus_driver.h:99
uint32_t vendorId
Vendor ID (EEprom manufacturer field).
Definition fieldbus_driver.h:98
uint32_t serialNumber
Serial number.
Definition fieldbus_driver.h:101
One slave's input and output windows within the process-data images.
Definition fieldbus_driver.h:137
uint32_t inputOffset
Byte offset of this slave's inputs within the input image.
Definition fieldbus_driver.h:141
uint32_t inputBytes
Input byte count for this slave.
Definition fieldbus_driver.h:142
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:138
uint32_t outputBytes
Output byte count for this slave.
Definition fieldbus_driver.h:140
uint32_t outputOffset
Byte offset of this slave's outputs within the output image.
Definition fieldbus_driver.h:139
One Sync Manager's configuration as programmed on a slave's ESC.
Definition fieldbus_driver.h:166
uint32_t flags
Raw SM control/flags register (buffer mode, direction, watchdog).
Definition fieldbus_driver.h:170
uint16_t length
Length of the guarded window in bytes.
Definition fieldbus_driver.h:169
uint8_t type
0=unused, 1=MbxOut, 2=MbxIn, 3=Outputs, 4=Inputs.
Definition fieldbus_driver.h:171
uint16_t physicalStart
Physical ESC memory start address the SM guards.
Definition fieldbus_driver.h:168
uint8_t index
SM number (0..7).
Definition fieldbus_driver.h:167