blob: 230a2f11dc9647e723b6e986c682e4961e0790a3 [file] [log] [blame]
Kevin Rocard93250d12012-07-19 17:48:30 +02001/*
David Wagnerb76c9d62014-02-05 18:30:24 +01002 * Copyright (c) 2011-2014, Intel Corporation
3 * All rights reserved.
Patrick Benavoli065264a2011-11-20 15:46:41 +01004 *
David Wagnerb76c9d62014-02-05 18:30:24 +01005 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
Patrick Benavoli065264a2011-11-20 15:46:41 +01007 *
David Wagnerb76c9d62014-02-05 18:30:24 +01008 * 1. Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer.
Patrick Benavoli065264a2011-11-20 15:46:41 +010010 *
David Wagnerb76c9d62014-02-05 18:30:24 +010011 * 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 Benavoli065264a2011-11-20 15:46:41 +010029 */
30#include "ParameterHandle.h"
31#include "ParameterAccessContext.h"
32#include "BaseParameter.h"
33#include "Subsystem.h"
34#include <assert.h>
35#include "ParameterMgr.h"
36#include "AutoLock.h"
37
38CParameterHandle::CParameterHandle(const CBaseParameter* pParameter, CParameterMgr* pParameterMgr)
39 : _pBaseParameter(pParameter), _pParameterMgr(pParameterMgr), _bBigEndianSubsystem(pParameter->getBelongingSubsystem()->isBigEndian())
40{
41}
42
43// Parameter features
44bool CParameterHandle::isRogue() const
45{
46 return _pBaseParameter->isRogue();
47}
48
49bool CParameterHandle::isArray() const
50{
51 return !_pBaseParameter->isScalar();
52}
53
54// Array Length
55uint32_t CParameterHandle::getArrayLength() const
56{
57 return _pBaseParameter->getArrayLength();
58}
59
60// Parameter path
61string CParameterHandle::getPath() const
62{
63 return _pBaseParameter->getPath();
64}
65
66// Parameter kind
67string CParameterHandle::getKind() const
68{
69 return _pBaseParameter->getKind();
70}
71
72// Boolean access
73bool CParameterHandle::setAsBoolean(bool bValue, string& strError)
74{
75 // Check operation validity
76 if (!checkAccessValidity(true, 0, strError)) {
77
78 return false;
79 }
80 // Ensure we're safe against blackboard foreign access
81 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
82
83 // When in tuning mode, silently skip the request
84 if (_pParameterMgr->tuningModeOn()) {
85
86 return true;
87 }
88
89 // Define access context
90 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
91
92 return _pBaseParameter->accessAsBoolean(bValue, true, parameterAccessContext);
93}
94
Frédéric Boisnarddfbd7a62013-07-31 17:37:20 +020095bool CParameterHandle::getAsBoolean(bool& bValue, string& strError) const
Patrick Benavoli065264a2011-11-20 15:46:41 +010096{
97 // Check operation validity
98 if (!checkAccessValidity(false, 0, strError)) {
99
100 return false;
101 }
102 // Ensure we're safe against blackboard foreign access
103 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
104
105 // Define access context
106 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
107
108 return _pBaseParameter->accessAsBoolean(bValue, false, parameterAccessContext);
109}
110
111bool CParameterHandle::setAsBooleanArray(const vector<bool>& abValues, string& strError)
112{
113 // Check operation validity
114 if (!checkAccessValidity(true, abValues.size(), strError)) {
115
116 return false;
117 }
118 // Ensure we're safe against blackboard foreign access
119 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
120
121 // When in tuning mode, silently skip the request
122 if (_pParameterMgr->tuningModeOn()) {
123
124 return true;
125 }
126
127 // Define access context
128 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
129
130 // Copy values for type adaptation
131 vector<bool> abUserValues = abValues;
132
133 return _pBaseParameter->accessAsBooleanArray(abUserValues, true, parameterAccessContext);
134}
135
136bool CParameterHandle::getAsBooleanArray(vector<bool>& abValues, string& strError) const
137{
138 // Check operation validity
139 if (!checkAccessValidity(false, -1, strError)) {
140
141 return false;
142 }
143 // Ensure we're safe against blackboard foreign access
144 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
145
146 // Define access context
147 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
148
149 return _pBaseParameter->accessAsBooleanArray(abValues, false, parameterAccessContext);
150}
151
152// Integer Access
153bool CParameterHandle::setAsInteger(uint32_t uiValue, string& strError)
154{
155 // Check operation validity
156 if (!checkAccessValidity(true, 0, strError)) {
157
158 return false;
159 }
160 // Ensure we're safe against blackboard foreign access
161 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
162
163 // When in tuning mode, silently skip the request
164 if (_pParameterMgr->tuningModeOn()) {
165
166 return true;
167 }
168
169 // Define access context
170 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
171
172 return _pBaseParameter->accessAsInteger(uiValue, true, parameterAccessContext);
173}
174
175bool CParameterHandle::getAsInteger(uint32_t& uiValue, string& strError) const
176{
177 // Check operation validity
178 if (!checkAccessValidity(false, 0, strError)) {
179
180 return false;
181 }
182 // Ensure we're safe against blackboard foreign access
183 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
184
185 // Define access context
186 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
187
188 return _pBaseParameter->accessAsInteger(uiValue, false, parameterAccessContext);
189}
190
191bool CParameterHandle::setAsIntegerArray(const vector<uint32_t>& auiValues, string& strError)
192{
193 // Check operation validity
194 if (!checkAccessValidity(true, auiValues.size(), strError)) {
195
196 return false;
197 }
198 // Ensure we're safe against blackboard foreign access
199 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
200
201 // When in tuning mode, silently skip the request
202 if (_pParameterMgr->tuningModeOn()) {
203
204 return true;
205 }
206
207 // Define access context
208 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
209
210 // Copy values for type adaptation
211 vector<uint32_t> auiUserValues = auiValues;
212
213 return _pBaseParameter->accessAsIntegerArray(auiUserValues, true, parameterAccessContext);
214}
215
216bool CParameterHandle::getAsIntegerArray(vector<uint32_t>& auiValues, string& strError) const
217{
218 // Check operation validity
219 if (!checkAccessValidity(false, -1, strError)) {
220
221 return false;
222 }
223 // Ensure we're safe against blackboard foreign access
224 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
225
226 // Define access context
227 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
228
229 return _pBaseParameter->accessAsIntegerArray(auiValues, false, parameterAccessContext);
230}
231
232// Signed Integer Access
233bool CParameterHandle::setAsSignedInteger(int32_t iValue, string& strError)
234{
235 // Check operation validity
236 if (!checkAccessValidity(true, 0, strError)) {
237
238 return false;
239 }
240 // Ensure we're safe against blackboard foreign access
241 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
242
243 // When in tuning mode, silently skip the request
244 if (_pParameterMgr->tuningModeOn()) {
245
246 return true;
247 }
248
249 // Define access context
250 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
251
252 return _pBaseParameter->accessAsSignedInteger(iValue, true, parameterAccessContext);
253}
254
255bool CParameterHandle::getAsSignedInteger(int32_t& iValue, string& strError) const
256{
257 // Check operation validity
258 if (!checkAccessValidity(false, 0, strError)) {
259
260 return false;
261 }
262 // Ensure we're safe against blackboard foreign access
263 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
264
265 // Define access context
266 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
267
268 return _pBaseParameter->accessAsSignedInteger(iValue, false, parameterAccessContext);
269}
270
271bool CParameterHandle::setAsSignedIntegerArray(const vector<int32_t>& aiValues, string& strError)
272{
273 // Check operation validity
274 if (!checkAccessValidity(true, aiValues.size(), strError)) {
275
276 return false;
277 }
278 // Ensure we're safe against blackboard foreign access
279 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
280
281 // When in tuning mode, silently skip the request
282 if (_pParameterMgr->tuningModeOn()) {
283
284 return true;
285 }
286
287 // Define access context
288 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
289
290 // Copy values for type adaptation
291 vector<int32_t> aiUserValues = aiValues;
292
293 return _pBaseParameter->accessAsSignedIntegerArray(aiUserValues, true, parameterAccessContext);
294}
295
296bool CParameterHandle::getAsSignedIntegerArray(vector<int32_t>& aiValues, string& strError) const
297{
298 // Check operation validity
299 if (!checkAccessValidity(false, -1, strError)) {
300
301 return false;
302 }
303 // Ensure we're safe against blackboard foreign access
304 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
305
306 // Define access context
307 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
308
309 return _pBaseParameter->accessAsSignedIntegerArray(aiValues, false, parameterAccessContext);
310}
311
312// Double Access
313bool CParameterHandle::setAsDouble(double dValue, string& strError)
314{
315 // Check operation validity
316 if (!checkAccessValidity(true, 0, strError)) {
317
318 return false;
319 }
320 // Ensure we're safe against blackboard foreign access
321 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
322
323 // When in tuning mode, silently skip the request
324 if (_pParameterMgr->tuningModeOn()) {
325
326 return true;
327 }
328
329 // Define access context
330 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
331
332 return _pBaseParameter->accessAsDouble(dValue, true, parameterAccessContext);
333}
334
335bool CParameterHandle::getAsDouble(double& dValue, string& strError) const
336{
337 // Check operation validity
338 if (!checkAccessValidity(false, 0, strError)) {
339
340 return false;
341 }
342 // Ensure we're safe against blackboard foreign access
343 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
344
345 // Define access context
346 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
347
348 return _pBaseParameter->accessAsDouble(dValue, false, parameterAccessContext);
349}
350
351bool CParameterHandle::setAsDoubleArray(const vector<double>& adValues, string& strError)
352{
353 // Check operation validity
354 if (!checkAccessValidity(true, adValues.size(), strError)) {
355
356 return false;
357 }
358 // Ensure we're safe against blackboard foreign access
359 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
360
361 // When in tuning mode, silently skip the request
362 if (_pParameterMgr->tuningModeOn()) {
363
364 return true;
365 }
366
367 // Define access context
368 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
369
370 // Copy values for type adaptation
371 vector<double> adUserValues = adValues;
372
373 return _pBaseParameter->accessAsDoubleArray(adUserValues, true, parameterAccessContext);
374}
375
376bool CParameterHandle::getAsDoubleArray(vector<double>& adValues, string& strError) const
377{
378 // Check operation validity
379 if (!checkAccessValidity(false, -1, strError)) {
380
381 return false;
382 }
383 // Ensure we're safe against blackboard foreign access
384 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
385
386 // Define access context
387 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
388
389 return _pBaseParameter->accessAsDoubleArray(adValues, false, parameterAccessContext);
390}
391
392// String Access
393bool CParameterHandle::setAsString(const string& strValue, string& strError)
394{
395 // Check operation validity
396 if (!checkAccessValidity(true, 0, strError)) {
397
398 return false;
399 }
400 // Ensure we're safe against blackboard foreign access
401 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
402
403 // When in tuning mode, silently skip the request
404 if (_pParameterMgr->tuningModeOn()) {
405
406 return true;
407 }
408
409 // Define access context
410 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
411
412 // Copy value for type adaptation
413 string strUserValue = strValue;
414
415 return _pBaseParameter->accessAsString(strUserValue, true, parameterAccessContext);
416}
417
418bool CParameterHandle::getAsString(string& strValue, string& strError) const
419{
420 // Check operation validity
421 if (!checkAccessValidity(false, 0, strError)) {
422
423 return false;
424 }
425 // Ensure we're safe against blackboard foreign access
426 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
427
428 // Define access context
429 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
430
431 return _pBaseParameter->accessAsString(strValue, false, parameterAccessContext);
432}
433
434bool CParameterHandle::setAsStringArray(const vector<string>& astrValues, string& strError)
435{
436 // Check operation validity
437 if (!checkAccessValidity(true, astrValues.size(), strError)) {
438
439 return false;
440 }
441 // Ensure we're safe against blackboard foreign access
442 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
443
444 // When in tuning mode, silently skip the request
445 if (_pParameterMgr->tuningModeOn()) {
446
447 return true;
448 }
449
450 // Define access context
451 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
452
453 // Copy values for type adaptation
454 vector<string> astrUserValues = astrValues;
455
456 return _pBaseParameter->accessAsStringArray(astrUserValues, true, parameterAccessContext);
457}
458
459bool CParameterHandle::getAsStringArray(vector<string>& astrValues, string& strError) const
460{
461 // Check operation validity
462 if (!checkAccessValidity(false, -1, strError)) {
463
464 return false;
465 }
466 // Ensure we're safe against blackboard foreign access
467 CAutoLock autoLock(_pParameterMgr->getBlackboardMutex());
468
469 // Define access context
470 CParameterAccessContext parameterAccessContext(strError, _bBigEndianSubsystem, _pParameterMgr->getParameterBlackboard());
471
472 return _pBaseParameter->accessAsStringArray(astrValues, false, parameterAccessContext);
473}
474
475// Access validity
476bool CParameterHandle::checkAccessValidity(bool bSet, uint32_t uiArrayLength, string& strError) const
477{
478 if (bSet && !isRogue()) {
479
480 strError = "Parameter is not rogue: ";
481
482 strError += getPath();
483
484 return false;
485 }
486
487 if (uiArrayLength && !isArray()) {
488
489 strError = "Parameter is scalar: ";
490
491 strError += getPath();
492
493 return false;
494 }
495
496 if (!uiArrayLength && isArray()) {
497
498 strError = "Parameter is an array: ";
499
500 strError += getPath();
501
502 return false;
503 }
504
505 if (bSet && uiArrayLength && (uiArrayLength != getArrayLength())) {
506
507 strError = "Array length mismatch: ";
508
509 strError += getPath();
510
511 return false;
512 }
513
514 return true;
515}