Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "behaviortree_cpp/decorator_node.h"
00015
00016 namespace BT
00017 {
00018 DecoratorNode::DecoratorNode(const std::string& name, const NodeConfiguration& config)
00019 : TreeNode::TreeNode(name, config), child_node_(nullptr)
00020 {
00021 }
00022
00023 void DecoratorNode::setChild(TreeNode* child)
00024 {
00025 if (child_node_)
00026 {
00027 throw BehaviorTreeException("Decorator [", name(), "] has already a child assigned");
00028 }
00029
00030 child_node_ = child;
00031 }
00032
00033 void DecoratorNode::halt()
00034 {
00035 haltChild();
00036 setStatus(NodeStatus::IDLE);
00037 }
00038
00039 const TreeNode* DecoratorNode::child() const
00040 {
00041 return child_node_;
00042 }
00043
00044 TreeNode* DecoratorNode::child()
00045 {
00046 return child_node_;
00047 }
00048
00049 void DecoratorNode::haltChild()
00050 {
00051 if (child_node_->status() == NodeStatus::RUNNING)
00052 {
00053 child_node_->halt();
00054 }
00055 child_node_->setStatus(NodeStatus::IDLE);
00056 }
00057
00058 SimpleDecoratorNode::SimpleDecoratorNode(const std::string& name, TickFunctor tick_functor,
00059 const NodeConfiguration& config)
00060 : DecoratorNode(name, config), tick_functor_(std::move(tick_functor))
00061 {
00062 }
00063
00064 NodeStatus SimpleDecoratorNode::tick()
00065 {
00066 return tick_functor_(child()->executeTick(), *this);
00067 }
00068
00069 NodeStatus DecoratorNode::executeTick()
00070 {
00071 NodeStatus status = TreeNode::executeTick();
00072 NodeStatus child_status = child()->status();
00073 if( child_status == NodeStatus::SUCCESS || child_status == NodeStatus::FAILURE )
00074 {
00075 child()->setStatus(NodeStatus::IDLE);
00076 }
00077 return status;
00078 }
00079
00080 }