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