Skip to content

Commit 89ba053

Browse files
authored
Add publisher/server and autoconnect args to BT Monitor (#170)
* Add publisher/server and autoconnect args to BT Monitor * Add extended timeout to get behavior tree on autoconnect * Add address arg
1 parent 7c7ba71 commit 89ba053

File tree

6 files changed

+118
-25
lines changed

6 files changed

+118
-25
lines changed

bt_editor/main.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,23 @@ main(int argc, char *argv[])
3939
"Start in one of these modes: [editor,monitor,replay]",
4040
"mode");
4141
parser.addOption(mode_option);
42+
43+
QCommandLineOption address_option(QStringList() << "address",
44+
"Address to connect to (defaults to localhost)",
45+
"address");
46+
parser.addOption(address_option);
47+
QCommandLineOption pub_port_option(QStringList() << "publisher_port",
48+
"Publisher port number (defaults to 1666)",
49+
"publisher_port");
50+
parser.addOption(pub_port_option);
51+
QCommandLineOption srv_port_option(QStringList() << "server_port",
52+
"Server port number (defaults to 1667)",
53+
"server_port");
54+
parser.addOption(srv_port_option);
55+
QCommandLineOption autoconnect_option(QStringList() << "autoconnect",
56+
"Autoconnect to monitor");
57+
parser.addOption(autoconnect_option);
58+
4259
parser.process( app );
4360

4461
QFile styleFile( ":/stylesheet.qss" );
@@ -88,7 +105,15 @@ main(int argc, char *argv[])
88105
mode = dialog.getGraphicMode();
89106
}
90107

91-
MainWindow win( mode );
108+
// Get the monitor options.
109+
const QString monitor_address = parser.value(address_option);
110+
const QString monitor_pub_port = parser.value(pub_port_option);
111+
const QString monitor_srv_port = parser.value(srv_port_option);
112+
const bool monitor_autoconnect = parser.isSet(autoconnect_option);
113+
114+
// Start the main application.
115+
MainWindow win( mode, monitor_address, monitor_pub_port,
116+
monitor_srv_port, monitor_autoconnect );
92117
win.show();
93118
return app.exec();
94119
}

bt_editor/mainwindow.cpp

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <nodes/NodeData>
2323
#include <nodes/NodeStyle>
2424
#include <nodes/FlowView>
25+
#include <thread>
2526

2627
#include "editor_flowscene.h"
2728
#include "utils.h"
@@ -40,11 +41,20 @@ using QtNodes::FlowScene;
4041
using QtNodes::NodeGraphicsObject;
4142
using QtNodes::NodeState;
4243

43-
MainWindow::MainWindow(GraphicMode initial_mode, QWidget *parent) :
44-
QMainWindow(parent),
45-
ui(new Ui::MainWindow),
46-
_current_mode(initial_mode),
47-
_current_layout(QtNodes::PortLayout::Vertical)
44+
MainWindow::MainWindow(GraphicMode initial_mode,
45+
const QString& monitor_address,
46+
const QString& monitor_pub_port,
47+
const QString& monitor_srv_port,
48+
const bool monitor_autoconnect,
49+
QWidget *parent) :
50+
QMainWindow(parent),
51+
ui(new Ui::MainWindow),
52+
_current_mode(initial_mode),
53+
_current_layout(QtNodes::PortLayout::Vertical),
54+
_monitor_address(monitor_address),
55+
_monitor_publisher_port(monitor_pub_port),
56+
_monitor_server_port(monitor_srv_port),
57+
_monitor_autoconnect(monitor_autoconnect)
4858
{
4959
ui->setupUi(this);
5060

@@ -96,14 +106,25 @@ MainWindow::MainWindow(GraphicMode initial_mode, QWidget *parent) :
96106
ui->leftFrame->layout()->addWidget( _replay_widget );
97107

98108
#ifdef ZMQ_FOUND
99-
_monitor_widget = new SidepanelMonitor(this);
109+
_monitor_widget = new SidepanelMonitor(
110+
this, _monitor_address, _monitor_publisher_port, _monitor_server_port);
100111
ui->leftFrame->layout()->addWidget( _monitor_widget );
101112

102113
connect( ui->toolButtonConnect, &QToolButton::clicked,
103114
_monitor_widget, &SidepanelMonitor::on_Connect );
104115

105116
connect( _monitor_widget, &SidepanelMonitor::connectionUpdate,
106117
this, &MainWindow::onConnectionUpdate );
118+
119+
if ( monitor_autoconnect )
120+
{
121+
// If autoconnecting, increase the timeout to get the behavior tree to a
122+
// larger value. This only lasts for one "connect" before returning to
123+
// its default value.
124+
_monitor_widget->set_load_tree_timeout_ms(
125+
_monitor_widget->_load_tree_autoconnect_timeout_ms);
126+
ui->toolButtonConnect->animateClick();
127+
}
107128
#else
108129
ui->actionMonitor_mode->setVisible(false);
109130
#endif

bt_editor/mainwindow.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ class MainWindow : public QMainWindow
4343
SUBTREE_REFRESH};
4444

