263 # Open and load file |
263 # Open and load file |
264 file = open(filepath, "r") |
264 file = open(filepath, "r") |
265 node = load(file) |
265 node = load(file) |
266 file.close() |
266 file.close() |
267 self.CurrentNode = node |
267 self.CurrentNode = node |
|
268 self.CurrentNode.SetNodeID(0) |
268 # Add a new buffer and defining current state |
269 # Add a new buffer and defining current state |
269 index = self.AddNodeBuffer(self.CurrentNode.Copy(), True) |
270 index = self.AddNodeBuffer(self.CurrentNode.Copy(), True) |
270 self.SetCurrentFilePath(filepath) |
271 self.SetCurrentFilePath(filepath) |
271 return index |
272 return index |
272 except: |
273 except: |
295 """ |
296 """ |
296 def CloseCurrent(self, ignore = False): |
297 def CloseCurrent(self, ignore = False): |
297 # Verify if it's not forced that the current node is saved before closing it |
298 # Verify if it's not forced that the current node is saved before closing it |
298 if self.UndoBuffers[self.NodeIndex].IsCurrentSaved() or ignore: |
299 if self.UndoBuffers[self.NodeIndex].IsCurrentSaved() or ignore: |
299 self.RemoveNodeBuffer(self.NodeIndex) |
300 self.RemoveNodeBuffer(self.NodeIndex) |
|
301 if len(self.UndoBuffers) > 0: |
|
302 previousindexes = [idx for idx in self.UndoBuffers.keys() if idx < self.NodeIndex] |
|
303 nextindexes = [idx for idx in self.UndoBuffers.keys() if idx > self.NodeIndex] |
|
304 if len(previousindexes) > 0: |
|
305 previousindexes.sort() |
|
306 self.NodeIndex = previousindexes[-1] |
|
307 elif len(nextindexes) > 0: |
|
308 nextindexes.sort() |
|
309 self.NodeIndex = nextindexes[0] |
|
310 else: |
|
311 self.NodeIndex = None |
|
312 else: |
|
313 self.NodeIndex = None |
300 return True |
314 return True |
301 return False |
315 return False |
302 |
316 |
303 """ |
317 """ |
304 Import an eds file and store it in a new buffer if no node edited |
318 Import an eds file and store it in a new buffer if no node edited |
372 """ |
386 """ |
373 def RemoveSubentriesFromCurrent(self, index, number): |
387 def RemoveSubentriesFromCurrent(self, index, number): |
374 # Informations about entry |
388 # Informations about entry |
375 infos = self.GetEntryInfos(index) |
389 infos = self.GetEntryInfos(index) |
376 length = self.CurrentNode.GetEntry(index, 0) |
390 length = self.CurrentNode.GetEntry(index, 0) |
|
391 if "nbmin" in infos: |
|
392 nbmin = infos["nbmin"] |
|
393 else: |
|
394 nbmin = 1 |
377 # Entry is a record, or is an array of manufacturer specific |
395 # Entry is a record, or is an array of manufacturer specific |
378 if infos["struct"] & OD_IdenticalSubindexes or 0x2000 <= index <= 0x5FFF and infos["struct"] & OD_IdenticalSubindexes: |
396 if infos["struct"] & OD_IdenticalSubindexes or 0x2000 <= index <= 0x5FFF and infos["struct"] & OD_IdenticalSubindexes: |
379 for i in xrange(min(number, length - 1)): |
397 for i in xrange(min(number, length - nbmin)): |
380 self.RemoveCurrentVariable(index, length - i) |
398 self.RemoveCurrentVariable(index, length - i) |
381 self.BufferCurrentNode() |
399 self.BufferCurrentNode() |
382 |
400 |
383 """ |
401 """ |
384 Add a SDO Server to current node |
402 Add a SDO Server to current node |
461 subentry_infos = self.GetSubentryInfos(index, 1) |
479 subentry_infos = self.GetSubentryInfos(index, 1) |
462 if "default" in subentry_infos: |
480 if "default" in subentry_infos: |
463 default = subentry_infos["default"] |
481 default = subentry_infos["default"] |
464 else: |
482 else: |
465 default = self.GetTypeDefaultValue(subentry_infos["type"]) |
483 default = self.GetTypeDefaultValue(subentry_infos["type"]) |
466 node.AddEntry(index, 1, default) |
484 node.AddEntry(index, value = []) |
|
485 if "nbmin" in subentry_infos: |
|
486 for i in xrange(subentry_infos["nbmin"]): |
|
487 node.AddEntry(index, i + 1, default) |
|
488 else: |
|
489 node.AddEntry(index, 1, default) |
467 # Second case entry is a record |
490 # Second case entry is a record |
468 else: |
491 else: |
469 i = 1 |
492 i = 1 |
470 subentry_infos = self.GetSubentryInfos(index, i) |
493 subentry_infos = self.GetSubentryInfos(index, i) |
471 while subentry_infos: |
494 while subentry_infos: |
489 self.RemoveCurrentVariable(index) |
512 self.RemoveCurrentVariable(index) |
490 if not disable_buffer: |
513 if not disable_buffer: |
491 self.BufferCurrentNode() |
514 self.BufferCurrentNode() |
492 return None |
515 return None |
493 |
516 |
|
517 |
|
518 """ |
|
519 Reset an subentry from current node to its default value |
|
520 """ |
|
521 def SetCurrentEntryToDefault(self, index, subindex, node = None): |
|
522 disable_buffer = node != None |
|
523 if node == None: |
|
524 node = self.CurrentNode |
|
525 if node.IsEntry(index, subindex): |
|
526 subentry_infos = self.GetSubentryInfos(index, subindex) |
|
527 if "default" in subentry_infos: |
|
528 default = subentry_infos["default"] |
|
529 else: |
|
530 default = self.GetTypeDefaultValue(subentry_infos["type"]) |
|
531 node.SetEntry(index, subindex, default) |
|
532 if not disable_buffer: |
|
533 self.BufferCurrentNode() |
494 |
534 |
495 """ |
535 """ |
496 Remove an entry from current node. Analize the index to perform the correct |
536 Remove an entry from current node. Analize the index to perform the correct |
497 method |
537 method |
498 """ |
538 """ |
651 dic[typeindex] = typevalue |
691 dic[typeindex] = typevalue |
652 if type not in dic: |
692 if type not in dic: |
653 type = node.GetEntry(type)[1] |
693 type = node.GetEntry(type)[1] |
654 if dic[type] == 0: |
694 if dic[type] == 0: |
655 try: |
695 try: |
656 if value.startswith("0x"): |
696 if value.startswith("$NODEID"): |
|
697 value = "\"%s\""%value |
|
698 elif value.startswith("0x"): |
657 value = int(value, 16) |
699 value = int(value, 16) |
658 else: |
700 else: |
659 value = int(value) |
701 value = int(value) |
660 node.SetEntry(index, subIndex, value) |
702 node.SetEntry(index, subIndex, value) |
661 except: |
703 except: |
894 def IsCurrentEntry(self, index): |
936 def IsCurrentEntry(self, index): |
895 if self.CurrentNode: |
937 if self.CurrentNode: |
896 return self.CurrentNode.IsEntry(index) |
938 return self.CurrentNode.IsEntry(index) |
897 return False |
939 return False |
898 |
940 |
899 def GetCurrentEntry(self, index, subIndex = None): |
941 def GetCurrentEntry(self, index, subIndex = None, compute = True): |
900 if self.CurrentNode: |
942 if self.CurrentNode: |
901 return self.CurrentNode.GetEntry(index, subIndex) |
943 return self.CurrentNode.GetEntry(index, subIndex, compute) |
902 return None |
944 return None |
903 |
945 |
904 def GetCurrentParamsEntry(self, index, subIndex = None): |
946 def GetCurrentParamsEntry(self, index, subIndex = None): |
905 if self.CurrentNode: |
947 if self.CurrentNode: |
906 return self.CurrentNode.GetParamsEntry(index, subIndex) |
948 return self.CurrentNode.GetParamsEntry(index, subIndex) |
945 def GetNodeEntryValues(self, node, index): |
987 def GetNodeEntryValues(self, node, index): |
946 if node and node.IsEntry(index): |
988 if node and node.IsEntry(index): |
947 entry_infos = node.GetEntryInfos(index) |
989 entry_infos = node.GetEntryInfos(index) |
948 data = [] |
990 data = [] |
949 editors = [] |
991 editors = [] |
950 values = node.GetEntry(index) |
992 values = node.GetEntry(index, compute = False) |
951 params = node.GetParamsEntry(index) |
993 params = node.GetParamsEntry(index) |
952 if type(values) == ListType: |
994 if type(values) == ListType: |
953 for i, value in enumerate(values): |
995 for i, value in enumerate(values): |
954 data.append({"value" : value}) |
996 data.append({"value" : value}) |
955 data[-1].update(params[i]) |
997 data[-1].update(params[i]) |
1013 dic["value"] = BoolType[dic["value"]] |
1055 dic["value"] = BoolType[dic["value"]] |
1014 result = type_model.match(dic["type"]) |
1056 result = type_model.match(dic["type"]) |
1015 if result: |
1057 if result: |
1016 values = result.groups() |
1058 values = result.groups() |
1017 if values[0] == "UNSIGNED": |
1059 if values[0] == "UNSIGNED": |
1018 format = "0x%0" + str(int(values[1])/4) + "X" |
1060 try: |
1019 dic["value"] = format%dic["value"] |
1061 format = "0x%0" + str(int(values[1])/4) + "X" |
|
1062 dic["value"] = format%dic["value"] |
|
1063 except: |
|
1064 pass |
1020 editor["value"] = "string" |
1065 editor["value"] = "string" |
1021 if values[0] == "INTEGER": |
1066 if values[0] == "INTEGER": |
1022 editor["value"] = "number" |
1067 editor["value"] = "number" |
1023 elif values[0] == "REAL": |
1068 elif values[0] == "REAL": |
1024 editor["value"] = "float" |
1069 editor["value"] = "float" |