equal
deleted
inserted
replaced
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)] |