objdictgen/nodemanager.py
changeset 299 506f9700b9fb
parent 268 8a21eb5bdedc
child 327 b904d9a99e28
equal deleted inserted replaced
298:dba062c5c3c1 299:506f9700b9fb
   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"