content.txt 4.39 KB
!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