content.txt
4.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
!1 Création d'un nouveau type de !-ParamGet-!
!2 Objectif
L'objectif de cette page est de créer un nouveau type de !-ParamGet-!.
Cela permettra de gérer un fichier xml décrivant un paramètre contenant une balise get du type
{{{
<get>
<newGetter name="density"/>
</get>
}}}
l'attribut name du noeud fils de <get> est obligatoire
!2 Procédure
* Il faut créer un plugin [[cf. AMDA plugin][.HelpDev.AmdaPlugin]] enregistrant le nouveau '''!-ParamGet-!'''
* Il faut créer au moins une classe dérivant de '''!-AMDA::Parameters::ParamGet_CRTP<maClass>-!'''.
* Il faut créer une classe dérivant de '''!-AMDA::XMLConfigurator::NodeGrpCfg-!'''.
* Il faut créer mettre à jour les schémas XSD permettant de valider les fichiers XML de paramètres
!2 Exemple:
!3 Création d'un nouveau !-ParamGet-!'''!-lectFile-!'''
Il devra lire les données dans un fichier ascii.
!4 1 - Suivre la procédure de création de plugin
[[cf. AMDA plugin][.HelpDev.AmdaPlugin]]
!5 La fonction registerPlugin doit contenir les lignes suivantes:
{{{
ParamGetFactory fact = boost::factory<ParamGetLectFile*>();
ServicesServer *servicesServer = ServicesServer::getInstance();
servicesServer->addParamGetFactory("LECT_FILE", fact);
XMLParameterConfigurator* lXMLConf = dynamic_cast<XMLParameterConfigurator*>(servicesServer->getConfigurator().get());
lXMLConf->addNodeParser("param/get/lectFile",AMDA::XMLConfigurator::NodeCfgSPtr(new GetLectFileNode));
}}}
!4 2 - Créer la classe !-GetLectFileNode-!
Il faut dériver de '''!-AMDA::XMLConfigurator::NodeGrpCfg-!''' et implémenter la méthode:
* !-void process()-! : permet de lire le noeud lectFile du fichier paramètre,
ce noeud peut comporter d'autres noeuds si besoin.
{{{
void GetLectFileNode::proceed(xmlNodePtr pNode, const AMDA::Parameters::CfgContext& pContext) {
const char *lSouceParamGet = "DDBASE";
LOG4CXX_DEBUG(gLogger, "NodeGetDDBase::proceed: '" << pNode->name << "' node")
ServicesServer* lServicesServer = pContext.get<ServicesServer*>();
Parameter* lParentParameter = pContext.get<Parameter*>();
ParameterManager* lParameterManager = pContext.get<ParameterManager*>();
xmlChar* lParamName = NULL;
try {
if (!(lParamName = xmlGetProp(pNode, (const xmlChar *) PARAMNAME))) {
ERROR_EXCEPTION(
ERROR_MANDATORY_ATTRIBUTE_MISSING << pNode->name << "@" << PARAMNAME)
}
ParameterSPtr lParameter;
if ( lParameterManager->addParameter(lParentParameter,std::string((const char*) lParamName),lParameter)) {
ParamGetLectFileSPtr lParamGet(dynamic_cast<ParamGetLectFile*>(lServicesServer->getParamGet("LECT_FILE", *lParameter)));
DataWriterSPtr lDataWriter( lParamGet);
lParamGet->setParName((const char*) lParamName);
lParameter->setDataWriter(lDataWriter);
AMDA::Parameters::CfgContext lContext(pContext);
lContext.push<ParamGetDDBase*>(lParamGet.get());
NodeGrpCfg::proceed(pNode, lContext);
}
} catch (...) {
if (lParamName) {
xmlFree(lParamName);
}
throw;
}
if (lParamName) {
xmlFree(lParamName);
}
}
}}}
!4 3 - Créer la classe !-ParamGetLectFile-!
Il faut dériver de '''!-AMDA::Parameters::ParamGet_CRTP<LectFile>-!''' et implémenter les méthodes:
* !-void DataWriter::init()-! :permet de calculer des informations static et créer les !-ParamData-!d'output.
{{{
void ParamGetLectFile::init() {
_paramData = new ParamDataSpec<float>();
}
}}}
* !-unsigned int DataWriter::write()-! :doit écrire les données dans le !-ParamData-! d'output et retourner le nombre de données qu'il a écrit.
{{{
unsigned int ParamGetLectFile::write() {
vector<string> colonne;
string ligne;
ofstream fichier("data.txt" );
// Tant que j'ai des lignes à lire
double time = 0;
while (getline (fichier, ligne))
{
float val = atof(ligne.str());
dynamic_cast<ParamDataSpec<float>(_paramData)->getDataList().push_back(val);
_paramData->getTimeList().push_back(time++);
}
return 0;
}
}}}
!4 4 - Mettre à jour le XSD
* Modifier le fichier request/all.xsd:
Y ajouter une ligne du type: !- <xs:include schemaLocation="newGetter.xsd" />-!
* Créer un fichier newGetter .xsd (voir nom du fichier référencé dans la ligne ajoutée au fichier all.xsd)
{{{
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="newGetter.xsd" />
<xs:element name="newGetter" substitutionGroup="Getter" type="GetterType"/>
</xs:schema>
}}}
!contents -R2 -g -p -f -h