• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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.
29  */
30 #pragma once
31 
32 #include "ParameterType.h"
33 
34 #include <string>
35 
36 class CFixedPointParameterType : public CParameterType
37 {
38 public:
39     CFixedPointParameterType(const std::string &strName);
40 
41     // From IXmlSink
42     bool fromXml(const CXmlElement &xmlElement,
43                  CXmlSerializingContext &serializingContext) override;
44 
45     // From IXmlSource
46     void toXml(CXmlElement &xmlElement, CXmlSerializingContext &serializingContext) const override;
47 
48     // XML Serialization value space handling
49     // Value space handling for configuration import
50     void handleValueSpaceAttribute(
51         CXmlElement &xmlConfigurableElementSettingsElement,
52         CConfigurationAccessContext &configurationAccessContext) const override;
53 
54     /// Conversion
55     // String
56     bool toBlackboard(const std::string &strValue, uint32_t &uiValue,
57                       CParameterAccessContext &parameterAccessContext) const override;
58     bool fromBlackboard(std::string &strValue, const uint32_t &uiValue,
59                         CParameterAccessContext &parameterAccessContext) const override;
60     // Double
61     bool toBlackboard(double dUserValue, uint32_t &uiValue,
62                       CParameterAccessContext &parameterAccessContext) const override;
63     bool fromBlackboard(double &dUserValue, uint32_t uiValue,
64                         CParameterAccessContext &parameterAccessContext) const override;
65 
66     // Element properties
67     void showProperties(std::string &strResult) const override;
68 
69     // CElement
70     std::string getKind() const override;
71 
72 private:
73     // Util size
74     size_t getUtilSizeInBits() const;
75     // Range computation
76     void getRange(double &dMin, double &dMax) const;
77 
78     /**
79      * Convert a decimal raw represented string into an unsigned long integer.
80      * In case of a failing conversion or encodability, this function set the error to
81      * illegal value provided and gives the range allowed for the parameter.
82      *
83      * @param[in] strValue Parameter read from the XML file representated as a string in decimal
84      *                     raw format
85      * @param[out] uiValue Parameter representated as a long unsigned integer.
86      * @param[in,out] parameterAccessContext Parameter access context.
87      *
88      * @return true if the string was successfully converted, false otherwise.
89      */
90     bool convertFromDecimal(const std::string &strValue, uint32_t &uiValue,
91                             CParameterAccessContext &parameterAccessContext) const;
92 
93     /**
94      * Convert an hexadecimal raw represented string into an unsigned long integer.
95      * In case of a failing conversion or encodability, this function set the error to
96      * illegal value provided and gives the range allowed for the parameter.
97      *
98      * @param[in] strValue Parameter read from the XML file representated as a string in hexadecimal
99      *                     raw format
100      * @param[out] uiValue Parameter representated as a long unsigned integer.
101      * @param[in,out] parameterAccessContext Parameter access context.
102      *
103      * @return true if the string was successfully converted, false otherwise.
104      */
105     bool convertFromHexadecimal(const std::string &strValue, uint32_t &uiValue,
106                                 CParameterAccessContext &parameterAccessContext) const;
107 
108     /**
109      * Convert a Qn.m represented string into an unsigned long integer.
110      * In case of a failing conversion or encodability, this function set the error to
111      * illegal value provided and gives the range allowed for the parameter.
112      *
113      * @param[in] strValue Parameter read from the XML file representated as a string in Qn.m
114      *                     representation.
115      * @param[out] uiValue Parameter representated as a long unsigned integer.
116      * @param[in,out] parameterAccessContext Parameter access context.
117      *
118      * @return true if the string was successfully converted, false otherwise.
119      */
120     bool convertFromQnm(const std::string &strValue, uint32_t &uiValue,
121                         CParameterAccessContext &parameterAccessContext) const;
122 
123     /**
124      * Set the out of range error.
125      * In case of a failing conversion or encodability, this function set the error to
126      * illegal value provided and gives the range allowed for the parameter.
127      *
128      * @param[in] strValue Parameter read from the XML file representated as a string
129      * @param[in,out] parameterAccessContext Parameter Access Context
130      */
131     void setOutOfRangeError(const std::string &strValue,
132                             CParameterAccessContext &parameterAccessContext) const;
133 
134     // Check if data is encodable
135     bool checkValueAgainstRange(double dValue) const;
136 
137     /**
138      * Convert a double towards a Qn.m representation which is stored in binary format.
139      * This value is rounded if the double is not encodable in the corresponding Qn.m format.
140      *
141      * @param[in] dValue the double which should be converted.
142      *
143      * @return the integer which contains the converted Qn.m number.
144      */
145     int32_t doubleToBinaryQnm(double dValue) const;
146 
147     /**
148      * Convert a Qn.m binary number towards its double representation.
149      *
150      * @param[in] iValue the integer which contains the Qn.m number which should be converted.
151      *
152      * @return the double which contains the double representation of iValue.
153      */
154     double binaryQnmToDouble(int32_t iValue) const;
155 
156     // Integral part in Q notation
157     uint32_t _uiIntegral{0};
158     // Fractional part in Q notation
159     uint32_t _uiFractional{0};
160 };
161