abstract_logger.h
Go to the documentation of this file.
00001 #ifndef ABSTRACT_LOGGER_H
00002 #define ABSTRACT_LOGGER_H
00003 
00004 #include "behaviortree_cpp/behavior_tree.h"
00005 #include "behaviortree_cpp/bt_factory.h"
00006 
00007 namespace BT
00008 {
00009 enum class TimestampType
00010 {
00011     ABSOLUTE,
00012     RELATIVE
00013 };
00014 
00015 typedef std::array<uint8_t, 12> SerializedTransition;
00016 
00017 class StatusChangeLogger
00018 {
00019   public:
00020     StatusChangeLogger(TreeNode* root_node);
00021     virtual ~StatusChangeLogger() = default;
00022 
00023     virtual void callback(BT::Duration timestamp, const TreeNode& node, NodeStatus prev_status,
00024                           NodeStatus status) = 0;
00025 
00026     virtual void flush() = 0;
00027 
00028     void setEnabled(bool enabled)
00029     {
00030         enabled_ = enabled;
00031     }
00032 
00033     void seTimestampType(TimestampType type)
00034     {
00035         type_ = type;
00036     }
00037 
00038     bool enabled() const
00039     {
00040         return enabled_;
00041     }
00042 
00043     // false by default.
00044     bool showsTransitionToIdle() const
00045     {
00046         return show_transition_to_idle_;
00047     }
00048 
00049     void enableTransitionToIdle(bool enable)
00050     {
00051         show_transition_to_idle_ = enable;
00052     }
00053 
00054   private:
00055     bool enabled_;
00056     bool show_transition_to_idle_;
00057     std::vector<TreeNode::StatusChangeSubscriber> subscribers_;
00058     TimestampType type_;
00059     BT::TimePoint first_timestamp_;
00060 };
00061 
00062 //--------------------------------------------
00063 
00064 inline StatusChangeLogger::StatusChangeLogger(TreeNode* root_node)
00065   : enabled_(true), show_transition_to_idle_(true), type_(TimestampType::ABSOLUTE)
00066 {
00067     first_timestamp_ = std::chrono::high_resolution_clock::now();
00068 
00069     auto subscribeCallback = [this](TimePoint timestamp, const TreeNode& node, NodeStatus prev,
00070                                     NodeStatus status) {
00071         if (enabled_ && (status != NodeStatus::IDLE || show_transition_to_idle_))
00072         {
00073             if (type_ == TimestampType::ABSOLUTE)
00074             {
00075                 this->callback(timestamp.time_since_epoch(), node, prev, status);
00076             }
00077             else
00078             {
00079                 this->callback(timestamp - first_timestamp_, node, prev, status);
00080             }
00081         }
00082     };
00083 
00084     auto visitor = [this, subscribeCallback](TreeNode* node) {
00085         subscribers_.push_back(node->subscribeToStatusChange(std::move(subscribeCallback)));
00086     };
00087 
00088     applyRecursiveVisitor(root_node, visitor);
00089 }
00090 }
00091 
00092 #endif   // ABSTRACT_LOGGER_H


behaviortree_cpp
Author(s): Michele Colledanchise, Davide Faconti
autogenerated on Sat Jun 8 2019 20:17:15