Program Listing for File scenario_view.h

Return to documentation for file (src/scenario_view.h)

//  Copyright (C) 2024 Intel Corporation
//
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at
//
//  http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing,
//  software distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions
//  and limitations under the License.
//
//  SPDX-License-Identifier: Apache-2.0

#pragma once

#include "rclcpp/rclcpp.hpp"
#include "rviz_common/display_context.hpp"
#include "rviz_common/ros_integration/ros_node_abstraction_iface.hpp"
#include <OgreCamera.h>
#include <OgreSceneNode.h>
#include <OgreVector3.h>
#include <QCheckBox>
#include <QComboBox>
#include <QDebug>
#include <QFormLayout>
#include <QHBoxLayout>
#include <QIcon>
#include <QLabel>
#include <QLineEdit>
#include <QMap>
#include <QObject>
#include <QPainter>
#include <QPixmap>
#include <QProgressBar>
#include <QPushButton>
#include <QTimer>
#include <QTreeView>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QVBoxLayout>
#include <chrono>
#include <cstdio>
#include <iomanip>
#include <py_trees_ros_interfaces/msg/behaviour_tree.hpp>
#include <rviz_common/panel.hpp>
#include <rviz_common/view_manager.hpp>
#include <tf2/utils.h>

class QPushButton;
class QComboBox;
class QTreeView;
class TreeModel;
class QTreeWidget;

namespace scenario_execution_rviz {

class IndicatorWidget;

class ScenarioView : public rviz_common::Panel {
  Q_OBJECT
public:
  ScenarioView(QWidget *parent = 0);

  virtual void load(const rviz_common::Config &config) override;
  virtual void save(rviz_common::Config config) const override;

Q_SIGNALS:
  void doubleClickedA(int index);

protected Q_SLOTS:
  void handleItemCollapsed(QTreeWidgetItem *collapsedItem);
  void handleItemExpanded(QTreeWidgetItem *expandedItem);
  void onHeaderDoubleClicked(int idx);
  void setupConnection();

protected:
  virtual void onInitialize() override;

  void behaviorTreeChanged(
      const py_trees_ros_interfaces::msg::BehaviourTree::SharedPtr msg);
  void populateTree(
      QList<QTreeWidgetItem *> &items,
      const py_trees_ros_interfaces::msg::BehaviourTree::SharedPtr msg);

  bool isNewTree(
      const py_trees_ros_interfaces::msg::BehaviourTree::SharedPtr previous,
      const py_trees_ros_interfaces::msg::BehaviourTree::SharedPtr current)
      const;
  void setIcon(int status, QTreeWidgetItem *item) const;

  rclcpp::Subscription<py_trees_ros_interfaces::msg::BehaviourTree>::SharedPtr
      mBehaviorTreeSubscriber;

  rclcpp::Node::SharedPtr _node;
  py_trees_ros_interfaces::msg::BehaviourTree::SharedPtr mPreviousMsg;

  QTreeWidget *mScenarioView;
  TreeModel *mTreeModel;
  bool treeWidgetBuilt = false;
  QMap<QString, bool> *collapsedStates;
  QString mSnapshotTopic;
  QTimer mInitTimer;

  // icons
  QIcon runningIcon = QIcon(":/icons/chevron-right-o.png");
  QIcon successIcon = QIcon(":/icons/check-o.png");
  QIcon failedIcon = QIcon(":/icons/close-o.png");
  QIcon waitingIcon = QIcon(":/icons/corner-down-right.png");
};

} // end namespace scenario_execution_rviz

class ConvertedBehavior : public QObject {

public:
  explicit ConvertedBehavior(
      const py_trees_ros_interfaces::msg::Behaviour &msg) {
    name = QString::fromStdString(msg.name);
    class_name = QString::fromStdString(msg.class_name);
    message = QString::fromStdString(msg.message);
    status = msg.status;
    type = msg.type;
    parent_id = uuidToQString(msg.parent_id.uuid);
    own_id = uuidToQString(msg.own_id.uuid);

    if (checkChild(msg.child_ids[0].uuid) == true) {

      for (auto const &child : msg.child_ids) {
        child_ids << uuidToQString(child.uuid);
      }
    }
  }

  QString name;
  QString class_name;
  QString own_id;
  QString parent_id;
  QStringList child_ids;
  QString current_child_id;
  QString message;
  int8_t status;
  int8_t type;

  QList<ConvertedBehavior *> mBehaviorList;

  static const QString
  uuidToQString(const std::array<unsigned char, 16> &uuid) {
    QString result;

    for (const auto &element : uuid) {

      result.append(QString("%1").arg(static_cast<unsigned int>(element), 2, 16,
                                      QChar('0')));
    }
    return result;
  }

  bool checkChild(const std::array<unsigned char, 16> &uuid) {
    bool result = true;
    // const unsigned char *null_ptr = NULL;
    const unsigned char *element_ptr = &uuid[0];
    if (element_ptr == nullptr) {

      result = false;
    }
    return result;
  }
};