blackboard_precondition.h
Go to the documentation of this file.
00001 /*  Copyright (C) 2018 Davide Faconti -  All Rights Reserved
00002 *
00003 *   Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
00004 *   to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
00005 *   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:
00006 *   The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
00007 *
00008 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00009 *   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,
00010 *   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.
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     // check if the key is present in the blackboard
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


behaviortree_cpp
Author(s): Michele Colledanchise, Davide Faconti
autogenerated on Sat Feb 2 2019 03:50:09