updated_decorator.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2024 Davide Faconti - All Rights Reserved
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
4 * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
5 * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
9 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
10 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
11 */
12 
15 
16 namespace BT
17 {
18 
20  const NodeConfig& config,
21  NodeStatus if_not_updated)
22  : DecoratorNode(name, config), if_not_updated_(if_not_updated)
23 {
24  auto it = config.input_ports.find("entry");
25  if(it == config.input_ports.end() || it->second.empty())
26  {
27  throw LogicError("Missing port 'entry' in ", name);
28  }
29  const auto entry_str = it->second;
30  StringView stripped_key;
31  if(isBlackboardPointer(entry_str, &stripped_key))
32  {
33  entry_key_ = stripped_key;
34  }
35  else
36  {
37  entry_key_ = entry_str;
38  }
39 }
40 
42 {
43  // continue executing an asynchronous child
45  {
46  auto status = child()->executeTick();
48  return status;
49  }
50 
51  if(auto entry = config().blackboard->getEntry(entry_key_))
52  {
53  std::unique_lock lk(entry->entry_mutex);
54  const uint64_t current_id = entry->sequence_id;
55  const uint64_t previous_id = sequence_id_;
56  sequence_id_ = current_id;
57 
58  if(previous_id == current_id)
59  {
60  return if_not_updated_;
61  }
62  }
63  else
64  {
65  return if_not_updated_;
66  }
67 
68  auto status = child()->executeTick();
70  return status;
71 }
72 
74 {
75  still_executing_child_ = false;
76 }
77 
78 } // namespace BT
BT
Definition: ex01_wrap_legacy.cpp:29
BT::EntryUpdatedDecorator::still_executing_child_
bool still_executing_child_
Definition: updated_decorator.h:42
BT::EntryUpdatedDecorator::tick
NodeStatus tick() override
Method to be implemented by the user.
Definition: updated_decorator.cpp:41
BT::TreeNode::config
const NodeConfig & config() const
Definition: tree_node.cpp:345
BT::TreeNode::executeTick
virtual BT::NodeStatus executeTick()
The method that should be used to invoke tick() and setStatus();.
Definition: tree_node.cpp:71
BT::StringView
std::string_view StringView
Definition: basic_types.h:59
BT::EntryUpdatedDecorator::entry_key_
std::string entry_key_
Definition: updated_decorator.h:41
BT::EntryUpdatedDecorator::if_not_updated_
NodeStatus if_not_updated_
Definition: updated_decorator.h:43
BT::NodeConfig::input_ports
PortsRemapping input_ports
Definition: tree_node.h:83
BT::DecoratorNode
Definition: decorator_node.h:8
bt_factory.h
BT::LogicError
Definition: exceptions.h:45
BT::EntryUpdatedDecorator::EntryUpdatedDecorator
EntryUpdatedDecorator(const std::string &name, const NodeConfig &config, NodeStatus if_not_updated)
Definition: updated_decorator.cpp:19
BT::NodeConfig::blackboard
Blackboard::Ptr blackboard
Definition: tree_node.h:79
BT::TreeNode::status
NodeStatus status() const
Definition: tree_node.cpp:279
BT::EntryUpdatedDecorator::sequence_id_
uint64_t sequence_id_
Definition: updated_decorator.h:40
BT::TreeNode::name
const std::string & name() const
Name of the instance, not the type.
Definition: tree_node.cpp:296
BT::DecoratorNode::child
const TreeNode * child() const
Definition: decorator_node.cpp:38
BT::NodeStatus::RUNNING
@ RUNNING
BT::EntryUpdatedDecorator::halt
void halt() override
The method used to interrupt the execution of this node.
Definition: updated_decorator.cpp:73
BT::NodeConfig
Definition: tree_node.h:73
BT::TreeNode::isBlackboardPointer
static bool isBlackboardPointer(StringView str, StringView *stripped_pointer=nullptr)
Check a string and return true if it matches the pattern: {...}.
Definition: tree_node.cpp:369
updated_decorator.h
BT::NodeStatus
NodeStatus
Definition: basic_types.h:33


behaviortree_cpp_v4
Author(s): Davide Faconti
autogenerated on Fri Jun 28 2024 02:20:08