⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nescdecls.py

📁 无线通信的主要编程软件,是无线通信工作人员的必备工具,关天相关教程我会在后续传上.
💻 PY
📖 第 1 页 / 共 2 页
字号:
# "Copyright (c) 2000-2003 The Regents of the University of California.  # All rights reserved.## Permission to use, copy, modify, and distribute this software and its# documentation for any purpose, without fee, and without written agreement# is hereby granted, provided that the above copyright notice, the following# two paragraphs and the author appear in all copies of this software.# # IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT# OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY# OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.# # THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY# AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS# ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO# PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."## @author Kamin Whitehouse #import sys, string, math, re, osfrom struct import *from xml.dom import minidomfrom jpype import jimportfrom copy import deepcopy############ This class can be used to hold a basic nesc type, eg uint8_t It can# be set and get through nescType.value, and does type checking# ###########def findBuildFile(givenString, desiredFilename) :  """This function will find a desiredFilename (eg. nescDecls.xml) the build directory  from a givenString (e.g 'build/pc').  Legal givenStrings are:  1.  Full path,     eg: /home/kamin/tinyos-1.x/...  2.  relative path, eg: apps/TestRpc/build/pc  3.  platform name, eg: pc or telosb  """  #check to see if the given string contains the desiredFilename  if givenString.find(desiredFilename) >= 0 :    filename = givenString  #then check to see if it is an absolute or relative path  elif givenString.find('/') >= 0 :    filename = givenString + desiredFilename  #then check to see if it is just the platform name  elif len(givenString) > 0:    filename = 'build/' + givenString + '/' + desiredFilename  #check if a default platform environment variable is defined  elif os.environ.has_key("TINYOS_DEFAULT_PLATFORM") :    filename = 'build/' + os.environ["TINYOS_DEFAULT_PLATFORM"] + '/' + desiredFilename  #otherwise, assume the file is in './'  else :    filename = desiredFilename      #check to see if the file was successfully found  if not os.path.isfile(filename) :    raise IOError("File %s not found" % filename)  return filename  class nescType( object ) :  """A python representation of a nesc type.  usage:  X = nescType.value  nescType.value = X  bytes = nescType.getBytes()  nescType.setBytes(bytes)  nescType  print nescType  """  def __init__( self , nescType, cType, pythonType, xmlTag,                conversionString, size, defaultValue) :    """create a new nescType"""    self.nescType = nescType    self.cType = cType    self.pythonType = pythonType    self._xmlTag = xmlTag    self.size = size    self._conversionString = conversionString    self.value = defaultValue  def __repr__(self) :    return "%s object at %s:\n\n%20s : %s" % (self.__class__, hex(id(self)), "value", str(self))  def __str__(self) :    if self._conversionString == "c" :        return "'" + str(self.value) + "'"    else :        return str(self.value)  #   this func could be used for type checking   def __setattr__(self, name, value) :    if self.__dict__.has_key("value") and name == "value":        #use the type conversions built into pack        pack(self._conversionString, value)    self.__dict__[name] = value  def oneLineStr(self) :    return str(self)  def __deepcopy__(self, memo={}) :    result = nescType(self.nescType, self.cType, self.pythonType,                    self._xmlTag, self._conversionString, self.size,                    deepcopy(self.value, memo))    memo[id(self)] = result    return result    def isType(self, xmlDefinition) :    """returns 1 if the xml definition describes this type.    Returns 0 otherwise."""    if xmlDefinition != None and xmlDefinition.tagName == self._xmlTag and \           xmlDefinition.hasAttribute("cname") and \           xmlDefinition.getAttribute("cname") == self.cType :      return 1    elif self.nescType == "void" and xmlDefinition.tagName == self._xmlTag :      #void is a special xml case that doesn't have cname defined (grr)      return 1    else :      return 0    def getBytes(self) :    """Hexidecimal representation of a value of this type"""    if self.nescType == "void" :      return ''    try:      bytes = pack(self._conversionString, self.value)    except Exception, inst:      print inst      raise Exception("Bytes conversion error: %s %d bytes to %d" %                      (self.nescType, len(bytes), self.size) )    if len(bytes) != self.size:      raise Exception("Wrong number of bytes for conversion: %s %d bytes to %d" %                      (self.nescType, len(bytes), self.size))    return bytes    def setBytes(self, bytes):    """A value of this type from a hexidecimal representation"""    if self.nescType == "void" :      return bytes    if len(bytes) < self.size:      raise Exception("Wrong number of bytes for conversion: %s %d bytes to %d" %                      (self.nescType, len(bytes), self.size))    try:      self.value, = unpack( self._conversionString, bytes[:self.size])    except Exception, inst:      print inst      raise Exception("Bytes conversion error: %s %d bytes to %d" %                      ( self.nescType, len(bytes), self.size) )    return bytes[self.size:]############ Array of basic nesc types,###########class nescArray( object ) :  """A python representation of a nesc array.  usage:  array = nescArray(size, nescType)  array = nescArray(myTypes, xmlDecl)  X = array[3]  X = array[3:6] (returns a list or, if char[] array, a python string)  array[3] = X  array[3:6] [X,Y,Z] (or, if char[], \"foo\")  bytes = array.getBytes()  array.setBytes(bytes)  array  print array  """  def __init__( self , *varargs) :    """initialize all elements to 0"""    if len(varargs) == 0 :      return    elif len(varargs) == 2 and type(varargs[0]) == int :      (self.len,self.elementType) = varargs[:]      bracketStr = "[" + str(self.len) + "]"    elif len(varargs) == 2 :      (nescTypes, xmlDefinition) = varargs[:]      if xmlDefinition.tagName != "type-array" :        raise Exception("Not array definition")      child = getUniqueChild(xmlDefinition)      self.elementType = nescTypes.getTypeFromXML(child)      sizeStr = xmlDefinition.getAttribute("elements")[2:]      self.len = int(sizeStr)      bracketStr = "[" + sizeStr + "]"    else :      raise Exception("Illegal array params")    self.nescType = self.elementType.nescType + bracketStr    self.cType = self.elementType.cType + bracketStr    self.pythonType = self.elementType.pythonType + bracketStr    self.size = self.len * self.elementType.size    self.value = []    for i in range(self.len):      self.value.append(deepcopy(self.elementType))        def __repr__(self) :    """A printable representation of the value"""    return "%s object at %s:\n\n\t%s" % (self.__class__, hex(id(self)), str(self))      def __str__(self) :    """A printable representation of the value"""    string = "nescArray of type %s:\n" % self.nescType#     if self.elementType._conversionString == "c":#       string += self.oneLineStr()#     else:    for i in range(self.len) :      string += "%2d: %s\n" % (i, self.value[i].oneLineStr())    return string  def __getitem__(self, key) :      if self.elementType.__class__ == nescType :          if key.__class__ == slice:              if self.elementType._conversionString == "c":                  string = ""                  for item in self.value.__getitem__(key) :                      string += item.value                  return string              else:                  return [item.value for item in self.value.__getitem__(key)]          else:              return self.value.__getitem__(key).value      else:          return self.value.__getitem__(key)        def __setitem__(self, key, value) :       if self.elementType.__class__ == nescType :        if key.__class__ == slice:            i=0;            for item in self.value.__getitem__(key) :                item.value = value[i]                i += 1        else:            self.value.__getitem__(key).value = value      else :          self.value.__setitem__(key, value)  def __delitem__(self, key) :       return self.value.__delitem__(key)  def oneLineStr(self) :    """A one-line representation of the value"""    #maybe the string should just print like a string    #but the \x00 chars look like nothing#     if self.elementType._conversionString == "c":#       string = '\''#       for c in self.value :#         string += c.value#       string += '\''#     else:    tmpStr = str(self.elementType)    if tmpStr.find("\n") >= 0 or len(tmpStr) > 5 :      return self.nescType    else :      i = 0; string = "["      while len(string) < 40 and i < self.len :        string += str(self.value[i]) + ", "        i += 1      if i < self.len :        string += "...]"      else:        string += "\b\b]"    return string   def __deepcopy__(self, memo={}) :    result = nescArray()    memo[id(self)] = result    result.elementType = deepcopy(self.elementType, memo)    result.nescType = self.nescType    result.cType = self.cType    result.pythonType = self.pythonType    result.len = self.len    result.size = self.size    result.value = deepcopy(self.value, memo)    return result  def isType(self, xmlDefinition) :    """returns 1 if the xml definition describes this type.    Returns 0 otherwise."""    if ( xmlDefinition != None and xmlDefinition.tagName == "type-array" and         int(xmlDefinition.getAttribute("elements")[2:]) == self.len ) :      child = getUniqueChild(xmlDefinition)      return self.elementType.isType(child)    else :      return 0  def getBytes(self) :    """Hexidecimal representation of a value of this type"""    bytes = ""    for i in range(self.len):      bytes += self.value[i].getBytes()    if len(bytes) != self.size:      raise Exception("Byte conversion error: %s %d bytes to %d" %                      ( self.nescType, len(bytes), self.size))    return bytes        def setBytes(self, bytes) :    """A value of this type from a hexidecimal representation"""    if len(bytes) < self.size:        raise Exception("Byte conversion error: %s %d bytes to %d" %                        (self.nescType, len(bytes), self.size) )    for i in range(self.len) :      bytes = self.value[i].setBytes(bytes)    return bytes############ Pointer to basic nesc types,###########class nescPointer( object ) :  """A python representation of a nesc pointer.  usage:  pointer = nescPointer(ptrSize, nescType)  pointer = nescPointer(myTypes, xmlDecl)  nescType = pointer.value  pointer.value = nescType  bytes = pointer.getBytes()  pointer.setBytes(bytes)  pointer  print pointer  """    def __init__( self , *varargs) :    """initialize all elements to 0"""    if len(varargs) == 0:      return    elif len(varargs) == 2 and varargs[1].__dict__.has_key("tagName"):      (nescTypes, xmlDefinition) = varargs[:]      if xmlDefinition.tagName != "type-pointer" :        raise Exception("Not pointer definition")      child = getUniqueChild(xmlDefinition)      self.value = nescTypes.getTypeFromXML(child)      self.size = int(xmlDefinition.getAttribute("size")[2:])    elif len(varargs) == 2 :      self.size = varargs[0].types["unsigned int"].size      self.value = varargs[1]    else :      raise Exception("Illegal nescPointer constructor arguments")    self.nescType = self.value.nescType + "*"    self.cType = self.value.cType + "*"    self.pythonType = self.value.pythonType + "*"        def __repr__(self) :    return "%s object at %s:\n\n\t%s" % (self.__class__, hex(id(self)), str(self))  def __str__(self) :    """A text representation of the value"""    return "ptr-> %s" % str(self.value)  def oneLineStr(self) :    """A one-line representation of the value"""    return  "ptr-> %s" % self.value.oneLineStr()  def __deepcopy__(self, memo={}) :    result = nescPointer()    memo[id(self)] = result    result.value = deepcopy(self.value, memo)    result.size = self.size    result.nescType = self.nescType    result.cType = self.cType    result.pythonType = self.pythonType    return result  def isType(self, xmlDefinition) :    """returns 1 if the xml definition describes this type.    Returns 0 otherwise."""    if xmlDefinition != None and xmlDefinition.tagName == "type-pointer" :      child = getUniqueChild(xmlDefinition)      return self.value.isType(child)    else :      return 0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -