etherlab/CommonEtherCATFunction.py
changeset 2459 21164625b393
parent 2446 922f0d84f869
child 2643 b98d9e08231f
equal deleted inserted replaced
2458:2a70d5240300 2459:21164625b393
     7 # Copyright (C) 2013: Real-Time & Embedded Systems (RTES) Lab. University of Seoul, Korea
     7 # Copyright (C) 2013: Real-Time & Embedded Systems (RTES) Lab. University of Seoul, Korea
     8 #
     8 #
     9 # See COPYING file for copyrights details.
     9 # See COPYING file for copyrights details.
    10 
    10 
    11 from __future__ import absolute_import
    11 from __future__ import absolute_import
       
    12 from __future__ import division
       
    13 from builtins import str as text
       
    14 import codecs
    12 import wx
    15 import wx
       
    16 
    13 
    17 
    14 mailbox_protocols = ["AoE", "EoE", "CoE", "FoE", "SoE", "VoE"]
    18 mailbox_protocols = ["AoE", "EoE", "CoE", "FoE", "SoE", "VoE"]
    15 
    19 
    16 
    20 
    17 def ExtractHexDecValue(value):
    21 def ExtractHexDecValue(value):
   180         """
   184         """
   181         Constructor
   185         Constructor
   182         @param controler: _EthercatSlaveCTN class in EthercatSlave.py
   186         @param controler: _EthercatSlaveCTN class in EthercatSlave.py
   183         """
   187         """
   184         self.Controler = controler
   188         self.Controler = controler
   185 
   189         self.HexDecode = codecs.getdecoder("hex_codec")
   186         self.ClearSDODataSet()
   190         self.ClearSDODataSet()
   187 
   191 
   188     # -------------------------------------------------------------------------------
   192     # -------------------------------------------------------------------------------
   189     #                        Used Master State
   193     #                        Used Master State
   190     # -------------------------------------------------------------------------------
   194     # -------------------------------------------------------------------------------
   547         value = "%x" % decnum
   551         value = "%x" % decnum
   548         value_len = len(value)
   552         value_len = len(value)
   549         if (value_len % 2) == 0:
   553         if (value_len % 2) == 0:
   550             hex_len = value_len
   554             hex_len = value_len
   551         else:
   555         else:
   552             hex_len = (value_len / 2) * 2 + 2
   556             hex_len = (value_len // 2) * 2 + 2
   553 
   557 
   554         hex_data = ("{:0>"+str(hex_len)+"x}").format(decnum)
   558         hex_data = ("{:0>"+str(hex_len)+"x}").format(decnum)
   555 
   559 
   556         return hex_data
   560         return hex_data
   557 
   561 
   587         self.BinaryCode = return_val
   591         self.BinaryCode = return_val
   588         self.Controler.SiiData = self.BinaryCode
   592         self.Controler.SiiData = self.BinaryCode
   589 
   593 
   590         # append zero-filled padding data up to EEPROM size
   594         # append zero-filled padding data up to EEPROM size
   591         for dummy in range(self.SmartViewInfosFromXML["eeprom_size"] - len(self.BinaryCode)):
   595         for dummy in range(self.SmartViewInfosFromXML["eeprom_size"] - len(self.BinaryCode)):
   592             self.BinaryCode = self.BinaryCode + 'ff'.decode('hex')
   596             self.BinaryCode = self.BinaryCode + self.HexDecode('ff')[0]
   593 
   597 
   594         return self.BinaryCode
   598         return self.BinaryCode
   595 
   599 
   596     def HexRead(self, binary):
   600     def HexRead(self, binary):
   597         """
   601         """
   646         @return eeprom_list : reconstructed list data structure
   650         @return eeprom_list : reconstructed list data structure
   647         """
   651         """
   648         eeprom_list = []
   652         eeprom_list = []
   649 
   653 
   650         if direction is 0 or 1:
   654         if direction is 0 or 1:
   651             for dummy in range(length/2):
   655             for dummy in range(length//2):
   652                 if data == "":
   656                 if data == "":
   653                     eeprom_list.append("00")
   657                     eeprom_list.append("00")
   654                 else:
   658                 else:
   655                     eeprom_list.append(data[direction*(length-2):direction*(length-2)+2])
   659                     eeprom_list.append(data[direction*(length-2):direction*(length-2)+2])
   656                 data = data[(1-direction)*2:length-direction*2]
   660                 data = data[(1-direction)*2:length-direction*2]
   806             # get EEPROM size for EEPROM offset 0x007c-0x007d;
   810             # get EEPROM size for EEPROM offset 0x007c-0x007d;
   807             data = ""
   811             data = ""
   808             for eeprom_element in device.getEeprom().getcontent():
   812             for eeprom_element in device.getEeprom().getcontent():
   809                 if eeprom_element["name"] == "ByteSize":
   813                 if eeprom_element["name"] == "ByteSize":
   810                     eeprom_size = int(str(eeprom_element))
   814                     eeprom_size = int(str(eeprom_element))
   811                     data = "{:0>4x}".format(int(eeprom_element)/1024*8-1)
   815                     data = "{:0>4x}".format(int(eeprom_element)//1024*8-1)
   812 
   816 
   813             if data == "":
   817             if data == "":
   814                 eeprom.append("00")
   818                 eeprom.append("00")
   815                 eeprom.append("00")
   819                 eeprom.append("00")
   816             else:
   820             else:
   855             for i in range(padding):
   859             for i in range(padding):
   856                 eeprom.append("ff")
   860                 eeprom.append("ff")
   857 
   861 
   858             # convert binary code
   862             # convert binary code
   859             for index in range(eeprom_size):
   863             for index in range(eeprom_size):
   860                 eeprom_binary = eeprom_binary + eeprom[index].decode('hex')
   864                 eeprom_binary = eeprom_binary + self.HexDecode(eeprom[index])[0]
   861 
   865 
   862             return eeprom_binary
   866             return eeprom_binary
   863 
   867 
   864     def ExtractEEPROMStringCategory(self, device):
   868     def ExtractEEPROMStringCategory(self, device):
   865         """
   869         """
   892         vendor_specific_data = ""
   896         vendor_specific_data = ""
   893         #   vendor_spec_strings : list of vendor specific "strings" for preventing duplicated strings
   897         #   vendor_spec_strings : list of vendor specific "strings" for preventing duplicated strings
   894         vendor_spec_strings = []
   898         vendor_spec_strings = []
   895         for element in device.getType().getcontent():
   899         for element in device.getType().getcontent():
   896             data += element
   900             data += element
   897         if data != "" and isinstance(data, unicode):
   901         if data != "" and isinstance(data, text):
   898             for vendor_spec_string in vendor_spec_strings:
   902             for vendor_spec_string in vendor_spec_strings:
   899                 if data == vendor_spec_string:
   903                 if data == vendor_spec_string:
   900                     self.OrderIdx = vendor_spec_strings.index(data)+1
   904                     self.OrderIdx = vendor_spec_strings.index(data)+1
   901                     typeflag = True
   905                     typeflag = True
   902                     break
   906                     break
   911                     vendor_specific_data += "{:0>2x}".format(ord(data[character]))
   915                     vendor_specific_data += "{:0>2x}".format(ord(data[character]))
   912         data = ""
   916         data = ""
   913 
   917 
   914         #  element2-1; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<GroupType>
   918         #  element2-1; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<GroupType>
   915         data = device.getGroupType()
   919         data = device.getGroupType()
   916         if data is not None and isinstance(data, unicode):
   920         if data is not None and isinstance(data, text):
   917             for vendor_spec_string in vendor_spec_strings:
   921             for vendor_spec_string in vendor_spec_strings:
   918                 if data == vendor_spec_string:
   922                 if data == vendor_spec_string:
   919                     self.GroupIdx = vendor_spec_strings.index(data)+1
   923                     self.GroupIdx = vendor_spec_strings.index(data)+1
   920                     grouptypeflag = True
   924                     grouptypeflag = True
   921                     break
   925                     break
   935                 for _vendor_id, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
   939                 for _vendor_id, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
   936                     for group_type, group_etc in vendor["groups"].iteritems():
   940                     for group_type, group_etc in vendor["groups"].iteritems():
   937                         for device_item in group_etc["devices"]:
   941                         for device_item in group_etc["devices"]:
   938                             if device == device_item[1]:
   942                             if device == device_item[1]:
   939                                 data = group_type
   943                                 data = group_type
   940                 if data is not None and isinstance(data, unicode):
   944                 if data is not None and isinstance(data, text):
   941                     for vendor_spec_string in vendor_spec_strings:
   945                     for vendor_spec_string in vendor_spec_strings:
   942                         if data == vendor_spec_string:
   946                         if data == vendor_spec_string:
   943                             self.GroupIdx = vendor_spec_strings.index(data)+1
   947                             self.GroupIdx = vendor_spec_strings.index(data)+1
   944                             grouptypeflag = True
   948                             grouptypeflag = True
   945                             break
   949                             break
   959             for _vendorId, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
   963             for _vendorId, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
   960                 for group_type, group_etc in vendor["groups"].iteritems():
   964                 for group_type, group_etc in vendor["groups"].iteritems():
   961                     for device_item in group_etc["devices"]:
   965                     for device_item in group_etc["devices"]:
   962                         if device == device_item[1]:
   966                         if device == device_item[1]:
   963                             data = group_etc["name"]
   967                             data = group_etc["name"]
   964         if data != "" and isinstance(data, unicode):
   968         if data != "" and isinstance(data, text):
   965             for vendor_spec_string in vendor_spec_strings:
   969             for vendor_spec_string in vendor_spec_strings:
   966                 if data == vendor_spec_string:
   970                 if data == vendor_spec_string:
   967                     groupnameflag = True
   971                     groupnameflag = True
   968                     break
   972                     break
   969             if groupnameflag is False:
   973             if groupnameflag is False:
   978 
   982 
   979         #  element4; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Name(LcId is "1033" or "1"?)>
   983         #  element4; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Name(LcId is "1033" or "1"?)>
   980         for element in device.getName():
   984         for element in device.getName():
   981             if element.getLcId() == 1 or element.getLcId() == 1033:
   985             if element.getLcId() == 1 or element.getLcId() == 1033:
   982                 data = element.getcontent()
   986                 data = element.getcontent()
   983         if data != "" and isinstance(data, unicode):
   987         if data != "" and isinstance(data, text):
   984             for vendor_spec_string in vendor_spec_strings:
   988             for vendor_spec_string in vendor_spec_strings:
   985                 if data == vendor_spec_string:
   989                 if data == vendor_spec_string:
   986                     self.NameIdx = vendor_spec_strings.index(data)+1
   990                     self.NameIdx = vendor_spec_strings.index(data)+1
   987                     devnameflag = True
   991                     devnameflag = True
   988                     break
   992                     break
   998         data = ""
  1002         data = ""
   999 
  1003 
  1000         #  element5-1; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Image16x14>
  1004         #  element5-1; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Image16x14>
  1001         if device.getcontent() is not None:
  1005         if device.getcontent() is not None:
  1002             data = device.getcontent()
  1006             data = device.getcontent()
  1003             if data is not None and isinstance(data, unicode):
  1007             if data is not None and isinstance(data, text):
  1004                 for vendor_spec_string in vendor_spec_strings:
  1008                 for vendor_spec_string in vendor_spec_strings:
  1005                     if data == vendor_spec_string:
  1009                     if data == vendor_spec_string:
  1006                         self.ImgIdx = vendor_spec_strings.index(data)+1
  1010                         self.ImgIdx = vendor_spec_strings.index(data)+1
  1007                         imageflag = True
  1011                         imageflag = True
  1008                         break
  1012                         break
  1022                 for _vendor_id, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
  1026                 for _vendor_id, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
  1023                     for group_type, group_etc in vendor["groups"].iteritems():
  1027                     for group_type, group_etc in vendor["groups"].iteritems():
  1024                         for device_item in group_etc["devices"]:
  1028                         for device_item in group_etc["devices"]:
  1025                             if device == device_item[1]:
  1029                             if device == device_item[1]:
  1026                                 data = group_etc
  1030                                 data = group_etc
  1027                 if data is not None and isinstance(data, unicode):
  1031                 if data is not None and isinstance(data, text):
  1028                     for vendor_spec_string in vendor_spec_strings:
  1032                     for vendor_spec_string in vendor_spec_strings:
  1029                         if data == vendor_spec_string:
  1033                         if data == vendor_spec_string:
  1030                             self.ImgIdx = vendor_spec_strings.index(data)+1
  1034                             self.ImgIdx = vendor_spec_strings.index(data)+1
  1031                             imageflag = True
  1035                             imageflag = True
  1032                             break
  1036                             break
  1130         if length % 4 == 0:
  1134         if length % 4 == 0:
  1131             pass
  1135             pass
  1132         else:
  1136         else:
  1133             length += length % 4
  1137             length += length % 4
  1134             padflag = True
  1138             padflag = True
  1135         eeprom.append("{:0>4x}".format(length/4)[2:4])
  1139         eeprom.append("{:0>4x}".format(length//4)[2:4])
  1136         eeprom.append("{:0>4x}".format(length/4)[0:2])
  1140         eeprom.append("{:0>4x}".format(length//4)[0:2])
  1137         #  total numbers of strings
  1141         #  total numbers of strings
  1138         eeprom.append("{:0>2x}".format(count))
  1142         eeprom.append("{:0>2x}".format(count))
  1139         for element in [vendor_specific_data,
  1143         for element in [vendor_specific_data,
  1140                         dc_related_elements,
  1144                         dc_related_elements,
  1141                         input_elements,
  1145                         input_elements,
  1142                         output_elements]:
  1146                         output_elements]:
  1143             for dummy in range(len(element)/2):
  1147             for dummy in range(len(element)//2):
  1144                 if element == "":
  1148                 if element == "":
  1145                     eeprom.append("00")
  1149                     eeprom.append("00")
  1146                 else:
  1150                 else:
  1147                     eeprom.append(element[0:2])
  1151                     eeprom.append(element[0:2])
  1148                 element = element[2:len(element)]
  1152                 element = element[2:len(element)]
  1283             eeprom.append("28")
  1287             eeprom.append("28")
  1284             eeprom.append("00")
  1288             eeprom.append("00")
  1285             #  category length
  1289             #  category length
  1286             if count % 2 == 1:
  1290             if count % 2 == 1:
  1287                 padflag = True
  1291                 padflag = True
  1288                 eeprom.append("{:0>4x}".format((count+1)/2)[2:4])
  1292                 eeprom.append("{:0>4x}".format((count+1)//2)[2:4])
  1289                 eeprom.append("{:0>4x}".format((count+1)/2)[0:2])
  1293                 eeprom.append("{:0>4x}".format((count+1)//2)[0:2])
  1290             else:
  1294             else:
  1291                 eeprom.append("{:0>4x}".format((count)/2)[2:4])
  1295                 eeprom.append("{:0>4x}".format((count)//2)[2:4])
  1292                 eeprom.append("{:0>4x}".format((count)/2)[0:2])
  1296                 eeprom.append("{:0>4x}".format((count)//2)[0:2])
  1293             for dummy in range(count):
  1297             for dummy in range(count):
  1294                 if data == "":
  1298                 if data == "":
  1295                     eeprom.append("00")
  1299                     eeprom.append("00")
  1296                 else:
  1300                 else:
  1297                     eeprom.append(data[0:2])
  1301                     eeprom.append(data[0:2])
  1330         if data != "":
  1334         if data != "":
  1331             #  category header
  1335             #  category header
  1332             eeprom.append("29")
  1336             eeprom.append("29")
  1333             eeprom.append("00")
  1337             eeprom.append("00")
  1334             #  category length
  1338             #  category length
  1335             eeprom.append("{:0>4x}".format(len(data)/4)[2:4])
  1339             eeprom.append("{:0>4x}".format(len(data)//4)[2:4])
  1336             eeprom.append("{:0>4x}".format(len(data)/4)[0:2])
  1340             eeprom.append("{:0>4x}".format(len(data)//4)[0:2])
  1337             for dummy in range(len(data)/2):
  1341             for dummy in range(len(data)//2):
  1338                 if data == "":
  1342                 if data == "":
  1339                     eeprom.append("00")
  1343                     eeprom.append("00")
  1340                 else:
  1344                 else:
  1341                     eeprom.append(data[0:2])
  1345                     eeprom.append(data[0:2])
  1342                 data = data[2:len(data)]
  1346                 data = data[2:len(data)]
  1438                 eeprom.append("33")
  1442                 eeprom.append("33")
  1439             else:
  1443             else:
  1440                 eeprom.append("00")
  1444                 eeprom.append("00")
  1441             eeprom.append("00")
  1445             eeprom.append("00")
  1442             #  category length
  1446             #  category length
  1443             eeprom.append("{:0>4x}".format(len(data)/4)[2:4])
  1447             eeprom.append("{:0>4x}".format(len(data)//4)[2:4])
  1444             eeprom.append("{:0>4x}".format(len(data)/4)[0:2])
  1448             eeprom.append("{:0>4x}".format(len(data)//4)[0:2])
  1445             data = str(data.lower())
  1449             data = str(data.lower())
  1446             for dummy in range(len(data)/2):
  1450             for dummy in range(len(data)//2):
  1447                 if data == "":
  1451                 if data == "":
  1448                     eeprom.append("00")
  1452                     eeprom.append("00")
  1449                 else:
  1453                 else:
  1450                     eeprom.append(data[0:2])
  1454                     eeprom.append(data[0:2])
  1451                 data = data[2:len(data)]
  1455                 data = data[2:len(data)]
  1512         if data != "":
  1516         if data != "":
  1513             #  category header
  1517             #  category header
  1514             eeprom.append("3c")
  1518             eeprom.append("3c")
  1515             eeprom.append("00")
  1519             eeprom.append("00")
  1516             #  category length
  1520             #  category length
  1517             eeprom.append("{:0>4x}".format(len(data)/4)[2:4])
  1521             eeprom.append("{:0>4x}".format(len(data)//4)[2:4])
  1518             eeprom.append("{:0>4x}".format(len(data)/4)[0:2])
  1522             eeprom.append("{:0>4x}".format(len(data)//4)[0:2])
  1519             data = str(data.lower())
  1523             data = str(data.lower())
  1520             for dummy in range(len(data)/2):
  1524             for dummy in range(len(data)//2):
  1521                 if data == "":
  1525                 if data == "":
  1522                     eeprom.append("00")
  1526                     eeprom.append("00")
  1523                 else:
  1527                 else:
  1524                     eeprom.append(data[0:2])
  1528                     eeprom.append(data[0:2])
  1525                 data = data[2:len(data)]
  1529                 data = data[2:len(data)]