mon_gui.cpp
Go to the documentation of this file.
1 // rqt GUI for rosmon
2 // Author: Max Schwarz <max.schwarz@uni-bonn.de>
3 
4 #include "mon_gui.h"
5 
6 #if HAVE_PLUGINLIB_NEW_HEADERS
8 #else
10 #endif
11 
12 #include <QMenu>
13 #include <QMessageBox>
14 #include <QTimer>
15 #include <QDebug>
16 #include <QSortFilterProxyModel>
17 
18 #include <rosmon_msgs/StartStop.h>
19 
20 #include <ros/service.h>
21 
22 #include <thread>
23 
24 #include "bar_delegate.h"
25 
26 namespace rqt_rosmon
27 {
28 
30 {
31  m_w = new QWidget;
32  m_ui.setupUi(m_w);
33 
34  m_rosmonModel = new ROSMonModel(this);
35  m_ui.nodeBox->setModel(m_rosmonModel);
36 
37  m_model = new NodeModel(getNodeHandle(), this);
38 
39 #if QT_VERSION_MAJOR >= 5
40  m_ui.nodeBox->setCurrentText("[auto]");
41 #else
42  m_ui.nodeBox->setEditText("[auto]");
43 #endif
44 
45  connect(m_ui.nodeBox, SIGNAL(editTextChanged(QString)),
46  SLOT(setNamespace(QString))
47  );
48 
49  auto sortFilterProxy = new QSortFilterProxyModel(this);
50  sortFilterProxy->setSourceModel(m_model);
51  sortFilterProxy->setDynamicSortFilter(true);
52  sortFilterProxy->setSortRole(NodeModel::SortRole);
53  m_ui.tableView->setModel(sortFilterProxy);
54 
55  m_ui.tableView->setSortingEnabled(true);
56  m_ui.tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
57  m_ui.tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
58  m_ui.tableView->setContextMenuPolicy(Qt::CustomContextMenu);
59 
60  // Display colored bar graph for CPU load
61  {
62  auto loadDelegate = new BarDelegate(m_ui.tableView);
63  int numCores = std::thread::hardware_concurrency();
64  if(numCores <= 0)
65  numCores = 1;
66 
67  loadDelegate->setRange(0.0, numCores);
68  m_ui.tableView->setItemDelegateForColumn(NodeModel::COL_LOAD,
69  loadDelegate
70  );
71  }
72 
73  // Display colored bar graph for memory consumption
74  {
75  auto memDelegate = new BarDelegate(m_ui.tableView);
76 
77  long int av_pages = sysconf(_SC_PHYS_PAGES);
78  long int page_size = sysconf(_SC_PAGESIZE);
79  int64_t availableMemory = av_pages * page_size;
80  if(availableMemory < 0)
81  availableMemory = 1;
82 
83  memDelegate->setRange(0.0, availableMemory);
84  m_ui.tableView->setItemDelegateForColumn(NodeModel::COL_MEMORY,
85  memDelegate
86  );
87  }
88 
89  connect(m_ui.tableView, SIGNAL(customContextMenuRequested(QPoint)),
90  SLOT(showContextMenu(QPoint))
91  );
92  connect(m_model, SIGNAL(stateReceived(rosmon_msgs::StateConstPtr)),
93  m_ui.tableView, SLOT(resizeRowsToContents())
94  );
95 
96  m_autoTimer = new QTimer(this);
97  m_autoTimer->setInterval(1000);
98  connect(m_autoTimer, SIGNAL(timeout()), SLOT(checkAutoTopic()));
99 
100  ctx.addWidget(m_w);
101  setNamespace("[auto]");
102 }
103 
105 {
106  m_model->unsubscribe();
107 }
108 
109 void MonGUI::restoreSettings(const qt_gui_cpp::Settings& pluginSettings, const qt_gui_cpp::Settings& instanceSettings)
110 {
111  if(instanceSettings.contains("namespace"))
112  {
113  QString ns = instanceSettings.value("namespace").toString();
114  m_ui.nodeBox->setEditText(ns);
115  setNamespace(ns);
116  }
117 
118  if(instanceSettings.contains("viewState"))
119  m_ui.tableView->horizontalHeader()->restoreState(instanceSettings.value("viewState").toByteArray());
120 }
121 
122 void MonGUI::saveSettings(qt_gui_cpp::Settings& pluginSettings, qt_gui_cpp::Settings& instanceSettings) const
123 {
124  instanceSettings.setValue("namespace", m_ui.nodeBox->currentText());
125  instanceSettings.setValue("viewState", m_ui.tableView->horizontalHeader()->saveState());
126 }
127 
128 void MonGUI::showContextMenu(const QPoint& point)
129 {
130  QModelIndex index = m_ui.tableView->indexAt(point);
131 
132  if(!index.isValid())
133  return;
134 
135  QMenu menu(m_ui.tableView);
136 
137  QAction* startAction = menu.addAction("Start");
138  startAction->setProperty("action", rosmon_msgs::StartStopRequest::START);
139 
140  QAction* stopAction = menu.addAction("Stop");
141  stopAction->setProperty("action", rosmon_msgs::StartStopRequest::STOP);
142 
143  QAction* restartAction = menu.addAction("Restart");
144  restartAction->setProperty("action", rosmon_msgs::StartStopRequest::RESTART);
145 
146  QAction* triggered = menu.exec(m_ui.tableView->viewport()->mapToGlobal(point));
147 
148  if(triggered)
149  {
150  rosmon_msgs::StartStop srv;
151  srv.request.node = index.sibling(index.row(), NodeModel::COL_NAME).data().toString().toStdString();
152  srv.request.ns = index.sibling(index.row(), NodeModel::COL_NAMESPACE).data().toString().toStdString();
153  srv.request.action = triggered->property("action").toInt();
154 
155  if(!ros::service::call(m_model->namespaceString().toStdString() + "/start_stop", srv))
156  QMessageBox::critical(m_w, "Failure", "Could not call start_stop service");
157  }
158 }
159 
161 {
162  // Stupid heuristic: Select the first matching
163  if(m_rosmonModel->rowCount(QModelIndex()) > 1)
164  {
165  QString ns = m_rosmonModel->data(m_rosmonModel->index(1), Qt::DisplayRole).toString();
166 
167  if(m_model->namespaceString() != ns)
168  m_model->setNamespace(ns);
169  }
170  else
171  m_model->setNamespace("");
172 }
173 
174 void MonGUI::setNamespace(const QString& ns)
175 {
176  if(ns == "[auto]")
177  {
178  checkAutoTopic();
179  m_autoTimer->start();
180  }
181  else
182  {
183  m_model->setNamespace(ns);
184  m_autoTimer->stop();
185  }
186 }
187 
188 }
189 
void setNamespace(const QString &ns)
Definition: mon_gui.cpp:174
void initPlugin(qt_gui_cpp::PluginContext &ctx) override
Definition: mon_gui.cpp:29
void shutdownPlugin() override
Definition: mon_gui.cpp:104
bool call(const std::string &service_name, MReq &req, MRes &res)
QVariant data(const QModelIndex &index, int role) const override
void checkAutoTopic()
Definition: mon_gui.cpp:160
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const
QTimer * m_autoTimer
Definition: mon_gui.h:38
void addWidget(QWidget *widget)
QWidget * m_w
Definition: mon_gui.h:35
bool contains(const QString &key) const
void showContextMenu(const QPoint &point)
Definition: mon_gui.cpp:128
void setValue(const QString &key, const QVariant &value)
void restoreSettings(const qt_gui_cpp::Settings &pluginSettings, const qt_gui_cpp::Settings &instanceSettings) override
Definition: mon_gui.cpp:109
ros::NodeHandle & getNodeHandle() const
NodeModel * m_model
Definition: mon_gui.h:36
void setNamespace(const QString &ns)
Definition: node_model.cpp:29
int rowCount(const QModelIndex &parent) const override
ROSMonModel * m_rosmonModel
Definition: mon_gui.h:37
QString namespaceString() const
Definition: node_model.h:46
void saveSettings(qt_gui_cpp::Settings &pluginSettings, qt_gui_cpp::Settings &instanceSettings) const override
Definition: mon_gui.cpp:122
#define PLUGINLIB_EXPORT_CLASS(class_type, base_class_type)
Ui_MonGUI m_ui
Definition: mon_gui.h:34


rqt_rosmon
Author(s): Max Schwarz
autogenerated on Sat Jan 9 2021 03:35:46