!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
{{{
}}}
l'attribut name du noeud fils de 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-!'''.
* 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();
ServicesServer *servicesServer = ServicesServer::getInstance();
servicesServer->addParamGetFactory("LECT_FILE", fact);
XMLParameterConfigurator* lXMLConf = dynamic_cast(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();
Parameter* lParentParameter = pContext.get();
ParameterManager* lParameterManager = pContext.get();
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(lServicesServer->getParamGet("LECT_FILE", *lParameter)));
DataWriterSPtr lDataWriter( lParamGet);
lParamGet->setParName((const char*) lParamName);
lParameter->setDataWriter(lDataWriter);
AMDA::Parameters::CfgContext lContext(pContext);
lContext.push(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-!''' 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();
}
}}}
* !-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 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(_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: !- -!
* Créer un fichier newGetter .xsd (voir nom du fichier référencé dans la ligne ajoutée au fichier all.xsd)
{{{
}}}
!contents -R2 -g -p -f -h