diff -r 000000000000 -r 29b1cd4cb562 bthci/bthci2/CommandsEvents/generator/parameter.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bthci/bthci2/CommandsEvents/generator/parameter.py Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,147 @@ +# Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +# Creates a comma separated string of parameters suitable for method signatures. +def makeParameters(aParams): + param_str = "" + + for p in aParams: + param_str += p.toParameter() + ', ' + + return param_str[:-2] + +# Creates a ;\n\t separated string of parameters suitable for class member declarations. +def makeMembers(aParams): + member_str = "" + + for p in aParams: + member_str += p.toMember() + ';\n\t' + + return member_str + +# Encapsulates a command parameter, has a name, a type, a offset and if is an 'array' of values has a array size specifier, +# i.e. the name of the parameter that determines the number of 'array entries' of this parameter. +class Parameter: + # aType, type of parameter + # aName, name of parameter + # aArray, name of array size specifier parameter. Optional. + def __init__(self, aType, aName, aOffset, aArray = ''): + self.iOffset = aOffset + if aName[0] == '@': + self.iName = aName[1:] + self.iNotInFrame = True + else: + self.iName = aName + self.iNotInFrame = False + self.iType = aType + self.iArray = aArray + + + def getName(self): + # Defective code strikes again - these are badly coded up values in the txt file so + # they have to be handled as a special case. + if self.iName == 'RxPacket_Length' or self.iName == 'TxPacket_Length': + return self.iName + ix = self.iName.find('_') + if ix >= 0: + return self.iName[0:ix] + else: + return self.iName + + # Returns a string of ''MemberType' iName' or 'RArray<'MemberType'> iName' depending on parameter is of type array or not. + def toMember(self): + if self.iArray == '': + return self.iType.toMember() + ' i' + self.getName() + else: + return 'RArray< ' + self.iType.toMember() + ' > i' + self.getName() + + # Returns a string of ''ParamType' aName' or 'const RArray<'ParamType'>& aName' depending on parameter is of type array or not. + def toParameter(self): + if self.iArray == '': + return self.iType.toParameter() + ' a' + self.getName() + else: + return 'const RArray< ' + self.iType.toArrayParameter() + ' >& a' + self.getName() + + def toEventParameter(self): + if self.iArray == '': + return self.iType.toParameter() + ' a' + self.getName() + else: + return 'const TArray< ' + self.iType.toArrayParameter() + ' >& a' + self.getName() + + # Returns a string used when writing data to a CHctlCommandFrame + def setterParams(self, indexer = ''): + # Needs size specifier, for TUint32 + if (self.iType.iSize == 3 or self.iType.iSize == 4 and self.iType.iSetter == 'PutBytes32') or self.iType.iSetter == 'PutPaddedString': + if indexer != '': + return 'i' + self.getName() + '[' + indexer + '], ' + str(self.iType.iSize); + else: + return 'i' + self.getName() + ', ' + str(self.iType.iSize) + else: + if indexer != '': + return 'i' + self.getName() + '[' + indexer + ']' + else: + return 'i' + self.getName() + + # Returns a string used when accessing values in the event data descriptor + def getterParams(self): + getter_str = str(self.iOffset) + + if self.iArray != '': + getter_str += ', ' + str(self.iBlockSize) + ', aIndex' + + if self.iType.iSize == 3 or self.iType.iSize == 4 and self.iType.iGetter == 'AsTUint32': + getter_str += ', ' + str(self.iType.iSize) + + return getter_str + + # Returns a string used to return the value from the event data descriptor + def getterFunc(self): + getter_str = self.iType.iGetter + '(' + self.getterParams() + ')' + if self.iType.iCast != '': + getter_str = 'static_cast<' + self.iType.iCast + '>(' + getter_str + ')' + return getter_str + + # Returns an accessor definition in the form of 'IMPORT_C 'AccessorType' iName() const;' or + # 'IMPORT_C 'AccessorType' iName(TInt aIndex) const;' if parameter is of array type. + def accessorDef(self, aEventOrCommand): + if self.iArray == '': + return 'IMPORT_C ' + self.iType.toAccessor(aEventOrCommand) + ' ' + self.getName() + '() const;' + else: + return 'IMPORT_C ' + self.iType.toAccessor(aEventOrCommand) + ' ' + self.getName() + '(TInt aIndex) const;' + + # Returns an accessor implementation in the form of 'EXPORT_C 'AccessorType' aClass::iName() const { ... }' or + # 'EXPORT_C 'AccessorType' aClass::iName(TInt aIndex) const { ... }' if parameter is of array type + # Used for events and complete events. + def eventAccessorImpl(self, aClass): + if self.iArray == '': + return 'EXPORT_C ' + self.iType.toAccessor('Event') + ' ' + aClass + '::' + self.getName() + '() const\n\t{\n\treturn ' + self.getterFunc() + ';\n\t}\n\n' + else: + return 'EXPORT_C ' + self.iType.toAccessor('Event') + ' ' + aClass + '::' + self.getName() + '(TInt aIndex) const\n\t{\n\treturn ' + self.getterFunc() + ';\n\t}\n\n' + + # Returns an accessor implementation in the form of 'EXPORT_C 'AccessorType' aClass::iName() const { ... }' or + # 'EXPORT_C 'AccessorType' aClass::iName(TInt aIndex) const { ... }' if parameter is of array type + # Used for command events. + def commandAccessorImpl(self, aClass): + memberName = 'i' + self.getName() + if self.iType.iRetTypename != '': + memberName = self.iType.iRetTypename + '(' + memberName + ')' + if self.iArray == '': + return 'EXPORT_C ' + self.iType.toAccessor('Command') + ' ' + aClass + '::' + self.getName() + '() const\n\t{\n\treturn ' + memberName + ';\n\t}\n\n' + else: + return 'EXPORT_C ' + self.iType.toAccessor('Command') + ' ' + aClass + '::' + self.getName() + '(TInt aIndex) const\n\t{\n\treturn ' + memberName + '[aIndex];\n\t}\n\n' + + # Returns a string of the format 'iName = aName;' + def memberAssignment(self): + return 'i' + self.getName() + ' = a' + self.getName() + ';'