Configurator.hpp
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_CONFIGURATOR_HPP
00040 #define ORO_CONFIGURATOR_HPP
00041
00042 #include "ConfigurationInterface.hpp"
00043 #include "PeriodicActivity.hpp"
00044 #include "TimeService.hpp"
00045 #include "Time.hpp"
00046
00047 namespace RTT
00048 {
00061 class RTT_API Configurator
00062 : protected PeriodicActivity
00063 {
00064 public:
00071 Configurator( double period )
00072 :PeriodicActivity(RTT::OS::LowestPriority, period ), mtarget(0), status (false)
00073 {
00074 }
00075
00083 bool configure( ConfigurationInterface* target, Seconds _timeout = 0 )
00084 {
00085 mtarget = target;
00086 TimeService::ticks timestamp = TimeService::Instance()->getTicks();
00087 this->start();
00088
00089 while ( this->isRunning() && ( _timeout == 0 ||
00090 TimeService::Instance()->secondsSince(timestamp) < _timeout ) )
00091 {
00092 struct timespec tt;
00093 tt.tv_nsec=100*1000*1000;
00094 tt.tv_sec =0;
00095 nanosleep(&tt, 0);
00096 }
00097
00098 this->stop();
00099
00100 return status;
00101 }
00102
00106 ConfigurationInterface* configTarget() const
00107 {
00108 return mtarget;
00109 }
00110
00111 bool initialize()
00112 {
00113 mtarget->configInit();
00114 return true;
00115 }
00116
00117 void step()
00118 {
00119 if ( !mtarget->configStep() || mtarget->isFinished() )
00120 this->stop();
00121 }
00122
00123 void finalize()
00124 {
00125 status = mtarget->isFinished();
00126 mtarget->configCleanup();
00127 }
00128
00129 protected:
00130 ConfigurationInterface* mtarget;
00131
00135 bool status;
00136 };
00137
00138 }
00139
00140
00141 #endif