};
+#include <boost/type_traits/remove_all_extents.hpp>
namespace CalciumInterface {
/********************* INTERFACE DE DECONNEXION *****************/
+ static void
+ ecp_cd (Superv_Component_i & component, std::string & instanceName)
+ {
+ /* TODO : Trouver le nom de l'instance SALOME*/
+ if (instanceName.empty()) instanceName="UNDEFINED";
+
+ }
+
static void
ecp_fin (Superv_Component_i & component, bool provideLastGivenValue)
{
/********************* INTERFACES DE LECTURE *****************/
- // T1 est le type de données
- template <typename T1 > static void
- ecp_lecture ( Superv_Component_i & component,
- CalciumTypes::DependencyType dependencyType,
- double & ti,
- double const & tf,
- long & i,
- const string & nomVar,
- size_t bufferLength,
- size_t & nRead,
- T1 * &data )
- {
- ecp_lecture<T1,T1> (component,dependencyType,ti,tf,
- i,nomVar,bufferLength,nRead,data);
-
- }
// T1 est le type de données
// T2 est un <nom> de type Calcium permettant de sélectionner le port CORBA correspondant
// le port à utiliser est le port cplx
template <typename T1, typename T2 > static void
ecp_lecture ( Superv_Component_i & component,
- CalciumTypes::DependencyType dependencyType,
+ int const & dependencyType,
double & ti,
double const & tf,
long & i,
typedef typename PortType::DataManipulator DataManipulator;
typedef typename DataManipulator::Type CorbaDataType; // Attention != T1
typedef typename DataManipulator::InnerType InnerType;
-
+ CalciumTypes::DependencyType _dependencyType=
+ static_cast<CalciumTypes::DependencyType>(dependencyType);
+
CorbaDataType corbaData;
#ifdef _DEBUG_
LOC(OSS()<<"Le mode de dépendance de la variable "
<< nomVar << " est indéfini."));
- if ( ( portDependencyType != dependencyType ) &&
- ( dependencyType != CalciumTypes::SEQUENCE_DEPENDENCY ) )
+ if ( ( portDependencyType != _dependencyType ) &&
+ ( _dependencyType != CalciumTypes::SEQUENCE_DEPENDENCY ) )
throw CalciumException(CalciumTypes::CPITVR,
LOC(OSS()<<"Le mode de dépendance de la variable "
<< nomVar << ": " << portDependencyType
<< " ne correspond pas au mode demandé."));
- if ( dependencyType == CalciumTypes::TIME_DEPENDENCY ) {
+ if ( _dependencyType == CalciumTypes::TIME_DEPENDENCY ) {
corbaData = port->get(ti,tf, 0);
#ifdef _DEBUG_
std::cout << "-------- CalciumInterface(ecp_lecture) MARK 5 ------------------" << std::endl;
#endif
}
- else if ( dependencyType == CalciumTypes::ITERATION_DEPENDENCY ) {
+ else if ( _dependencyType == CalciumTypes::ITERATION_DEPENDENCY ) {
corbaData = port->get(0, i);
#ifdef _DEBUG_
std::cout << "-------- CalciumInterface(ecp_lecture) MARK 6 ------------------" << std::endl;
return;
}
+ // T1 est le type de données
+ template <typename T1 > static void
+ ecp_lecture ( Superv_Component_i & component,
+ int const & dependencyType,
+ double & ti,
+ double const & tf,
+ long & i,
+ const string & nomVar,
+ size_t bufferLength,
+ size_t & nRead,
+ T1 * &data )
+ {
+ ecp_lecture<T1,T1> (component,dependencyType,ti,tf,
+ i,nomVar,bufferLength,nRead,data);
+
+ }
/********************* INTERFACES D'ECRITURE *****************/
- template <typename T1> static void
- ecp_ecriture ( Superv_Component_i & component,
- CalciumTypes::DependencyType dependencyType,
- double const & t,
- long const & i,
- const string & nomVar,
- size_t bufferLength,
- T1 & data ) {
- ecp_ecriture<T1,T1> (component,dependencyType,t,i,nomVar,bufferLength,data);
- }
-
+ // T1 : DataType
+ // T2 : PortType
template <typename T1, typename T2> static void
ecp_ecriture ( Superv_Component_i & component,
- CalciumTypes::DependencyType dependencyType,
+ int const & dependencyType,
double const & t,
long const & i,
const string & nomVar,
size_t bufferLength,
- T1 & data )
+ T1 const & data )
{
assert(&component);
- //typedef typename StarTrait<TT>::NonStarType T;
- typedef typename UsesPortTraits<T2>::PortType PortType;
- typedef typename ProvidesPortTraits<T2>::PortType ProvidesPortType;
- typedef typename ProvidesPortType::DataManipulator DataManipulator;
+ //typedef typename StarTrait<TT>::NonStarType T;
+ typedef typename boost::remove_all_extents< T2 >::type T2_without_extent;
+ typedef typename boost::remove_all_extents< T1 >::type T1_without_extent;
+
+ typedef typename UsesPortTraits <T2_without_extent>::PortType UsesPortType;
+ typedef typename ProvidesPortTraits<T2_without_extent>::PortType ProvidesPortType;// pour obtenir un manipulateur de données
+ typedef typename ProvidesPortType::DataManipulator DataManipulator;
// Verifier que l'on peut définir UsesPortType::DataManipulator
// typedef typename PortType::DataManipulator DataManipulator;
- typedef typename DataManipulator::Type CorbaDataType; // Attention != T1
- typedef typename DataManipulator::InnerType InnerType;
+ typedef typename DataManipulator::Type CorbaDataType; // Attention != T1
+ typedef typename DataManipulator::InnerType InnerType;
+
+ T1_without_extent const & _data = data;
+
+ CalciumTypes::DependencyType _dependencyType=
+ static_cast<CalciumTypes::DependencyType>(dependencyType);
#ifdef _DEBUG_
std::cerr << "-------- CalciumInterface(ecriture) MARK 1 ------------------" << std::endl;
#endif
if ( nomVar.empty() ) throw CalciumException(CalciumTypes::CPNMVR,
LOC("Le nom de la variable est <nul>"));
- PortType * port;
+ UsesPortType * port;
#ifdef _DEBUG_
std::cout << "-------- CalciumInterface(ecriture) MARK 2 ------------------" << std::endl;
#endif
try {
- port = component.Superv_Component_i::get_port< PortType > (nomVar.c_str());
+ port = component.Superv_Component_i::get_port< UsesPortType > (nomVar.c_str());
#ifdef _DEBUG_
std::cout << "-------- CalciumInterface(ecriture) MARK 3 ------------------" << std::endl;
#endif
// throw (CalciumException(CalciumTypes::CPIT,ex));
// }
- if ( dependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
+ if ( _dependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
throw CalciumException(CalciumTypes::CPIT,
LOC(OSS()<<"Le mode de dépendance demandé pour la variable "
<< nomVar << " est indéfini."));
- if ( dependencyType == CalciumTypes::SEQUENCE_DEPENDENCY )
+ if ( _dependencyType == CalciumTypes::SEQUENCE_DEPENDENCY )
throw CalciumException(CalciumTypes::CPIT,
LOC(OSS()<<"Le mode de dépendance SEQUENCE_DEPENDENCY pour la variable "
<< nomVar << " est impossible en écriture."));
// et vice-versa pour informer les provides port du mode dans lequel on est. Sinon il faut
// modifier l'interface IDL pour y ajouter un mode de dépendance !
// ---->
-// if ( portDependencyType != dependencyType )
+// if ( portDependencyType != _dependencyType )
// throw CalciumException(CalciumTypes::CPITVR,
// LOC(OSS()<<"Le mode de dépendance de la variable "
// << nomVar << " ne correspond pas au mode demandé."));
// OLD : la séquence locale. Or la méthode put récupère le buffer directement
// OLD : qui est alors le buffer utilisateur. Il pourrait alors arriver que :
// OLD : * Le recepteur efface le buffer emetteur
- // OLD : * Le port lui-même efface le buffer de l'ulisateur !
+ // OLD : * Le port lui-même efface le buffer de l'utilisateur !
// OLD : Cette copie est effectuée dans GenericPortUses::put
// OLD : en fonction de la collocalisation ou non.
// - OLD :En cas de connection multiples d'un port uses distant vers plusieurs port provides
// OLD : Il faut effectuer une copie dans le port provides.
// OLD : Cette copie est effectuée dans GenericPortUses::put
// OLD : en fonction de la collocalisation ou non.
- Copy2CorbaSpace<IsSameType<T1,InnerType>::value, DataManipulator >::apply(corbaData,data,bufferLength);
+ Copy2CorbaSpace<IsSameType<T1_without_extent,InnerType>::value, DataManipulator >::apply(corbaData,_data,bufferLength);
//TODO : GERER LES EXCEPTIONS ICI : ex le port n'est pas connecté
- if ( dependencyType == CalciumTypes::TIME_DEPENDENCY ) {
+ if ( _dependencyType == CalciumTypes::TIME_DEPENDENCY ) {
try
{
port->put(*corbaData,t, -1);
std::cout << "-------- CalciumInterface(ecriture) MARK 5 ------------------" << std::endl;
#endif
}
- else if ( dependencyType == CalciumTypes::ITERATION_DEPENDENCY ) {
+ else if ( _dependencyType == CalciumTypes::ITERATION_DEPENDENCY ) {
try
{
port->put(*corbaData,-1, i);
#endif
return;
- }
+ };
+
+ template <typename T1> static void
+ ecp_ecriture ( Superv_Component_i & component,
+ int const & dependencyType,
+ double const & t,
+ long const & i,
+ const string & nomVar,
+ size_t bufferLength,
+ T1 const & data ) {
+ ecp_ecriture<T1,T1> (component,dependencyType,t,i,nomVar,bufferLength,data);
+ };
};
#ifndef _CALCIUM_INTERFACE_HXX_
#define _CALCIUM_INTERFACE_HXX_
-//Interface C++
+//Interface CALCIUM des utilisateurs en C++
#include "CalciumCxxInterface.hxx"
#include "CalciumException.hxx"
#include <stdio.h>
+//Ce fichier déclare et défini l'interfaçage entre l'API utilisteur C et C++
+//Les procédures déclarées n'ont pas vocation à être utilisées directement (celà est
+// cependant possible).
//#define _DEBUG_
#ifdef _DEBUG_
double _tf=*tf; \
size_t _nRead=0; \
size_t _bufferLength=bufferLength; \
- CalciumTypes::DependencyType _dependencyType= \
- static_cast<CalciumTypes::DependencyType>(dependencyType); \
\
if ( IsSameType< _name , cplx >::value ) _bufferLength*=2; \
DEBTRACE( "-------- CalciumInterface(lecture Inter Part) MARK 1 ------------------" ) \
try { \
CalciumInterface::ecp_lecture< _type, _name >( *_component, \
- _dependencyType, \
+ dependencyType, \
_ti, _tf, *i, \
nomvar, \
_bufferLength, _nRead, *data); \
} catch ( const CalciumException & ex) { \
DEBTRACE( ex.what() ); \
return ex.getInfo(); \
- } catch ( ... ) { \
- std::cerr << "Unexpected exception " << std::endl; \
- return CalciumTypes::CPATAL; \
+ } catch ( ... ) { \
+ std::cerr << "Unexpected exception " << std::endl; \
+ return CalciumTypes::CPATAL; \
} \
if ( IsSameType< _name , cplx >::value ) { *nRead=_nRead/2; \
DEBTRACE( "-------- CalciumInterface(lecture Inter Part) IsSameType cplx -------------" ) \
DEBTRACE( "-------- CalciumInterface(lecture Inter Part) _nRead : " << _nRead ) \
DEBTRACE( "-------- CalciumInterface(lecture Inter Part) *nRead : " << *nRead ) \
} else *nRead = _nRead; \
- if (_dependencyType == CalciumTypes::CP_SEQUENTIEL ) \
+ if (dependencyType == CalciumTypes::CP_SEQUENTIEL ) \
*ti=(CalTimeType< _type _qual >::TimeType)(_ti); \
DEBTRACE( "-------- CalciumInterface(lecture Inter Part), Data Ptr :" << *data ) \
return CalciumTypes::CPOK; \
DEBTRACE( "-------- CalciumInterface(ecriture Inter Part) MARK 1 ------------------" ) \
try { \
/*printf("-------- CalciumInterface(ecriture Inter Part), cp_name : Nom de la var. de type %s : %s\n",#_type,nomvar);*/ \
- std::string essai(nomvar); \
- DEBTRACE( "----------->-" << nomvar ) \
+ DEBTRACE( "----------->-" << nomvar ) \
CalciumInterface::ecp_ecriture< _type, _name >( *_component, \
- static_cast<CalciumTypes::DependencyType>(dependencyType), \
+ dependencyType, \
_t,i,nomvar,_bufferLength,*data); \
} catch ( const CalciumException & ex) { \
std::cerr << ex.what() << std::endl; \
// double _tf=*tf;
// size_t _nRead=0;
// size_t _bufferLength=bufferLength;
-// CalciumTypes::DependencyType _dependencyType=
+// CalciumTypes::DependencyType dependencyType=
// static_cast<CalciumTypes::DependencyType>(dependencyType);
// // - GERER POINTEUR NULL : NOTHING TODO
// DEBTRACE( "-------- CalciumInterface(lecture Inter Part) MARK 1 ------------------" )
// try {
// CalciumInterface::ecp_lecture< char*, char* >( *_component,
-// _dependencyType,
+// dependencyType,
// _ti, _tf, *i,
// nomvar,
// _bufferLength, _nRead, *data);
// *nRead = _nRead;
-// if (_dependencyType == CalciumTypes::CP_SEQUENTIEL )
+// if (dependencyType == CalciumTypes::CP_SEQUENTIEL )
// *ti=(float)(_ti);
// DEBTRACE( "-------- CalciumInterface(lecture Inter Part), Data Ptr :" << *data ) ;