4545
public:
46-
explicit MainWindow(GraphicMode initial_mode, QWidget *parent = nullptr);
46+
explicit MainWindow(GraphicMode initial_mode,
47+
const QString& monitor_address = "",
48+
const QString& monitor_pub_port = "",
49+
const QString& monitor_srv_port = "",
50+
const bool monitor_autoconnect = false,
51+
QWidget *parent = nullptr);
4752
~MainWindow() override;
4853

4954
void loadFromXML(const QString &xml_text);
@@ -202,7 +207,12 @@ private slots:
202207
#ifdef ZMQ_FOUND
203208
SidepanelMonitor* _monitor_widget;
204209
#endif
205-
210+
211+
QString _monitor_address;
212+
QString _monitor_publisher_port;
213+
QString _monitor_server_port;
214+
bool _monitor_autoconnect;
215+
206216
MainWindow::SavedState saveCurrentState();
207217
void clearUndoStacks();
208218
};

bt_editor/sidepanel_monitor.cpp

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
#include "mainwindow.h"
1111
#include "utils.h"
1212

13-
SidepanelMonitor::SidepanelMonitor(QWidget *parent) :
13+
SidepanelMonitor::SidepanelMonitor(QWidget *parent,
14+
const QString &address,
15+
const QString &publisher_port,
16+
const QString &server_port) :
1417
QFrame(parent),
1518
ui(new Ui::SidepanelMonitor),
1619
_zmq_context(1),
@@ -20,8 +23,22 @@ SidepanelMonitor::SidepanelMonitor(QWidget *parent) :
2023
_parent(parent)
2124
{
2225
ui->setupUi(this);
23-
_timer = new QTimer(this);
26+
this->set_load_tree_timeout_ms(_load_tree_default_timeout_ms);
2427

28+
if ( !address.isEmpty() )
29+
{
30+
ui->lineEdit_address->setText(address);
31+
}
32+
if ( !publisher_port.isEmpty() )
33+
{
34+
ui->lineEdit_publisher->setText(publisher_port);
35+
}
36+
if ( !server_port.isEmpty() )
37+
{
38+
ui->lineEdit_server->setText(server_port);
39+
}
40+
41+
_timer = new QTimer(this);
2542
connect( _timer, &QTimer::timeout, this, &SidepanelMonitor::on_timer );
2643
}
2744

