-
Notifications
You must be signed in to change notification settings - Fork 910
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
based on MonotonicTime (which uses the CLOCK_MONOTONIC). This timer is not influenced by time jumps of the system time, so ideal for things like periodic checks of timeout/heartbeat, etc...
- Loading branch information
Showing
7 changed files
with
492 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
/* | ||
* Copyright (C) 2009, Willow Garage, Inc. | ||
* | ||
* Redistribution and use in source and binary forms, with or without | ||
* modification, are permitted provided that the following conditions are met: | ||
* * Redistributions of source code must retain the above copyright notice, | ||
* this list of conditions and the following disclaimer. | ||
* * Redistributions in binary form must reproduce the above copyright | ||
* notice, this list of conditions and the following disclaimer in the | ||
* documentation and/or other materials provided with the distribution. | ||
* * Neither the names of Stanford University or Willow Garage, Inc. nor the names of its | ||
* contributors may be used to endorse or promote products derived from | ||
* this software without specific prior written permission. | ||
* | ||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
* POSSIBILITY OF SUCH DAMAGE. | ||
*/ | ||
|
||
#ifndef ROSCPP_MONOTONIC_TIMER_H | ||
#define ROSCPP_MONOTONIC_TIMER_H | ||
|
||
#include "common.h" | ||
#include "forwards.h" | ||
#include "monotonic_timer_options.h" | ||
|
||
namespace ros | ||
{ | ||
|
||
/** | ||
* \brief Manages a wall-clock timer callback | ||
* | ||
* A MonotonicTimer should always be created through a call to NodeHandle::createMonotonicTimer(), or copied from one | ||
* that was. Once all copies of a specific | ||
* MonotonicTimer go out of scope, the callback associated with that handle will stop | ||
* being called. | ||
*/ | ||
class ROSCPP_DECL MonotonicTimer | ||
{ | ||
public: | ||
MonotonicTimer() {} | ||
MonotonicTimer(const MonotonicTimer& rhs); | ||
~MonotonicTimer(); | ||
|
||
/** | ||
* \brief Start the timer. Does nothing if the timer is already started. | ||
*/ | ||
void start(); | ||
/** | ||
* \brief Stop the timer. Once this call returns, no more callbacks will be called. Does | ||
* nothing if the timer is already stopped. | ||
*/ | ||
void stop(); | ||
|
||
/** | ||
* \brief Returns whether or not the timer has any pending events to call. | ||
*/ | ||
bool hasPending(); | ||
|
||
/** | ||
* \brief Set the period of this timer | ||
*/ | ||
void setPeriod(const WallDuration& period, bool reset=true); | ||
|
||
bool isValid() { return impl_ && impl_->isValid(); } | ||
operator void*() { return isValid() ? (void *) 1 : (void *) 0; } | ||
|
||
bool operator<(const MonotonicTimer& rhs) | ||
{ | ||
return impl_ < rhs.impl_; | ||
} | ||
|
||
bool operator==(const MonotonicTimer& rhs) | ||
{ | ||
return impl_ == rhs.impl_; | ||
} | ||
|
||
bool operator!=(const MonotonicTimer& rhs) | ||
{ | ||
return impl_ != rhs.impl_; | ||
} | ||
|
||
private: | ||
MonotonicTimer(const MonotonicTimerOptions& ops); | ||
|
||
class Impl | ||
{ | ||
public: | ||
Impl(); | ||
~Impl(); | ||
|
||
bool isValid(); | ||
bool hasPending(); | ||
void setPeriod(const WallDuration &period, bool reset=true); | ||
|
||
void start(); | ||
void stop(); | ||
|
||
bool started_; | ||
int32_t timer_handle_; | ||
|
||
WallDuration period_; | ||
MonotonicTimerCallback callback_; | ||
CallbackQueueInterface *callback_queue_; | ||
VoidConstWPtr tracked_object_; | ||
bool has_tracked_object_; | ||
bool oneshot_; | ||
}; | ||
typedef boost::shared_ptr<Impl> ImplPtr; | ||
typedef boost::weak_ptr<Impl> ImplWPtr; | ||
|
||
ImplPtr impl_; | ||
|
||
friend class NodeHandle; | ||
}; | ||
|
||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
/* | ||
* Copyright (C) 2009, Willow Garage, Inc. | ||
* | ||
* Redistribution and use in source and binary forms, with or without | ||
* modification, are permitted provided that the following conditions are met: | ||
* * Redistributions of source code must retain the above copyright notice, | ||
* this list of conditions and the following disclaimer. | ||
* * Redistributions in binary form must reproduce the above copyright | ||
* notice, this list of conditions and the following disclaimer in the | ||
* documentation and/or other materials provided with the distribution. | ||
* * Neither the names of Stanford University or Willow Garage, Inc. nor the names of its | ||
* contributors may be used to endorse or promote products derived from | ||
* this software without specific prior written permission. | ||
* | ||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
* POSSIBILITY OF SUCH DAMAGE. | ||
*/ | ||
|
||
#ifndef ROSCPP_MONOTONIC_TIMER_OPTIONS_H | ||
#define ROSCPP_MONOTONIC_TIMER_OPTIONS_H | ||
|
||
#include "common.h" | ||
#include "ros/forwards.h" | ||
|
||
namespace ros | ||
{ | ||
|
||
/** | ||
* \brief Encapsulates all options available for starting a timer | ||
*/ | ||
struct ROSCPP_DECL MonotonicTimerOptions | ||
{ | ||
MonotonicTimerOptions() | ||
: period(0.1) | ||
, callback_queue(0) | ||
, oneshot(false) | ||
, autostart(true) | ||
{ | ||
} | ||
|
||
/* | ||
* \brief Constructor | ||
* \param | ||
*/ | ||
MonotonicTimerOptions(WallDuration _period, const MonotonicTimerCallback& _callback, CallbackQueueInterface* _queue, | ||
bool oneshot = false, bool autostart = true) | ||
: period(_period) | ||
, callback(_callback) | ||
, callback_queue(_queue) | ||
, oneshot(oneshot) | ||
, autostart(autostart) | ||
{} | ||
|
||
WallDuration period; ///< The period to call the callback at | ||
MonotonicTimerCallback callback; ///< The callback to call | ||
|
||
CallbackQueueInterface* callback_queue; ///< Queue to add callbacks to. If NULL, the global callback queue will be used | ||
|
||
/** | ||
* A shared pointer to an object to track for these callbacks. If set, the a weak_ptr will be created to this object, | ||
* and if the reference count goes to 0 the subscriber callbacks will not get called. | ||
* | ||
* \note Note that setting this will cause a new reference to be added to the object before the | ||
* callback, and for it to go out of scope (and potentially be deleted) in the code path (and therefore | ||
* thread) that the callback is invoked from. | ||
*/ | ||
VoidConstPtr tracked_object; | ||
|
||
bool oneshot; | ||
bool autostart; | ||
}; | ||
|
||
|
||
} | ||
|
||
#endif | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.