!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