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 {
00032 template <typename T>
00033 class BlackboardPreconditionNode : public DecoratorNode
00034 {
00035 public:
00036 BlackboardPreconditionNode(const std::string& name, const NodeConfiguration& config)
00037 : DecoratorNode(name, config)
00038 {
00039 if( std::is_same<T,int>::value)
00040 setRegistrationID("BlackboardCheckInt");
00041 else if( std::is_same<T,double>::value)
00042 setRegistrationID("BlackboardCheckDouble");
00043 else if( std::is_same<T,std::string>::value)
00044 setRegistrationID("BlackboardCheckString");
00045 }
00046
00047 virtual ~BlackboardPreconditionNode() override = default;
00048
00049 static PortsList providedPorts()
00050 {
00051 return {InputPort("value_A"),
00052 InputPort("value_B"),
00053 InputPort<NodeStatus>("return_on_mismatch") };
00054 }
00055
00056 private:
00057 virtual BT::NodeStatus tick() override;
00058 };
00059
00060
00061
00062 template<typename T> inline
00063 NodeStatus BlackboardPreconditionNode<T>::tick()
00064 {
00065 T value_A;
00066 T value_B;
00067 NodeStatus default_return_status = NodeStatus::FAILURE;
00068
00069 setStatus(NodeStatus::RUNNING);
00070
00071 if( getInput("value_A", value_A) &&
00072 getInput("value_B", value_B) &&
00073 value_B == value_A )
00074 {
00075 return child_node_->executeTick();
00076 }
00077
00078 if( child()->status() == NodeStatus::RUNNING )
00079 {
00080 haltChild();
00081 }
00082 getInput("return_on_mismatch", default_return_status);
00083 return default_return_status;
00084 }
00085
00086 }
00087
00088 #endif