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 #include "ros/timer.h"
00029 #include "ros/timer_manager.h"
00030
00031 namespace ros
00032 {
00033
00034 Timer::Impl::Impl()
00035 : started_(false)
00036 , timer_handle_(-1)
00037 , constructed_(WallTime::now().toSec())
00038 {
00039 }
00040
00041 Timer::Impl::~Impl()
00042 {
00043 if (WallTime::now().toSec() - constructed_ < 0.001)
00044 ROS_WARN("Timer destroyed immediately after creation. Did you forget to store the handle?");
00045 stop();
00046 }
00047
00048 bool Timer::Impl::isValid()
00049 {
00050 return !period_.isZero();
00051 }
00052
00053 void Timer::Impl::start()
00054 {
00055 if (!started_)
00056 {
00057 VoidConstPtr tracked_object;
00058 if (has_tracked_object_)
00059 {
00060 tracked_object = tracked_object_.lock();
00061 }
00062
00063 timer_handle_ = TimerManager<Time, Duration, TimerEvent>::global().add(period_, callback_, callback_queue_, tracked_object, oneshot_);
00064 started_ = true;
00065 }
00066 }
00067
00068 void Timer::Impl::stop()
00069 {
00070 if (started_)
00071 {
00072 started_ = false;
00073 TimerManager<Time, Duration, TimerEvent>::global().remove(timer_handle_);
00074 timer_handle_ = -1;
00075 }
00076 }
00077
00078 bool Timer::Impl::hasPending()
00079 {
00080 if (!isValid() || timer_handle_ == -1)
00081 {
00082 return false;
00083 }
00084
00085 return TimerManager<Time, Duration, TimerEvent>::global().hasPending(timer_handle_);
00086 }
00087
00088 void Timer::Impl::setPeriod(const Duration& period)
00089 {
00090 period_ = period;
00091 TimerManager<Time, Duration, TimerEvent>::global().setPeriod(timer_handle_, period);
00092 }
00093
00094 Timer::Timer(const TimerOptions& ops)
00095 : impl_(new Impl)
00096 {
00097 impl_->period_ = ops.period;
00098 impl_->callback_ = ops.callback;
00099 impl_->callback_queue_ = ops.callback_queue;
00100 impl_->tracked_object_ = ops.tracked_object;
00101 impl_->has_tracked_object_ = ops.tracked_object;
00102 impl_->oneshot_ = ops.oneshot;
00103 }
00104
00105 Timer::Timer(const Timer& rhs)
00106 {
00107 impl_ = rhs.impl_;
00108 }
00109
00110 Timer::~Timer()
00111 {
00112 }
00113
00114 void Timer::start()
00115 {
00116 if (impl_)
00117 {
00118 impl_->start();
00119 }
00120 }
00121
00122 void Timer::stop()
00123 {
00124 if (impl_)
00125 {
00126 impl_->stop();
00127 }
00128 }
00129
00130 bool Timer::hasPending()
00131 {
00132 if (impl_)
00133 {
00134 return impl_->hasPending();
00135 }
00136
00137 return false;
00138 }
00139
00140 void Timer::setPeriod(const Duration& period)
00141 {
00142 if (impl_)
00143 {
00144 impl_->setPeriod(period);
00145 }
00146 }
00147
00148 }