Motorcortex Core  version: 2.7.6
ecat_xml_v1_0.h
1 /*
2  * Developer : Alexey Zakharov (alexey.zakharov@vectioneer.com)
3  * All rights reserved. Copyright (c) 2015 - 2018 VECTIONEER.
4  */
5 
6 #ifndef ECAT_XML_V1_0_H
7 #define ECAT_XML_V1_0_H
8 
9 #include "ecat_xml.h"
10 #include <algorithm>
11 #include <initializer_list>
12 #include <string>
13 
14 namespace mcx::ecat {
15 
16 class EtherCatXmlV1_0 : public EtherCatXml {
17 public:
18  EtherCatXmlV1_0() = default;
19 
20  virtual ~EtherCatXmlV1_0() = default;
21 
22  // loads domain configuration from xml element
23  EcatDomainConfig loadDomainConfig(tinyxml2::XMLElement* domain_xml, const std::string& path) const override;
24 
25 private:
26  // loads devices from etherlab xml file
27  int loadTopologyXml(const std::string& path, const std::string& filename,
28  std::vector<EcatDevice>& device_config_list) const;
29 
30  bool loadSdoXml(tinyxml2::XMLElement* device, unsigned int device_id,
31  std::vector<EcatSdoConfig>* sdo_config_list) const;
32 
33  std::vector<EcatPdoInfo> loadDataMaps(tinyxml2::XMLElement* parent) const;
34 
35  bool loadPdoXml(tinyxml2::XMLElement* device, const EcatDevice& device_config,
36  std::vector<EcatSyncInfo>* sync_info_list) const;
37 
38  // loads mailbox configuration
39  bool loadMailboxXml(tinyxml2::XMLElement* device, const EcatDevice& device_config, const std::string& path,
40  std::vector<EcatMailbox>* mailbox_config_list) const;
41 
42  bool loadDcXml(tinyxml2::XMLElement* device, const EcatDevice& device_config, EcatDcInfo* dc_config) const;
43 
44  // loading provided xml file with init parameters
45  bool loadInitCmdXml(const std::string& path, const std::string& filename, EcatMailbox& mailbox_config) const;
46 
47  // loading mailbox xlm with SoE tag
48  bool parseSoe(tinyxml2::XMLNode* soe_node, std::vector<EcatSoe>& soe) const;
49 
50  // loading mailbox xml with CoE tag
51  bool parseCoe(tinyxml2::XMLNode* coe_node, std::vector<EcatCoe>& coe) const;
52 
53  // loading mailbox from csv file
54  bool parseCsvCoe(const char* csv_file, std::vector<EcatCoe>& coe) const;
55 
56  double getNoErrorSec(tinyxml2::XMLElement* element) const;
57 
58  double getErrorSec(tinyxml2::XMLElement* element) const;
59 
60  bool getSdoRecovery(tinyxml2::XMLElement* element) const;
61 
62  bool getXmlAttrib(tinyxml2::XMLElement* element, const char* attrib, unsigned int& val) const;
63 
64  bool getXmlAttribHex(tinyxml2::XMLElement* element, const char* attrib, unsigned int& val) const;
65 
66  tinyxml2::XMLElement* getFirstDevice(tinyxml2::XMLNode* element) const;
67 
68  tinyxml2::XMLElement* getFirstSmElement(tinyxml2::XMLNode* element) const;
69 
70  tinyxml2::XMLElement* getFirstDcElement(tinyxml2::XMLNode* element) const;
71 
72  tinyxml2::XMLNode* getFirstPdoElement(tinyxml2::XMLNode* element) const;
73 
74  tinyxml2::XMLNode* nextSiblingPdoElement(tinyxml2::XMLNode* element) const;
75 
76  bool hasMapAll(const tinyxml2::XMLElement* element) const;
77 
78  bool getMapAll(const tinyxml2::XMLElement* element) const;
79 
80  EcatPdoId getPdoEntryId(tinyxml2::XMLElement* element, const std::string& element_name) const;
81 
82  EcatPdoId getSdoEntryId(tinyxml2::XMLElement* element) const;
83 
84  bool hasAlias(tinyxml2::XMLElement* element) const;
85 
86  bool getAlias(tinyxml2::XMLElement* element, unsigned int* alias, unsigned int* position) const;
87 
88  unsigned int getId(tinyxml2::XMLElement* element) const;
89 
90  unsigned int getSize(tinyxml2::XMLElement* element) const;
91 
92  EcatPdoInfo getDataMap(tinyxml2::XMLElement* element) const;
93 
94  ParameterLink getParameterLink(tinyxml2::XMLElement* element, ParameterLinkType type) const;
95 
96  unsigned int strToUIntHex(const char* str, bool force_hex = false) const;
97 
98  unsigned long strToULongHex(const char* str, bool force_hex = false) const;
99 
100  unsigned int getVendorId(tinyxml2::XMLNode* element) const;
101 
102  unsigned int getProductCode(tinyxml2::XMLNode* element) const;
103 
104  unsigned int getSyncManagerId(tinyxml2::XMLNode* pdo) const;
105 
106  unsigned int getIndex(tinyxml2::XMLNode* element) const;
107 
108  unsigned int getSubIndex(tinyxml2::XMLNode* element) const;
109 
110  unsigned int getBitLen(tinyxml2::XMLNode* element) const;
111 
112  const char* getDeviceName(tinyxml2::XMLNode* element) const;
113 
114  DataTypeDesc getDataType(tinyxml2::XMLNode* element) const; /* deprecated */
115 
116  DataTypeDesc getDataTypeAttr(tinyxml2::XMLElement* element) const;
117 
118  bool isRxPdo(tinyxml2::XMLNode* element) const;
119 
120  bool isTxPdo(tinyxml2::XMLNode* element) const;
121 
122  // device/slave config list helper functions
123  bool getSyncInfo(const std::vector<EcatSyncInfo>& sync_info_list, unsigned int sm_index,
124  EcatSyncInfo*& sync_info) const;
125 
126  bool getSyncAndPdoInfo(const std::vector<EcatSyncInfo>& sync_info_list, unsigned int pdo_index,
127  EcatSyncInfo*& sm_info, EcatPdoInfo*& pdo_info) const;
128 
129  bool getSyncAndPdoAndEntryInfo(const std::vector<EcatSyncInfo>& sync_info_list, const EcatPdoId& pdo_id,
130  EcatSyncInfo*& sm_info, EcatPdoInfo*& pdo_info, EcatPdoInfo*& entry_info) const;
131 
132  bool getPdoInfo(const std::vector<EcatPdoInfo>& pdo_info_list, unsigned int pdo_index, EcatPdoInfo*& pdo_info) const;
133 
134  bool getEntryInfo(const std::vector<EcatPdoInfo>& entry_info_list, unsigned int entry_index,
135  unsigned int entry_subindex, bool is_mapped, EcatPdoInfo*& entry_info) const;
136 
137  static unsigned int getPdoBitLength(const std::vector<EcatPdoInfo>& entry_info_list);
138 
139  inline static unsigned int getDeviceId(const EcatDevice& config_list_element);
140 
141  inline static unsigned int getDeviceId(const EcatDeviceConfig& config_list_element);
142 
143  template <typename T>
144  bool findSlaveByDeviceId(const std::vector<T>& config_list, unsigned int device_id, T& config_list_element) const;
145 
146  template <typename T>
147  bool getSlaveByDeviceId(const std::vector<T>& config_list, unsigned int device_id, T*& config_list_element_ptr) const;
148 };
149 
150 inline unsigned int EtherCatXmlV1_0::getDeviceId(const EcatDevice& config_list_element) {
151  return config_list_element.device_info.position;
152 }
153 
154 inline unsigned int EtherCatXmlV1_0::getDeviceId(const EcatDeviceConfig& config_list_element) {
155  return config_list_element.info.position;
156 }
157 
158 } // namespace mcx::ecat
159 
160 #endif /* ECAT_XML_V1_0_H */
mcx::ecat::EcatPdoInfo
Definition: ecat_xmltypes.h:113
mcx::ecat::EtherCatXmlV1_0
Definition: ecat_xml_v1_0.h:16
mcx::ecat::EcatDomainConfig
Definition: ecat_xmltypes.h:255
mcx::ecat::EcatMailbox
Definition: ecat_xmltypes.h:242
mcx::ecat::EcatSyncInfo
Definition: ecat_xmltypes.h:134
mcx::ecat::EcatPdoId
Definition: ecat_xmltypes.h:87
mcx::ecat::DataTypeDesc
Definition: ecat_datatype.h:24
mcx::ecat::EcatDcInfo
Definition: ecat_xmltypes.h:167
mcx::ecat::EtherCatXml
Definition: ecat_xml.h:24
mcx::ecat::EcatDevice
Definition: ecat_xmltypes.h:187
mcx::ecat::EcatDeviceConfig
Definition: ecat_xmltypes.h:247