objdictgen/nodemanager.py
changeset 244 da4245399655
parent 242 4864f7f01e1d
child 245 d43ebbed895f
equal deleted inserted replaced
243:7fcc129a06ce 244:da4245399655
   330 
   330 
   331     """
   331     """
   332     Add the specified number of subentry for the given entry. Verify that total
   332     Add the specified number of subentry for the given entry. Verify that total
   333     number of subentry (except 0) doesn't exceed nbmax defined
   333     number of subentry (except 0) doesn't exceed nbmax defined
   334     """
   334     """
   335     def AddSubentriesToCurrent(self, index, number):
   335     def AddSubentriesToCurrent(self, index, number, node = None):
       
   336         if node == None:
       
   337             disable_buffer = True
       
   338             node = self.CurrentNode  
       
   339         else:
       
   340             disable_buffer = False
   336         # Informations about entry
   341         # Informations about entry
   337         length = self.CurrentNode.GetEntry(index, 0)
   342         length = node.GetEntry(index, 0)
   338         infos = self.GetEntryInfos(index)
   343         infos = node.GetEntryInfos(index)
   339         subentry_infos = self.GetSubentryInfos(index, 1)
   344         subentry_infos = node.GetSubentryInfos(index, 1)
   340         # Get default value for subindex
   345         # Get default value for subindex
   341         if "default" in subentry_infos:
   346         if "default" in subentry_infos:
   342             default = subentry_infos["default"]
   347             default = subentry_infos["default"]
   343         else:
   348         else:
   344             default = self.GetTypeDefaultValue(subentry_infos["type"])   
   349             default = self.GetTypeDefaultValue(subentry_infos["type"])   
   345         # First case entry is record
   350         # First case entry is record
   346         if infos["struct"] & OD_IdenticalSubindexes:
   351         if infos["struct"] & OD_IdenticalSubindexes: 
   347             for i in xrange(1, min(number,subentry_infos["nbmax"]-length) + 1):
   352             for i in xrange(1, min(number,subentry_infos["nbmax"]-length) + 1):
   348                 self.CurrentNode.AddEntry(index, length + i, default)
   353                 node.AddEntry(index, length + i, default)
   349             self.BufferCurrentNode()
   354             if not disable_buffer:
       
   355                     self.BufferCurrentNode()
       
   356             return None
   350         # Second case entry is array, only possible for manufacturer specific
   357         # Second case entry is array, only possible for manufacturer specific
   351         elif infos["struct"] & OD_MultipleSubindexes and 0x2000 <= index <= 0x5FFF:
   358         elif infos["struct"] & OD_MultipleSubindexes and 0x2000 <= index <= 0x5FFF:
   352             values = {"name" : "Undefined", "type" : 5, "access" : "rw", "pdo" : True}
   359             values = {"name" : "Undefined", "type" : 5, "access" : "rw", "pdo" : True}
   353             for i in xrange(1, min(number,0xFE-length) + 1):
   360             for i in xrange(1, min(number,0xFE-length) + 1):
   354                 self.CurrentNode.AddMappingEntry(index, length + i, values = values.copy())
   361                 node.AddMappingEntry(index, length + i, values = values.copy())
   355                 self.CurrentNode.AddEntry(index, length + i, 0)
   362                 node.AddEntry(index, length + i, 0)
   356             self.BufferCurrentNode()
   363             if not disable_buffer:
       
   364                     self.BufferCurrentNode()
       
   365             return None
       
   366             
   357 
   367 
   358     """
   368     """
   359     Remove the specified number of subentry for the given entry. Verify that total
   369     Remove the specified number of subentry for the given entry. Verify that total
   360     number of subentry (except 0) isn't less than 1
   370     number of subentry (except 0) isn't less than 1
   361     """
   371     """
   435         return None
   445         return None
   436     
   446     
   437     """
   447     """
   438     Add entries specified in addinglist and remove entries specified in removinglist
   448     Add entries specified in addinglist and remove entries specified in removinglist
   439     """
   449     """
   440     def ManageEntriesOfCurrent(self, addinglist, removinglist):
   450     def ManageEntriesOfCurrent(self, addinglist, removinglist, node = None):
       
   451         if node == None:
       
   452             disable_buffer = True
       
   453             node = self.CurrentNode
       
   454         else:
       
   455             disable_buffer = False
   441         # Add all the entries in addinglist
   456         # Add all the entries in addinglist
   442         for index in addinglist:
   457         for index in addinglist:
   443             infos = self.GetEntryInfos(index)
   458             infos = self.GetEntryInfos(index)
   444             if infos["struct"] & OD_MultipleSubindexes:
   459             if infos["struct"] & OD_MultipleSubindexes:
   445                 # First case entry is a record
   460                 # First case entry is a record
   447                     subentry_infos = self.GetSubentryInfos(index, 1)
   462                     subentry_infos = self.GetSubentryInfos(index, 1)
   448                     if "default" in subentry_infos:
   463                     if "default" in subentry_infos:
   449                         default = subentry_infos["default"]
   464                         default = subentry_infos["default"]
   450                     else:
   465                     else:
   451                         default = self.GetTypeDefaultValue(subentry_infos["type"])
   466                         default = self.GetTypeDefaultValue(subentry_infos["type"])
   452                     self.CurrentNode.AddEntry(index, 1, default)
   467                     node.AddEntry(index, 1, default)
   453                 # Second case entry is a record
   468                 # Second case entry is a record
   454                 else:
   469                 else:
   455                     i = 1
   470                     i = 1
   456                     subentry_infos = self.GetSubentryInfos(index, i)
   471                     subentry_infos = self.GetSubentryInfos(index, i)
   457                     while subentry_infos:
   472                     while subentry_infos:
   458                         if "default" in subentry_infos:
   473                         if "default" in subentry_infos:
   459                             default = subentry_infos["default"]
   474                             default = subentry_infos["default"]
   460                         else:
   475                         else:
   461                             default = self.GetTypeDefaultValue(subentry_infos["type"])
   476                             default = self.GetTypeDefaultValue(subentry_infos["type"])
   462                         self.CurrentNode.AddEntry(index, i, default)
   477                         node.AddEntry(index, i, default)
   463                         i += 1
   478                         i += 1
   464                         subentry_infos = self.GetSubentryInfos(index, i)
   479                         subentry_infos = self.GetSubentryInfos(index, i)
   465             # Third case entry is a record
   480             # Third case entry is a record
   466             else:
   481             else:
   467                 subentry_infos = self.GetSubentryInfos(index, 0)
   482                 subentry_infos = self.GetSubentryInfos(index, 0)
   468                 if "default" in subentry_infos:
   483                 if "default" in subentry_infos:
   469                     default = subentry_infos["default"]
   484                     default = subentry_infos["default"]
   470                 else:
   485                 else:
   471                     default = self.GetTypeDefaultValue(subentry_infos["type"])
   486                     default = self.GetTypeDefaultValue(subentry_infos["type"])
   472                 self.CurrentNode.AddEntry(index, 0, default)
   487                 node.AddEntry(index, 0, default)
   473         # Remove all the entries in removinglist
   488         # Remove all the entries in removinglist
   474         for index in removinglist:
   489         for index in removinglist:
   475             self.RemoveCurrentVariable(index)
   490             self.RemoveCurrentVariable(index)
   476         self.BufferCurrentNode()
   491         if not disable_buffer:
       
   492             self.BufferCurrentNode()
       
   493         return None
   477 
   494 
   478 
   495 
   479     """
   496     """
   480     Remove an entry from current node. Analize the index to perform the correct
   497     Remove an entry from current node. Analize the index to perform the correct
   481     method
   498     method
   524                 if not infos["need"]:
   541                 if not infos["need"]:
   525                     self.CurrentNode.RemoveEntry(index, subIndex)
   542                     self.CurrentNode.RemoveEntry(index, subIndex)
   526             if index in Mappings[-1]:
   543             if index in Mappings[-1]:
   527                 self.CurrentNode.RemoveMappingEntry(index, subIndex)
   544                 self.CurrentNode.RemoveMappingEntry(index, subIndex)
   528 
   545 
   529     def AddMapVariableToCurrent(self, index, name, struct, number):
   546     def AddMapVariableToCurrent(self, index, name, struct, number, node = None):
   530         if 0x2000 <= index <= 0x5FFF:
   547         if 0x2000 <= index <= 0x5FFF:
   531             if not self.CurrentNode.IsEntry(index):
   548             if node == None:
   532                 self.CurrentNode.AddMappingEntry(index, name = name, struct = struct)
   549                 disable_buffer = True
       
   550                 node = self.CurrentNode
       
   551             else:
       
   552                 disable_buffer = False
       
   553             if not node.IsEntry(index):
       
   554                 node.AddMappingEntry(index, name = name, struct = struct)
   533                 if struct == var:
   555                 if struct == var:
   534                     values = {"name" : name, "type" : 0x05, "access" : "rw", "pdo" : True}
   556                     values = {"name" : name, "type" : 0x05, "access" : "rw", "pdo" : True}
   535                     self.CurrentNode.AddMappingEntry(index, 0, values = values)
   557                     node.AddMappingEntry(index, 0, values = values)
   536                     self.CurrentNode.AddEntry(index, 0, 0)
   558                     node.AddEntry(index, 0, 0)
   537                 else:
   559                 else:
   538                     values = {"name" : "Number of Entries", "type" : 0x05, "access" : "ro", "pdo" : False}
   560                     values = {"name" : "Number of Entries", "type" : 0x05, "access" : "ro", "pdo" : False}
   539                     self.CurrentNode.AddMappingEntry(index, 0, values = values)
   561                     node.AddMappingEntry(index, 0, values = values)
   540                     if struct == rec:
   562                     if struct == rec:
   541                         values = {"name" : name + " %d[(sub)]", "type" : 0x05, "access" : "rw", "pdo" : True, "nbmax" : 0xFE}
   563                         values = {"name" : name + " %d[(sub)]", "type" : 0x05, "access" : "rw", "pdo" : True, "nbmax" : 0xFE}
   542                         self.CurrentNode.AddMappingEntry(index, 1, values = values)
   564                         node.AddMappingEntry(index, 1, values = values)
   543                         for i in xrange(number):
   565                         for i in xrange(number):
   544                             self.CurrentNode.AddEntry(index, i + 1, 0)
   566                             node.AddEntry(index, i + 1, 0)
   545                     else:
   567                     else:
   546                         for i in xrange(number):
   568                         for i in xrange(number):
   547                             values = {"name" : "Undefined", "type" : 0x05, "access" : "rw", "pdo" : True}
   569                             values = {"name" : "Undefined", "type" : 0x05, "access" : "rw", "pdo" : True}
   548                             self.CurrentNode.AddMappingEntry(index, i + 1, values = values)
   570                             node.AddMappingEntry(index, i + 1, values = values)
   549                             self.CurrentNode.AddEntry(index, i + 1, 0)
   571                             node.AddEntry(index, i + 1, 0)
   550                 self.BufferCurrentNode()
   572                 if not disable_buffer:
       
   573                     self.BufferCurrentNode()
   551                 return None
   574                 return None
   552             else:
   575             else:
   553                 return "Index 0x%04X already defined!"%index
   576                 return "Index 0x%04X already defined!"%index
   554         else:
   577         else:
   555             return "Index 0x%04X isn't a valid index for Map Variable!"%index
   578             return "Index 0x%04X isn't a valid index for Map Variable!"%index
   593             entry_infos = self.GetEntryInfos(index)
   616             entry_infos = self.GetEntryInfos(index)
   594             if "callback" not in entry_infos:
   617             if "callback" not in entry_infos:
   595                 self.CurrentNode.SetParamsEntry(index, None, callback = value)
   618                 self.CurrentNode.SetParamsEntry(index, None, callback = value)
   596                 self.BufferCurrentNode()
   619                 self.BufferCurrentNode()
   597 
   620 
   598     def SetCurrentEntry(self, index, subIndex, value, name, editor):
   621     def SetCurrentEntry(self, index, subIndex, value, name, editor, node = None):
   599         if self.CurrentNode and self.CurrentNode.IsEntry(index):
   622         
       
   623         if node == None:
       
   624                 disable_buffer = True
       
   625                 node = self.CurrentNode
       
   626         else:
       
   627             disable_buffer = False
       
   628         if node and node.IsEntry(index):
   600             if name == "value":
   629             if name == "value":
   601                 if editor == "map":
   630                 if editor == "map":
   602                     value = self.CurrentNode.GetMapValue(value)
   631                     value = node.GetMapValue(value)
   603                     if value:
   632                     if value:
   604                         self.CurrentNode.SetEntry(index, subIndex, value)
   633                         node.SetEntry(index, subIndex, value)
   605                 elif editor == "bool":
   634                 elif editor == "bool":
   606                     value = value == "True"
   635                     value = value == "True"
   607                     self.CurrentNode.SetEntry(index, subIndex, value)
   636                     node.SetEntry(index, subIndex, value)
   608                 elif editor == "time":
   637                 elif editor == "time":
   609                     self.CurrentNode.SetEntry(index, subIndex, value)
   638                     node.SetEntry(index, subIndex, value)
   610                 elif editor == "number":
   639                 elif editor == "number":
   611                     try:
   640                     try:
   612                         self.CurrentNode.SetEntry(index, subIndex, int(value))
   641                         node.SetEntry(index, subIndex, int(value))
   613                     except:
   642                     except:
   614                         pass
   643                         pass
   615                 elif editor == "domain":
   644                 elif editor == "domain":
   616                     try:
   645                     try:
   617                         if len(value) % 2 != 0:
   646                         if len(value) % 2 != 0:
   618                             value = "0" + value
   647                             value = "0" + value
   619                         value = value.decode('hex_codec')
   648                         value = value.decode('hex_codec')
   620                         self.CurrentNode.SetEntry(index, subIndex, value)
   649                         node.SetEntry(index, subIndex, value)
   621                     except:
   650                     except:
   622                         pass
   651                         pass
   623                 else:
   652                 else:
   624                     subentry_infos = self.GetSubentryInfos(index, subIndex)
   653                     subentry_infos = self.GetSubentryInfos(index, subIndex)
   625                     type = subentry_infos["type"]
   654                     type = subentry_infos["type"]
   626                     dic = {}
   655                     dic = {}
   627                     for typeindex, typevalue in CustomisableTypes:
   656                     for typeindex, typevalue in CustomisableTypes:
   628                         dic[typeindex] = typevalue
   657                         dic[typeindex] = typevalue
   629                     if type not in dic:
   658                     if type not in dic:
   630                         type = self.CurrentNode.GetEntry(type)[1]
   659                         type = node.GetEntry(type)[1]
   631                     if dic[type] == 0:
   660                     if dic[type] == 0:
   632                         try:
   661                         try:
   633                             if value.startswith("0x"):
   662                             if value.startswith("0x"):
   634                                 value = int(value, 16)
   663                                 value = int(value, 16)
   635                             else:
   664                             else:
   636                                 value = int(value)
   665                                 value = int(value)
   637                             self.CurrentNode.SetEntry(index, subIndex, value)
   666                             node.SetEntry(index, subIndex, value)
   638                         except:
   667                         except:
   639                             pass
   668                             pass
   640                     else:
   669                     else:
   641                         self.CurrentNode.SetEntry(index, subIndex, value)
   670                         node.SetEntry(index, subIndex, value)
   642             elif name in ["comment", "save"]:
   671             elif name in ["comment", "save"]:
   643                 if editor == "option":
   672                 if editor == "option":
   644                     value = value == "Yes"
   673                     value = value == "Yes"
   645                 if name == "save":
   674                 if name == "save":
   646                     self.CurrentNode.SetParamsEntry(index, subIndex, save = value)
   675                     node.SetParamsEntry(index, subIndex, save = value)
   647                 elif name == "comment":
   676                 elif name == "comment":
   648                     self.CurrentNode.SetParamsEntry(index, subIndex, comment = value)
   677                     node.SetParamsEntry(index, subIndex, comment = value)
   649             else:
   678             else:
   650                 if editor == "type":
   679                 if editor == "type":
   651                     value = self.GetTypeIndex(value)
   680                     value = self.GetTypeIndex(value)
   652                     size = self.GetEntryInfos(value)["size"]
   681                     size = self.GetEntryInfos(value)["size"]
   653                     self.CurrentNode.UpdateMapVariable(index, subIndex, size)
   682                     node.UpdateMapVariable(index, subIndex, size)
   654                 elif editor in ["access","raccess"]:
   683                 elif editor in ["access","raccess"]:
   655                     dic = {}
   684                     dic = {}
   656                     for abbrev,access in AccessType.iteritems():
   685                     for abbrev,access in AccessType.iteritems():
   657                         dic[access] = abbrev
   686                         dic[access] = abbrev
   658                     value = dic[value]
   687                     value = dic[value]
   659                     if editor == "raccess" and not self.CurrentNode.IsMappingEntry(index):
   688                     if editor == "raccess" and not node.IsMappingEntry(index):
   660                         entry_infos = self.GetEntryInfos(index)
   689                         entry_infos = self.GetEntryInfos(index)
   661                         self.CurrentNode.AddMappingEntry(index, name = entry_infos["name"], struct = 7)
   690                         node.AddMappingEntry(index, name = entry_infos["name"], struct = 7)
   662                         self.CurrentNode.AddMappingEntry(index, 0, values = self.GetSubentryInfos(index, 0, False).copy())
   691                         node.AddMappingEntry(index, 0, values = self.GetSubentryInfos(index, 0, False).copy())
   663                         self.CurrentNode.AddMappingEntry(index, 1, values = self.GetSubentryInfos(index, 1, False).copy())
   692                         node.AddMappingEntry(index, 1, values = self.GetSubentryInfos(index, 1, False).copy())
   664                 self.CurrentNode.SetMappingEntry(index, subIndex, values = {name : value})
   693                 node.SetMappingEntry(index, subIndex, values = {name : value})
   665             self.BufferCurrentNode()
   694             if not disable_buffer:
       
   695                 self.BufferCurrentNode()
       
   696             return None
   666 
   697 
   667     def SetCurrentEntryName(self, index, name):
   698     def SetCurrentEntryName(self, index, name):
   668         self.CurrentNode.SetMappingEntry(index, name=name)
   699         self.CurrentNode.SetMappingEntry(index, name=name)
   669         self.BufferCurrentNode()
   700         self.BufferCurrentNode()
   670 
   701 
   833         if self.CurrentNode:
   864         if self.CurrentNode:
   834             return self.CurrentNode.GetNodeName()
   865             return self.CurrentNode.GetNodeName()
   835         else:
   866         else:
   836             return ""
   867             return ""
   837 
   868 
   838     def GetCurrentNodeID(self):
   869     def GetCurrentNodeCopy(self):
       
   870         if self.CurrentNode:
       
   871             return self.CurrentNode.Copy()
       
   872         else:
       
   873             return None
       
   874     
       
   875     def GetCurrentNodeID(self, node = None):
   839         if self.CurrentNode:
   876         if self.CurrentNode:
   840             return self.CurrentNode.GetNodeID()
   877             return self.CurrentNode.GetNodeID()
   841         else:
   878         else:
   842             return None
   879             return None
   843 
   880 
  1062         if self.CurrentNode:
  1099         if self.CurrentNode:
  1063             return self.CurrentNode.GetMapVariableList()
  1100             return self.CurrentNode.GetMapVariableList()
  1064         else:
  1101         else:
  1065             return []
  1102             return []
  1066 
  1103 
  1067     def GetMandatoryIndexes(self, node = None):
  1104     def GetMandatoryIndexes(self):
  1068         if self.CurrentNode:
  1105         if self.CurrentNode:
  1069             return self.CurrentNode.GetMandatoryIndexes()
  1106             return self.CurrentNode.GetMandatoryIndexes()
  1070         else:
  1107         else:
  1071             return FindMandatoryIndexes(MappingDictionary)
  1108             return FindMandatoryIndexes(MappingDictionary)
  1072     
  1109