qnodedialog.cpp
Go to the documentation of this file.
1 #include "qnodedialog.h"
2 #include "ui_qnodedialog.h"
3 #include <boost/make_shared.hpp>
4 #include <QSettings>
5 #include <QMessageBox>
6 
7 std::string getDefaultMasterURI()
8 {
9  if (qgetenv("ROS_MASTER_URI").isEmpty())
10  {
11  QMessageBox msgBox;
12  msgBox.setText("WARNINGS: the ROS_MASTER_URI is not defined in your environment\n"
13  "Using the default value [http://localhost:11311]\n");
14  msgBox.exec();
15  return "http://localhost:11311";
16  }
17  else
18  {
19  auto master_uri = (qgetenv("ROS_MASTER_URI"));
20  return std::string(master_uri.data());
21  }
22 }
23 
24 QNodeDialog::QNodeDialog(QWidget* parent) : QDialog(parent), ui(new Ui::QNodeDialog)
25 {
26  ui->setupUi(this);
27 
28  QSettings settings;
29 
30  auto master_ui = settings.value("QNode.master_uri", tr("http://localhost:11311")).toString();
31  auto host_ip = settings.value("QNode.host_ip", tr("localhost")).toString();
32 
33  ui->lineEditMaster->setText(master_ui);
34  ui->lineEditHost->setText(host_ip);
35 }
36 
37 namespace ros
38 {
39 namespace master
40 {
41 void init(const M_string& remappings);
42 }
43 } // namespace ros
44 
45 bool QNodeDialog::Connect(const std::string& ros_master_uri, const std::string& hostname)
46 {
47  std::map<std::string, std::string> remappings;
48  remappings["__master"] = ros_master_uri;
49  remappings["__hostname"] = hostname;
50 
51  static bool first_time = true;
52  if (first_time || !ros::ok())
53  {
54  ros::init(remappings, "PlotJugglerListener", ros::init_options::AnonymousName);
55  first_time = false;
56  }
57  else
58  {
59  ros::master::init(remappings);
60  }
61  ros::start();
62 
63  bool connected = ros::master::check();
64  if (!connected)
65  {
66  QMessageBox msgBox;
67  msgBox.setText(QString("Could not connect to the ros master [%1]").arg(QString::fromStdString(ros_master_uri)));
68  msgBox.exec();
69  }
70 
71  return connected;
72 }
73 
75 {
76  QSettings settings;
77  settings.setValue("QNode.master_uri", ui->lineEditMaster->text());
78  settings.setValue("QNode.host_ip", ui->lineEditHost->text());
79  delete ui;
80 }
81 
83 {
84  bool connected = false;
85  if (ui->checkBoxUseEnvironment->isChecked())
86  {
87  const std::string master_uri = getDefaultMasterURI();
88  connected = QNodeDialog::Connect(master_uri, "localhost");
89  }
90  else
91  {
92  std::string ros_master_uri = ui->lineEditMaster->text().toStdString();
93  std::string hostname = ui->lineEditHost->text().toStdString();
94  connected = QNodeDialog::Connect(ros_master_uri, hostname);
95  }
96  if (connected)
97  {
98  this->close();
99  }
100  else
101  {
102  }
103 }
104 
106 {
107  ui->lineEditMaster->setEnabled(!checked);
108  ui->lineEditHost->setEnabled(!checked);
109 }
110 
112 {
113  this->close();
114 }
115 
117 {
118  static RosManager manager;
119  return manager;
120 }
121 
123 {
124  if (ros::isStarted())
125  {
126  ros::shutdown(); // explicitly needed since we use ros::start();;
128  }
129 }
130 
132 {
133 }
134 
136 {
137  RosManager& manager = RosManager::get();
138 
139  if (!ros::isInitialized() || !ros::master::check() || !ros::ok())
140  {
141  bool connected = QNodeDialog::Connect(getDefaultMasterURI(), "localhost");
142  if (!connected)
143  {
144  // as a fallback strategy, launch the QNodeDialog
145  QNodeDialog dialog;
146  dialog.exec();
147  }
148  }
150  {
151  if (!manager._node)
152  {
153  manager._node.reset(new ros::NodeHandle, [](ros::NodeHandle* node) {
154  delete node;
156  });
157  }
158  }
159  else{
160  return nullptr;
161  }
162  return manager._node;
163 }
ros::init_options::AnonymousName
AnonymousName
ros::master::check
ROSCPP_DECL bool check()
qnodedialog.h
getDefaultMasterURI
std::string getDefaultMasterURI()
Definition: qnodedialog.cpp:7
boost::shared_ptr< NodeHandle >
ros::init
ROSCPP_DECL void init(const M_string &remappings, const std::string &name, uint32_t options=0)
QNodeDialog::on_checkBoxUseEnvironment_toggled
void on_checkBoxUseEnvironment_toggled(bool checked)
Definition: qnodedialog.cpp:105
ros::master::init
void init(const M_string &remappings)
ros
QNodeDialog::Connect
static bool Connect(const std::string &ros_master_uri, const std::string &hostname="localhost")
Definition: qnodedialog.cpp:45
arg
auto arg(const Char *name, const T &arg) -> detail::named_arg< Char, T >
QNodeDialog::~QNodeDialog
~QNodeDialog()
Definition: qnodedialog.cpp:74
ros::shutdown
ROSCPP_DECL void shutdown()
QNodeDialog
Definition: qnodedialog.h:12
ros::ok
ROSCPP_DECL bool ok()
RosManager::~RosManager
~RosManager()
Definition: qnodedialog.cpp:131
Ui
ros::isInitialized
ROSCPP_DECL bool isInitialized()
QNodeDialog::QNodeDialog
QNodeDialog(QWidget *parent=nullptr)
Definition: qnodedialog.cpp:24
QNodeDialog::on_pushButtonConnect_pressed
void on_pushButtonConnect_pressed()
Definition: qnodedialog.cpp:82
ros::isStarted
ROSCPP_DECL bool isStarted()
RosManager::get
static RosManager & get()
Definition: qnodedialog.cpp:116
QNodeDialog::ui
Ui::QNodeDialog * ui
Definition: qnodedialog.h:30
ros::start
ROSCPP_DECL void start()
QNodeDialog::on_pushButtonCancel_pressed
void on_pushButtonCancel_pressed()
Definition: qnodedialog.cpp:111
RosManager
Definition: qnodedialog.h:33
ros::waitForShutdown
ROSCPP_DECL void waitForShutdown()
RosManager::stopROS
void stopROS()
Definition: qnodedialog.cpp:122
RosManager::_node
ros::NodeHandlePtr _node
Definition: qnodedialog.h:36
RosManager::getNode
static ros::NodeHandlePtr getNode()
Definition: qnodedialog.cpp:135
ros::NodeHandle
M_string
std::map< std::string, std::string > M_string


plotjuggler_ros
Author(s): Davide Faconti
autogenerated on Wed Feb 21 2024 03:22:56