Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef DECORATOR_BLACKBOARD_PRECONDITION_NODE_H
00014 #define DECORATOR_BLACKBOARD_PRECONDITION_NODE_H
00015
00016 #include "behaviortree_cpp/decorator_node.h"
00017
00018 namespace BT
00019 {
00020 template <typename T>
00021 class BlackboardPreconditionNode : public DecoratorNode
00022 {
00023 public:
00024 BlackboardPreconditionNode(const std::string& name, const NodeParameters& params)
00025 : DecoratorNode(name, params)
00026 {
00027 if( std::is_same<T,int>::value)
00028 setRegistrationName("BlackboardCheckInt");
00029 else if( std::is_same<T,double>::value)
00030 setRegistrationName("BlackboardCheckDouble");
00031 else if( std::is_same<T,std::string>::value)
00032 setRegistrationName("BlackboardCheckString");
00033 }
00034
00035 virtual ~BlackboardPreconditionNode() override = default;
00036
00037 static const NodeParameters& requiredNodeParameters()
00038 {
00039 static NodeParameters params = {{"key", ""}, {"expected", "*"}};
00040 return params;
00041 }
00042
00043 private:
00044 virtual BT::NodeStatus tick() override;
00045 };
00046
00047
00048
00049 template<typename T> inline
00050 NodeStatus BlackboardPreconditionNode<T>::tick()
00051 {
00052 std::string key;
00053 T expected_value;
00054 T current_value;
00055
00056 getParam("key", key);
00057 setStatus(NodeStatus::RUNNING);
00058
00059
00060 if ( !blackboard() || !(blackboard()->contains(key)) )
00061 {
00062 return NodeStatus::FAILURE;
00063 }
00064
00065 if( initializationParameters().at("expected") == "*" )
00066 {
00067 return child_node_->executeTick();
00068 }
00069
00070 bool same = ( getParam("expected", expected_value) &&
00071 blackboard()->get(key, current_value) &&
00072 current_value == expected_value ) ;
00073 if(same)
00074 {
00075 return child_node_->executeTick();
00076 }
00077 else{
00078 if( child()->status() == NodeStatus::RUNNING)
00079 {
00080 haltChild();
00081 }
00082 return NodeStatus::FAILURE;
00083 }
00084
00085 }
00086
00087 }
00088
00089 #endif