00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef ORO_CALL_FUNCTION_HPP
00040 #define ORO_CALL_FUNCTION_HPP
00041
00042 #include "../base/ActionInterface.hpp"
00043 #include "../base/DisposableInterface.hpp"
00044 #include "../internal/DataSources.hpp"
00045 #include "ProgramInterface.hpp"
00046 #include "../internal/DataSource.hpp"
00047 #include "../ExecutionEngine.hpp"
00048 #include <boost/shared_ptr.hpp>
00049 #include <boost/bind.hpp>
00050
00051 namespace RTT
00052 { namespace scripting {
00053 using namespace detail;
00054
00062 class RTT_SCRIPTING_API CallFunction
00063 : public base::ActionInterface
00064 {
00065 base::ActionInterface* minit;
00066 ExecutionEngine* mrunner;
00067 ExecutionEngine* mcaller;
00071 internal::AssignableDataSource<ProgramInterface*>::shared_ptr _v;
00076 boost::shared_ptr<ProgramInterface> _foo;
00077 bool isqueued;
00078 bool maccept;
00079
00080 bool fooDone() {
00081 return _foo->inError() || _foo->isStopped();
00082 }
00083 public:
00092 CallFunction( base::ActionInterface* init_com,
00093 boost::shared_ptr<ProgramInterface> foo,
00094 ExecutionEngine* p, ExecutionEngine* caller,
00095 internal::AssignableDataSource<ProgramInterface*>* v = 0 ,
00096 internal::AssignableDataSource<bool>* a = 0 )
00097 : minit(init_com),
00098 mrunner(p), mcaller(caller),
00099 _v( v==0 ? new internal::UnboundDataSource< internal::ValueDataSource<ProgramInterface*> >(foo.get()) : v ),
00100 _foo( foo ), isqueued(false), maccept(false)
00101 {
00102 }
00103
00104 ~CallFunction() {
00105 this->reset();
00106 }
00107
00108 virtual bool execute() {
00109
00110 if (isqueued == false ) {
00111 isqueued = true;
00112 maccept = minit->execute() && mrunner->runFunction( _foo.get() );
00113
00114 _foo->start();
00115 if ( maccept ) {
00116
00117
00118 mrunner->waitForFunctions(boost::bind(&CallFunction::fooDone,this) );
00119 if ( _foo->inError() ) {
00120 throw false;
00121 }
00122 return true;
00123 }
00124 return false;
00125 }
00126 return true;
00127 }
00128
00129 virtual void reset() {
00130 mrunner->removeFunction( _foo.get() );
00131 maccept = false;
00132 isqueued = false;
00133 }
00134
00135 virtual bool valid() const {
00136 return maccept;
00137 }
00138
00139 virtual void readArguments() {
00140
00141 minit->readArguments();
00142 }
00143
00144 base::ActionInterface* clone() const
00145 {
00146
00147 return new CallFunction( minit->clone(), _foo, mrunner, mcaller, _v.get() );
00148 }
00149
00150 base::ActionInterface* copy( std::map<const base::DataSourceBase*, base::DataSourceBase*>& alreadyCloned ) const
00151 {
00152
00153
00154 boost::shared_ptr<ProgramInterface> fcpy( _foo->copy(alreadyCloned) );
00155 internal::AssignableDataSource<ProgramInterface*>* vcpy = _v->copy(alreadyCloned);
00156 vcpy->set( fcpy.get() );
00157 return new CallFunction( minit->copy(alreadyCloned), fcpy , mrunner, mcaller, vcpy );
00158 }
00159
00160 };
00161
00162 }}
00163
00164 #endif