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");
 
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
bool call(const std::string &service_name, MReq &req, MRes &res)
ROSCPP_DECL bool getTopics(V_TopicInfo &topics)
void addWidget(QWidget *widget)
std::vector< TopicInfo > V_TopicInfo
void setValue(const QString &key, const QVariant &value)
virtual void restoreSettings(const Settings &, const Settings &)
virtual void saveSettings(Settings &, Settings &) const
#define PLUGINLIB_EXPORT_CLASS(class_type, base_class_type)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant()) const