fancy_gui.cpp
Go to the documentation of this file.
1 // rosbag_fancy GUI
2 // Author: Christian Lenz <lenz@ais.uni-bonn.de>
3 
4 #include "fancy_gui.h"
5 
6 #include "topic_model.h"
7 
8 #include <rosfmt/rosfmt.h>
9 #include <ros/node_handle.h>
10 #include <ros/service.h>
11 #include <ros/master.h>
13 
14 #include <std_srvs/Trigger.h>
15 
16 #include <QMessageBox>
17 
18 Q_DECLARE_METATYPE(rosbag_fancy_msgs::StatusConstPtr)
19 
21 {
22 
23 FancyGui::FancyGui()
24 {
25 }
26 
27 FancyGui::~FancyGui()
28 {
29 }
30 
31 void FancyGui::initPlugin(qt_gui_cpp::PluginContext& context)
32 {
33  m_w = new QWidget;
34  m_ui.setupUi(m_w);
35 
36  qRegisterMetaType<rosbag_fancy_msgs::StatusConstPtr>();
37  connect(this, &FancyGui::receivedStatus, &m_model, &TopicModel::setState, Qt::QueuedConnection);
38  connect(this, &FancyGui::receivedStatus, this, &FancyGui::updateView, Qt::QueuedConnection);
39 
40  m_ui.tableView->setModel(&m_model);
41 
42  QHeaderView *verticalHeader = m_ui.tableView->verticalHeader();
43  verticalHeader->setDefaultSectionSize(verticalHeader->fontMetrics().height()+2);
44  verticalHeader->hide();
45 
46  connect(m_ui.prefixComboBox, QOverload<int>::of(&QComboBox::activated), this, &FancyGui::subscribe);
47  connect(m_ui.refreshButton, &QToolButton::clicked, this, &FancyGui::refreshTopicList);
48 
49  connect(m_ui.startButton, &QPushButton::clicked, this, &FancyGui::start);
50  connect(m_ui.stopButton, &QPushButton::clicked, this, &FancyGui::stop);
51 
52  context.addWidget(m_w);
53 }
54 
55 void FancyGui::shutdownPlugin()
56 {
57  m_sub_status.shutdown();
58 }
59 
60 void FancyGui::saveSettings(qt_gui_cpp::Settings& plugin_settings, qt_gui_cpp::Settings& instance_settings) const
61 {
62  qt_gui_cpp::Plugin::saveSettings(plugin_settings, instance_settings);
63 
64  instance_settings.setValue("prefix", QString::fromStdString(m_prefix));
65  instance_settings.setValue("columns", m_ui.tableView->horizontalHeader()->saveState());
66 }
67 
68 void FancyGui::restoreSettings(const qt_gui_cpp::Settings& plugin_settings, const qt_gui_cpp::Settings& instance_settings)
69 {
70  qt_gui_cpp::Plugin::restoreSettings(plugin_settings, instance_settings);
71 
72  m_prefix = instance_settings.value("prefix").toString().toStdString();
73  refreshTopicList();
74 
75  m_ui.tableView->horizontalHeader()->restoreState(instance_settings.value("columns").toByteArray());
76 }
77 
78 void FancyGui::refreshTopicList()
79 {
81  ros::master::getTopics(topics);
82 
83  m_ui.prefixComboBox->clear();
84 
85  int idx = 0;
86  for(const ros::master::TopicInfo& topic : topics)
87  {
88  if(topic.datatype != "rosbag_fancy_msgs/Status")
89  continue;
90 
91  QString name = QString::fromStdString(topic.name);
92 
93  // Strip /status suffix
94  if(name.endsWith("/status"))
95  name = name.left(name.length() - 7);
96  else
97  continue;
98 
99  m_ui.prefixComboBox->addItem(name);
100  if(name.toStdString() == m_prefix)
101  {
102  m_ui.prefixComboBox->setCurrentIndex(idx);
103  subscribe();
104  }
105  ++idx;
106  }
107 
108 }
109 
110 void FancyGui::subscribe()
111 {
112  ros::NodeHandle nh;
113  std::string prefix = m_ui.prefixComboBox->currentText().toStdString();
114  m_prefix = prefix;
115 
116  m_sub_status = nh.subscribe(prefix + "/status", 1, &FancyGui::receivedStatus, this);
117 
118  m_w->setWindowTitle(QString::fromStdString(m_prefix));
119 }
120 
121 void FancyGui::updateView(const rosbag_fancy_msgs::StatusConstPtr& msg)
122 {
123  m_ui.file_name->setText(QString::fromStdString(msg->bagfile));
124  m_ui.bandwidth->setText(memoryToString(msg->bandwidth) + "/s");
125  m_ui.size->setText(memoryToString(msg->bytes));
126  m_ui.free_space->setText(memoryToString(msg->free_bytes));
127 
128  int totalMsgs = 0;
129  for(auto& t : msg->topics)
130  totalMsgs += t.messages;
131 
132  m_ui.messages->setText(QString::number(totalMsgs));
133 
134  switch(msg->status)
135  {
136  case rosbag_fancy_msgs::Status::STATUS_PAUSED:
137  m_ui.status->setText("PAUSED");
138  m_ui.status->setStyleSheet("color: white; background-color: red;");
139  m_ui.startButton->setEnabled(true);
140  m_ui.stopButton->setEnabled(false);
141  break;
142  case rosbag_fancy_msgs::Status::STATUS_RUNNING:
143  m_ui.status->setText("RUNNING");
144  m_ui.status->setStyleSheet("color: white; background-color: green;");
145  m_ui.startButton->setEnabled(false);
146  m_ui.stopButton->setEnabled(true);
147  break;
148  default:
149  m_ui.status->setText("UNKNOWN");
150  m_ui.status->setStyleSheet("");
151  m_ui.startButton->setEnabled(false);
152  m_ui.stopButton->setEnabled(false);
153  break;
154  }
155 
156  m_ui.tableView->resizeRowsToContents();
157 }
158 
159 QString FancyGui::rateToString(double rate) const
160 {
161  std::string s;
162  if(rate < 1000.0)
163  s = fmt::format("{:.1f} Hz", rate);
164  else if(rate < 1e6)
165  s = fmt::format("{:.1f} kHz", rate / 1e3);
166  else
167  s = fmt::format("{:.1f} MHz", rate / 1e6);
168 
169  return QString::fromStdString(s);
170 }
171 
172 QString FancyGui::memoryToString(uint64_t memory) const
173 {
174  std::string s;
175  if(memory < static_cast<uint64_t>(1<<10))
176  s = fmt::format("{}.0 B", memory);
177  else if(memory < static_cast<uint64_t>(1<<20))
178  s = fmt::format("{:.1f} KiB", static_cast<double>(memory) / static_cast<uint64_t>(1<<10));
179  else if(memory < static_cast<uint64_t>(1<<30))
180  s = fmt::format("{:.1f} MiB", static_cast<double>(memory) / static_cast<uint64_t>(1<<20));
181  else if(memory < static_cast<uint64_t>(1ull<<40))
182  s = fmt::format("{:.1f} GiB", static_cast<double>(memory) / static_cast<uint64_t>(1ull<<30));
183  else
184  s = fmt::format("{:.1f} TiB", static_cast<double>(memory) / static_cast<uint64_t>(1ull<<40));
185 
186  return QString::fromStdString(s);
187 }
188 
189 void FancyGui::start()
190 {
191  std_srvs::Trigger srv;
192  if(!ros::service::call(m_prefix + "/start", srv))
193  QMessageBox::critical(m_w, "Error", "Could not call start service");
194 }
195 
196 void FancyGui::stop()
197 {
198  std_srvs::Trigger srv;
199  if(!ros::service::call(m_prefix + "/stop", srv))
200  QMessageBox::critical(m_w, "Error", "Could not call stop service");
201 }
202 
203 }
204 
rosfmt.h
node_handle.h
ros::service::call
bool call(const std::string &service_name, MReq &req, MRes &res)
qt_gui_cpp::Settings::setValue
void setValue(const QString &key, const QVariant &value)
qt_gui_cpp::PluginContext
s
XmlRpcServer s
service.h
qt_gui_cpp::Plugin::restoreSettings
virtual void restoreSettings(const Settings &, const Settings &)
qt_gui_cpp::PluginContext::addWidget
void addWidget(QWidget *widget)
ros::master::getTopics
ROSCPP_DECL bool getTopics(V_TopicInfo &topics)
qt_gui_cpp::Settings
qt_gui_cpp::Plugin::saveSettings
virtual void saveSettings(Settings &, Settings &) const
class_list_macros.h
rqt_gui_cpp::Plugin
PLUGINLIB_EXPORT_CLASS
#define PLUGINLIB_EXPORT_CLASS(class_type, base_class_type)
topic_model.h
fancy_gui.h
ros::master::V_TopicInfo
std::vector< TopicInfo > V_TopicInfo
ros::NodeHandle::subscribe
Subscriber subscribe(const std::string &topic, uint32_t queue_size, const boost::function< void(C)> &callback, const VoidConstPtr &tracked_object=VoidConstPtr(), const TransportHints &transport_hints=TransportHints())
rqt_rosbag_fancy
Definition: fancy_gui.cpp:20
rqt_rosbag_fancy::FancyGui
Definition: fancy_gui.h:20
ros::master::TopicInfo
qt_gui_cpp::Settings::value
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
master.h
ros::NodeHandle


rqt_rosbag_fancy
Author(s): Christian Lenz
autogenerated on Tue Feb 20 2024 03:21:03