1b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner/*
2b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Copyright (c) 2011-2014, Intel Corporation
3b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * All rights reserved.
4b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
5b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Redistribution and use in source and binary forms, with or without modification,
6b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * are permitted provided that the following conditions are met:
7b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
8b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 1. Redistributions of source code must retain the above copyright notice, this
9b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * list of conditions and the following disclaimer.
10b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
11b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 2. Redistributions in binary form must reproduce the above copyright notice,
12b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * this list of conditions and the following disclaimer in the documentation and/or
13b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * other materials provided with the distribution.
14b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
15b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 3. Neither the name of the copyright holder nor the names of its contributors
16b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * may be used to endorse or promote products derived from this software without
17b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * specific prior written permission.
18b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
19b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli */
3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BitParameter.h"
3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BitParameterType.h"
3268a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ParameterAccessContext.h"
3368a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ConfigurationAccessContext.h"
3468a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ParameterBlackboard.h"
3568a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BitParameterBlock.h"
369620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard#include "BitwiseAreaConfiguration.h"
3768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
382ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli#define base CBaseParameter
3968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
40d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalveusing std::string;
41d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve
4268a912857707864bbaaff9808717813105072a6ePatrick BenavoliCBitParameter::CBitParameter(const string& strName, const CTypeElement* pTypeElement) : base(strName, pTypeElement)
4368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4468a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
4568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Type
4768a912857707864bbaaff9808717813105072a6ePatrick BenavoliCInstanceConfigurableElement::Type CBitParameter::getType() const
4868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return EBitParameter;
5068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
5168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Size
532ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoliuint32_t CBitParameter::getBelongingBlockSize() const
5468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
5568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return static_cast<const CBitParameterBlock*>(getParent())->getSize();
5668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
5768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
582ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli// Instantiation, allocation
5968a912857707864bbaaff9808717813105072a6ePatrick Benavoliuint32_t CBitParameter::getFootPrint() const
6068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
619620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard    // Allocation done at parent level
6268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return 0;
6368a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
6468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
65065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli// Actual parameter access (tuning)
6668a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CBitParameter::doSetValue(const string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
6768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
68065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    return doSet(strValue, uiOffset, parameterAccessContext);
69065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli}
70065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
71065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavolivoid CBitParameter::doGetValue(string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
72065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli{
73065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    doGet(strValue, uiOffset, parameterAccessContext);
74065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli}
75065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
76065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli/// Value access
77065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli// Boolean access
78065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavolibool CBitParameter::accessAsBoolean(bool& bValue, bool bSet, CParameterAccessContext& parameterAccessContext) const
79065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli{
80065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    // Check boolean access validity here
81065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    if (static_cast<const CBitParameterType*>(getTypeElement())->getBitSize() != 1) {
82065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
83065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli        parameterAccessContext.setError("Type mismatch");
84a1258f4f8121fbda5223e3875ac7ef6d53195e4cFrancois Gaffie        appendParameterPathToError(parameterAccessContext);
85065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
86065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli        return false;
87065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    }
88065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
89065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    // Rely on integer access
90a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    uint32_t uiValue;
91065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
92065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    if (bSet) {
93065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
94065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli        uiValue = bValue;
95065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    }
96065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
97065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    if (!accessAsInteger(uiValue, bSet, parameterAccessContext)) {
98065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
99065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli        return false;
100065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    }
101065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
102065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    if (!bSet) {
103065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
104065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli        bValue = uiValue != 0;
105065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    }
106065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
107065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    return true;
108065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli}
109065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
110065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli// Integer Access
111a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivibool CBitParameter::accessAsInteger(uint32_t& uiValue, bool bSet, CParameterAccessContext& parameterAccessContext) const
112065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli{
113065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    uint32_t uiOffset = getOffset();
114065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
115065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    if (bSet) {
116065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
1178ab7293fc32d078f558985b938fa5c71c2b0404bFrancois Gaffie        // Set Value
1188ab7293fc32d078f558985b938fa5c71c2b0404bFrancois Gaffie        if (!doSet(uiValue, uiOffset, parameterAccessContext)) {
119065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
120a1258f4f8121fbda5223e3875ac7ef6d53195e4cFrancois Gaffie            appendParameterPathToError(parameterAccessContext);
1218ab7293fc32d078f558985b938fa5c71c2b0404bFrancois Gaffie            return false;
1228ab7293fc32d078f558985b938fa5c71c2b0404bFrancois Gaffie        }
1238ab7293fc32d078f558985b938fa5c71c2b0404bFrancois Gaffie        // Synchronize
1248ab7293fc32d078f558985b938fa5c71c2b0404bFrancois Gaffie        if (!sync(parameterAccessContext)) {
125065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
126a1258f4f8121fbda5223e3875ac7ef6d53195e4cFrancois Gaffie            appendParameterPathToError(parameterAccessContext);
127065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli            return false;
128065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli        }
129065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    } else {
130065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
131065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli        // Convert
132065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli        doGet(uiValue, uiOffset, parameterAccessContext);
133065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    }
134065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    return true;
135065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli}
136065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli
137065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavolitemplate <typename type>
138065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavolibool CBitParameter::doSet(type value, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
139065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli{
1409533156ebad9b5989703db70be3f6bd22c9811c4Guillaume Denneulin    uint64_t uiData = 0;
14168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Read/modify/write
14368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Beware this code works on little endian architectures only!
1461352ae53c457466fadb3aa35f01afab899548657Patrick Benavoli    pBlackboard->readInteger(&uiData, getBelongingBlockSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
14768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Convert
149065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    if (!static_cast<const CBitParameterType*>(getTypeElement())->toBlackboard(value, uiData, parameterAccessContext)) {
15068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
15268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
15368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Write blackboard
1541352ae53c457466fadb3aa35f01afab899548657Patrick Benavoli    pBlackboard->writeInteger(&uiData, getBelongingBlockSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
15568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
15768a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
15868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
159065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavolitemplate <typename type>
160065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavolivoid CBitParameter::doGet(type& value, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
16168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
1629533156ebad9b5989703db70be3f6bd22c9811c4Guillaume Denneulin    uint64_t uiData = 0;
16368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
16468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Read blackboard
1651352ae53c457466fadb3aa35f01afab899548657Patrick Benavoli    const CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
16668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
16768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Beware this code works on little endian architectures only!
1681352ae53c457466fadb3aa35f01afab899548657Patrick Benavoli    pBlackboard->readInteger(&uiData, getBelongingBlockSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
16968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
17068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Convert
171065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli    static_cast<const CBitParameterType*>(getTypeElement())->fromBlackboard(value, uiData, parameterAccessContext);
17268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
1739620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard
1749620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard// AreaConfiguration creation
1759620e44c6c7605bf589f60331eb5b05b71336853Frédéric BoisnardCAreaConfiguration* CBitParameter::createAreaConfiguration(const CSyncerSet* pSyncerSet) const
1769620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard{
1779620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard    return new CBitwiseAreaConfiguration(this, pSyncerSet);
1789620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard}
1799620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard
1809620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard// Access from area configuration
1819533156ebad9b5989703db70be3f6bd22c9811c4Guillaume Denneulinuint64_t CBitParameter::merge(uint64_t uiOriginData, uint64_t uiNewData) const
1829620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard{
1839620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard    // Convert
1849620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard    return static_cast<const CBitParameterType*>(getTypeElement())->merge(uiOriginData, uiNewData);
1859620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard}
186