Skip to content

Commit 5ec2e9b

Browse files
committed
Add support for custom sleep override function in Tree class
Signed-off-by: Tony Najjar <tony.najjar@dexory.com>
1 parent 3ff6a32 commit 5ec2e9b

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

include/behaviortree_cpp/bt_factory.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,13 @@ class Tree
122122

123123
[[nodiscard]] TreeNode* rootNode() const;
124124

125+
/// Function signature for a custom sleep override.
126+
/// The function receives the desired sleep duration and a reference to the
127+
/// WakeUpSignal so it can check for early wake-up.
128+
/// Return true if woken up before the timeout, false if the full duration elapsed.
129+
using SleepOverrideFunc =
130+
std::function<bool(std::chrono::system_clock::duration, WakeUpSignal&)>;
131+
125132
/**
126133
* @brief Sleep for a certain amount of time. This sleep could be interrupted by the methods
127134
* TreeNode::emitWakeUpSignal() or Tree::emitWakeUpSignal()
@@ -137,6 +144,14 @@ class Tree
137144
*/
138145
void emitWakeUpSignal();
139146

147+
/**
148+
* @brief Set a custom sleep override function. When set, Tree::sleep()
149+
* will delegate to this function instead of using the default
150+
* WakeUpSignal::waitFor(). This allows integrating with external clock
151+
* sources (e.g. ROS sim time) while preserving wake-up signal support.
152+
*/
153+
void setSleepOverride(SleepOverrideFunc func);
154+
140155
~Tree();
141156

142157
/// Tick the root of the tree once, even if a node invoked
@@ -196,6 +211,7 @@ class Tree
196211
friend class BehaviorTreeFactory;
197212

198213
std::shared_ptr<WakeUpSignal> wake_up_;
214+
SleepOverrideFunc sleep_override_;
199215

200216
enum TickOption
201217
{

src/bt_factory.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,10 @@ TreeNode* Tree::rootNode() const
655655

656656
bool Tree::sleep(std::chrono::system_clock::duration timeout)
657657
{
658+
if(sleep_override_)
659+
{
660+
return sleep_override_(timeout, *wake_up_);
661+
}
658662
return wake_up_->waitFor(
659663
std::chrono::duration_cast<std::chrono::milliseconds>(timeout));
660664
}
@@ -664,6 +668,11 @@ void Tree::emitWakeUpSignal()
664668
wake_up_->emitSignal();
665669
}
666670

671+
void Tree::setSleepOverride(SleepOverrideFunc func)
672+
{
673+
sleep_override_ = std::move(func);
674+
}
675+
667676
Tree::~Tree()
668677
{
669678
haltTree();

0 commit comments

Comments
 (0)