📄 tossimapp.py
字号:
#if all types within the struct are already defined, it can be defined
try :
self.addType(nescStruct(self, typeDef ) )
numSkipped=0
except Exception, e:
if len(e.args) > 0 and e.args[0] == "Undefined struct":
#otherwise, put it back in the queue and move on to the next one
typeDefs.append(typeDef)
numSkipped += 1
elif len(e.args) > 0 and e.args[0] == "Anonymous struct" :
self.anonymousStructs.append(typeDef)
elif len(e.args) > 0 and e.args[0] == "Anonymous struct reference" :
self.anonymousRefStructs.append( (typeDef, e.args[1]) )
elif len(e.args) > 0 and e.args[0] == "Unknown type" :
self.unknownStructs.append( (typeDef, e.args[1]) )
else :
#if it's an unknown exception, reraise it
raise
#make sure we are not cycling endlessly
if numSkipped >= len(typeDefs) > 0:
self.undefinedTypes = typeDefs
break
def printSkippedTypes(self):
err = ""
if len(self.anonymousStructs) >0 :
err += "\nWarning: %d structs were anonymous." % len(self.anonymousStructs)
# for struc in anonymousStructs :
# err += "\t%s\n" % struc.getAttribute("ref")
if len(self.anonymousRefStructs) >0 :
err += "\nWarning: The following structs referenced anonymous structs:\n"
for pair in self.anonymousRefStructs :
err += "\t%s\n" % pair[0].getAttribute("name")
if len(self.undefinedTypes) >0 :
err += "\nWarning: The following types are ill-defined or had circular dependencies:\n"
for struc in self.undefinedTypes :
err += "\t%s\n" % struc.getAttribute("name")
if len(self.unknownStructs) >0 :
err += "\nWarning: The following structs had unknown xml types:\n"
for pair in self.unknownStructs :
err += "\t%s (%s)\n" % (pair[0].getAttribute("name"),
pair[1].tagName )
if len(err) > 0 : print err
def getTypeFromXML(self, xmlDefinition) :
"""Find the type name value given an xml definition.
If it is an array or pointer, define the new type here."""
#first, see if the tag is type or if child is type
if xmlDefinition.tagName.find("type-") < 0 or \
xmlDefinition.tagName.find("type-qualified") >= 0 :
foundType = 0
childNodes = [node for node in xmlDefinition.childNodes
if node.nodeType == 1]
for tag in childNodes :
if tag.tagName.find("type-") >= 0 :
foundType += 1
typeTag = tag
if foundType < 1 :
raise Exception("No type tag found")
if foundType > 1 :
raise Exception("Too many type tags found")
else :
return self.getTypeFromXML(typeTag)
#now check all the existing types to see if it is one of them
for val in self._typeNames :
typeObj = self._types[val]
if typeObj.isType(xmlDefinition) :
return deepcopy(typeObj)
#if the type doesn't already exist, try creating a new one
try :
return nescArray(self, xmlDefinition)
except Exception, e:
if len(e.args) <= 0 or e.args[0] != "Not array definition":
raise
try :
return nescPointer(self, xmlDefinition)
except Exception, e:
if len(e.args) <= 0 or e.args[0] != "Not pointer definition":
raise
#it is not a simple type, array, or pointer,
#so it must be a yet undefined struct
child = getUniqueChild(xmlDefinition)
if ( xmlDefinition.tagName == "type-tag" and child != None and
child.tagName == "struct-ref" ):
if child.hasAttribute("name"):
raise Exception("Undefined struct")
else :
raise Exception("Anonymous struct reference", child)
else:
#otherwise, raise an exception
#(but first make sure the right kind of unknown type is displayed)
if xmlDefinition.tagName == "type-tag":
xmlDefinition = child
raise Exception("Unknown type", xmlDefinition)
class NescEnums( object ) :
"""A class that holds all enums defined in a specific nesc application.
usage:
myEnums = NescEnums('/path/to/nescDecls.xml')
print myEnums
var = myEnums.enumName
"""
def __init__( self, applicationName="Unknown App", xmlFilename = None ) :
self.applicationName = applicationName
self._enums = []
if type(xmlFilename) == str:
xmlFilename = minidom.parse(xmlFilename)
self.createEnumsFromXml(xmlFilename)
def __getitem__(self, key) :
if key in self._enums :
return self.__dict__[key]
else:
raise AttributeError("No such enum defined")
def createEnumsFromXml(self, dom) :
#now define all the struct types
enumDefs = [node for node in dom.getElementsByTagName("enum")]
integer = re.compile('^I:(\d+)$')
hexidecimal = re.compile('^(0x[\dabcdefABCDEF]+)$')
for enumDef in enumDefs :
name = enumDef.getAttribute("name")
if name in self._enums :
continue
value = enumDef.getAttribute("value")
match = integer.match(value)
if match != None :
self.__dict__[name] = int(match.groups()[0])
else :
match = hexidecimal.match(value)
if match != None :
self.__dict__[name] = int(match.groups()[0], 16)
else :
self.__dict__[name] = value
self._enums.append(name)
namedEnums = [node for node in dom.getElementsByTagName("namedEnum")]
for namedEnum in namedEnums :
name = namedEnum.getAttribute("name")
self.__dict__[name] = NescEnums(namedEnum,name)
self._enums.append(name)
def __repr__(self) :
return "%s object at %s:\n\n\t%s" % (self.__class__, hex(id(self)), str(self))
def __str__(self) :
""" Print all available enums."""
string = "\n"
for key in self._enums :
string += "\t%s = %s\n" % (key, str(self[key]))
return string
class NescMsgs( object ) :
"""A class that holds all msgs defined in a specific nesc application.
It assumes a struct is a message if AM_STRUCTNAME is defined.
usage:
myMsgs = NescMsgs(myTypes, myEnums[, applicationName])
print myMsgs
var = myMsgs.msgName
"""
def __init__( self, types, enums, applicationName="Unknown App" ) :
self.applicationName = applicationName
msgTypes = [enum for enum in enums._enums if enum.find("AM_") ==0]
name = re.compile("^AM_(\w+)$")
self._msgNames = []
self._msgs = {}
for msgType in msgTypes :
if type(enums[msgType]) == int:
msgName = name.match(msgType)
if msgName != None :
msgName = msgName.groups()[0]
for key in types._typeNames :
if key.lower() == msgName.lower() :
msg = TosMsg(enums[msgType], types[key])
self._msgs[key] = msg
self._msgNames.append(key)
break
def __getattr__(self, name) :
if name in self._msgNames :
return deepcopy(self._msgs[name])
else:
raise AttributeError("No such message defined")
def __getitem__(self, key) :
if key in self._msgNames :
return deepcopy(self._msgs[key])
else:
raise AttributeError("No such message defined")
def __repr__(self) :
return "%s object at %s:\n\n\t%s" % (self.__class__, hex(id(self)), str(self))
def __str__(self) :
""" Print all available msgs."""
string = "\n"
for key in self._msgNames :
string += "\t%5d : %s\n" % (self._msgs[key].amType, key)
return string
class NescApp( object ) :
"""A class that holds all types, enums, msgs, rpc commands and ram
symbol definitions as defined for a specific nesc application.
usage:
myApp = nescApp('/path/to/nescDecls.xml')
print myApp
var = myApp.enums.enumName
var = myApp.types.typeName
"""
def __init__( self, applicationName="Unknown App", xmlFile="app.xml" ) :
"""This function creates the NescEnums, NescTypes, and NescMsgs
objects for a particular application."""
#first, import all enums, types, msgs, rpc functions, and ram symbols
self.applicationName = applicationName
self.xmlFile = xmlFile
# Check for the nescDecls.xml file
if not os.path.isfile(xmlFile):
raise Exception("""\nERROR: cannot find file \"%s\".
Your nesC app cannot be imported. Be sure that you compiled with the \"nescDecls\" option.\n\n""" % xmlFile)
# Import enums, types, and msgs
self.enums = NescEnums(applicationName, xmlFile)
self.types = NescTypes(applicationName, xmlFile)
self.variables = NescVariables(applicationName, xmlFile)
self.messages = NescMsgs(self.types, self.enums, applicationName)
def __repr__(self) :
return "%s object at %s:\n\n%s" % (self.__class__, hex(id(self)), str(self))
def __str__(self) :
""" Print all application declarations."""
string = "%20s : %d\n" % ("Enums", len(self.enums._enums))
string += "%20s : %d\n" % ("Types", len(self.types._types))
string += "%20s : %d\n" % ("Messages", len(self.messages._msgNames))
string += "%20s : %d\n" % ("Variables", len(self.variables._varNames))
return string
def configureTossim(self):
for var in variables:
Mote.var
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -