ESI.cpp
Go to the documentation of this file.
1 #include "ESI.h"
2 
4 
5 #include "../ErrorReporting.h"
6 
7 extern "C"
8 {
9 #include <ethercat.h>
10 }
11 
13 {
14 
15  std::optional<std::vector<std::byte>>
16  ESIHandler::readESIBinaryBlob(std::uint16_t slaveIndex,
17  std::uint16_t startAddress,
18  std::uint16_t endAddress) const
19  {
20  bool pdiHadEEPROMControl = static_cast<bool>(ec_slave[slaveIndex].eep_pdi);
21  if (ec_eeprom2master(slaveIndex) == 0)
22  {
24  "Failed to read ESI of slave at index %u - could not get control of the EEPROM.",
25  slaveIndex);
26  return std::nullopt;
27  }
28 
29  std::vector<std::byte> result = readFromEEPROM(
30  slaveIndex, startAddress, endAddress, ec_slave[slaveIndex].eep_8byte > 0); // NOLINT
31 
32  if (pdiHadEEPROMControl)
33  {
34  ec_eeprom2pdi(slaveIndex);
35  }
36 
37  return std::move(result);
38  }
39 
40  std::vector<std::byte>
41  ESIHandler::readFromEEPROM(std::uint16_t slaveIndex,
42  std::uint16_t startAddress,
43  std::uint16_t endAddress,
44  bool has64BitPackets) const
45  {
46  ARMARX_CHECK_GREATER_EQUAL(endAddress, startAddress);
47 
48  std::vector<std::byte> result;
49 
50  // Some slaves return data from the EEPROM in 4 byte (2 word) units,
51  // others in 8 byte (4 word) units.
52  std::uint16_t addressIncr = 2;
53  if (has64BitPackets)
54  {
55  addressIncr = 4;
56  }
57 
58  result.reserve((endAddress - startAddress) * addressIncr * 2);
59 
60  std::uint16_t slaveConfiguredAddress = ec_slave[slaveIndex].configadr;
61 
62  for (std::uint16_t currentAddress = startAddress; currentAddress < endAddress;
63  currentAddress += addressIncr)
64  {
65  std::uint64_t eepromData =
66  ec_readeepromFP(slaveConfiguredAddress, currentAddress, EC_TIMEOUTEEP);
67 
68  // Repack the result into some std::bytes
69  for (int i = 0; i < addressIncr * 2; ++i)
70  {
71  static const int byteLength = 8;
72  static const int byteMask = 0xFF;
73  result.push_back(std::byte((eepromData >> (i * byteLength)) & byteMask));
74  }
75  }
76 
77  return result;
78  }
79 
80 
81  std::uint8_t
82  getU8(const std::vector<std::byte>& esiBinary, std::uint16_t address)
83  {
84  if (esiBinary.size() < static_cast<std::size_t>(address + 1))
85  ARMARX_FATAL << "The ESI binary ended unexpectedly!";
86  return static_cast<std::uint8_t>(esiBinary.at(address));
87  }
88 
89  std::uint16_t
90  getU16(const std::vector<std::byte>& esiBinary, std::uint16_t address)
91  {
92  if (esiBinary.size() < static_cast<std::size_t>(address + 2))
93  ARMARX_FATAL << "The ESI binary ended unexpectedly!";
94  const std::uint16_t byteSize = 8;
95  return static_cast<std::uint16_t>(esiBinary.at(address)) &
96  (static_cast<std::uint16_t>(esiBinary.at(address + 1)) << byteSize);
97  }
98 
99  std::int16_t
100  get16(const std::vector<std::byte>& esiBinary, std::uint16_t address)
101  {
102  auto unsignedValue = getU16(esiBinary, address);
103  return *reinterpret_cast<std::int16_t*>(&unsignedValue);
104  }
105 
106  std::uint16_t
107  getU16W(const std::vector<std::byte>& esiBinary, std::uint16_t wordAddress)
108  {
109  return getU16(esiBinary, wordAddress * 2);
110  }
111 
112  std::uint32_t
113  getU32(const std::vector<std::byte>& esiBinary, std::uint16_t address)
114  {
115  if (esiBinary.size() < static_cast<std::size_t>(address + 4))
116  ARMARX_FATAL << "The ESI binary ended unexpectedly!";
117  const auto byteSize = 8;
118  return static_cast<std::uint32_t>(esiBinary.at(address)) +
119  (static_cast<std::uint32_t>(esiBinary.at(address + 1)) << byteSize) +
120  (static_cast<std::uint32_t>(esiBinary.at(address + 2)) << 2 * byteSize) +
121  (static_cast<std::uint32_t>(esiBinary.at(address + 3)) << 3 * byteSize);
122  }
123 
124  std::uint32_t
125  getU32W(const std::vector<std::byte>& esiBinary, std::uint16_t wordAddress)
126  {
127  return getU32(esiBinary, wordAddress * 2);
128  }
129 
130  ESIData
131  ESIParser::parseESI(const std::vector<std::byte>& esiBinary)
132  {
133  ESIData esiData{};
134  esiData.header = parseHeader(esiBinary);
135  std::uint16_t categoryOffset = 0x0040;
136  auto categoryType = getU16W(esiBinary, categoryOffset);
137  // Attention - the MSB is undefined! -> setting to zero.
138  categoryType &= (1 << 15) - 1;
139  auto categorySize = getU16W(esiBinary, categoryOffset + 1);
140  while (categoryType != 0x7fff)
141  {
142  switch (categoryType)
143  {
144  case 0:
145  // NOP
146  break;
147  // 1 - 9 are device specific categories -> ignored
148  case 10:
149  // STRINGS
150  esiData.strings = parseStrings(esiBinary, categoryOffset + 2);
151  break;
152  case 20:
153  // DataTypes
154  // "for future use" -> ignored
155  break;
156  case 30:
157  // General
158  esiData.general = parseGeneral(esiBinary, categoryOffset + 2);
159  break;
160  case 40:
161  // FMMU
162  esiData.fmmu = parseFMMU(esiBinary, categoryOffset + 2, categorySize);
163  break;
164  case 41:
165  // SyncM
166  esiData.syncM = parseSyncM(esiBinary, categoryOffset + 2, categorySize);
167  break;
168  case 50:
169  // TxPDO
170  esiData.txPDO = parsePDOs(esiBinary, categoryOffset + 2, categorySize);
171  break;
172  case 51:
173  // RxPDO
174  esiData.rxPDO = parsePDOs(esiBinary, categoryOffset + 2, categorySize);
175  break;
176  // 60+ are reserved or vendor specific -> ignored
177  }
178  categoryOffset += 2 + categorySize;
179  categoryType = getU16W(esiBinary, categoryOffset);
180  // Attention - the MSB is undefined! -> setting to zero.
181  categoryType &= (1 << 15) - 1;
182  categorySize = getU16W(esiBinary, categoryOffset + 1);
183  }
184  return esiData;
185  }
186 
187  ESIHeader
188  ESIParser::parseHeader(const std::vector<std::byte>& esiBinary)
189  {
190  ESIHeader esiHeader;
191  esiHeader.pdiControl = getU16W(esiBinary, 0x0000);
192  esiHeader.pdiConfiguration = getU16W(esiBinary, 0x0001);
193  esiHeader.syncImpulseLen = getU16W(esiBinary, 0x0002);
194  esiHeader.pdiConfiguration2 = getU16W(esiBinary, 0x0003);
195  esiHeader.stationAlias = getU16W(esiBinary, 0x0004);
196  esiHeader.checkSum = getU16W(esiBinary, 0x0007);
197  esiHeader.vendorID = getU32W(esiBinary, 0x0008);
198  esiHeader.productCode = getU32W(esiBinary, 0x000A);
199  esiHeader.revisionNumber = getU32W(esiBinary, 0x000C);
200  esiHeader.serialNumber = getU32W(esiBinary, 0x000E);
201  esiHeader.bootstrapReceiveMailboxOffset = getU16W(esiBinary, 0x0014);
202  esiHeader.bootstrapReceiveMailboxSize = getU16W(esiBinary, 0x0015);
203  esiHeader.bootstrapSendMailboxOffset = getU16W(esiBinary, 0x0016);
204  esiHeader.bootstrapSendMailboxSize = getU16W(esiBinary, 0x0017);
205  esiHeader.standardReceiveMailboxOffset = getU16W(esiBinary, 0x0018);
206  esiHeader.standardReceiveMailboxSize = getU16W(esiBinary, 0x0019);
207  esiHeader.standardSendMailboxOffset = getU16W(esiBinary, 0x001A);
208  esiHeader.standardSendMailboxSize = getU16W(esiBinary, 0x001B);
209  esiHeader.mailboxProtocol = getU16W(esiBinary, 0x001C);
210  esiHeader.eepromSize = getU16W(esiBinary, 0x003E);
211  esiHeader.version = getU16W(esiBinary, 0x003F);
212  return esiHeader;
213  }
214 
215  std::vector<std::string>
216  ESIParser::parseStrings(const std::vector<std::byte>& esiBinary, std::uint16_t wordOffset)
217  {
218  std::vector<std::string> strings;
219  auto nStrings = getU8(esiBinary, 2 * wordOffset);
220  strings.reserve(nStrings);
221  std::uint16_t currentOffset = 2 * wordOffset + 1;
222  for (auto i = 0; i < nStrings; ++i)
223  {
224  std::uint8_t len;
225  std::string tmp;
226  len = static_cast<std::uint8_t>(esiBinary.at(currentOffset));
227  ++currentOffset;
228  if (currentOffset + len > esiBinary.size())
229  ARMARX_FATAL << "The ESI binary ended unexpectedly while reading a string!";
230  tmp.assign(reinterpret_cast<const char*>(&esiBinary[currentOffset]), len);
231  strings.emplace_back(tmp);
232  currentOffset += len;
233  }
234  return strings;
235  }
236 
237  ESIGeneral
238  ESIParser::parseGeneral(const std::vector<std::byte>& esiBinary, std::uint16_t wordOffset)
239  {
240  ESIGeneral esiGeneral;
241  std::uint16_t offset = 2 * wordOffset;
242  esiGeneral.groupIdx = getU8(esiBinary, offset + 0x0000);
243  esiGeneral.imgIdx = getU8(esiBinary, offset + 0x0001);
244  esiGeneral.orderIdx = getU8(esiBinary, offset + 0x0002);
245  esiGeneral.nameIdx = getU8(esiBinary, offset + 0x0003);
246  esiGeneral.coEDetails = getU8(esiBinary, offset + 0x0005);
247  esiGeneral.foEDetails = getU8(esiBinary, offset + 0x0006);
248  esiGeneral.eoEDetails = getU8(esiBinary, offset + 0x0007);
249  esiGeneral.soEChannels = getU8(esiBinary, offset + 0x0008);
250  esiGeneral.dS402Channels = getU8(esiBinary, offset + 0x0009);
251  esiGeneral.sysmanClass = getU8(esiBinary, offset + 0x000a);
252  esiGeneral.flags = getU8(esiBinary, offset + 0x000b);
253  esiGeneral.currentOnEBus = get16(esiBinary, offset + 0x000c);
254  esiGeneral.physicalPort = getU16(esiBinary, offset + 0x0010);
255  esiGeneral.physicalMemoryAddress = getU16(esiBinary, offset + 0x0012);
256  return esiGeneral;
257  }
258 
259  ESIFMMU
260  ESIParser::parseFMMU(const std::vector<std::byte>& esiBinary,
261  std::uint16_t wordOffset,
262  std::uint16_t len)
263  {
264  std::uint16_t count = 2 * len;
265  ESIFMMU esiFmmu;
266  esiFmmu.reserve(count);
267  for (std::uint16_t i = 0; i < count; ++i)
268  {
269  esiFmmu.emplace_back(getU8(esiBinary, 2 * wordOffset + i));
270  }
271  return esiFmmu;
272  }
273 
274  ESISyncM
275  ESIParser::parseSyncM(const std::vector<std::byte>& esiBinary,
276  std::uint16_t wordOffset,
277  std::uint16_t len)
278  {
279  const std::uint16_t syncMElementLen = 8;
280  const std::uint16_t count = 2 * len / syncMElementLen;
281  ESISyncM esiSyncM;
282  esiSyncM.reserve(count);
283  std::uint16_t currentOffset = 2 * wordOffset;
284  for (size_t i = 0; i < count; ++i)
285  {
286  ESISyncMElement elem;
287  elem.physicalStartAddress = getU16(esiBinary, currentOffset + 0x0000);
288  elem.length = getU16(esiBinary, currentOffset + 0x0002);
289  elem.controlRegister = getU8(esiBinary, currentOffset + 0x0004);
290  elem.statusRegister = getU8(esiBinary, currentOffset + 0x0005);
291  elem.enableSynchManager = getU8(esiBinary, currentOffset + 0x0006);
292  elem.syncManagerType = getU8(esiBinary, currentOffset + 0x0007);
293  esiSyncM.emplace_back(elem);
294  currentOffset += syncMElementLen;
295  }
296  return esiSyncM;
297  }
298 
299  std::vector<ESIPDOObject>
300  ESIParser::parsePDOs(const std::vector<std::byte>& esiBinary,
301  std::uint16_t wordOffset,
302  std::uint16_t len)
303  {
304  std::vector<ESIPDOObject> esiPDOs;
305  std::uint16_t currentOffset = 2 * wordOffset;
306  while (currentOffset < 2 * (wordOffset + len))
307  {
308  ESIPDOObject pdoObject;
309  pdoObject.pdoIndex = getU16(esiBinary, currentOffset + 0x0000);
310  pdoObject.entryCount = getU8(esiBinary, currentOffset + 0x0002);
311  pdoObject.syncManager = getU8(esiBinary, currentOffset + 0x0003);
312  pdoObject.synchronization = getU8(esiBinary, currentOffset + 0x0004);
313  pdoObject.nameIdx = getU8(esiBinary, currentOffset + 0x0005);
314  pdoObject.flags = getU16(esiBinary, currentOffset + 0x0006);
315  pdoObject.entries = std::vector<ESIPDOEntry>{pdoObject.entryCount};
316  currentOffset += 8;
317  for (int i = 0; i < pdoObject.entryCount; ++i)
318  {
319  ESIPDOEntry pdoEntry;
320  pdoEntry.index = getU16(esiBinary, currentOffset + 0x0000);
321  pdoEntry.subIndex = getU8(esiBinary, currentOffset + 0x0002);
322  pdoEntry.nameIdx = getU8(esiBinary, currentOffset + 0x0003);
323  pdoEntry.dataType = getU8(esiBinary, currentOffset + 0x0004);
324  pdoEntry.bitLength = getU8(esiBinary, currentOffset + 0x0005);
325  pdoEntry.flags = getU16(esiBinary, currentOffset + 0x0006);
326  pdoObject.entries.emplace_back(pdoEntry);
327  currentOffset += 8;
328  }
329  esiPDOs.emplace_back(pdoObject);
330  }
331  return esiPDOs;
332  }
333 } // namespace armarx::control::ethercat
armarx::control::ethercat::ESIHeader::stationAlias
std::uint16_t stationAlias
Definition: ESI.h:73
armarx::control::ethercat::ESISyncMElement::length
std::uint16_t length
Definition: ESI.h:129
armarx::control::ethercat::ESIParser::parseGeneral
ESIGeneral parseGeneral(const std::vector< std::byte > &esiBinary, std::uint16_t wordOffset)
Definition: ESI.cpp:238
armarx::control::ethercat::ESIHeader::serialNumber
std::uint32_t serialNumber
Definition: ESI.h:78
armarx::control::ethercat::ESISyncMElement::physicalStartAddress
std::uint16_t physicalStartAddress
Definition: ESI.h:128
armarx::control::ethercat::ESIPDOEntry::index
std::uint16_t index
Definition: ESI.h:140
armarx::control::ethercat::ESIGeneral::sysmanClass
std::uint8_t sysmanClass
Definition: ESI.h:115
ESI.h
armarx::control::ethercat::ESIHeader::standardSendMailboxSize
std::uint16_t standardSendMailboxSize
Definition: ESI.h:86
armarx::control::ethercat::ESIPDOObject::entryCount
std::uint8_t entryCount
Definition: ESI.h:151
armarx::control::ethercat::ESIGeneral::physicalMemoryAddress
std::uint16_t physicalMemoryAddress
Definition: ESI.h:119
armarx::control::ethercat::ESIGeneral::imgIdx
std::uint8_t imgIdx
Definition: ESI.h:107
armarx::control::ethercat::ESIPDOObject::syncManager
std::uint8_t syncManager
Definition: ESI.h:152
armarx::control::ethercat::ESIHeader::version
std::uint16_t version
Definition: ESI.h:89
armarx::control::ethercat::getU16W
std::uint16_t getU16W(const std::vector< std::byte > &esiBinary, std::uint16_t wordAddress)
Definition: ESI.cpp:107
armarx::control::ethercat::ESIPDOObject::entries
std::vector< ESIPDOEntry > entries
Definition: ESI.h:156
armarx::control::ethercat::ESIHandler::readESIBinaryBlob
std::optional< std::vector< std::byte > > readESIBinaryBlob(std::uint16_t slaveIndex, std::uint16_t startAddress, std::uint16_t endAddress) const
Definition: ESI.cpp:16
armarx::control::ethercat::ESIHeader::productCode
std::uint32_t productCode
Definition: ESI.h:76
armarx::control::ethercat::ESIHeader::standardReceiveMailboxSize
std::uint16_t standardReceiveMailboxSize
Definition: ESI.h:84
armarx::control::ethercat::ESIHeader::pdiControl
std::uint16_t pdiControl
Definition: ESI.h:69
armarx::control::ethercat::ESIHeader::bootstrapReceiveMailboxOffset
std::uint16_t bootstrapReceiveMailboxOffset
Definition: ESI.h:79
armarx::control::ethercat::ESIPDOObject::flags
std::uint16_t flags
Definition: ESI.h:155
armarx::control::ethercat::get16
std::int16_t get16(const std::vector< std::byte > &esiBinary, std::uint16_t address)
Definition: ESI.cpp:100
armarx::control::ethercat::ESIParser::parseHeader
ESIHeader parseHeader(const std::vector< std::byte > &esiBinary)
Definition: ESI.cpp:188
armarx::control::ethercat::ESIHeader
Definition: ESI.h:67
armarx::control::ethercat::ESIGeneral::dS402Channels
std::uint8_t dS402Channels
Definition: ESI.h:114
armarx::control::ethercat::ESIParser::parseSyncM
ESISyncM parseSyncM(const std::vector< std::byte > &esiBinary, std::uint16_t wordOffset, std::uint16_t len)
Definition: ESI.cpp:275
armarx::control::ethercat::ESIPDOEntry
Definition: ESI.h:138
armarx::control::ethercat::ESIHeader::standardReceiveMailboxOffset
std::uint16_t standardReceiveMailboxOffset
Definition: ESI.h:83
armarx::control::ethercat::ESIData
Holds ESI data that can be read from slaves via SII.
Definition: ESI.h:167
armarx::control::ethercat::getU16
std::uint16_t getU16(const std::vector< std::byte > &esiBinary, std::uint16_t address)
Definition: ESI.cpp:90
armarx::control::ethercat::ESIGeneral::nameIdx
std::uint8_t nameIdx
Definition: ESI.h:109
ARMARX_FATAL
#define ARMARX_FATAL
Definition: Logging.h:192
armarx::control::ethercat::ESIGeneral::currentOnEBus
std::int16_t currentOnEBus
Definition: ESI.h:117
armarx::control::ethercat::ESIHeader::checkSum
std::uint16_t checkSum
Definition: ESI.h:74
armarx::control::ethercat::ESIHeader::bootstrapSendMailboxOffset
std::uint16_t bootstrapSendMailboxOffset
Definition: ESI.h:81
armarx::control::ethercat::ESIGeneral
Definition: ESI.h:104
armarx::control::ethercat::ESIParser::parsePDOs
std::vector< ESIPDOObject > parsePDOs(const std::vector< std::byte > &esiBinary, std::uint16_t wordOffset, std::uint16_t len)
Definition: ESI.cpp:300
armarx::control::ethercat::ESIPDOEntry::subIndex
std::uint8_t subIndex
Definition: ESI.h:141
armarx::control::ethercat::ESIHeader::vendorID
std::uint32_t vendorID
Definition: ESI.h:75
armarx::control::ethercat::ESIHeader::bootstrapReceiveMailboxSize
std::uint16_t bootstrapReceiveMailboxSize
Definition: ESI.h:80
armarx::control::ethercat::ESISyncMElement::syncManagerType
std::uint8_t syncManagerType
Definition: ESI.h:133
armarx::control::ethercat::ESIPDOObject::nameIdx
std::uint8_t nameIdx
Definition: ESI.h:154
armarx::control::ethercat::getU32
std::uint32_t getU32(const std::vector< std::byte > &esiBinary, std::uint16_t address)
Definition: ESI.cpp:113
armarx::control::ethercat
Definition: Bus.cpp:24
armarx::control::ethercat::ESISyncMElement::enableSynchManager
std::uint8_t enableSynchManager
Definition: ESI.h:132
armarx::control::ethercat::ESIHeader::eepromSize
std::uint16_t eepromSize
Definition: ESI.h:88
armarx::control::ethercat::ESIHeader::mailboxProtocol
std::uint16_t mailboxProtocol
Definition: ESI.h:87
armarx::control::ethercat::ESIGeneral::eoEDetails
std::uint8_t eoEDetails
Definition: ESI.h:112
ARMARX_CHECK_GREATER_EQUAL
#define ARMARX_CHECK_GREATER_EQUAL(lhs, rhs)
This macro evaluates whether lhs is greater or equal (>=) rhs and if it turns out to be false it will...
Definition: ExpressionException.h:123
armarx::control::ethercat::ESIParser::parseFMMU
ESIFMMU parseFMMU(const std::vector< std::byte > &esiBinary, std::uint16_t wordOffset, std::uint16_t len)
Definition: ESI.cpp:260
armarx::control::ethercat::ESISyncMElement::controlRegister
std::uint8_t controlRegister
Definition: ESI.h:130
armarx::control::ethercat::getU8
std::uint8_t getU8(const std::vector< std::byte > &esiBinary, std::uint16_t address)
Definition: ESI.cpp:82
ExpressionException.h
armarx::control::ethercat::getU32W
std::uint32_t getU32W(const std::vector< std::byte > &esiBinary, std::uint16_t wordAddress)
Definition: ESI.cpp:125
armarx::control::ethercat::ESIPDOEntry::dataType
std::uint8_t dataType
Definition: ESI.h:143
armarx::control::ethercat::ESIGeneral::soEChannels
std::uint8_t soEChannels
Definition: ESI.h:113
armarx::control::ethercat::ESIPDOObject::pdoIndex
std::uint16_t pdoIndex
Definition: ESI.h:150
armarx::control::ethercat::ESIHeader::pdiConfiguration
std::uint16_t pdiConfiguration
Definition: ESI.h:70
armarx::control::ethercat::ESIPDOObject
Definition: ESI.h:148
slaveConfiguredAddress
uint16_t slaveConfiguredAddress
Definition: EtherCATFrame.h:60
armarx::control::ethercat::ESIGeneral::orderIdx
std::uint8_t orderIdx
Definition: ESI.h:108
armarx::control::ethercat::ESIGeneral::physicalPort
std::uint16_t physicalPort
Definition: ESI.h:118
armarx::control::ethercat::ESISyncMElement
Definition: ESI.h:126
armarx::control::ethercat::ESIGeneral::foEDetails
std::uint8_t foEDetails
Definition: ESI.h:111
GENERAL_ERROR
#define GENERAL_ERROR(...)
Definition: ErrorReporting.h:255
armarx::control::ethercat::ESIData::header
ESIHeader header
Definition: ESI.h:169
armarx::control::ethercat::ESIPDOEntry::bitLength
std::uint8_t bitLength
Definition: ESI.h:144
armarx::control::ethercat::ESIHeader::syncImpulseLen
std::uint16_t syncImpulseLen
Definition: ESI.h:71
armarx::control::ethercat::ESISyncM
std::vector< ESISyncMElement > ESISyncM
Definition: ESI.h:136
armarx::control::ethercat::ESISyncMElement::statusRegister
std::uint8_t statusRegister
Definition: ESI.h:131
armarx::control::ethercat::ESIParser::parseStrings
std::vector< std::string > parseStrings(const std::vector< std::byte > &esiBinary, std::uint16_t wordOffset)
Definition: ESI.cpp:216
armarx::control::ethercat::ESIParser::parseESI
ESIData parseESI(const std::vector< std::byte > &esiBinary)
Parse a standard-conformant binary in SII format to an ESI structure.
Definition: ESI.cpp:131
armarx::control::ethercat::ESIHeader::revisionNumber
std::uint32_t revisionNumber
Definition: ESI.h:77
armarx::control::ethercat::ESIHeader::bootstrapSendMailboxSize
std::uint16_t bootstrapSendMailboxSize
Definition: ESI.h:82
armarx::control::ethercat::ESIPDOObject::synchronization
std::uint8_t synchronization
Definition: ESI.h:153
armarx::control::ethercat::ESIPDOEntry::flags
std::uint16_t flags
Definition: ESI.h:145
armarx::control::ethercat::ESIGeneral::flags
std::uint8_t flags
Definition: ESI.h:116
armarx::control::ethercat::ESIGeneral::groupIdx
std::uint8_t groupIdx
Definition: ESI.h:106
armarx::control::ethercat::ESIHeader::standardSendMailboxOffset
std::uint16_t standardSendMailboxOffset
Definition: ESI.h:85
armarx::control::ethercat::ESIHeader::pdiConfiguration2
std::uint16_t pdiConfiguration2
Definition: ESI.h:72
armarx::control::ethercat::ESIGeneral::coEDetails
std::uint8_t coEDetails
Definition: ESI.h:110
armarx::control::ethercat::ESIPDOEntry::nameIdx
std::uint8_t nameIdx
Definition: ESI.h:142
armarx::control::ethercat::ESIFMMU
std::vector< std::uint8_t > ESIFMMU
Definition: ESI.h:124