📄 nescdecls.py
字号:
# "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 + -