blob: d239ed8353d8403874ddb6aee00b4af7e5589951 [file] [log] [blame]
David Wagnerb76c9d62014-02-05 18:30:24 +01001/*
2 * Copyright (c) 2011-2014, Intel Corporation
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation and/or
13 * other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors
16 * may be used to endorse or promote products derived from this software without
17 * specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Patrick Benavoli68a91282011-08-31 11:23:23 +020029 */
30#include "BitParameter.h"
31#include "BitParameterType.h"
32#include "ParameterAccessContext.h"
33#include "ConfigurationAccessContext.h"
34#include "ParameterBlackboard.h"
35#include "BitParameterBlock.h"
Frédéric Boisnard9620e442012-05-30 16:15:02 +020036#include "BitwiseAreaConfiguration.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020037
Patrick Benavoli2ecf9002011-08-31 11:23:24 +020038#define base CBaseParameter
Patrick Benavoli68a91282011-08-31 11:23:23 +020039
40CBitParameter::CBitParameter(const string& strName, const CTypeElement* pTypeElement) : base(strName, pTypeElement)
41{
42}
43
44// Type
45CInstanceConfigurableElement::Type CBitParameter::getType() const
46{
47 return EBitParameter;
48}
49
50// Size
Patrick Benavoli2ecf9002011-08-31 11:23:24 +020051uint32_t CBitParameter::getBelongingBlockSize() const
Patrick Benavoli68a91282011-08-31 11:23:23 +020052{
53 return static_cast<const CBitParameterBlock*>(getParent())->getSize();
54}
55
Patrick Benavoli2ecf9002011-08-31 11:23:24 +020056// Instantiation, allocation
Patrick Benavoli68a91282011-08-31 11:23:23 +020057uint32_t CBitParameter::getFootPrint() const
58{
Frédéric Boisnard9620e442012-05-30 16:15:02 +020059 // Allocation done at parent level
Patrick Benavoli68a91282011-08-31 11:23:23 +020060 return 0;
61}
62
Patrick Benavoli065264a2011-11-20 15:46:41 +010063// Actual parameter access (tuning)
Patrick Benavoli68a91282011-08-31 11:23:23 +020064bool CBitParameter::doSetValue(const string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
65{
Patrick Benavoli065264a2011-11-20 15:46:41 +010066 return doSet(strValue, uiOffset, parameterAccessContext);
67}
68
69void CBitParameter::doGetValue(string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
70{
71 doGet(strValue, uiOffset, parameterAccessContext);
72}
73
74/// Value access
75// Boolean access
76bool CBitParameter::accessAsBoolean(bool& bValue, bool bSet, CParameterAccessContext& parameterAccessContext) const
77{
78 // Check boolean access validity here
79 if (static_cast<const CBitParameterType*>(getTypeElement())->getBitSize() != 1) {
80
81 parameterAccessContext.setError("Type mismatch");
Francois Gaffiea1258f42014-04-07 13:47:48 +020082 appendParameterPathToError(parameterAccessContext);
Patrick Benavoli065264a2011-11-20 15:46:41 +010083
84 return false;
85 }
86
87 // Rely on integer access
Guillaume Denneulin95331562012-09-27 15:13:10 +020088 uint64_t uiValue;
Patrick Benavoli065264a2011-11-20 15:46:41 +010089
90 if (bSet) {
91
92 uiValue = bValue;
93 }
94
95 if (!accessAsInteger(uiValue, bSet, parameterAccessContext)) {
96
97 return false;
98 }
99
100 if (!bSet) {
101
102 bValue = uiValue != 0;
103 }
104
105 return true;
106}
107
108// Integer Access
Guillaume Denneulin95331562012-09-27 15:13:10 +0200109bool CBitParameter::accessAsInteger(uint64_t& uiValue, bool bSet, CParameterAccessContext& parameterAccessContext) const
Patrick Benavoli065264a2011-11-20 15:46:41 +0100110{
111 uint32_t uiOffset = getOffset();
112
113 if (bSet) {
114
Francois Gaffie8ab72932014-04-07 13:46:05 +0200115 // Set Value
116 if (!doSet(uiValue, uiOffset, parameterAccessContext)) {
Patrick Benavoli065264a2011-11-20 15:46:41 +0100117
Francois Gaffiea1258f42014-04-07 13:47:48 +0200118 appendParameterPathToError(parameterAccessContext);
Francois Gaffie8ab72932014-04-07 13:46:05 +0200119 return false;
120 }
121 // Synchronize
122 if (!sync(parameterAccessContext)) {
Patrick Benavoli065264a2011-11-20 15:46:41 +0100123
Francois Gaffiea1258f42014-04-07 13:47:48 +0200124 appendParameterPathToError(parameterAccessContext);
Patrick Benavoli065264a2011-11-20 15:46:41 +0100125 return false;
126 }
127 } else {
128
129 // Convert
130 doGet(uiValue, uiOffset, parameterAccessContext);
131 }
132 return true;
133}
134
135template <typename type>
136bool CBitParameter::doSet(type value, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
137{
Guillaume Denneulin95331562012-09-27 15:13:10 +0200138 uint64_t uiData = 0;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200139
140 // Read/modify/write
141 CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
142
143 // Beware this code works on little endian architectures only!
Patrick Benavoli1352ae52011-10-21 16:48:04 +0200144 pBlackboard->readInteger(&uiData, getBelongingBlockSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
Patrick Benavoli68a91282011-08-31 11:23:23 +0200145
146 // Convert
Patrick Benavoli065264a2011-11-20 15:46:41 +0100147 if (!static_cast<const CBitParameterType*>(getTypeElement())->toBlackboard(value, uiData, parameterAccessContext)) {
Patrick Benavoli68a91282011-08-31 11:23:23 +0200148
149 return false;
150 }
151 // Write blackboard
Patrick Benavoli1352ae52011-10-21 16:48:04 +0200152 pBlackboard->writeInteger(&uiData, getBelongingBlockSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
Patrick Benavoli68a91282011-08-31 11:23:23 +0200153
154 return true;
155}
156
Patrick Benavoli065264a2011-11-20 15:46:41 +0100157template <typename type>
158void CBitParameter::doGet(type& value, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
Patrick Benavoli68a91282011-08-31 11:23:23 +0200159{
Guillaume Denneulin95331562012-09-27 15:13:10 +0200160 uint64_t uiData = 0;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200161
162 // Read blackboard
Patrick Benavoli1352ae52011-10-21 16:48:04 +0200163 const CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
Patrick Benavoli68a91282011-08-31 11:23:23 +0200164
165 // Beware this code works on little endian architectures only!
Patrick Benavoli1352ae52011-10-21 16:48:04 +0200166 pBlackboard->readInteger(&uiData, getBelongingBlockSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
Patrick Benavoli68a91282011-08-31 11:23:23 +0200167
168 // Convert
Patrick Benavoli065264a2011-11-20 15:46:41 +0100169 static_cast<const CBitParameterType*>(getTypeElement())->fromBlackboard(value, uiData, parameterAccessContext);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200170}
Frédéric Boisnard9620e442012-05-30 16:15:02 +0200171
172// AreaConfiguration creation
173CAreaConfiguration* CBitParameter::createAreaConfiguration(const CSyncerSet* pSyncerSet) const
174{
175 return new CBitwiseAreaConfiguration(this, pSyncerSet);
176}
177
178// Access from area configuration
Guillaume Denneulin95331562012-09-27 15:13:10 +0200179uint64_t CBitParameter::merge(uint64_t uiOriginData, uint64_t uiNewData) const
Frédéric Boisnard9620e442012-05-30 16:15:02 +0200180{
181 // Convert
182 return static_cast<const CBitParameterType*>(getTypeElement())->merge(uiOriginData, uiNewData);
183}