@@ -97,7 +114,7 @@ void SidepanelMonitor::on_timer()
97114
qDebug() << "Reload tree from server";
98115
if( !getTreeFromServer() ) {
99116
_connected = false;
100-
ui->lineEdit->setDisabled(false);
117+
ui->lineEdit_address->setDisabled(false);
101118
_timer->stop();
102119
connectionUpdate(false);
103120
return;
@@ -127,8 +144,7 @@ bool SidepanelMonitor::getTreeFromServer()
127144
zmq::socket_t zmq_client( _zmq_context, ZMQ_REQ );
128145
zmq_client.connect( _connection_address_req.c_str() );
129146

130-
int timeout_ms = 1000;
131-
zmq_client.setsockopt(ZMQ_RCVTIMEO,&timeout_ms, sizeof(int) );
147+
zmq_client.setsockopt(ZMQ_RCVTIMEO, &_load_tree_timeout_ms, sizeof(int) );
132148

133149
zmq_client.send(request, zmq::send_flags::none);
134150

@@ -187,13 +203,13 @@ bool SidepanelMonitor::getTreeFromServer()
187203

188204
void SidepanelMonitor::on_Connect()
189205
{
190-
if( !_connected)
206+
if( !_connected )
191207
{
192-
QString address = ui->lineEdit->text();
208+
QString address = ui->lineEdit_address->text();
193209
if( address.isEmpty() )
194210
{
195-
address = ui->lineEdit->placeholderText();
196-
ui->lineEdit->setText(address);
211+
address = ui->lineEdit_address->placeholderText();
212+
ui->lineEdit_address->setText(address);
197213
}
198214

199215
QString publisher_port = ui->lineEdit_publisher->text();
@@ -221,13 +237,16 @@ void SidepanelMonitor::on_Connect()
221237

222238
int timeout_ms = 1;
223239
_zmq_subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0);
224-
_zmq_subscriber.setsockopt(ZMQ_RCVTIMEO,&timeout_ms, sizeof(int) );
240+
_zmq_subscriber.setsockopt(ZMQ_RCVTIMEO, &timeout_ms, sizeof(int) );
225241

226242
if( !getTreeFromServer() )
227243
{
228244
failed = true;
229245
_connected = false;
230246
}
247+
// After we try get a tree on connect, reset to the default timeout.
248+
// This is done so that we only use the increased autoconnect timeout once.
249+
this->set_load_tree_timeout_ms(_load_tree_default_timeout_ms);
231250
}
232251
catch(zmq::error_t& err)
233252
{
@@ -241,9 +260,9 @@ void SidepanelMonitor::on_Connect()
241260
if( !failed )
242261
{
243262
_connected = true;
244-
ui->lineEdit->setDisabled(true);
263+
ui->lineEdit_address->setDisabled(true);
245264
ui->lineEdit_publisher->setDisabled(true);
246-
_timer->start(20);
265+
_timer->start(_timer_period_ms);
247266
connectionUpdate(true);
248267
}
249268
else{
@@ -255,7 +274,7 @@ void SidepanelMonitor::on_Connect()
255274
}
256275
else{
257276
_connected = false;
258-
ui->lineEdit->setDisabled(false);
277+
ui->lineEdit_address->setDisabled(false);
259278
ui->lineEdit_publisher->setDisabled(false);
260279
_timer->stop();
261280

bt_editor/sidepanel_monitor.h

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,26 @@ class SidepanelMonitor : public QFrame
1515
Q_OBJECT
1616

1717
public:
18-
explicit SidepanelMonitor(QWidget *parent = nullptr);
18+
/// Timer period in milliseconds.
19+
static constexpr int _timer_period_ms = 20;
20+
/// Default timeout to get behavior tree, in milliseconds.
21+
static constexpr int _load_tree_default_timeout_ms = 1000;
22+
/// Timeout to get behavior tree during autoconnect, in milliseconds.
23+
static constexpr int _load_tree_autoconnect_timeout_ms = 10000;
24+
25+
explicit SidepanelMonitor(QWidget *parent = nullptr,
26+
const QString &address = "",
27+
const QString &publisher_port = "",
28+
const QString &server_port = "");
1929
~SidepanelMonitor();
2030

2131
void clear();
2232

33+
void set_load_tree_timeout_ms(const int timeout_ms)
34+
{
35+
_load_tree_timeout_ms = timeout_ms;
36+
};
37+
2338
public slots:
2439

2540
void on_Connect();
@@ -44,11 +59,14 @@ private slots:
4459
zmq::context_t _zmq_context;
4560
zmq::socket_t _zmq_subscriber;
4661

62+
QTimer* _timer;
63+
4764
bool _connected;
4865
std::string _connection_address_pub;
4966
std::string _connection_address_req;
50-
QTimer* _timer;
5167
int _msg_count;
68+
69+
int _load_tree_timeout_ms; // Timeout to get behavior tree.
5270
AbsBehaviorTree _loaded_tree;
5371
std::unordered_map<int, int> _uid_to_index;
5472

bt_editor/sidepanel_monitor.ui

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
</widget>
4040
</item>
4141
<item row="0" column="1">
42-
<widget class="QLineEdit" name="lineEdit">
42+
<widget class="QLineEdit" name="lineEdit_address">
4343
<property name="maximumSize">
4444
<size>
4545
<width>16777215</width>

0 commit comments

Comments
 (0)