diff options
author | Patrick Benavoli <patrickx.benavoli@intel.com> | 2011-10-27 14:27:27 +0200 |
---|---|---|
committer | David Wagner <david.wagner@intel.com> | 2014-02-10 17:14:57 +0100 |
commit | 9fc3c0d2118102588ba82b1cad85b1d7c27967aa (patch) | |
tree | 3fc42a147e8252d7f821cf333039be538811ef61 /parameter | |
parent | 4bed9212041d94d52e55e624bd081fcbf01ee04e (diff) | |
download | external_parameter-framework-9fc3c0d2118102588ba82b1cad85b1d7c27967aa.zip external_parameter-framework-9fc3c0d2118102588ba82b1cad85b1d7c27967aa.tar.gz external_parameter-framework-9fc3c0d2118102588ba82b1cad85b1d7c27967aa.tar.bz2 |
PFW: Enumeration types
BZ: 13274
Added enumeration type parameters. They are sizeable like integers but always
treated as signed. Lexical - numerical value pairs are now specified from the
Strutural description XML file (subsystem level).
When set, literal or numerical values may be used interchangeably, however the
output form will depend on the currently selected value space and output
format.
Change-Id: I498b53a2bbd8f414bb8a09063c28265a7502bfbf
Signed-off-by: Patrick Benavoli <patrickx.benavoli@intel.com>
Reviewed-on: http://android.intel.com:8080/22635
Reviewed-by: Centelles, Sylvain <sylvain.centelles@intel.com>
Tested-by: Barthes, FabienX <fabienx.barthes@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
Reviewed-on: http://android.intel.com:8080/26782
Reviewed-by: Barthes, FabienX <fabienx.barthes@intel.com>
Diffstat (limited to 'parameter')
-rw-r--r-- | parameter/Android.mk | 3 | ||||
-rw-r--r-- | parameter/EnumParameterType.cpp | 247 | ||||
-rw-r--r-- | parameter/EnumParameterType.h | 79 | ||||
-rw-r--r-- | parameter/ParameterMgr.cpp | 2 |
4 files changed, 330 insertions, 1 deletions
diff --git a/parameter/Android.mk b/parameter/Android.mk index f6ce250..caa2fb4 100644 --- a/parameter/Android.mk +++ b/parameter/Android.mk @@ -85,7 +85,8 @@ LOCAL_SRC_FILES:= \ BaseParameter.cpp \ AutoLock.cpp \ StringParameterType.cpp \ - StringParameter.cpp + StringParameter.cpp \ + EnumParameterType.cpp LOCAL_MODULE:= libparameter diff --git a/parameter/EnumParameterType.cpp b/parameter/EnumParameterType.cpp new file mode 100644 index 0000000..f59c7ba --- /dev/null +++ b/parameter/EnumParameterType.cpp @@ -0,0 +1,247 @@ +/* <auto_header> + * <FILENAME> + * + * INTEL CONFIDENTIAL + * Copyright © 2011 Intel + * Corporation All Rights Reserved. + * + * The source code contained or described herein and all documents related to + * the source code ("Material") are owned by Intel Corporation or its suppliers + * or licensors. Title to the Material remains with Intel Corporation or its + * suppliers and licensors. The Material contains trade secrets and proprietary + * and confidential information of Intel or its suppliers and licensors. The + * Material is protected by worldwide copyright and trade secret laws and + * treaty provisions. No part of the Material may be used, copied, reproduced, + * modified, published, uploaded, posted, transmitted, distributed, or + * disclosed in any way without Intel’s prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by Intel in writing. + * + * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com) + * CREATED: 2011-06-01 + * UPDATED: 2011-07-27 + * + * + * </auto_header> + */ +#include "EnumParameterType.h" +#include <stdlib.h> +#include <sstream> +#include <iomanip> +#include <ctype.h> +#include <assert.h> +#include "ParameterAccessContext.h" + +#define base CParameterType + +CEnumParameterType::CEnumParameterType(const string& strName) : base(strName) +{ +} + +string CEnumParameterType::getKind() const +{ + return "EnumParameter"; +} + +// Element properties +void CEnumParameterType::showProperties(string& strResult) const +{ + base::showProperties(strResult); + + strResult += "Value Pairs:\n"; + + // Show all value pairs + ValuePairListIterator it; + + for (it = _valuePairList.begin(); it != _valuePairList.end(); ++it) { + + strResult += "\tLiteral: \""; + strResult += it->_strLiteral; + strResult += "\", Numerical: "; + strResult += toString(it->_iNumerical); + strResult += "\n"; + } +} + +bool CEnumParameterType::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) +{ + // Size in bits + uint32_t uiSizeInBits = xmlElement.getAttributeInteger("Size"); + + // Size + setSize(uiSizeInBits / 8); + + // Get value pairs + CXmlElement::CChildIterator it(xmlElement); + + CXmlElement xmlValuePairElement; + + while (it.next(xmlValuePairElement)) { + + _valuePairList.push_back(SValuePair(xmlValuePairElement.getAttributeString("Literal"), xmlValuePairElement.getAttributeSignedInteger("Numerical"))); + } + + // Check value pair list + if (_valuePairList.empty()) { + + serializingContext.setError("No Value pairs provided for element " + xmlElement.getPath()); + + return false; + } + + // Don't dig + return true; +} + +bool CEnumParameterType::asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const +{ + int32_t iData; + + if (isNumber(strValue)) { + + // Numerical value provided + + // Hexa + bool bValueProvidedAsHexa = !strValue.compare(0, 2, "0x"); + + // Get value + iData = strtol(strValue.c_str(), NULL, 0); + + if (bValueProvidedAsHexa && isEncodable(iData)) { + + // Sign extend + signExtend(iData); + } + // Check validity + if (!isValid(iData)) { + + parameterAccessContext.setError("Provided value not part of numerical space"); + + return false; + } + } else { + // Literal value provided + + // Check validity + if (!getNumerical(strValue, iData)) { + + parameterAccessContext.setError("Provided value not part of lexical space"); + + return false; + } + } + + // Return data + uiValue = iData; + + return true; +} + +void CEnumParameterType::asString(const uint32_t& uiValue, string& strValue, CParameterAccessContext& parameterAccessContext) const +{ + // Take care of format + if (parameterAccessContext.valueSpaceIsRaw()) { + + // Format + ostringstream strStream; + + // Numerical format requested + if (parameterAccessContext.outputRawFormatIsHex()) { + + // Hexa display with unecessary bits cleared out + strStream << "0x" << hex << uppercase << setw(getSize()*2) << setfill('0') << makeEncodable(uiValue); + + strValue = strStream.str(); + } else { + + // Integer display + int32_t iValue = uiValue; + + // Sign extend + signExtend(iValue); + + strStream << iValue; + + strValue = strStream.str(); + } + } else { + + // Integer display + int32_t iValue = uiValue; + + // Sign extend + signExtend(iValue); + + // Literal display requested (should succeed) + getLiteral(iValue, strValue); + } +} + +// Default value handling (simulation only) +uint32_t CEnumParameterType::getDefaultValue() const +{ + assert(!_valuePairList.empty()); + + // Return first item + return _valuePairList.front()._iNumerical; +} + +// Check string is a number +bool CEnumParameterType::isNumber(const string& strValue) +{ + char cFirst = strValue[0]; + + return isdigit(cFirst) || cFirst == '+' || cFirst == '-'; +} + +// Literal - numerical conversions +bool CEnumParameterType::getLiteral(int32_t iNumerical, string& strLiteral) const +{ + ValuePairListIterator it; + + for (it = _valuePairList.begin(); it != _valuePairList.end(); ++it) { + + if (it->_iNumerical == iNumerical) { + + strLiteral = it->_strLiteral; + + return true; + } + } + return false; +} + +bool CEnumParameterType::getNumerical(const string& strLiteral, int32_t& iNumerical) const +{ + ValuePairListIterator it; + + for (it = _valuePairList.begin(); it != _valuePairList.end(); ++it) { + + if (it->_strLiteral == strLiteral) { + + iNumerical = it->_iNumerical; + + return true; + } + } + return false; +} + +// Numerical validity +bool CEnumParameterType::isValid(int32_t iNumerical) const +{ + ValuePairListIterator it; + + for (it = _valuePairList.begin(); it != _valuePairList.end(); ++it) { + + if (it->_iNumerical == iNumerical) { + + return true; + } + } + return false; +} diff --git a/parameter/EnumParameterType.h b/parameter/EnumParameterType.h new file mode 100644 index 0000000..f6d546f --- /dev/null +++ b/parameter/EnumParameterType.h @@ -0,0 +1,79 @@ +/* <auto_header> + * <FILENAME> + * + * INTEL CONFIDENTIAL + * Copyright © 2011 Intel + * Corporation All Rights Reserved. + * + * The source code contained or described herein and all documents related to + * the source code ("Material") are owned by Intel Corporation or its suppliers + * or licensors. Title to the Material remains with Intel Corporation or its + * suppliers and licensors. The Material contains trade secrets and proprietary + * and confidential information of Intel or its suppliers and licensors. The + * Material is protected by worldwide copyright and trade secret laws and + * treaty provisions. No part of the Material may be used, copied, reproduced, + * modified, published, uploaded, posted, transmitted, distributed, or + * disclosed in any way without Intel’s prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by Intel in writing. + * + * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com) + * CREATED: 2011-06-01 + * UPDATED: 2011-07-27 + * + * + * </auto_header> + */ +#pragma once + +#include "ParameterType.h" + +#include <list> + +class CEnumParameterType : public CParameterType +{ + // Value pairs + struct SValuePair + { + SValuePair(const string& strLiteral, int32_t iNumerical) : _strLiteral(strLiteral), _iNumerical(iNumerical) {} + + string _strLiteral; + int32_t _iNumerical; + }; + typedef list<SValuePair>::const_iterator ValuePairListIterator; +public: + CEnumParameterType(const string& strName); + + // From IXmlSink + virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext); + + // Conversion + virtual bool asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const; + virtual void asString(const uint32_t& uiValue, string& strValue, CParameterAccessContext& parameterAccessContext) const; + + // Default value handling (simulation only) + virtual uint32_t getDefaultValue() const; + + // Element properties + virtual void showProperties(string& strResult) const; + + // CElement + virtual string getKind() const; +private: + // Check string is a number + static bool isNumber(const string& strValue); + + // Literal - numerical conversions + bool getLiteral(int32_t iNumerical, string& strLiteral) const; + bool getNumerical(const string& strLiteral, int32_t& iNumerical) const; + + // Numerical validity + bool isValid(int32_t iNumerical) const; + + // Value pairs + list<SValuePair> _valuePairList; +}; diff --git a/parameter/ParameterMgr.cpp b/parameter/ParameterMgr.cpp index 768a5c5..83867d5 100644 --- a/parameter/ParameterMgr.cpp +++ b/parameter/ParameterMgr.cpp @@ -64,6 +64,7 @@ #include "BitParameterBlockType.h" #include "BitParameterType.h" #include "StringParameterType.h" +#include "EnumParameterType.h" #include "RemoteProcessorServerInterface.h" #include "ElementLocator.h" #include "AutoLog.h" @@ -1754,6 +1755,7 @@ void CParameterMgr::feedElementLibraries() pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CParameterBlockType>("ParameterBlock")); pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CBooleanParameterType>("BooleanParameter")); pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CIntegerParameterType>("IntegerParameter")); + pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CEnumParameterType>("EnumParameter")); pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CFixedPointParameterType>("FixedPointParameter")); pParameterCreationLibrary->addElementBuilder(new TKindElementBuilderTemplate<CXmlFileIncluderElement>("SubsystemInclude")); |