14 #include <std_srvs/Trigger.h>
16 #include <QMessageBox>
18 Q_DECLARE_METATYPE(rosbag_fancy_msgs::StatusConstPtr)
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);
40 m_ui.tableView->setModel(&m_model);
42 QHeaderView *verticalHeader = m_ui.tableView->verticalHeader();
43 verticalHeader->setDefaultSectionSize(verticalHeader->fontMetrics().height()+2);
44 verticalHeader->hide();
46 connect(m_ui.prefixComboBox, QOverload<int>::of(&QComboBox::activated),
this, &FancyGui::subscribe);
47 connect(m_ui.refreshButton, &QToolButton::clicked,
this, &FancyGui::refreshTopicList);
49 connect(m_ui.startButton, &QPushButton::clicked,
this, &FancyGui::start);
50 connect(m_ui.stopButton, &QPushButton::clicked,
this, &FancyGui::stop);
55 void FancyGui::shutdownPlugin()
57 m_sub_status.shutdown();
64 instance_settings.
setValue(
"prefix", QString::fromStdString(m_prefix));
65 instance_settings.
setValue(
"columns", m_ui.tableView->horizontalHeader()->saveState());
72 m_prefix = instance_settings.
value(
"prefix").toString().toStdString();
75 m_ui.tableView->horizontalHeader()->restoreState(instance_settings.
value(
"columns").toByteArray());
78 void FancyGui::refreshTopicList()
83 m_ui.prefixComboBox->clear();
88 if(topic.datatype !=
"rosbag_fancy_msgs/Status")
91 QString name = QString::fromStdString(topic.name);
94 if(name.endsWith(
"/status"))
95 name = name.left(name.length() - 7);
99 m_ui.prefixComboBox->addItem(name);
100 if(name.toStdString() == m_prefix)
102 m_ui.prefixComboBox->setCurrentIndex(idx);
110 void FancyGui::subscribe()
113 std::string prefix = m_ui.prefixComboBox->currentText().toStdString();
116 m_sub_status = nh.
subscribe(prefix +
"/status", 1, &FancyGui::receivedStatus,
this);
118 m_w->setWindowTitle(QString::fromStdString(m_prefix));
121 void FancyGui::updateView(
const rosbag_fancy_msgs::StatusConstPtr& msg)
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));
129 for(
auto& t : msg->topics)
130 totalMsgs += t.messages;
132 m_ui.messages->setText(QString::number(totalMsgs));
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);
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);
149 m_ui.status->setText(
"UNKNOWN");
150 m_ui.status->setStyleSheet(
"");
151 m_ui.startButton->setEnabled(
false);
152 m_ui.stopButton->setEnabled(
false);
156 m_ui.tableView->resizeRowsToContents();
159 QString FancyGui::rateToString(
double rate)
const
163 s = fmt::format(
"{:.1f} Hz", rate);
165 s = fmt::format(
"{:.1f} kHz", rate / 1e3);
167 s = fmt::format(
"{:.1f} MHz", rate / 1e6);
169 return QString::fromStdString(
s);
172 QString FancyGui::memoryToString(uint64_t memory)
const
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));
184 s = fmt::format(
"{:.1f} TiB",
static_cast<double>(memory) /
static_cast<uint64_t
>(1ull<<40));
186 return QString::fromStdString(
s);
189 void FancyGui::start()
191 std_srvs::Trigger srv;
193 QMessageBox::critical(m_w,
"Error",
"Could not call start service");
196 void FancyGui::stop()
198 std_srvs::Trigger srv;
200 QMessageBox::critical(m_w,
"Error",
"Could not call stop service");