diff --git a/include/sot-dyninv/commands-helper.h b/include/sot-dyninv/commands-helper.h index d9d35c5df105282b81abc62b3b360d671d96e727..e9e2502689c51a741212dba09f1e63c3d8af7ea1 100644 --- a/include/sot-dyninv/commands-helper.h +++ b/include/sot-dyninv/commands-helper.h @@ -30,7 +30,7 @@ namespace dynamicgraph { template <class E, typename T> - class DirectGetter + class DirectGetter : public Command { public: @@ -38,10 +38,10 @@ namespace dynamicgraph { typedef T (E::*GetterMethod) () const; /// Constructor - DirectGetter(E& entity,T* ptr, - const std::string& docString) - : Command(entity, std::vector<Value::Type>(), docString), - T_ptr(ptr) {} + DirectGetter(E& entity,T* ptr, + const std::string& docString) + : Command(entity, std::vector<Value::Type>(), docString), + T_ptr(ptr) {} protected: virtual Value doExecute() { return Value(*T_ptr); } @@ -50,16 +50,16 @@ namespace dynamicgraph { }; template <class E, typename T> - DirectGetter<E,T>* - makeDirectGetter( E& entity,T* ptr, - const std::string& docString) - { return new DirectGetter<E,T>(entity,ptr,docString); } + DirectGetter<E,T>* + makeDirectGetter( E& entity,T* ptr, + const std::string& docString) + { return new DirectGetter<E,T>(entity,ptr,docString); } std::string docDirectGetter( const std::string& name, const std::string& type ) - { - return std::string("\nGet the ")+name+".\n\nNo input.\nReturn an "+type+".\n\n"; - } + { + return std::string("\nGet the ")+name+".\n\nNo input.\nReturn an "+type+".\n\n"; + } } // namespace command } // namespace dynamicgraph @@ -69,35 +69,26 @@ namespace dynamicgraph { namespace dynamicgraph { namespace command { - template <class E, typename T> - class DirectSetter - : public Command - { - public: - DirectSetter(E& entity,T* ptr,const std::string& docString); - typedef void (E::*SetterMethod) (const int&); - protected: - virtual Value doExecute() + template< typename T > + struct ValueHelper { - const std::vector<Value>& values = getParameterValues(); - T val = values[0].value(); - return (*T_ptr) = val; - } - private: - T* T_ptr; - }; + static const Value::Type TypeID; + }; + + template<> + const Value::Type ValueHelper<int>::TypeID = Value::INT; - template <class E> - class DirectSetter<E,int> + + template <class E, typename T, Value::Type TYPEID> + class DirectSetter : public Command { - typedef int T; public: DirectSetter(E& entity,T* ptr,const std::string& docString) - :Command(entity, boost::assign::list_of(Value::INT), docString) + :Command(entity, boost::assign::list_of(TYPEID), docString) ,T_ptr(ptr) - {} + {} protected: virtual Value doExecute() @@ -111,23 +102,39 @@ namespace dynamicgraph { T* T_ptr; }; - template <class E, typename T> - DirectSetter<E,T>* - makeDirectSetter( E& entity,T* ptr, - const std::string& docString) - { return new DirectSetter<E,T>(entity,ptr,docString); } + + + template <Value::Type TYPEID,class E, typename T> + DirectSetter<E,T,TYPEID>* + makeDirectSetter( E& entity,T* ptr, + const std::string& docString) + { return new DirectSetter<E,T,TYPEID>(entity,ptr,docString); } std::string docDirectSetter( const std::string& name, const std::string& type ) - { - return std::string("\nSet the ")+name+".\n\nInput:\n - a " - +type+".\nVoid return.\n\n"; - } + { + return std::string("\nSet the ")+name+".\n\nInput:\n - a " + +type+".\nVoid return.\n\n"; + } } // namespace command } // namespace dynamicgraph + +/* --- HELPER --------------------------------------------------------------- */ +namespace sot { + namespace dyninv { + using ::dynamicgraph::command::Value; + using ::dynamicgraph::command::makeDirectGetter; + using ::dynamicgraph::command::docDirectGetter; + using ::dynamicgraph::command::makeDirectSetter; + using ::dynamicgraph::command::docDirectSetter; + } // namespace dyninv +} // namespace sot + + + #endif // __sot_dyninv_commands_helper_H__ diff --git a/include/sot-dyninv/controller-pd.h b/include/sot-dyninv/controller-pd.h index a0f2bf102a578bc96963f170348b05d56838f51a..8cb63768b0a7ca88414996c492e3ed8614017f64 100644 --- a/include/sot-dyninv/controller-pd.h +++ b/include/sot-dyninv/controller-pd.h @@ -37,6 +37,7 @@ /* SOT */ #include <sot-dyninv/signal-helper.h> +#include <sot-dyninv/entity-helper.h> @@ -47,8 +48,10 @@ namespace sot { /* --- CLASS ----------------------------------------------------------- */ /* --------------------------------------------------------------------- */ + class SOTCONTROLLERPD_EXPORT ControllerPD :public ::dynamicgraph::Entity + ,public ::dynamicgraph::EntityHelper<ControllerPD> { public: /* --- CONSTRUCTOR ---- */ diff --git a/src/controller-pd.cpp b/src/controller-pd.cpp index 838841c52389fe061af98b9158d98f1e8c01f236..d95590b34b8825809580099f6a757be3b32621c0 100644 --- a/src/controller-pd.cpp +++ b/src/controller-pd.cpp @@ -28,10 +28,6 @@ namespace sot namespace dg = ::dynamicgraph; using namespace dg; - using ::dynamicgraph::command::makeDirectGetter; - using ::dynamicgraph::command::docDirectGetter; - using ::dynamicgraph::command::makeDirectSetter; - using ::dynamicgraph::command::docDirectSetter; /* --- DG FACTORY ------------------------------------------------------- */ DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(ControllerPD,"ControllerPD"); @@ -50,28 +46,21 @@ namespace sot ,CONSTRUCT_SIGNAL_IN(velocity,ml::Vector) ,CONSTRUCT_SIGNAL_IN(velocityRef,ml::Vector) - ,CONSTRUCT_SIGNAL_OUT(control,ml::Vector,ControllerPD, - KpSIN << KdSIN << positionSIN << positionRefSIN - << velocitySIN << velocityRefSIN ) + ,CONSTRUCT_SIGNAL_OUT(control,ml::Vector, + KpSIN << KdSIN << positionSIN << positionRefSIN + << velocitySIN << velocityRefSIN ) { Entity::signalRegistration( KpSIN << KdSIN << positionSIN << positionRefSIN << velocitySIN << velocityRefSIN << controlSOUT ); - /* Commands. */ addCommand("getSize", makeDirectGetter(*this,&_dimension, docDirectGetter("dimension","int"))); - // std::string docstring - // = "\nSet the vectors dimension.\n\nInput:\n- an int.\nVoid return.\n\n"; - // addCommand("setSize", - // new ::dynamicgraph::command::Setter<ControllerPD,int> - // (*this, &ControllerPD::size,docstring)); - addCommand("setSize", - makeDirectSetter(*this, &_dimension, + makeDirectSetter<Value::INT>(*this, &_dimension, docDirectSetter("dimension","int"))); }