blob: e8ab8631c8a8e7344c0025d1107f2168b048ca88 [file] [log] [blame]
Frédéric Boisnarddaaa63c2012-08-27 15:48:15 +02001/*
Patrick Benavoli68a91282011-08-31 11:23:23 +02002 * INTEL CONFIDENTIAL
3 * Copyright © 2011 Intel
4 * Corporation All Rights Reserved.
5 *
6 * The source code contained or described herein and all documents related to
7 * the source code ("Material") are owned by Intel Corporation or its suppliers
8 * or licensors. Title to the Material remains with Intel Corporation or its
9 * suppliers and licensors. The Material contains trade secrets and proprietary
10 * and confidential information of Intel or its suppliers and licensors. The
11 * Material is protected by worldwide copyright and trade secret laws and
12 * treaty provisions. No part of the Material may be used, copied, reproduced,
13 * modified, published, uploaded, posted, transmitted, distributed, or
14 * disclosed in any way without Intel’s prior express written permission.
15 *
16 * No license under any patent, copyright, trade secret or other intellectual
17 * property right is granted to or conferred upon you by disclosure or delivery
18 * of the Materials, either expressly, by implication, inducement, estoppel or
19 * otherwise. Any license under such intellectual property rights must be
20 * express and approved by Intel in writing.
21 *
Patrick Benavoli68a91282011-08-31 11:23:23 +020022 * CREATED: 2011-06-01
23 * UPDATED: 2011-07-27
Patrick Benavoli68a91282011-08-31 11:23:23 +020024 */
25#include "ParameterMgr.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020026#include "XmlParameterSerializingContext.h"
27#include "XmlElementSerializingContext.h"
28#include "SystemClass.h"
29#include "ElementLibrarySet.h"
30#include "SubsystemLibrary.h"
31#include "NamedElementBuilderTemplate.h"
32#include "KindElementBuilderTemplate.h"
33#include "ElementBuilderTemplate.h"
34#include "SelectionCriterionType.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020035#include "SubsystemElementBuilder.h"
36#include "SelectionCriteria.h"
37#include "ComponentType.h"
38#include "ComponentInstance.h"
39#include "ParameterBlockType.h"
40#include "BooleanParameterType.h"
41#include "IntegerParameterType.h"
42#include "FixedPointParameterType.h"
43#include "ParameterBlackboard.h"
44#include "Parameter.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020045#include "ParameterAccessContext.h"
46#include "XmlFileIncluderElement.h"
47#include "ParameterFrameworkConfiguration.h"
48#include "FrameworkConfigurationGroup.h"
Guillaume Denneulina4ec15d2012-02-17 14:38:14 +010049#include "PluginLocation.h"
50#include "SubsystemPlugins.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020051#include "FrameworkConfigurationLocation.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020052#include "ConfigurableDomains.h"
53#include "ConfigurableDomain.h"
54#include "DomainConfiguration.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020055#include "XmlDomainSerializingContext.h"
56#include "BitParameterBlockType.h"
57#include "BitParameterType.h"
Patrick Benavoli1352ae52011-10-21 16:48:04 +020058#include "StringParameterType.h"
Patrick Benavoli9fc3c0d2011-10-27 14:27:27 +020059#include "EnumParameterType.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020060#include "RemoteProcessorServerInterface.h"
61#include "ElementLocator.h"
62#include "AutoLog.h"
63#include "CompoundRule.h"
64#include "SelectionCriterionRule.h"
65#include "SimulatedBackSynchronizer.h"
66#include "HardwareBackSynchronizer.h"
Patrick Benavoli1387bda2011-08-31 11:23:24 +020067#include "AutoLock.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020068#include <strings.h>
69#include <dlfcn.h>
70#include <assert.h>
Patrick Benavoli065264a2011-11-20 15:46:41 +010071#include "ParameterHandle.h"
Patrick Benavoliee65e6d2011-11-20 18:52:24 +010072#include "LinearParameterAdaptation.h"
Patrick Benavoli68808c62012-02-02 17:12:41 +010073#include "EnumValuePair.h"
Georges-Henri Baron326a31d2012-06-28 12:05:09 +020074#include "XmlFileDocSink.h"
75#include "XmlFileDocSource.h"
76#include "XmlStringDocSink.h"
77#include "XmlMemoryDocSink.h"
78#include "XmlMemoryDocSource.h"
Kevin Rocardace81f82012-12-11 16:19:17 +010079#include "Utility.h"
Patrick Benavoli68a91282011-08-31 11:23:23 +020080
81#define base CElement
82
83// Used for remote processor server creation
84typedef IRemoteProcessorServerInterface* (*CreateRemoteProcessorServer)(uint16_t uiPort, IRemoteCommandHandler* pCommandHandler);
85
86// Global configuration file name (fixed)
87const char* gacParameterFrameworkConfigurationFileName = "ParameterFrameworkConfiguration.xml";
88const char* gacSystemSchemasSubFolder = "Schemas";
89
90// Config File System looks normally like this:
91// ---------------------------------------------
Patrick Benavoli95ac0342011-11-07 20:32:51 +010092//├── <ParameterFrameworkConfiguration>.xml
Patrick Benavoli68a91282011-08-31 11:23:23 +020093//├── Schemas
94//│ └── *.xsd
95//├── Settings
96//│ └── <SystemClassName folder>*
97//│ ├── <ConfigurableDomains>.xml
98//│ └── <Settings>.bin?
99//└── Structure
100// └── <SystemClassName folder>*
101// ├── <SystemClassName>Class.xml
102// └── <Subsystem>.xml*
103// --------------------------------------------
104
105
106// Remote command parser array
Patrick Benavoli592ae562011-09-05 16:53:58 +0200107const CParameterMgr::SRemoteCommandParserItem CParameterMgr::gastRemoteCommandParserItems[] = {
Patrick Benavoli592ae562011-09-05 16:53:58 +0200108 /// Version
109 { "version", &CParameterMgr::versionCommandProcess, 0, "", "Show version" },
Patrick Benavoli68a91282011-08-31 11:23:23 +0200110 /// Status
111 { "status", &CParameterMgr::statusCommandProcess, 0, "", "Show current status" },
112 /// Tuning Mode
113 { "setTuningMode", &CParameterMgr::setTuningModeCommmandProcess, 1, "on|off*", "Turn on or off Tuning Mode" },
114 { "getTuningMode", &CParameterMgr::getTuningModeCommmandProcess, 0, "", "Show Tuning Mode" },
115 /// Value Space
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200116 { "setValueSpace", &CParameterMgr::setValueSpaceCommmandProcess, 1, "raw|real*", "Assigns Value Space used for parameter value interpretation" },
Patrick Benavoli68a91282011-08-31 11:23:23 +0200117 { "getValueSpace", &CParameterMgr::getValueSpaceCommmandProcess, 0, "", "Show Value Space" },
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200118 /// Output Raw Format
119 { "setOutputRawFormat", &CParameterMgr::setOutputRawFormatCommmandProcess, 1, "dec*|hex", "Assigns format used to output parameter values when in raw Value Space" },
120 { "getOutputRawFormat", &CParameterMgr::getOutputRawFormatCommmandProcess, 0, "", "Show Output Raw Format" },
Patrick Benavoli68a91282011-08-31 11:23:23 +0200121 /// Sync
122 { "setAutoSync", &CParameterMgr::setAutoSyncCommmandProcess, 1, "on*|off", "Turn on or off automatic synchronization to hardware while in Tuning Mode" },
123 { "getAutoSync", &CParameterMgr::getAutoSyncCommmandProcess, 0, "", "Show Auto Sync state" },
124 { "sync", &CParameterMgr::syncCommmandProcess, 0, "", "Synchronize current settings to hardware while in Tuning Mode and Auto Sync off" },
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200125 /// Criteria
Patrick Benavoli1387bda2011-08-31 11:23:24 +0200126 { "listCriteria", &CParameterMgr::listCriteriaCommmandProcess, 0, "", "List selection criteria" },
Patrick Benavoli68a91282011-08-31 11:23:23 +0200127 /// Domains
128 { "listDomains", &CParameterMgr::listDomainsCommmandProcess, 0, "", "List configurable domains" },
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100129 { "dumpDomains", &CParameterMgr::dumpDomainsCommmandProcess, 0, "", "Show all domains and configurations, including applicability conditions" },
Patrick Benavoli68a91282011-08-31 11:23:23 +0200130 { "createDomain", &CParameterMgr::createDomainCommmandProcess, 1, "<domain>", "Create new configurable domain" },
131 { "deleteDomain", &CParameterMgr::deleteDomainCommmandProcess, 1, "<domain>", "Delete configurable domain" },
Kevin Rocard170f0a42012-06-18 13:56:05 +0200132 { "deleteAllDomains", &CParameterMgr::deleteAllDomainsCommmandProcess, 0, "", "Delete all configurable domains" },
Patrick Benavoli68a91282011-08-31 11:23:23 +0200133 { "renameDomain", &CParameterMgr::renameDomainCommmandProcess, 2, "<domain> <new name>", "Rename configurable domain" },
Patrick Benavoli63499d42011-10-24 18:50:03 +0200134 { "setSequenceAwareness", &CParameterMgr::setSequenceAwarenessCommmandProcess, 1, "<domain> true|false*", "Set configurable domain sequence awareness" },
135 { "getSequenceAwareness", &CParameterMgr::getSequenceAwarenessCommmandProcess, 1, "<domain>", "Get configurable domain sequence awareness" },
Patrick Benavoli68a91282011-08-31 11:23:23 +0200136 { "listDomainElements", &CParameterMgr::listDomainElementsCommmandProcess, 1, "<domain>", "List elements associated to configurable domain" },
137 { "addElement", &CParameterMgr::addElementCommmandProcess, 2, "<domain> <elem path>", "Associate element at given path to configurable domain" },
138 { "removeElement", &CParameterMgr::removeElementCommmandProcess, 2, "<domain> <elem path>", "Dissociate element at given path from configurable domain" },
139 { "splitDomain", &CParameterMgr::splitDomainCommmandProcess, 2, "<domain> <elem path>", "Split configurable domain at given associated element path" },
140 /// Configurations
141 { "listConfigurations", &CParameterMgr::listConfigurationsCommmandProcess, 1, "<domain>", "List domain configurations" },
142 { "createConfiguration", &CParameterMgr::createConfigurationCommmandProcess, 2, "<domain> <configuration>", "Create new domain configuration" },
143 { "deleteConfiguration", &CParameterMgr::deleteConfigurationCommmandProcess, 2, "<domain> <configuration>", "Delete domain configuration" },
144 { "renameConfiguration", &CParameterMgr::renameConfigurationCommmandProcess, 3, "<domain> <configuration> <new name>", "Rename domain configuration" },
145 { "saveConfiguration", &CParameterMgr::saveConfigurationCommmandProcess, 2, "<domain> <configuration>", "Save current settings into configuration" },
146 { "restoreConfiguration", &CParameterMgr::restoreConfigurationCommmandProcess, 2, "<domain> <configuration>", "Restore current settings from configuration" },
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100147 { "setElementSequence", &CParameterMgr::setElementSequenceCommmandProcess, 3, "<domain> <configuration> <elem path list>", "Set element application order for configuration" },
Patrick Benavoli63499d42011-10-24 18:50:03 +0200148 { "getElementSequence", &CParameterMgr::getElementSequenceCommmandProcess, 2, "<domain> <configuration>", "Get element application order for configuration" },
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100149 { "setRule", &CParameterMgr::setRuleCommmandProcess, 3, "<domain> <configuration> <rule>", "Set configuration application rule" },
150 { "clearRule", &CParameterMgr::clearRuleCommmandProcess, 2, "<domain> <configuration>", "Clear configuration application rule" },
151 { "getRule", &CParameterMgr::getRuleCommmandProcess, 2, "<domain> <configuration>", "Get configuration application rule" },
Patrick Benavoli68a91282011-08-31 11:23:23 +0200152 /// Elements/Parameters
153 { "listElements", &CParameterMgr::listElementsCommmandProcess, 1, "<elem path>|/", "List elements under element at given path or root" },
Patrick Benavoli592ae562011-09-05 16:53:58 +0200154 { "listParameters", &CParameterMgr::listParametersCommmandProcess, 1, "<elem path>|/", "List parameters under element at given path or root" },
Patrick Benavoli68a91282011-08-31 11:23:23 +0200155 { "dumpElement", &CParameterMgr::dumpElementCommmandProcess, 1, "<elem path>", "Dump structure and content of element at given path" },
156 { "getElementSize", &CParameterMgr::getElementSizeCommmandProcess, 1, "<elem path>", "Show size of element at given path" },
Patrick Benavoli2ecf9002011-08-31 11:23:24 +0200157 { "showProperties", &CParameterMgr::showPropertiesCommmandProcess, 1, "<elem path>", "Show properties of element at given path" },
Patrick Benavoli1387bda2011-08-31 11:23:24 +0200158 { "getParameter", &CParameterMgr::getParameterCommmandProcess, 1, "<param path>", "Get value for parameter at given path" },
Patrick Benavoli2ecf9002011-08-31 11:23:24 +0200159 { "setParameter", &CParameterMgr::setParameterCommmandProcess, 2, "<param path> <value>", "Set value for parameter at given path" },
Patrick Benavoli1387bda2011-08-31 11:23:24 +0200160 { "listBelongingDomains", &CParameterMgr::listBelongingDomainsCommmandProcess, 1, "<elem path>", "List domain(s) element at given path belongs to" },
Patrick Benavoli68a91282011-08-31 11:23:23 +0200161 { "listAssociatedDomains", &CParameterMgr::listAssociatedDomainsCommmandProcess, 1, "<elem path>", "List domain(s) element at given path is associated to" },
Frédéric Boisnarde42dacd2013-02-25 15:56:56 +0100162 { "getConfigurationParameter", &CParameterMgr::getConfigurationParameterCommmandProcess, 3, "<domain> <configuration> <param path>", "Get value for parameter at given path from configuration" },
163 { "setConfigurationParameter", &CParameterMgr::setConfigurationParameterCommmandProcess, 4, "<domain> <configuration> <param path> <value>", "Set value for parameter at given path to configuration" },
Patrick Benavoli68a91282011-08-31 11:23:23 +0200164 /// Browse
165 { "listAssociatedElements", &CParameterMgr::listAssociatedElementsCommmandProcess, 0, "", "List element sub-trees associated to at least one configurable domain" },
166 { "listConflictingElements", &CParameterMgr::listConflictingElementsCommmandProcess, 0, "", "List element sub-trees contained in more than one configurable domain" },
167 { "listRogueElements", &CParameterMgr::listRogueElementsCommmandProcess, 0, "", "List element sub-trees owned by no configurable domain" },
168 /// Settings Import/Export
169 { "exportDomainsXML", &CParameterMgr::exportConfigurableDomainsToXMLCommmandProcess, 1, "<file path> ", "Export domains to XML file" },
170 { "importDomainsXML", &CParameterMgr::importConfigurableDomainsFromXMLCommmandProcess, 1, "<file path>", "Import domains from XML file" },
171 { "exportDomainsWithSettingsXML", &CParameterMgr::exportConfigurableDomainsWithSettingsToXMLCommmandProcess, 1, "<file path> ", "Export domains including settings to XML file" },
172 { "importDomainsWithSettingsXML", &CParameterMgr::importConfigurableDomainsWithSettingsFromXMLCommmandProcess, 1, "<file path>", "Import domains including settings from XML file" },
173 { "exportSettings", &CParameterMgr::exportSettingsCommmandProcess, 1, "<file path>", "Export settings to binary file" },
Georges-Henri Baron326a31d2012-06-28 12:05:09 +0200174 { "importSettings", &CParameterMgr::importSettingsCommmandProcess, 1, "<file path>", "Import settings from binary file" },
175 { "getDomainsXML", &CParameterMgr::getDomainsXMLCommmandProcess, 0 ,"", "Print domains including settings as XML" },
176 /// Structure Export
177 { "getSystemClassXML", &CParameterMgr::getSystemClassXMLCommmandProcess, 0 ,"", "Print parameter structure as XML" }
Patrick Benavoli68a91282011-08-31 11:23:23 +0200178};
179// Remote command parsers array Size
Patrick Benavoli592ae562011-09-05 16:53:58 +0200180const uint32_t CParameterMgr::guiNbRemoteCommandParserItems = sizeof(gastRemoteCommandParserItems) / sizeof(gastRemoteCommandParserItems[0]);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200181
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100182CParameterMgr::CParameterMgr(const string& strConfigurationFilePath) :
Patrick Benavoli68a91282011-08-31 11:23:23 +0200183 _bTuningModeIsOn(false),
184 _bValueSpaceIsRaw(false),
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200185 _bOutputRawFormatIsHex(false),
Patrick Benavoli68a91282011-08-31 11:23:23 +0200186 _bAutoSyncOn(true),
187 _pMainParameterBlackboard(new CParameterBlackboard),
188 _pElementLibrarySet(new CElementLibrarySet),
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100189 _strXmlConfigurationFilePath(strConfigurationFilePath),
Guillaume Denneulina4ec15d2012-02-17 14:38:14 +0100190 _pSubsystemPlugins(NULL),
Patrick Benavoli68a91282011-08-31 11:23:23 +0200191 _uiStructureChecksum(0),
192 _pRemoteProcessorServer(NULL),
193 _uiMaxCommandUsageLength(0),
194 _pLogger(NULL),
195 _uiLogDepth(0)
196{
197 // Tuning Mode Mutex
Patrick Benavoli065264a2011-11-20 15:46:41 +0100198 bzero(&_blackboardMutex, sizeof(_blackboardMutex));
199 pthread_mutex_init(&_blackboardMutex, NULL);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200200
201 // Deal with children
202 addChild(new CParameterFrameworkConfiguration);
203 addChild(new CSelectionCriteria);
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100204 addChild(new CSystemClass);
205 addChild(new CConfigurableDomains);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200206
207 // Feed element library
208 feedElementLibraries();
Patrick Benavoli63499d42011-10-24 18:50:03 +0200209
210 _pCommandHandler = new CCommandHandler(this);
211
212 // Add command parsers
213 uint32_t uiRemoteCommandParserItem;
214
215 for (uiRemoteCommandParserItem = 0; uiRemoteCommandParserItem < guiNbRemoteCommandParserItems; uiRemoteCommandParserItem++) {
216
217 const SRemoteCommandParserItem* pRemoteCommandParserItem = &gastRemoteCommandParserItems[uiRemoteCommandParserItem];
218
219 _pCommandHandler->addCommandParser(pRemoteCommandParserItem->_pcCommandName,
220 pRemoteCommandParserItem->_pfnParser,
221 pRemoteCommandParserItem->_uiMinArgumentCount,
222 pRemoteCommandParserItem->_pcHelp,
223 pRemoteCommandParserItem->_pcDescription);
224 }
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100225
226 // Configuration file folder
227 uint32_t uiSlashPos = _strXmlConfigurationFilePath.rfind('/', -1);
228
229 assert(uiSlashPos != (uint32_t)-1);
230
231 _strXmlConfigurationFolderPath = _strXmlConfigurationFilePath.substr(0, uiSlashPos);
232
233 // Schema absolute folder location
234 _strSchemaFolderLocation = _strXmlConfigurationFolderPath + "/" + gacSystemSchemasSubFolder;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200235}
236
237CParameterMgr::~CParameterMgr()
238{
239 // Children
240 delete _pRemoteProcessorServer;
Frederic Boisnard31242302012-04-26 17:07:34 +0200241 delete _pCommandHandler;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200242 delete _pMainParameterBlackboard;
243 delete _pElementLibrarySet;
244
245 // Tuning Mode Mutex
Patrick Benavoli065264a2011-11-20 15:46:41 +0100246 pthread_mutex_destroy(&_blackboardMutex);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200247}
248
249string CParameterMgr::getKind() const
250{
251 return "ParameterMgr";
252}
253
254// Logging
255void CParameterMgr::setLogger(CParameterMgr::ILogger* pLogger)
256{
257 _pLogger = pLogger;
258}
259
260// Logging
Kevin Rocardace81f82012-12-11 16:19:17 +0100261void CParameterMgr::doLog(bool bIsWarning, const string& strLog) const
Patrick Benavoli68a91282011-08-31 11:23:23 +0200262{
263 if (_pLogger) {
264
265 // Nest
266 string strIndent;
267
268 // Level
269 uint32_t uiNbIndents = _uiLogDepth;
270
271 while (uiNbIndents--) {
272
273 strIndent += " ";
274 }
275
276 // Log
Kevin Rocardace81f82012-12-11 16:19:17 +0100277 _pLogger->log(bIsWarning, strIndent + strLog);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200278 }
279}
280
281void CParameterMgr::nestLog() const
282{
Patrick Benavoli592ae562011-09-05 16:53:58 +0200283 _uiLogDepth++;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200284}
285
286void CParameterMgr::unnestLog() const
287{
Patrick Benavoli592ae562011-09-05 16:53:58 +0200288 _uiLogDepth--;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200289}
290
Patrick Benavoli63499d42011-10-24 18:50:03 +0200291// Version
292string CParameterMgr::getVersion() const
293{
294 string strVersion;
295
296 // Major
297 strVersion = toString(guiEditionMajor) + ".";
298 // Minor
299 strVersion += toString(guiEditionMinor) + ".";
300 // Revision
301 strVersion += toString(guiRevision);
302
303 return strVersion;
304}
305
Patrick Benavoli68a91282011-08-31 11:23:23 +0200306bool CParameterMgr::load(string& strError)
307{
308 CAutoLog autoLog(this, "Loading");
309
310 // Load Framework configuration
311 if (!loadFrameworkConfiguration(strError)) {
312
313 return false;
314 }
315
316 // Load subsystems
Guillaume Denneulina4ec15d2012-02-17 14:38:14 +0100317 if (!getSystemClass()->loadSubsystems(strError, _pSubsystemPlugins)) {
Patrick Benavoli68a91282011-08-31 11:23:23 +0200318
319 return false;
320 }
321
322 // Load structure
323 if (!loadStructure(strError)) {
324
325 return false;
326 }
327
328 // Load settings
329 if (!loadSettings(strError)) {
330
331 return false;
332 }
333
Patrick Benavoli1387bda2011-08-31 11:23:24 +0200334 // Back synchronization for areas in parameter blackboard not covered by any domain
Kevin Rocardace81f82012-12-11 16:19:17 +0100335 CBackSynchronizer* pBackSynchronizer = createBackSynchronizer();
Patrick Benavoli68a91282011-08-31 11:23:23 +0200336
Patrick Benavoli1387bda2011-08-31 11:23:24 +0200337 // Back-synchronize
Kevin Rocard57096bd2012-11-30 11:24:20 +0100338 {
339 CAutoLog autoLog(this, "Main blackboard back synchronization");
340
Kevin Rocard5d6e05a2013-01-21 15:57:45 +0100341 pBackSynchronizer->sync();
Kevin Rocard57096bd2012-11-30 11:24:20 +0100342
Patrick Benavoli1387bda2011-08-31 11:23:24 +0200343 // Get rid of back synchronizer
344 delete pBackSynchronizer;
Patrick Benavoli1387bda2011-08-31 11:23:24 +0200345 }
Patrick Benavoli1387bda2011-08-31 11:23:24 +0200346
347 // We're done loading the settings and back synchronizing
348 CConfigurableDomains* pConfigurableDomains = getConfigurableDomains();
349
350 // We need to ensure all domains are valid
351 pConfigurableDomains->validate(_pMainParameterBlackboard);
352
Kevin Rocard7f265822012-12-07 18:51:22 +0100353 // Log selection criterion states
354 {
355 CAutoLog autoLog(this, "Criterion states");
356
357 const CSelectionCriteria* selectionCriteria = getConstSelectionCriteria();
358
359 list<string> lstrSelectionCriteron;
360 selectionCriteria->listSelectionCriteria(lstrSelectionCriteron, true, false);
361
Kevin Rocard36299362013-02-04 14:57:47 +0100362 log_table(false, lstrSelectionCriteron);
Kevin Rocard7f265822012-12-07 18:51:22 +0100363 }
364
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +0100365 // At initialization, check subsystems that need resync
366 doApplyConfigurations(true);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200367
Patrick Benavoli1387bda2011-08-31 11:23:24 +0200368 // Start remote processor server if appropriate
369 return handleRemoteProcessingInterface(strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200370}
371
372bool CParameterMgr::loadFrameworkConfiguration(string& strError)
373{
374 CAutoLog autoLog(this, "Loading framework configuration");
375
Patrick Benavoli68a91282011-08-31 11:23:23 +0200376 // Parse Structure XML file
377 CXmlElementSerializingContext elementSerializingContext(strError);
378
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100379 if (!xmlParse(elementSerializingContext, getFrameworkConfiguration(), _strXmlConfigurationFilePath, _strXmlConfigurationFolderPath, EFrameworkConfigurationLibrary)) {
Patrick Benavoli68a91282011-08-31 11:23:23 +0200380
381 return false;
382 }
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100383 // Set class name to system class and configurable domains
384 getSystemClass()->setName(getConstFrameworkConfiguration()->getSystemClassName());
385 getConfigurableDomains()->setName(getConstFrameworkConfiguration()->getSystemClassName());
386
Guillaume Denneulina4ec15d2012-02-17 14:38:14 +0100387 // Get subsystem plugins elements
388 _pSubsystemPlugins = static_cast<const CSubsystemPlugins*>(getConstFrameworkConfiguration()->findChild("SubsystemPlugins"));
Patrick Benavoli68a91282011-08-31 11:23:23 +0200389
Guillaume Denneulina4ec15d2012-02-17 14:38:14 +0100390 if (!_pSubsystemPlugins) {
Patrick Benavoli68a91282011-08-31 11:23:23 +0200391
Guillaume Denneulina4ec15d2012-02-17 14:38:14 +0100392 strError = "Parameter Framework Configuration: couldn't find SubsystemPlugins element";
Patrick Benavoli68a91282011-08-31 11:23:23 +0200393
394 return false;
395 }
Patrick Benavoli68a91282011-08-31 11:23:23 +0200396
Patrick Benavoli68a91282011-08-31 11:23:23 +0200397 // Log tuning availability
Kevin Rocardace81f82012-12-11 16:19:17 +0100398 log_info("Tuning %s", getConstFrameworkConfiguration()->isTuningAllowed() ? "allowed" : "prohibited");
Patrick Benavoli68a91282011-08-31 11:23:23 +0200399
400 return true;
401}
402
403bool CParameterMgr::loadStructure(string& strError)
404{
405 // Retrieve system to load structure to
406 CSystemClass* pSystemClass = getSystemClass();
407
408 CAutoLog autoLog(this, "Loading " + pSystemClass->getName() + " system class structure");
409
410 // Get structure description element
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100411 const CFrameworkConfigurationLocation* pStructureDescriptionFileLocation = static_cast<const CFrameworkConfigurationLocation*>(getConstFrameworkConfiguration()->findChildOfKind("StructureDescriptionFileLocation"));
Patrick Benavoli68a91282011-08-31 11:23:23 +0200412
413 if (!pStructureDescriptionFileLocation) {
414
415 strError = "No StructureDescriptionFileLocation element found for SystemClass " + pSystemClass->getName();
416
417 return false;
418 }
419
420 // Get Xml structure folder
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100421 string strXmlStructureFolder = pStructureDescriptionFileLocation->getFolderPath(_strXmlConfigurationFolderPath);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200422
423 // Get Xml structure file name
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100424 string strXmlStructureFilePath = pStructureDescriptionFileLocation->getFilePath(_strXmlConfigurationFolderPath);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200425
426 // Parse Structure XML file
427 CXmlParameterSerializingContext parameterBuildContext(strError);
428
Kevin Rocard57096bd2012-11-30 11:24:20 +0100429 CAutoLog autolog(pSystemClass, "Importing system structure from file " + strXmlStructureFilePath);
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200430
Patrick Benavoli68a91282011-08-31 11:23:23 +0200431 if (!xmlParse(parameterBuildContext, pSystemClass, strXmlStructureFilePath, strXmlStructureFolder, EParameterCreationLibrary)) {
432
433 return false;
434 }
435
436 // Initialize offsets
437 pSystemClass->setOffset(0);
438
439 // Initialize main blackboard's size
440 _pMainParameterBlackboard->setSize(pSystemClass->getFootPrint());
441
442 return true;
443}
444
445bool CParameterMgr::loadSettings(string& strError)
446{
447 CAutoLog autoLog(this, "Loading settings");
448
449 // Get settings configuration element
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100450 const CFrameworkConfigurationGroup* pParameterConfigurationGroup = static_cast<const CFrameworkConfigurationGroup*>(getConstFrameworkConfiguration()->findChildOfKind("SettingsConfiguration"));
Patrick Benavoli68a91282011-08-31 11:23:23 +0200451
452 if (!pParameterConfigurationGroup) {
453
454 // No settings to load
455
456 return true;
457 }
458 // Get binary settings file location
459 const CFrameworkConfigurationLocation* pBinarySettingsFileLocation = static_cast<const CFrameworkConfigurationLocation*>(pParameterConfigurationGroup->findChildOfKind("BinarySettingsFileLocation"));
460
461 string strXmlBinarySettingsFilePath;
462
463 if (pBinarySettingsFileLocation) {
464
465 // Get Xml binary settings file name
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100466 strXmlBinarySettingsFilePath = pBinarySettingsFileLocation->getFilePath(_strXmlConfigurationFolderPath);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200467 }
468
469 // Get configurable domains element
470 const CFrameworkConfigurationLocation* pConfigurableDomainsFileLocation = static_cast<const CFrameworkConfigurationLocation*>(pParameterConfigurationGroup->findChildOfKind("ConfigurableDomainsFileLocation"));
471
472 if (!pConfigurableDomainsFileLocation) {
473
474 strError = "No ConfigurableDomainsFileLocation element found for SystemClass " + getSystemClass()->getName();
475
476 return false;
477 }
478 // Get destination root element
479 CConfigurableDomains* pConfigurableDomains = getConfigurableDomains();
480
481 // Get Xml configuration domains file name
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100482 string strXmlConfigurationDomainsFilePath = pConfigurableDomainsFileLocation->getFilePath(_strXmlConfigurationFolderPath);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200483
484 // Get Xml configuration domains folder
Patrick Benavoli95ac0342011-11-07 20:32:51 +0100485 string strXmlConfigurationDomainsFolder = pConfigurableDomainsFileLocation->getFolderPath(_strXmlConfigurationFolderPath);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200486
487 // Parse configuration domains XML file (ask to read settings from XML file if they are not provided as binary)
488 CXmlDomainSerializingContext xmlDomainSerializingContext(strError, !pBinarySettingsFileLocation);
489
490 // Selection criteria definition for rule creation
491 xmlDomainSerializingContext.setSelectionCriteriaDefinition(getConstSelectionCriteria()->getSelectionCriteriaDefinition());
492
Patrick Benavoli63499d42011-10-24 18:50:03 +0200493 // Auto validation of configurations if no binary settings provided
494 xmlDomainSerializingContext.setAutoValidationRequired(!pBinarySettingsFileLocation);
495
Kevin Rocardace81f82012-12-11 16:19:17 +0100496 log_info("Importing configurable domains from file %s %s settings", strXmlConfigurationDomainsFilePath.c_str(), pBinarySettingsFileLocation ? "without" : "with");
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200497
Patrick Benavoli68a91282011-08-31 11:23:23 +0200498 // Do parse
499 if (!xmlParse(xmlDomainSerializingContext, pConfigurableDomains, strXmlConfigurationDomainsFilePath, strXmlConfigurationDomainsFolder, EParameterConfigurationLibrary, "SystemClassName")) {
500
501 return false;
502 }
503 // We have loaded the whole system structure, compute checksum
504 const CSystemClass* pSystemClass = getConstSystemClass();
505 _uiStructureChecksum = pSystemClass->computeStructureChecksum() + getConfigurableDomains()->computeStructureChecksum() + getSelectionCriteria()->computeStructureChecksum();
506
507 // Load binary settings if any provided
508 if (pBinarySettingsFileLocation && !pConfigurableDomains->serializeSettings(strXmlBinarySettingsFilePath, false, _uiStructureChecksum, strError)) {
509
510 return false;
511 }
512
Patrick Benavoli1387bda2011-08-31 11:23:24 +0200513 return true;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200514}
515
516// XML parsing
517bool CParameterMgr::xmlParse(CXmlElementSerializingContext& elementSerializingContext, CElement* pRootElement, const string& strXmlFilePath, const string& strXmlFolder, CParameterMgr::ElementLibrary eElementLibrary, const string& strNameAttrituteName)
518{
519 // Init serializing context
520 elementSerializingContext.set(_pElementLibrarySet->getElementLibrary(eElementLibrary), strXmlFolder, _strSchemaFolderLocation);
521
522 // Get Schema file associated to root element
523 string strXmlSchemaFilePath = _strSchemaFolderLocation + "/" + pRootElement->getKind() + ".xsd";
524
Georges-Henri Baron326a31d2012-06-28 12:05:09 +0200525 CXmlFileDocSource fileDocSource(strXmlFilePath, strXmlSchemaFilePath, pRootElement->getKind(), pRootElement->getName(), strNameAttrituteName);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200526
527 // Start clean
528 pRootElement->clean();
529
Georges-Henri Baron326a31d2012-06-28 12:05:09 +0200530 CXmlMemoryDocSink memorySink(pRootElement);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200531
Georges-Henri Baron326a31d2012-06-28 12:05:09 +0200532 if (!memorySink.process(fileDocSource, elementSerializingContext)) {
533 //Cleanup
Patrick Benavoli68a91282011-08-31 11:23:23 +0200534 pRootElement->clean();
535
536 return false;
537 }
538
Patrick Benavoli68a91282011-08-31 11:23:23 +0200539 return true;
540}
541
542// Init
543bool CParameterMgr::init(string& strError)
544{
545 return base::init(strError);
546}
547
548// Selection criteria interface
549CSelectionCriterionType* CParameterMgr::createSelectionCriterionType(bool bIsInclusive)
550{
551 // Propagate
552 return getSelectionCriteria()->createSelectionCriterionType(bIsInclusive);
553}
554
555CSelectionCriterion* CParameterMgr::createSelectionCriterion(const string& strName, const CSelectionCriterionType* pSelectionCriterionType)
556{
557 // Propagate
558 return getSelectionCriteria()->createSelectionCriterion(strName, pSelectionCriterionType);
559}
560
Patrick Benavolib71ccf72011-09-13 14:15:52 +0200561// Selection criterion retrieval
562CSelectionCriterion* CParameterMgr::getSelectionCriterion(const string& strName)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200563{
Patrick Benavolib71ccf72011-09-13 14:15:52 +0200564 // Propagate
565 return getSelectionCriteria()->getSelectionCriterion(strName);
566}
567
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +0100568// Configuration application
Kevin Rocardace81f82012-12-11 16:19:17 +0100569void CParameterMgr::applyConfigurations()
Patrick Benavolib71ccf72011-09-13 14:15:52 +0200570{
571 CAutoLog autoLog(this, "Configuration application request");
Patrick Benavoli68a91282011-08-31 11:23:23 +0200572
573 // Lock state
Patrick Benavoli065264a2011-11-20 15:46:41 +0100574 CAutoLock autoLock(&_blackboardMutex);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200575
576 if (!_bTuningModeIsOn) {
577
578 // Apply configuration(s)
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +0100579 doApplyConfigurations(false);
Frédéric Boisnarddaaa63c2012-08-27 15:48:15 +0200580 } else {
581
Kevin Rocardace81f82012-12-11 16:19:17 +0100582 log_warning("Configurations were not applied because the TuningMode is on");
Patrick Benavoli68a91282011-08-31 11:23:23 +0200583 }
Patrick Benavoli68a91282011-08-31 11:23:23 +0200584}
585
Patrick Benavoli4bed9212011-10-27 14:18:00 +0200586// Dynamic parameter handling
Patrick Benavoli065264a2011-11-20 15:46:41 +0100587CParameterHandle* CParameterMgr::createParameterHandle(const string& strPath, string& strError)
Patrick Benavoli4bed9212011-10-27 14:18:00 +0200588{
Patrick Benavoli065264a2011-11-20 15:46:41 +0100589 CPathNavigator pathNavigator(strPath);
Patrick Benavoli4bed9212011-10-27 14:18:00 +0200590
Patrick Benavoli065264a2011-11-20 15:46:41 +0100591 // Nagivate through system class
592 if (!pathNavigator.navigateThrough(getConstSystemClass()->getName(), strError)) {
593
Patrick Benavoli79f16cc2011-11-25 22:36:41 +0100594 return NULL;
Patrick Benavoli065264a2011-11-20 15:46:41 +0100595 }
596
597 // Find element
598 const CElement* pElement = getConstSystemClass()->findDescendant(pathNavigator);
599
600 if (!pElement) {
601
602 strError = "Path not found";
603
Patrick Benavoli79f16cc2011-11-25 22:36:41 +0100604 return NULL;
Patrick Benavoli065264a2011-11-20 15:46:41 +0100605 }
606
607 // Check found element is a parameter
608 const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pElement);
609
610 if (!pConfigurableElement->isParameter()) {
611
612 // Element is not parameter
613 strError = "Not a parameter";
614
Patrick Benavoli79f16cc2011-11-25 22:36:41 +0100615 return NULL;
Patrick Benavoli065264a2011-11-20 15:46:41 +0100616 }
617
618 // Convert as parameter and return new handle
619 return new CParameterHandle(static_cast<const CBaseParameter*>(pElement), this);
Patrick Benavoli4bed9212011-10-27 14:18:00 +0200620}
621
Patrick Benavoli68a91282011-08-31 11:23:23 +0200622/////////////////// Remote command parsers
Patrick Benavoli592ae562011-09-05 16:53:58 +0200623/// Version
Patrick Benavoli63499d42011-10-24 18:50:03 +0200624CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::versionCommandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli592ae562011-09-05 16:53:58 +0200625{
626 (void)remoteCommand;
627
Patrick Benavoli63499d42011-10-24 18:50:03 +0200628 // Show version
629 strResult = getVersion();
Patrick Benavoli592ae562011-09-05 16:53:58 +0200630
Patrick Benavoli63499d42011-10-24 18:50:03 +0200631 return CCommandHandler::ESucceeded;
Patrick Benavoli592ae562011-09-05 16:53:58 +0200632}
633
Patrick Benavoli68a91282011-08-31 11:23:23 +0200634/// Status
Patrick Benavoli63499d42011-10-24 18:50:03 +0200635CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::statusCommandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200636{
637 (void)remoteCommand;
638 // System class
639 const CSystemClass* pSystemClass = getSystemClass();
640
Patrick Benavoli68a91282011-08-31 11:23:23 +0200641 // Show status
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200642 /// General section
643 appendTitle(strResult, "General:");
644 // System class
Patrick Benavoli68a91282011-08-31 11:23:23 +0200645 strResult += "System Class: ";
646 strResult += pSystemClass->getName();
647 strResult += "\n";
648
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200649 // Tuning mode
Patrick Benavoli68a91282011-08-31 11:23:23 +0200650 strResult += "Tuning Mode: ";
651 strResult += tuningModeOn() ? "on" : "off";
652 strResult += "\n";
653
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200654 // Value space
Patrick Benavoli68a91282011-08-31 11:23:23 +0200655 strResult += "Value Space: ";
656 strResult += valueSpaceIsRaw() ? "raw" : "real";
657 strResult += "\n";
658
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200659 // Output raw format
660 strResult += "Output Raw Format: ";
661 strResult += outputRawFormatIsHex() ? "hex" : "dec";
662 strResult += "\n";
663
664 // Auto Sync
Patrick Benavoli68a91282011-08-31 11:23:23 +0200665 strResult += "Auto Sync: ";
666 strResult += autoSyncOn() ? "on" : "off";
667 strResult += "\n";
668
669 /// Subsystem list
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200670 appendTitle(strResult, "Subsystems:");
Patrick Benavoli68a91282011-08-31 11:23:23 +0200671 string strSubsystemList;
672 pSystemClass->listChildrenPaths(strSubsystemList);
673 strResult += strSubsystemList;
674
675 /// Last applied configurations
Frédéric Boisnard8b243f52012-09-06 18:03:20 +0200676 appendTitle(strResult, "Last Applied [Pending] Configurations:");
Patrick Benavoli68a91282011-08-31 11:23:23 +0200677 string strLastAppliedConfigurations;
678 getConfigurableDomains()->listLastAppliedConfigurations(strLastAppliedConfigurations);
679 strResult += strLastAppliedConfigurations;
680
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200681 /// Criteria states
Frédéric Boisnard8b243f52012-09-06 18:03:20 +0200682 appendTitle(strResult, "Selection Criteria:");
Kevin Rocard7f265822012-12-07 18:51:22 +0100683 list<string> lstrSelectionCriteria;
684 getSelectionCriteria()->listSelectionCriteria(lstrSelectionCriteria, false, true);
685 // Concatenate the criterion list as the command result
686 CUtility::concatenate(lstrSelectionCriteria, strResult);
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200687
Patrick Benavoli63499d42011-10-24 18:50:03 +0200688 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200689}
690
691/// Tuning Mode
Patrick Benavoli63499d42011-10-24 18:50:03 +0200692CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::setTuningModeCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200693{
694 if (remoteCommand.getArgument(0) == "on") {
695
696 if (setTuningMode(true, strResult)) {
697
Patrick Benavoli63499d42011-10-24 18:50:03 +0200698 return CCommandHandler::EDone;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200699 }
700 } else if (remoteCommand.getArgument(0) == "off") {
701
702 if (setTuningMode(false, strResult)) {
703
Patrick Benavoli63499d42011-10-24 18:50:03 +0200704 return CCommandHandler::EDone;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200705 }
706 } else {
707 // Show usage
Patrick Benavoli63499d42011-10-24 18:50:03 +0200708 return CCommandHandler::EShowUsage;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200709 }
Patrick Benavoli63499d42011-10-24 18:50:03 +0200710 return CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200711}
712
Patrick Benavoli63499d42011-10-24 18:50:03 +0200713CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getTuningModeCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200714{
715 (void)remoteCommand;
716
717 strResult = tuningModeOn() ? "on" : "off";
718
Patrick Benavoli63499d42011-10-24 18:50:03 +0200719 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200720}
721
722/// Value Space
Patrick Benavoli63499d42011-10-24 18:50:03 +0200723CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::setValueSpaceCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200724{
725 (void)strResult;
726
727 if (remoteCommand.getArgument(0) == "raw") {
728
729 setValueSpace(true);
730
Patrick Benavoli63499d42011-10-24 18:50:03 +0200731 return CCommandHandler::EDone;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200732
733 } else if (remoteCommand.getArgument(0) == "real") {
734
735 setValueSpace(false);
736
Patrick Benavoli63499d42011-10-24 18:50:03 +0200737 return CCommandHandler::EDone;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200738
739 } else {
740 // Show usage
Patrick Benavoli63499d42011-10-24 18:50:03 +0200741 return CCommandHandler::EShowUsage;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200742 }
Patrick Benavoli63499d42011-10-24 18:50:03 +0200743 return CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200744}
745
Patrick Benavoli63499d42011-10-24 18:50:03 +0200746CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getValueSpaceCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200747{
748 (void)remoteCommand;
749
750 strResult = valueSpaceIsRaw() ? "raw" : "real";
751
Patrick Benavoli63499d42011-10-24 18:50:03 +0200752 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200753}
754
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200755/// Output Raw Format
Patrick Benavoli63499d42011-10-24 18:50:03 +0200756CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::setOutputRawFormatCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200757{
758 (void)strResult;
759
760 if (remoteCommand.getArgument(0) == "hex") {
761
762 setOutputRawFormat(true);
763
Patrick Benavoli63499d42011-10-24 18:50:03 +0200764 return CCommandHandler::EDone;
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200765
766 } else if (remoteCommand.getArgument(0) == "dec") {
767
768 setOutputRawFormat(false);
769
Patrick Benavoli63499d42011-10-24 18:50:03 +0200770 return CCommandHandler::EDone;
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200771
772 } else {
773 // Show usage
Patrick Benavoli63499d42011-10-24 18:50:03 +0200774 return CCommandHandler::EShowUsage;
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200775 }
Patrick Benavoli63499d42011-10-24 18:50:03 +0200776 return CCommandHandler::EFailed;
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200777}
778
Patrick Benavoli63499d42011-10-24 18:50:03 +0200779CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getOutputRawFormatCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200780{
781 (void)remoteCommand;
782
783 strResult = outputRawFormatIsHex() ? "hex" : "dec";
784
Patrick Benavoli63499d42011-10-24 18:50:03 +0200785 return CCommandHandler::ESucceeded;
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200786}
787
Patrick Benavoli68a91282011-08-31 11:23:23 +0200788/// Sync
Patrick Benavoli63499d42011-10-24 18:50:03 +0200789CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::setAutoSyncCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200790{
791 if (remoteCommand.getArgument(0) == "on") {
792
793 if (setAutoSync(true, strResult)) {
794
Patrick Benavoli63499d42011-10-24 18:50:03 +0200795 return CCommandHandler::EDone;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200796 }
797 } else if (remoteCommand.getArgument(0) == "off") {
798
799 if (setAutoSync(false, strResult)) {
800
Patrick Benavoli63499d42011-10-24 18:50:03 +0200801 return CCommandHandler::EDone;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200802 }
803 } else {
804 // Show usage
Patrick Benavoli63499d42011-10-24 18:50:03 +0200805 return CCommandHandler::EShowUsage;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200806 }
Patrick Benavoli63499d42011-10-24 18:50:03 +0200807 return CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200808}
809
Patrick Benavoli63499d42011-10-24 18:50:03 +0200810CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getAutoSyncCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200811{
812 (void)remoteCommand;
813
814 strResult = autoSyncOn() ? "on" : "off";
815
Patrick Benavoli63499d42011-10-24 18:50:03 +0200816 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200817}
818
Patrick Benavoli63499d42011-10-24 18:50:03 +0200819CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::syncCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200820{
821 (void)remoteCommand;
822
Patrick Benavoli63499d42011-10-24 18:50:03 +0200823 return sync(strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200824}
825
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200826/// Criteria
Patrick Benavoli63499d42011-10-24 18:50:03 +0200827CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::listCriteriaCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200828{
829 (void)remoteCommand;
830
Kevin Rocard7f265822012-12-07 18:51:22 +0100831 list<string> lstrResult;
832
833 getSelectionCriteria()->listSelectionCriteria(lstrResult, true, true);
834
835 // Concatenate the criterion list as the command result
836 CUtility::concatenate(lstrResult, strResult);
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200837
Patrick Benavoli63499d42011-10-24 18:50:03 +0200838 return CCommandHandler::ESucceeded;
Patrick Benavoli6ba361d2011-08-31 11:23:24 +0200839}
Patrick Benavoli68a91282011-08-31 11:23:23 +0200840
841/// Domains
Patrick Benavoli63499d42011-10-24 18:50:03 +0200842CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::listDomainsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200843{
844 (void)remoteCommand;
845
Patrick Benavoli63499d42011-10-24 18:50:03 +0200846 getConfigurableDomains()->listDomains(strResult);
Patrick Benavoli68a91282011-08-31 11:23:23 +0200847
Patrick Benavoli63499d42011-10-24 18:50:03 +0200848 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200849}
850
Patrick Benavoli63499d42011-10-24 18:50:03 +0200851CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::createDomainCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200852{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200853 return createDomain(remoteCommand.getArgument(0), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200854}
855
Patrick Benavoli63499d42011-10-24 18:50:03 +0200856CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::deleteDomainCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200857{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200858 return deleteDomain(remoteCommand.getArgument(0), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200859}
860
Kevin Rocard170f0a42012-06-18 13:56:05 +0200861CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::deleteAllDomainsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
862{
863 (void)remoteCommand;
864
865 return deleteAllDomains(strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
866}
867
Patrick Benavoli63499d42011-10-24 18:50:03 +0200868CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::renameDomainCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200869{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200870 return getConfigurableDomains()->renameDomain(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200871}
872
Patrick Benavoli63499d42011-10-24 18:50:03 +0200873CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::setSequenceAwarenessCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200874{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200875 // Check tuning mode
876 if (!checkTuningModeOn(strResult)) {
877
878 return CCommandHandler::EFailed;
879 }
880
881 // Set property
882 bool bSequenceAware;
883
884 if (remoteCommand.getArgument(1) == "true") {
885
886 bSequenceAware = true;
887
888 } else if (remoteCommand.getArgument(1) == "false") {
889
890 bSequenceAware = false;
891
892 } else {
893 // Show usage
894 return CCommandHandler::EShowUsage;
895 }
896
897 return getConfigurableDomains()->setSequenceAwareness(remoteCommand.getArgument(0), bSequenceAware, strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200898}
899
Patrick Benavoli63499d42011-10-24 18:50:03 +0200900CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getSequenceAwarenessCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200901{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200902 // Get property
903 bool bSequenceAware;
904
905 if (!getConfigurableDomains()->getSequenceAwareness(remoteCommand.getArgument(0), bSequenceAware, strResult)) {
906
907 return CCommandHandler::EFailed;
908 }
909
910 strResult = bSequenceAware ? "true" : "false";
911
912 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200913}
914
Patrick Benavoli63499d42011-10-24 18:50:03 +0200915CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::listDomainElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200916{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200917 return getConfigurableDomains()->listDomainElements(remoteCommand.getArgument(0), strResult) ? CCommandHandler::ESucceeded : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200918}
919
Patrick Benavoli63499d42011-10-24 18:50:03 +0200920CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::addElementCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200921{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200922 return addConfigurableElementToDomain(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
923}
924
925CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::removeElementCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
926{
927 return removeConfigurableElementFromDomain(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
928}
929
930CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::splitDomainCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
931{
932 return split(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200933}
934
935/// Configurations
Patrick Benavoli63499d42011-10-24 18:50:03 +0200936CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::listConfigurationsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200937{
Patrick Benavoli0bd50542011-11-29 11:10:27 +0100938 return getConstConfigurableDomains()->listConfigurations(remoteCommand.getArgument(0), strResult) ? CCommandHandler::ESucceeded : CCommandHandler::EFailed;
939}
940
941CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::dumpDomainsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
942{
943 (void)remoteCommand;
944
945 // Dummy error context
946 string strError;
947 CErrorContext errorContext(strError);
948
949 // Dump
950 getConstConfigurableDomains()->dumpContent(strResult, errorContext);
951
952 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200953}
954
Patrick Benavoli63499d42011-10-24 18:50:03 +0200955CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::createConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200956{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200957 return createConfiguration(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200958}
959
Patrick Benavoli63499d42011-10-24 18:50:03 +0200960CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::deleteConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200961{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200962 return deleteConfiguration(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200963}
964
Patrick Benavoli63499d42011-10-24 18:50:03 +0200965CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::renameConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200966{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200967 return getConfigurableDomains()->renameConfiguration(remoteCommand.getArgument(0), remoteCommand.getArgument(1), remoteCommand.getArgument(2), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200968}
969
Patrick Benavoli63499d42011-10-24 18:50:03 +0200970CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::saveConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200971{
Patrick Benavoli63499d42011-10-24 18:50:03 +0200972 return saveConfiguration(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +0200973}
974
Patrick Benavoli63499d42011-10-24 18:50:03 +0200975CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::restoreConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +0200976{
Kevin Rocardace81f82012-12-11 16:19:17 +0100977 list<string> lstrResult;
978 if (!restoreConfiguration(remoteCommand.getArgument(0), remoteCommand.getArgument(1), lstrResult)) {
979 //Concatenate the error list as the command result
980 CUtility::concatenate(lstrResult, strResult);
981
982 return CCommandHandler::EFailed;
983 }
984 return CCommandHandler::EDone;
Patrick Benavoli63499d42011-10-24 18:50:03 +0200985}
986
987CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::setElementSequenceCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
988{
989 // Check tuning mode
990 if (!checkTuningModeOn(strResult)) {
991
992 return CCommandHandler::EFailed;
993 }
994
995 // Build configurable element path list
996 vector<string> astrNewElementSequence;
997
998 uint32_t uiArgument;
999
1000 for (uiArgument = 2; uiArgument < remoteCommand.getArgumentCount(); uiArgument++) {
1001
1002 astrNewElementSequence.push_back(remoteCommand.getArgument(uiArgument));
1003 }
1004
1005 // Delegate to configurable domains
1006 return getConfigurableDomains()->setElementSequence(remoteCommand.getArgument(0), remoteCommand.getArgument(1), astrNewElementSequence, strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
1007}
1008
1009CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getElementSequenceCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
1010{
1011 // Delegate to configurable domains
1012 return getConfigurableDomains()->getElementSequence(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? CCommandHandler::ESucceeded : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001013}
1014
Patrick Benavoli0bd50542011-11-29 11:10:27 +01001015CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::setRuleCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
1016{
1017 // Delegate to configurable domains
1018 return getConfigurableDomains()->setApplicationRule(remoteCommand.getArgument(0), remoteCommand.getArgument(1), remoteCommand.packArguments(2, remoteCommand.getArgumentCount() - 2), getConstSelectionCriteria()->getSelectionCriteriaDefinition(), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
1019}
1020
1021CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::clearRuleCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
1022{
1023 // Delegate to configurable domains
1024 return getConfigurableDomains()->clearApplicationRule(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
1025}
1026
1027CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getRuleCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
1028{
1029 // Delegate to configurable domains
1030 return getConfigurableDomains()->getApplicationRule(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? CCommandHandler::ESucceeded : CCommandHandler::EFailed;
1031}
1032
Patrick Benavoli68a91282011-08-31 11:23:23 +02001033/// Elements/Parameters
Patrick Benavoli63499d42011-10-24 18:50:03 +02001034CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::listElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001035{
1036 CElementLocator elementLocator(getSystemClass(), false);
1037
1038 CElement* pLocatedElement = NULL;
1039
1040 if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
1041
Patrick Benavoli63499d42011-10-24 18:50:03 +02001042 return CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001043 }
1044
1045 strResult = string("\n");
1046
1047 if (!pLocatedElement) {
1048
1049 // List from root folder
1050
1051 // Return system class qualified name
1052 pLocatedElement = getSystemClass();
1053 }
1054
1055 // Return sub-elements
1056 strResult += pLocatedElement->listQualifiedPaths(false);
1057
Patrick Benavoli63499d42011-10-24 18:50:03 +02001058 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001059}
1060
1061/// Elements/Parameters
Patrick Benavoli63499d42011-10-24 18:50:03 +02001062CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::listParametersCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001063{
1064 CElementLocator elementLocator(getSystemClass(), false);
1065
1066 CElement* pLocatedElement = NULL;
1067
1068 if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
1069
Patrick Benavoli63499d42011-10-24 18:50:03 +02001070 return CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001071 }
1072
1073 strResult = string("\n");
1074
1075 if (!pLocatedElement) {
1076
1077 // List from root folder
1078
1079 // Return system class qualified name
1080 pLocatedElement = getSystemClass();
1081 }
1082
1083 // Return sub-elements
1084 strResult += pLocatedElement->listQualifiedPaths(true);
1085
Patrick Benavoli63499d42011-10-24 18:50:03 +02001086 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001087}
1088
Patrick Benavoli63499d42011-10-24 18:50:03 +02001089CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::dumpElementCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001090{
1091 CElementLocator elementLocator(getSystemClass());
1092
1093 CElement* pLocatedElement = NULL;
1094
1095 if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
1096
Patrick Benavoli63499d42011-10-24 18:50:03 +02001097 return CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001098 }
1099
1100 string strError;
1101
Patrick Benavoli6ba361d2011-08-31 11:23:24 +02001102 CParameterAccessContext parameterAccessContext(strError, _pMainParameterBlackboard, _bValueSpaceIsRaw, _bOutputRawFormatIsHex);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001103
1104 // Dump elements
1105 pLocatedElement->dumpContent(strResult, parameterAccessContext);
1106
Patrick Benavoli63499d42011-10-24 18:50:03 +02001107 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001108}
1109
Patrick Benavoli63499d42011-10-24 18:50:03 +02001110CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getElementSizeCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001111{
1112 CElementLocator elementLocator(getSystemClass());
1113
1114 CElement* pLocatedElement = NULL;
1115
1116 if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
1117
Patrick Benavoli63499d42011-10-24 18:50:03 +02001118 return CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001119 }
1120
1121 // Converted to actual sizable element
1122 const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pLocatedElement);
1123
1124 // Get size as string
Patrick Benavoli6ba361d2011-08-31 11:23:24 +02001125 strResult = pConfigurableElement->getFootprintAsString();
Patrick Benavoli68a91282011-08-31 11:23:23 +02001126
Patrick Benavoli63499d42011-10-24 18:50:03 +02001127 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001128}
1129
Patrick Benavoli63499d42011-10-24 18:50:03 +02001130CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::showPropertiesCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli2ecf9002011-08-31 11:23:24 +02001131{
1132 CElementLocator elementLocator(getSystemClass());
1133
1134 CElement* pLocatedElement = NULL;
1135
1136 if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
1137
Patrick Benavoli63499d42011-10-24 18:50:03 +02001138 return CCommandHandler::EFailed;
Patrick Benavoli2ecf9002011-08-31 11:23:24 +02001139 }
1140
1141 // Convert element
1142 const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pLocatedElement);
1143
1144 // Return element properties
1145 pConfigurableElement->showProperties(strResult);
1146
Patrick Benavoli63499d42011-10-24 18:50:03 +02001147 return CCommandHandler::ESucceeded;
Patrick Benavoli2ecf9002011-08-31 11:23:24 +02001148}
1149
Patrick Benavoli63499d42011-10-24 18:50:03 +02001150CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getParameterCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001151{
1152 string strValue;
1153
Frédéric Boisnarde42dacd2013-02-25 15:56:56 +01001154 if (!accessParameterValue(remoteCommand.getArgument(0), strValue, false, strResult)) {
Patrick Benavoli68a91282011-08-31 11:23:23 +02001155
Patrick Benavoli63499d42011-10-24 18:50:03 +02001156 return CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001157 }
1158 // Succeeded
1159 strResult = strValue;
1160
Patrick Benavoli63499d42011-10-24 18:50:03 +02001161 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001162}
1163
Patrick Benavoli63499d42011-10-24 18:50:03 +02001164CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::setParameterCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001165{
Patrick Benavoli065264a2011-11-20 15:46:41 +01001166 // Check tuning mode
1167 if (!checkTuningModeOn(strResult)) {
1168
1169 return CCommandHandler::EFailed;
1170 }
1171 // Get value to set
1172 string strValue = remoteCommand.packArguments(1, remoteCommand.getArgumentCount() - 1);
1173
Frédéric Boisnarde42dacd2013-02-25 15:56:56 +01001174 return accessParameterValue(remoteCommand.getArgument(0), strValue, true, strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001175}
1176
Patrick Benavoli63499d42011-10-24 18:50:03 +02001177CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::listBelongingDomainsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001178{
1179 CElementLocator elementLocator(getSystemClass());
1180
1181 CElement* pLocatedElement = NULL;
1182
1183 if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
1184
Patrick Benavoli63499d42011-10-24 18:50:03 +02001185 return CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001186 }
1187
1188 // Convert element
1189 const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pLocatedElement);
1190
1191 // Return element belonging domains
1192 pConfigurableElement->listBelongingDomains(strResult);
1193
Patrick Benavoli63499d42011-10-24 18:50:03 +02001194 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001195}
1196
Patrick Benavoli63499d42011-10-24 18:50:03 +02001197CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::listAssociatedDomainsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001198{
1199 CElementLocator elementLocator(getSystemClass());
1200
1201 CElement* pLocatedElement = NULL;
1202
1203 if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
1204
Patrick Benavoli63499d42011-10-24 18:50:03 +02001205 return CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001206 }
1207
1208 // Convert element
1209 const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pLocatedElement);
1210
1211 // Return element belonging domains
1212 pConfigurableElement->listAssociatedDomains(strResult);
1213
Patrick Benavoli63499d42011-10-24 18:50:03 +02001214 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001215}
1216
Patrick Benavoli63499d42011-10-24 18:50:03 +02001217CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::listAssociatedElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001218{
1219 (void)remoteCommand;
1220
1221 getConfigurableDomains()->listAssociatedElements(strResult);
1222
Patrick Benavoli63499d42011-10-24 18:50:03 +02001223 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001224}
1225
Patrick Benavoli63499d42011-10-24 18:50:03 +02001226CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::listConflictingElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001227{
1228 (void)remoteCommand;
1229
1230 getConfigurableDomains()->listConflictingElements(strResult);
1231
Patrick Benavoli63499d42011-10-24 18:50:03 +02001232 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001233}
1234
Patrick Benavoli63499d42011-10-24 18:50:03 +02001235CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::listRogueElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001236{
1237 (void)remoteCommand;
1238
1239 getSystemClass()->listRogueElements(strResult);
1240
Patrick Benavoli63499d42011-10-24 18:50:03 +02001241 return CCommandHandler::ESucceeded;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001242}
1243
Frédéric Boisnarde42dacd2013-02-25 15:56:56 +01001244CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getConfigurationParameterCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
1245{
1246 string strOutputValue;
1247 string strError;
1248
1249 if (!accessConfigurationValue(remoteCommand.getArgument(0), remoteCommand.getArgument(1), remoteCommand.getArgument(2), strOutputValue, false, strError)) {
1250
1251 strResult = strError;
1252 return CCommandHandler::EFailed;
1253 }
1254 // Succeeded
1255 strResult = strOutputValue;
1256
1257 return CCommandHandler::ESucceeded;
1258}
1259
1260CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::setConfigurationParameterCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
1261{
1262 // Get value to set
1263 string strValue = remoteCommand.packArguments(3, remoteCommand.getArgumentCount() - 3);
1264
1265 bool bSuccess = accessConfigurationValue(remoteCommand.getArgument(0),
1266 remoteCommand.getArgument(1),
1267 remoteCommand.getArgument(2),
1268 strValue, true, strResult);
1269
1270 return bSuccess ? CCommandHandler::EDone : CCommandHandler::EFailed;
1271}
1272
Patrick Benavoli68a91282011-08-31 11:23:23 +02001273/// Settings Import/Export
Patrick Benavoli63499d42011-10-24 18:50:03 +02001274CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::exportConfigurableDomainsToXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001275{
Patrick Benavoli63499d42011-10-24 18:50:03 +02001276 return exportDomainsXml(remoteCommand.getArgument(0), false, strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001277}
1278
Patrick Benavoli63499d42011-10-24 18:50:03 +02001279CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::importConfigurableDomainsFromXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001280{
Patrick Benavoli63499d42011-10-24 18:50:03 +02001281 return importDomainsXml(remoteCommand.getArgument(0), false, strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001282}
1283
Patrick Benavoli63499d42011-10-24 18:50:03 +02001284CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::exportConfigurableDomainsWithSettingsToXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001285{
Patrick Benavoli63499d42011-10-24 18:50:03 +02001286 return exportDomainsXml(remoteCommand.getArgument(0), true, strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001287}
1288
Patrick Benavoli63499d42011-10-24 18:50:03 +02001289CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::importConfigurableDomainsWithSettingsFromXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001290{
Patrick Benavoli63499d42011-10-24 18:50:03 +02001291 return importDomainsXml(remoteCommand.getArgument(0), true, strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001292}
1293
Patrick Benavoli63499d42011-10-24 18:50:03 +02001294CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::exportSettingsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001295{
Patrick Benavoli63499d42011-10-24 18:50:03 +02001296 return exportDomainsBinary(remoteCommand.getArgument(0), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001297}
1298
Patrick Benavoli63499d42011-10-24 18:50:03 +02001299CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::importSettingsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001300{
Patrick Benavoli63499d42011-10-24 18:50:03 +02001301 return importDomainsBinary(remoteCommand.getArgument(0), strResult) ? CCommandHandler::EDone : CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001302}
1303
Georges-Henri Baron326a31d2012-06-28 12:05:09 +02001304/// GUI commands
1305
1306CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getDomainsXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
1307{
1308 (void)remoteCommand;
1309
1310 if (!getDomainsXMLString(strResult, true)) {
1311
1312 return CCommandHandler::EFailed;
1313 }
1314 // Succeeded
1315 return CCommandHandler::ESucceeded;
1316}
1317
1318CParameterMgr::CCommandHandler::CommandStatus CParameterMgr::getSystemClassXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
1319{
1320 (void)remoteCommand;
1321
1322 if (!getSystemClassXMLString(strResult)) {
1323
1324 return CCommandHandler::EFailed;
1325 }
1326 // Succeeded
1327 return CCommandHandler::ESucceeded;
1328}
1329
Frédéric Boisnarde42dacd2013-02-25 15:56:56 +01001330// User set/get parameters in main BlackBoard
1331bool CParameterMgr::accessParameterValue(const string& strPath, string& strValue, bool bSet, string& strError)
1332{
1333 // Define context
1334 CParameterAccessContext parameterAccessContext(strError, _pMainParameterBlackboard, _bValueSpaceIsRaw, _bOutputRawFormatIsHex);
1335
1336 return accessValue(parameterAccessContext, strPath, strValue, bSet, strError);
1337}
1338
1339// User set/get parameters in specific Configuration BlackBoard
1340bool CParameterMgr::accessConfigurationValue(const string& strDomain, const string& strConfiguration, const string& strPath, string& strValue, bool bSet, string& strError)
1341{
1342 CElementLocator elementLocator(getSystemClass());
1343
1344 CElement* pLocatedElement = NULL;
1345
1346 if (!elementLocator.locate(strPath, &pLocatedElement, strError)) {
1347
1348 return false;
1349 }
1350
1351 // Convert element
1352 const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pLocatedElement);
1353
1354 // Get the Configuration blackboard and the Base Offset of the configurable element in this blackboard
1355 uint32_t uiBaseOffset;
1356 bool bIsLastApplied;
1357
1358 CParameterBlackboard* pConfigurationBlackboard = getConstConfigurableDomains()->findConfigurationBlackboard(strDomain, strConfiguration, pConfigurableElement, uiBaseOffset, bIsLastApplied, strError);
1359
1360 if (!pConfigurationBlackboard) {
1361
1362 return false;
1363 }
1364
1365 log_info("Element %s in Domain %s, offset: %d, base offset: %d", strPath.c_str(), strDomain.c_str(), pConfigurableElement->getOffset(), uiBaseOffset);
1366
1367 /// Update the Configuration Blackboard
1368
1369 // Define Configuration context using Base Offset
1370 CParameterAccessContext parameterAccessContext(strError, pConfigurationBlackboard, _bValueSpaceIsRaw, _bOutputRawFormatIsHex, uiBaseOffset);
1371
1372 // Access Value in the Configuration Blackboard
1373 if (!accessValue(parameterAccessContext, strPath, strValue, bSet, strError)) {
1374
1375 return false;
1376 }
1377
1378 /// If the Configuration is the last one applied, update the Main Blackboard as well
1379
1380 if (bIsLastApplied) {
1381
1382 // Define Main context
1383 parameterAccessContext.setParameterBlackboard(_pMainParameterBlackboard);
1384
1385 // Access Value in the Main Blackboard
1386 return accessValue(parameterAccessContext, strPath, strValue, bSet, strError);
1387 }
1388
1389 return true;
1390}
1391
Patrick Benavoli68a91282011-08-31 11:23:23 +02001392// User set/get parameters
Frédéric Boisnarde42dacd2013-02-25 15:56:56 +01001393bool CParameterMgr::accessValue(CParameterAccessContext& parameterAccessContext, const string& strPath, string& strValue, bool bSet, string& strError)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001394{
Patrick Benavoli065264a2011-11-20 15:46:41 +01001395 // Lock state
1396 CAutoLock autoLock(&_blackboardMutex);
1397
1398 CPathNavigator pathNavigator(strPath);
1399
1400 // Nagivate through system class
1401 if (!pathNavigator.navigateThrough(getConstSystemClass()->getName(), strError)) {
Patrick Benavoli68a91282011-08-31 11:23:23 +02001402
1403 return false;
1404 }
1405
Patrick Benavoli68808c62012-02-02 17:12:41 +01001406 // Auto Sync
1407 if (bSet) {
1408
1409 parameterAccessContext.setAutoSync(_bAutoSyncOn);
1410 }
1411
Patrick Benavoli065264a2011-11-20 15:46:41 +01001412 // Do the get
1413 return getConstSystemClass()->accessValue(pathNavigator, strValue, bSet, parameterAccessContext);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001414}
1415
1416// Tuning mode
1417bool CParameterMgr::setTuningMode(bool bOn, string& strError)
1418{
1419 // Tuning allowed?
Patrick Benavoli95ac0342011-11-07 20:32:51 +01001420 if (bOn && !getConstFrameworkConfiguration()->isTuningAllowed()) {
Patrick Benavoli68a91282011-08-31 11:23:23 +02001421
1422 strError = "Tuning prohibited";
1423
1424 return false;
1425 }
1426 // Lock state
Patrick Benavoli065264a2011-11-20 15:46:41 +01001427 CAutoLock autoLock(&_blackboardMutex);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001428
1429 // Warn domains about exiting tuning mode
1430 if (!bOn && _bTuningModeIsOn) {
1431
1432 // Ensure application of currently selected configurations
Patrick Benavoli1387bda2011-08-31 11:23:24 +02001433 // Force-apply configurations
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +01001434 doApplyConfigurations(true);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001435
Patrick Benavoli68a91282011-08-31 11:23:23 +02001436 // Turn auto sync back on
1437 _bAutoSyncOn = true;
1438 }
1439
1440 // Store
1441 _bTuningModeIsOn = bOn;
1442
Patrick Benavoli68a91282011-08-31 11:23:23 +02001443 return true;
1444}
1445
1446bool CParameterMgr::tuningModeOn() const
1447{
1448 return _bTuningModeIsOn;
1449}
1450
1451// Current value space for user set/get value interpretation
1452void CParameterMgr::setValueSpace(bool bIsRaw)
1453{
1454 _bValueSpaceIsRaw = bIsRaw;
1455}
1456
1457bool CParameterMgr::valueSpaceIsRaw()
1458{
1459 return _bValueSpaceIsRaw;
1460}
1461
Patrick Benavoli6ba361d2011-08-31 11:23:24 +02001462// Current Output Raw Format for user get value interpretation
1463void CParameterMgr::setOutputRawFormat(bool bIsHex)
1464{
1465 _bOutputRawFormatIsHex = bIsHex;
1466}
1467
1468bool CParameterMgr::outputRawFormatIsHex()
1469{
1470 return _bOutputRawFormatIsHex;
1471}
1472
Patrick Benavoli68a91282011-08-31 11:23:23 +02001473/// Sync
1474// Automatic hardware synchronization control (during tuning session)
1475bool CParameterMgr::setAutoSync(bool bAutoSyncOn, string& strError)
1476{
1477 // Check tuning mode
1478 if (!checkTuningModeOn(strError)) {
1479
1480 return false;
1481 }
1482 // Warn domains about turning auto sync back on
1483 if (bAutoSyncOn && !_bAutoSyncOn) {
1484
Patrick Benavoli592ae562011-09-05 16:53:58 +02001485 // Do the synchronization at system class level (could be optimized by keeping track of all modified parameters)
1486 if (!sync(strError)) {
Patrick Benavoli68a91282011-08-31 11:23:23 +02001487
1488 return false;
1489 }
1490 }
1491
1492 // Set Auto sync
1493 _bAutoSyncOn = bAutoSyncOn;
1494
1495 return true;
1496}
1497
1498bool CParameterMgr::autoSyncOn() const
1499{
1500 return _bAutoSyncOn;
1501}
1502
1503// Manual hardware synchronization control (during tuning session)
1504bool CParameterMgr::sync(string& strError)
1505{
1506 // Check tuning mode
1507 if (!checkTuningModeOn(strError)) {
1508
1509 return false;
1510 }
1511 // Warn domains about turning auto sync back on
1512 if (_bAutoSyncOn) {
1513
1514 strError = "Feature unavailable when Auto Sync is on";
1515
1516 return false;
1517 }
1518
1519 // Get syncer set
1520 CSyncerSet syncerSet;
1521 // ... from system class
1522 getConstSystemClass()->fillSyncerSet(syncerSet);
Kevin Rocardace81f82012-12-11 16:19:17 +01001523
Patrick Benavoli68a91282011-08-31 11:23:23 +02001524 // Sync
Kevin Rocardace81f82012-12-11 16:19:17 +01001525 list<string> lstrError;
1526 if (! syncerSet.sync(*_pMainParameterBlackboard, false, &lstrError)){
1527
1528 CUtility::concatenate(lstrError, strError);
1529 return false;
1530 };
1531
1532 return true;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001533}
1534
1535// Content dump
1536void CParameterMgr::logStructureContent(string& strContent) const
1537{
1538 string strError;
1539
Patrick Benavoli6ba361d2011-08-31 11:23:24 +02001540 CParameterAccessContext parameterAccessContext(strError, _pMainParameterBlackboard, _bValueSpaceIsRaw, _bOutputRawFormatIsHex);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001541
1542 dumpContent(strContent, parameterAccessContext);
1543}
1544
1545// Configuration/Domains handling
1546bool CParameterMgr::createDomain(const string& strName, string& strError)
1547{
1548 // Check tuning mode
1549 if (!checkTuningModeOn(strError)) {
1550
1551 return false;
1552 }
1553
1554 // Delegate to configurable domains
1555 return getConfigurableDomains()->createDomain(strName, strError);
1556}
1557
1558bool CParameterMgr::deleteDomain(const string& strName, string& strError)
1559{
1560 // Check tuning mode
1561 if (!checkTuningModeOn(strError)) {
1562
1563 return false;
1564 }
1565
1566 // Delegate to configurable domains
1567 return getConfigurableDomains()->deleteDomain(strName, strError);
1568}
1569
Kevin Rocard170f0a42012-06-18 13:56:05 +02001570bool CParameterMgr::deleteAllDomains(string& strError)
1571{
1572 // Check tuning mode
1573 if (!checkTuningModeOn(strError)) {
1574
1575 return false;
1576 }
1577
1578 // Delegate to configurable domains
1579 getConfigurableDomains()->deleteAllDomains();
1580
1581 return true;
1582}
1583
Patrick Benavoli68a91282011-08-31 11:23:23 +02001584bool CParameterMgr::createConfiguration(const string& strDomain, const string& strConfiguration, string& strError)
1585{
1586 // Check tuning mode
1587 if (!checkTuningModeOn(strError)) {
1588
1589 return false;
1590 }
1591
1592 // Delegate to configurable domains
1593 return getConfigurableDomains()->createConfiguration(strDomain, strConfiguration, _pMainParameterBlackboard, strError);
1594}
1595
1596bool CParameterMgr::deleteConfiguration(const string& strDomain, const string& strConfiguration, string& strError)
1597{
1598 // Check tuning mode
1599 if (!checkTuningModeOn(strError)) {
1600
1601 return false;
1602 }
1603
1604 // Delegate to configurable domains
1605 return getConfigurableDomains()->deleteConfiguration(strDomain, strConfiguration, strError);
1606}
1607
Kevin Rocardace81f82012-12-11 16:19:17 +01001608bool CParameterMgr::restoreConfiguration(const string& strDomain, const string& strConfiguration, list<string>& lstrError)
Patrick Benavoli68a91282011-08-31 11:23:23 +02001609{
Kevin Rocardace81f82012-12-11 16:19:17 +01001610 string strError;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001611 // Check tuning mode
1612 if (!checkTuningModeOn(strError)) {
1613
Kevin Rocardace81f82012-12-11 16:19:17 +01001614 lstrError.push_back(strError);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001615 return false;
1616 }
1617
1618 // Delegate to configurable domains
Kevin Rocardace81f82012-12-11 16:19:17 +01001619 return getConstConfigurableDomains()->restoreConfiguration(strDomain, strConfiguration, _pMainParameterBlackboard, _bAutoSyncOn, lstrError);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001620}
1621
1622bool CParameterMgr::saveConfiguration(const string& strDomain, const string& strConfiguration, string& strError)
1623{
1624 // Check tuning mode
1625 if (!checkTuningModeOn(strError)) {
1626
1627 return false;
1628 }
1629
1630 // Delegate to configurable domains
1631 return getConfigurableDomains()->saveConfiguration(strDomain, strConfiguration, _pMainParameterBlackboard, strError);
1632}
1633
1634// Configurable element - domain association
1635bool CParameterMgr::addConfigurableElementToDomain(const string& strDomain, const string& strConfigurableElementPath, string& strError)
1636{
1637 // Check tuning mode
1638 if (!checkTuningModeOn(strError)) {
1639
1640 return false;
1641 }
1642
1643 CElementLocator elementLocator(getSystemClass());
1644
1645 CElement* pLocatedElement = NULL;
1646
1647 if (!elementLocator.locate(strConfigurableElementPath, &pLocatedElement, strError)) {
1648
1649 return false;
1650 }
1651
1652 // Convert element
Pavel Chupin85413ff2012-04-24 10:55:48 +04001653 CConfigurableElement* pConfigurableElement = static_cast<CConfigurableElement*>(pLocatedElement);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001654
1655 // Delegate
1656 return getConfigurableDomains()->addConfigurableElementToDomain(strDomain, pConfigurableElement, _pMainParameterBlackboard, strError);
1657}
1658
1659bool CParameterMgr::removeConfigurableElementFromDomain(const string& strDomain, const string& strConfigurableElementPath, string& strError)
1660{
1661 // Check tuning mode
1662 if (!checkTuningModeOn(strError)) {
1663
1664 return false;
1665 }
1666
1667 CElementLocator elementLocator(getSystemClass());
1668
1669 CElement* pLocatedElement = NULL;
1670
1671 if (!elementLocator.locate(strConfigurableElementPath, &pLocatedElement, strError)) {
1672
Patrick Benavoli63499d42011-10-24 18:50:03 +02001673 return CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001674 }
1675
1676 // Convert element
Pavel Chupin85413ff2012-04-24 10:55:48 +04001677 CConfigurableElement* pConfigurableElement = static_cast<CConfigurableElement*>(pLocatedElement);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001678
1679 // Delegate
1680 return getConfigurableDomains()->removeConfigurableElementFromDomain(strDomain, pConfigurableElement, strError);
1681}
1682
1683bool CParameterMgr::split(const string& strDomain, const string& strConfigurableElementPath, string& strError)
1684{
1685 // Check tuning mode
1686 if (!checkTuningModeOn(strError)) {
1687
1688 return false;
1689 }
1690
1691 CElementLocator elementLocator(getSystemClass());
1692
1693 CElement* pLocatedElement = NULL;
1694
1695 if (!elementLocator.locate(strConfigurableElementPath, &pLocatedElement, strError)) {
1696
Patrick Benavoli63499d42011-10-24 18:50:03 +02001697 return CCommandHandler::EFailed;
Patrick Benavoli68a91282011-08-31 11:23:23 +02001698 }
1699
1700 // Convert element
Pavel Chupin85413ff2012-04-24 10:55:48 +04001701 CConfigurableElement* pConfigurableElement = static_cast<CConfigurableElement*>(pLocatedElement);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001702
1703 // Delegate
1704 return getConfigurableDomains()->split(strDomain, pConfigurableElement, strError);
1705}
1706
1707// XML Import/Export
1708bool CParameterMgr::importDomainsXml(const string& strFileName, bool bWithSettings, string& strError)
1709{
1710 // Check tuning mode
1711 if (!checkTuningModeOn(strError)) {
1712
1713 return false;
1714 }
1715
1716 // check path is absolute
1717 if (strFileName[0] != '/') {
1718
1719 strError = "Please provide absolute path";
1720
1721 return false;
1722 }
1723 // Root element
1724 CConfigurableDomains* pConfigurableDomains = getConfigurableDomains();
1725
1726 // Context
1727 CXmlDomainSerializingContext xmlDomainSerializingContext(strError, bWithSettings);
1728
1729 // Secltion criteria definition for rule creation
1730 xmlDomainSerializingContext.setSelectionCriteriaDefinition(getConstSelectionCriteria()->getSelectionCriteriaDefinition());
1731
1732 // Parse
1733 if (!xmlParse(xmlDomainSerializingContext, pConfigurableDomains, strFileName, "", EParameterConfigurationLibrary, "SystemClassName")) {
1734
1735 return false;
1736 }
1737
1738 // Validate domains after XML import
1739 pConfigurableDomains->validate(_pMainParameterBlackboard);
1740
1741 return true;
1742}
1743
1744bool CParameterMgr::exportDomainsXml(const string& strFileName, bool bWithSettings, string& strError) const
1745{
1746 // check path is absolute
1747 if (strFileName[0] != '/') {
1748
1749 strError = "Please provide absolute path";
1750
1751 return false;
1752 }
1753
1754 // Root element
1755 const CConfigurableDomains* pConfigurableDomains = getConstConfigurableDomains();
1756
1757 // Get Schema file associated to root element
1758 string strXmlSchemaFilePath = _strSchemaFolderLocation + "/" + pConfigurableDomains->getKind() + ".xsd";
1759
1760 // Context
1761 CXmlDomainSerializingContext xmlDomainSerializingContext(strError, bWithSettings);
1762
1763 // Value space
1764 xmlDomainSerializingContext.setValueSpaceRaw(_bValueSpaceIsRaw);
1765
Patrick Benavoli6ba361d2011-08-31 11:23:24 +02001766 // Output raw format
1767 xmlDomainSerializingContext.setOutputRawFormat(_bOutputRawFormatIsHex);
1768
Georges-Henri Baron326a31d2012-06-28 12:05:09 +02001769 // Use a doc source by loading data from instantiated Configurable Domains
1770 CXmlMemoryDocSource memorySource(pConfigurableDomains, pConfigurableDomains->getKind(), strXmlSchemaFilePath, "parameter-framework", getVersion());
Patrick Benavoli68a91282011-08-31 11:23:23 +02001771
Georges-Henri Baron326a31d2012-06-28 12:05:09 +02001772 // Use a doc sink to write the doc data in a file
1773 CXmlFileDocSink fileSink(strFileName);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001774
Georges-Henri Baron326a31d2012-06-28 12:05:09 +02001775 if (!fileSink.process(memorySource, xmlDomainSerializingContext)) {
Patrick Benavoli68a91282011-08-31 11:23:23 +02001776 return false;
1777 }
1778
1779 return true;
1780}
1781
1782// Binary Import/Export
1783bool CParameterMgr::importDomainsBinary(const string& strFileName, string& strError)
1784{
1785 // Check tuning mode
1786 if (!checkTuningModeOn(strError)) {
1787
1788 return false;
1789 }
1790 // check path is absolute
1791 if (strFileName[0] != '/') {
1792
1793 strError = "Please provide absolute path";
1794
1795 return false;
1796 }
1797 // Root element
1798 CConfigurableDomains* pConfigurableDomains = getConfigurableDomains();
1799
1800 // Serialize in
1801 return pConfigurableDomains->serializeSettings(strFileName, false, _uiStructureChecksum, strError);
1802}
1803
1804bool CParameterMgr::exportDomainsBinary(const string& strFileName, string& strError)
1805{
1806 // check path is absolute
1807 if (strFileName[0] != '/') {
1808
1809 strError = "Please provide absolute path";
1810
1811 return false;
1812 }
Patrick Benavoli68a91282011-08-31 11:23:23 +02001813
Patrick Benavoli68a91282011-08-31 11:23:23 +02001814 // Root element
1815 CConfigurableDomains* pConfigurableDomains = getConfigurableDomains();
1816
1817 // Serialize out
1818 return pConfigurableDomains->serializeSettings(strFileName, true, _uiStructureChecksum, strError);
1819}
1820
1821// For tuning, check we're in tuning mode
1822bool CParameterMgr::checkTuningModeOn(string& strError) const
1823{
1824 // Tuning Mode on?
1825 if (!_bTuningModeIsOn) {
1826
1827 strError = "Tuning Mode must be on";
1828
1829 return false;
1830 }
1831 return true;
1832}
1833
Patrick Benavoli065264a2011-11-20 15:46:41 +01001834// Tuning mutex dynamic parameter handling
1835pthread_mutex_t* CParameterMgr::getBlackboardMutex()
Patrick Benavoli4bed9212011-10-27 14:18:00 +02001836{
Patrick Benavoli065264a2011-11-20 15:46:41 +01001837 return &_blackboardMutex;
Patrick Benavoli4bed9212011-10-27 14:18:00 +02001838}
1839
Patrick Benavoli065264a2011-11-20 15:46:41 +01001840// Blackboard reference (dynamic parameter handling)
1841CParameterBlackboard* CParameterMgr::getParameterBlackboard()
Patrick Benavoli4bed9212011-10-27 14:18:00 +02001842{
Patrick Benavoli065264a2011-11-20 15:46:41 +01001843 return _pMainParameterBlackboard;
Patrick Benavoli4bed9212011-10-27 14:18:00 +02001844}
1845
Patrick Benavoli68a91282011-08-31 11:23:23 +02001846// Dynamic creation library feeding
1847void CParameterMgr::feedElementLibraries()
1848{
1849 // Global Configuration handling
1850 CElementLibrary* pFrameworkConfigurationLibrary = new CElementLibrary;
1851
Patrick Benavoli6ba361d2011-08-31 11:23:24 +02001852 pFrameworkConfigurationLibrary->addElementBuilder(new TElementBuilderTemplate<CParameterFrameworkConfiguration>("ParameterFrameworkConfiguration"));
Guillaume Denneulina4ec15d2012-02-17 14:38:14 +01001853 pFrameworkConfigurationLibrary->addElementBuilder(new TKindElementBuilderTemplate<CSubsystemPlugins>("SubsystemPlugins"));
1854 pFrameworkConfigurationLibrary->addElementBuilder(new TKindElementBuilderTemplate<CPluginLocation>("Location"));
Patrick Benavoli6ba361d2011-08-31 11:23:24 +02001855 pFrameworkConfigurationLibrary->addElementBuilder(new TKindElementBuilderTemplate<CFrameworkConfigurationLocation>("StructureDescriptionFileLocation"));
1856 pFrameworkConfigurationLibrary->addElementBuilder(new TKindElementBuilderTemplate<CFrameworkConfigurationGroup>("SettingsConfiguration"));
1857 pFrameworkConfigurationLibrary->addElementBuilder(new TKindElementBuilderTemplate<CFrameworkConfigurationLocation>("ConfigurableDomainsFileLocation"));
1858 pFrameworkConfigurationLibrary->addElementBuilder(new TKindElementBuilderTemplate<CFrameworkConfigurationLocation>("BinarySettingsFileLocation"));
Patrick Benavoli68a91282011-08-31 11:23:23 +02001859
1860 _pElementLibrarySet->addElementLibrary(pFrameworkConfigurationLibrary);
1861
1862 // Parameter creation
1863 CElementLibrary* pParameterCreationLibrary = new CElementLibrary;
1864
1865 pParameterCreationLibrary->addElementBuilder(new CSubsystemElementBuilder(getSystemClass()->getSubsystemLibrary()));
Patrick Benavoli6ba361d2011-08-31 11:23:24 +02001866 pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CComponentType>("ComponentType"));
1867 pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CComponentInstance>("Component"));
1868 pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CBitParameterType>("BitParameter"));
1869 pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CBitParameterBlockType>("BitParameterBlock"));
Patrick Benavoli1352ae52011-10-21 16:48:04 +02001870 pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CStringParameterType>("StringParameter"));
Patrick Benavoli6ba361d2011-08-31 11:23:24 +02001871 pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CParameterBlockType>("ParameterBlock"));
1872 pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CBooleanParameterType>("BooleanParameter"));
1873 pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CIntegerParameterType>("IntegerParameter"));
Patrick Benavoliee65e6d2011-11-20 18:52:24 +01001874 pParameterCreationLibrary->addElementBuilder(new TElementBuilderTemplate<CLinearParameterAdaptation>("LinearAdaptation"));
Patrick Benavoli9fc3c0d2011-10-27 14:27:27 +02001875 pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CEnumParameterType>("EnumParameter"));
Patrick Benavoli68808c62012-02-02 17:12:41 +01001876 pParameterCreationLibrary->addElementBuilder(new TElementBuilderTemplate<CEnumValuePair>("ValuePair"));
Patrick Benavoli6ba361d2011-08-31 11:23:24 +02001877 pParameterCreationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CFixedPointParameterType>("FixedPointParameter"));
1878 pParameterCreationLibrary->addElementBuilder(new TKindElementBuilderTemplate<CXmlFileIncluderElement>("SubsystemInclude"));
Patrick Benavoli68a91282011-08-31 11:23:23 +02001879
1880 _pElementLibrarySet->addElementLibrary(pParameterCreationLibrary);
1881
1882 // Parameter Configuration Domains creation
1883 CElementLibrary* pParameterConfigurationLibrary = new CElementLibrary;
1884
Patrick Benavoli6ba361d2011-08-31 11:23:24 +02001885 pParameterConfigurationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CConfigurableDomain>("ConfigurableDomain"));
1886 pParameterConfigurationLibrary->addElementBuilder(new TNamedElementBuilderTemplate<CDomainConfiguration>("Configuration"));
1887 pParameterConfigurationLibrary->addElementBuilder(new TElementBuilderTemplate<CCompoundRule>("CompoundRule"));
1888 pParameterConfigurationLibrary->addElementBuilder(new TElementBuilderTemplate<CSelectionCriterionRule>("SelectionCriterionRule"));
Patrick Benavoli68a91282011-08-31 11:23:23 +02001889
1890 _pElementLibrarySet->addElementLibrary(pParameterConfigurationLibrary);
1891}
1892
1893// Remote Processor Server connection handling
1894bool CParameterMgr::handleRemoteProcessingInterface(string& strError)
1895{
1896 CAutoLog autoLog(this, "Handling remote processing interface");
1897
1898 // Start server if tuning allowed
Patrick Benavoli95ac0342011-11-07 20:32:51 +01001899 if (getConstFrameworkConfiguration()->isTuningAllowed()) {
Patrick Benavoli68a91282011-08-31 11:23:23 +02001900
Kevin Rocardace81f82012-12-11 16:19:17 +01001901 log_info("Loading remote processor library");
Patrick Benavoli68a91282011-08-31 11:23:23 +02001902
1903 // Load library
1904 void* lib_handle = dlopen("libremote-processor.so", RTLD_NOW);
1905
1906 if (!lib_handle) {
1907
1908 // Return error
1909 const char* pcError = dlerror();
1910
1911 if (pcError) {
1912
1913 strError = pcError;
1914 } else {
1915
1916 strError = "Unable to load libremote-processor.so library";
1917 }
1918
1919 return false;
1920 }
1921
1922 CreateRemoteProcessorServer pfnCreateRemoteProcessorServer = (CreateRemoteProcessorServer)dlsym(lib_handle, "createRemoteProcessorServer");
1923
1924 if (!pfnCreateRemoteProcessorServer) {
1925
1926 strError = "libremote-process.so does not contain createRemoteProcessorServer symbol.";
1927
1928 return false;
1929 }
1930
1931 // Create server
Patrick Benavoli95ac0342011-11-07 20:32:51 +01001932 _pRemoteProcessorServer = pfnCreateRemoteProcessorServer(getConstFrameworkConfiguration()->getServerPort(), _pCommandHandler);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001933
Kevin Rocardace81f82012-12-11 16:19:17 +01001934 log_info("Starting remote processor server on port %d", getConstFrameworkConfiguration()->getServerPort());
Patrick Benavoli68a91282011-08-31 11:23:23 +02001935 // Start
1936 if (!_pRemoteProcessorServer->start()) {
1937
1938 strError = "Unable to start remote processor server";
1939
1940 return false;
1941 }
1942 }
1943
1944 return true;
1945}
1946
1947// Back synchronization
Kevin Rocardace81f82012-12-11 16:19:17 +01001948CBackSynchronizer* CParameterMgr::createBackSynchronizer() const
Patrick Benavoli68a91282011-08-31 11:23:23 +02001949{
1950#ifdef SIMULATION
1951 // In simulation, back synchronization of the blackboard won't probably work
1952 // We need to ensure though the blackboard is initialized with valid data
Kevin Rocardace81f82012-12-11 16:19:17 +01001953 return new CSimulatedBackSynchronizer(getConstSystemClass(), _pMainParameterBlackboard);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001954#else
1955 // Real back synchronizer from subsystems
Kevin Rocardace81f82012-12-11 16:19:17 +01001956 return new CHardwareBackSynchronizer(getConstSystemClass(), _pMainParameterBlackboard);
Patrick Benavoli68a91282011-08-31 11:23:23 +02001957#endif
1958}
1959
1960// Children typwise access
1961CParameterFrameworkConfiguration* CParameterMgr::getFrameworkConfiguration()
1962{
1963 return static_cast<CParameterFrameworkConfiguration*>(getChild(EFrameworkConfiguration));
1964}
1965
1966const CParameterFrameworkConfiguration* CParameterMgr::getConstFrameworkConfiguration()
1967{
1968 return getFrameworkConfiguration();
1969}
1970
1971CSelectionCriteria* CParameterMgr::getSelectionCriteria()
1972{
1973 return static_cast<CSelectionCriteria*>(getChild(ESelectionCriteria));
1974}
1975
1976const CSelectionCriteria* CParameterMgr::getConstSelectionCriteria()
1977{
1978 return static_cast<const CSelectionCriteria*>(getChild(ESelectionCriteria));
1979}
1980
1981CSystemClass* CParameterMgr::getSystemClass()
1982{
1983 return static_cast<CSystemClass*>(getChild(ESystemClass));
1984}
1985
1986const CSystemClass* CParameterMgr::getConstSystemClass() const
1987{
1988 return static_cast<const CSystemClass*>(getChild(ESystemClass));
1989}
1990
1991// Configurable Domains
1992CConfigurableDomains* CParameterMgr::getConfigurableDomains()
1993{
1994 return static_cast<CConfigurableDomains*>(getChild(EConfigurableDomains));
1995}
1996
1997const CConfigurableDomains* CParameterMgr::getConstConfigurableDomains()
1998{
1999 return static_cast<const CConfigurableDomains*>(getChild(EConfigurableDomains));
2000}
2001
2002const CConfigurableDomains* CParameterMgr::getConstConfigurableDomains() const
2003{
2004 return static_cast<const CConfigurableDomains*>(getChild(EConfigurableDomains));
2005}
Georges-Henri Baron326a31d2012-06-28 12:05:09 +02002006
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +01002007// Apply configurations
2008void CParameterMgr::doApplyConfigurations(bool bForce)
2009{
2010 CSyncerSet syncerSet;
Georges-Henri Baron326a31d2012-06-28 12:05:09 +02002011
Guillaume Denneulinf2fd15a2012-12-20 17:53:29 +01002012 // Check subsystems that need resync
2013 getSystemClass()->checkForSubsystemsToResync(syncerSet);
2014
2015 // Ensure application of currently selected configurations
2016 getConfigurableDomains()->apply(_pMainParameterBlackboard, syncerSet, bForce);
2017
2018 // Reset the modified status of the current criteria to indicate that a new configuration has been applied
2019 getSelectionCriteria()->resetModifiedStatus();
2020}
2021
2022/// GUI commands functions
Georges-Henri Baron326a31d2012-06-28 12:05:09 +02002023bool CParameterMgr::getDomainsXMLString(string& strResult, bool bWithSettings)
2024{
2025
2026 // Root element
2027 const CConfigurableDomains* pConfigurableDomains = getConstConfigurableDomains();
2028
2029 // Get Schema file associated to root element
2030 string strXmlSchemaFilePath = _strSchemaFolderLocation + "/" + pConfigurableDomains->getKind() + ".xsd";
2031
2032 string strError;
2033
2034 // Context
2035 CXmlDomainSerializingContext xmlDomainSerializingContext(strError, bWithSettings);
2036
2037 // Value space
2038 xmlDomainSerializingContext.setValueSpaceRaw(_bValueSpaceIsRaw);
2039
2040 // Output raw format
2041 xmlDomainSerializingContext.setOutputRawFormat(_bOutputRawFormatIsHex);
2042
2043 // Use a doc source by loading data from instantiated Configurable Domains
2044 CXmlMemoryDocSource memorySource(pConfigurableDomains, pConfigurableDomains->getKind(), strXmlSchemaFilePath, "parameter-framework", getVersion());
2045
2046 // Use a doc sink the write the doc data in a string
2047 CXmlStringDocSink stringSink(strResult);
2048
2049 if (!stringSink.process(memorySource, xmlDomainSerializingContext)) {
2050 strResult = strError;
2051
2052 return false;
2053 }
2054
2055 return true;
2056}
2057
2058bool CParameterMgr::getSystemClassXMLString(string& strResult)
2059{
2060 // Root element
2061 const CSystemClass* pSystemClass = getSystemClass();
2062
2063 string strError;
2064
2065 CXmlSerializingContext xmlSerializingContext(strError);
2066
2067 // Use a doc source by loading data from instantiated Configurable Domains
2068 CXmlMemoryDocSource memorySource(pSystemClass, pSystemClass->getKind());
2069
2070 // Use a doc sink that write the doc data in a string
2071 CXmlStringDocSink stringSink(strResult);
2072
2073 if (!stringSink.process(memorySource, xmlSerializingContext)) {
2074 strResult = strError;
2075 return false;
2076 }
2077
2078 return true;
2079}