BitParameter.cpp revision 68a912857707864bbaaff9808717813105072a6e
168a912857707864bbaaff9808717813105072a6ePatrick Benavoli/* <auto_header> 268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * <FILENAME> 368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * 468a912857707864bbaaff9808717813105072a6ePatrick Benavoli * INTEL CONFIDENTIAL 568a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Copyright © 2011 Intel 668a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Corporation All Rights Reserved. 768a912857707864bbaaff9808717813105072a6ePatrick Benavoli * 868a912857707864bbaaff9808717813105072a6ePatrick Benavoli * The source code contained or described herein and all documents related to 968a912857707864bbaaff9808717813105072a6ePatrick Benavoli * the source code ("Material") are owned by Intel Corporation or its suppliers 1068a912857707864bbaaff9808717813105072a6ePatrick Benavoli * or licensors. Title to the Material remains with Intel Corporation or its 1168a912857707864bbaaff9808717813105072a6ePatrick Benavoli * suppliers and licensors. The Material contains trade secrets and proprietary 1268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * and confidential information of Intel or its suppliers and licensors. The 1368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Material is protected by worldwide copyright and trade secret laws and 1468a912857707864bbaaff9808717813105072a6ePatrick Benavoli * treaty provisions. No part of the Material may be used, copied, reproduced, 1568a912857707864bbaaff9808717813105072a6ePatrick Benavoli * modified, published, uploaded, posted, transmitted, distributed, or 1668a912857707864bbaaff9808717813105072a6ePatrick Benavoli * disclosed in any way without Intel’s prior express written permission. 1768a912857707864bbaaff9808717813105072a6ePatrick Benavoli * 1868a912857707864bbaaff9808717813105072a6ePatrick Benavoli * No license under any patent, copyright, trade secret or other intellectual 1968a912857707864bbaaff9808717813105072a6ePatrick Benavoli * property right is granted to or conferred upon you by disclosure or delivery 2068a912857707864bbaaff9808717813105072a6ePatrick Benavoli * of the Materials, either expressly, by implication, inducement, estoppel or 2168a912857707864bbaaff9808717813105072a6ePatrick Benavoli * otherwise. Any license under such intellectual property rights must be 2268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * express and approved by Intel in writing. 2368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * 2468a912857707864bbaaff9808717813105072a6ePatrick Benavoli * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com) 2568a912857707864bbaaff9808717813105072a6ePatrick Benavoli * CREATED: 2011-06-01 2668a912857707864bbaaff9808717813105072a6ePatrick Benavoli * UPDATED: 2011-07-27 2768a912857707864bbaaff9808717813105072a6ePatrick Benavoli * 2868a912857707864bbaaff9808717813105072a6ePatrick Benavoli * 2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli * </auto_header> 3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli */ 3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BitParameter.h" 3268a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BitParameterType.h" 3368a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ParameterAccessContext.h" 3468a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ConfigurationAccessContext.h" 3568a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ParameterBlackboard.h" 3668a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BitParameterBlock.h" 3768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 3868a912857707864bbaaff9808717813105072a6ePatrick Benavoli#define base CInstanceConfigurableElement 3968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4068a912857707864bbaaff9808717813105072a6ePatrick BenavoliCBitParameter::CBitParameter(const string& strName, const CTypeElement* pTypeElement) : base(strName, pTypeElement) 4168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4268a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 4368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 4468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Type 4568a912857707864bbaaff9808717813105072a6ePatrick BenavoliCInstanceConfigurableElement::Type CBitParameter::getType() const 4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 4768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return EBitParameter; 4868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 4968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Size 5168a912857707864bbaaff9808717813105072a6ePatrick Benavoliuint32_t CBitParameter::getSize() const 5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 5368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return static_cast<const CBitParameterBlock*>(getParent())->getSize(); 5468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 5568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 5668a912857707864bbaaff9808717813105072a6ePatrick Benavoli// XML configuration settings parsing/composing 5768a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CBitParameter::serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const 5868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 5968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Handle access 6068a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!configurationAccessContext.serializeOut()) { 6168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Write to blackboard 6368a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!doSetValue(xmlConfigurableElementSettingsElement.getTextContent(), getOffset() - configurationAccessContext.getBaseOffset(), configurationAccessContext)) { 6468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6568a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Append parameter path to error 6668a912857707864bbaaff9808717813105072a6ePatrick Benavoli configurationAccessContext.appendToError(" " + getPath()); 6768a912857707864bbaaff9808717813105072a6ePatrick Benavoli 6868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 6968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 7068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } else { 7168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Get string value 7368a912857707864bbaaff9808717813105072a6ePatrick Benavoli string strValue; 7468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7568a912857707864bbaaff9808717813105072a6ePatrick Benavoli doGetValue(strValue, getOffset() - configurationAccessContext.getBaseOffset(), configurationAccessContext); 7668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 7768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Populate value into xml text node 7868a912857707864bbaaff9808717813105072a6ePatrick Benavoli xmlConfigurableElementSettingsElement.setTextContent(strValue); 7968a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 8068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 8168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Done 8268a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 8368a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 8468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 8568a912857707864bbaaff9808717813105072a6ePatrick Benavoliuint32_t CBitParameter::getFootPrint() const 8668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 8768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Allocation made on parent side 8868a912857707864bbaaff9808717813105072a6ePatrick Benavoli return 0; 8968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 9068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9168a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Dump 9268a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CBitParameter::logValue(string& strValue, CErrorContext& errorContext) const 9368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 9468a912857707864bbaaff9808717813105072a6ePatrick Benavoli CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext); 9568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 9668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Dump value 9768a912857707864bbaaff9808717813105072a6ePatrick Benavoli doGetValue(strValue, getOffset(), parameterContext); 9868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 9968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Parameter Access 10168a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CBitParameter::setValue(CPathNavigator& pathNavigator, const string& strValue, CErrorContext& errorContext) const 10268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 10368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Check path validity 10468a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!checkPathExhausted(pathNavigator, errorContext)) { 10568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 10668a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 10768a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 10868a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Parameter context 10968a912857707864bbaaff9808717813105072a6ePatrick Benavoli CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext); 11068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 11168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Set Value 11268a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!doSetValue(strValue, getOffset(), parameterContext)) { 11368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 11468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Append parameter path to error 11568a912857707864bbaaff9808717813105072a6ePatrick Benavoli parameterContext.appendToError(" " + getPath()); 11668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 11768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 11868a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 11968a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Synchronize 12068a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!sync(parameterContext)) { 12168a912857707864bbaaff9808717813105072a6ePatrick Benavoli 12268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Append parameter path to error 12368a912857707864bbaaff9808717813105072a6ePatrick Benavoli parameterContext.appendToError(" " + getPath()); 12468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 12568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 12668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 12768a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 12868a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 12968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13068a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CBitParameter::getValue(CPathNavigator& pathNavigator, string& strValue, CErrorContext& errorContext) const 13168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 13268a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Check path validity 13368a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!checkPathExhausted(pathNavigator, errorContext)) { 13468a912857707864bbaaff9808717813105072a6ePatrick Benavoli 13568a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 13668a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 13768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Parameter context 13868a912857707864bbaaff9808717813105072a6ePatrick Benavoli CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext); 13968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Get Value 14168a912857707864bbaaff9808717813105072a6ePatrick Benavoli doGetValue(strValue, getOffset(), parameterContext); 14268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14368a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 14568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 14668a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CBitParameter::doSetValue(const string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const 14768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiData = 0; 14968a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15068a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Read/modify/write 15168a912857707864bbaaff9808717813105072a6ePatrick Benavoli CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard(); 15268a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15368a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Beware this code works on little endian architectures only! 15468a912857707864bbaaff9808717813105072a6ePatrick Benavoli pBlackboard->read(&uiData, getSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem()); 15568a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15668a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Convert 15768a912857707864bbaaff9808717813105072a6ePatrick Benavoli if (!static_cast<const CBitParameterType*>(getTypeElement())->asInteger(strValue, uiData, parameterAccessContext)) { 15868a912857707864bbaaff9808717813105072a6ePatrick Benavoli 15968a912857707864bbaaff9808717813105072a6ePatrick Benavoli return false; 16068a912857707864bbaaff9808717813105072a6ePatrick Benavoli } 16168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Write blackboard 16268a912857707864bbaaff9808717813105072a6ePatrick Benavoli pBlackboard->write(&uiData, getSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem()); 16368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 16468a912857707864bbaaff9808717813105072a6ePatrick Benavoli return true; 16568a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 16668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 16768a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CBitParameter::doGetValue(string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const 16868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{ 16968a912857707864bbaaff9808717813105072a6ePatrick Benavoli uint32_t uiData = 0; 17068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 17168a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Read blackboard 17268a912857707864bbaaff9808717813105072a6ePatrick Benavoli CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard(); 17368a912857707864bbaaff9808717813105072a6ePatrick Benavoli 17468a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Beware this code works on little endian architectures only! 17568a912857707864bbaaff9808717813105072a6ePatrick Benavoli pBlackboard->read(&uiData, getSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem()); 17668a912857707864bbaaff9808717813105072a6ePatrick Benavoli 17768a912857707864bbaaff9808717813105072a6ePatrick Benavoli // Convert 17868a912857707864bbaaff9808717813105072a6ePatrick Benavoli static_cast<const CBitParameterType*>(getTypeElement())->asString(uiData, strValue); 17968a912857707864bbaaff9808717813105072a6ePatrick Benavoli} 18068a912857707864bbaaff9808717813105072a6ePatrick Benavoli 181