Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add publisher/server and autoconnect args to BT Monitor #170

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 26 additions & 1 deletion bt_editor/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,23 @@ main(int argc, char *argv[])
"Start in one of these modes: [editor,monitor,replay]",
"mode");
parser.addOption(mode_option);

QCommandLineOption address_option(QStringList() << "address",
"Address to connect to (defaults to localhost)",
"address");
parser.addOption(address_option);
QCommandLineOption pub_port_option(QStringList() << "publisher_port",
"Publisher port number (defaults to 1666)",
"publisher_port");
parser.addOption(pub_port_option);
QCommandLineOption srv_port_option(QStringList() << "server_port",
"Server port number (defaults to 1667)",
"server_port");
parser.addOption(srv_port_option);
QCommandLineOption autoconnect_option(QStringList() << "autoconnect",
"Autoconnect to monitor");
parser.addOption(autoconnect_option);

parser.process( app );

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

MainWindow win( mode );
// Get the monitor options.
const QString monitor_address = parser.value(address_option);
const QString monitor_pub_port = parser.value(pub_port_option);
const QString monitor_srv_port = parser.value(srv_port_option);
const bool monitor_autoconnect = parser.isSet(autoconnect_option);

// Start the main application.
MainWindow win( mode, monitor_address, monitor_pub_port,
monitor_srv_port, monitor_autoconnect );
win.show();
return app.exec();
}
Expand Down
33 changes: 27 additions & 6 deletions bt_editor/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <nodes/NodeData>
#include <nodes/NodeStyle>
#include <nodes/FlowView>
#include <thread>
sea-bass marked this conversation as resolved.
Show resolved Hide resolved

#include "editor_flowscene.h"
#include "utils.h"
Expand All @@ -40,11 +41,20 @@ using QtNodes::FlowScene;
using QtNodes::NodeGraphicsObject;
using QtNodes::NodeState;

MainWindow::MainWindow(GraphicMode initial_mode, QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
_current_mode(initial_mode),
_current_layout(QtNodes::PortLayout::Vertical)
MainWindow::MainWindow(GraphicMode initial_mode,
const QString& monitor_address,
const QString& monitor_pub_port,
const QString& monitor_srv_port,
const bool monitor_autoconnect,
QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
_current_mode(initial_mode),
_current_layout(QtNodes::PortLayout::Vertical),
_monitor_address(monitor_address),
_monitor_publisher_port(monitor_pub_port),
_monitor_server_port(monitor_srv_port),
_monitor_autoconnect(monitor_autoconnect)
{
ui->setupUi(this);

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

#ifdef ZMQ_FOUND
_monitor_widget = new SidepanelMonitor(this);
_monitor_widget = new SidepanelMonitor(
this, _monitor_address, _monitor_publisher_port, _monitor_server_port);
ui->leftFrame->layout()->addWidget( _monitor_widget );

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

connect( _monitor_widget, &SidepanelMonitor::connectionUpdate,
this, &MainWindow::onConnectionUpdate );

if ( monitor_autoconnect )
{
// If autoconnecting, increase the timeout to get the behavior tree to a
// larger value. This only lasts for one "connect" before returning to
// its default value.
_monitor_widget->set_load_tree_timeout_ms(
_monitor_widget->_load_tree_autoconnect_timeout_ms);
ui->toolButtonConnect->animateClick();
}
#else
ui->actionMonitor_mode->setVisible(false);
#endif
Expand Down
14 changes: 12 additions & 2 deletions bt_editor/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,12 @@ class MainWindow : public QMainWindow
SUBTREE_REFRESH};

public:
explicit MainWindow(GraphicMode initial_mode, QWidget *parent = nullptr);
explicit MainWindow(GraphicMode initial_mode,
const QString& monitor_address = "",
const QString& monitor_pub_port = "",
const QString& monitor_srv_port = "",
const bool monitor_autoconnect = false,
QWidget *parent = nullptr);
~MainWindow() override;

void loadFromXML(const QString &xml_text);
Expand Down Expand Up @@ -202,7 +207,12 @@ private slots:
#ifdef ZMQ_FOUND
SidepanelMonitor* _monitor_widget;
#endif


QString _monitor_address;
QString _monitor_publisher_port;
QString _monitor_server_port;
bool _monitor_autoconnect;

MainWindow::SavedState saveCurrentState();
void clearUndoStacks();
};
Expand Down
45 changes: 32 additions & 13 deletions bt_editor/sidepanel_monitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@
#include "mainwindow.h"
#include "utils.h"

SidepanelMonitor::SidepanelMonitor(QWidget *parent) :
SidepanelMonitor::SidepanelMonitor(QWidget *parent,
const QString &address,
const QString &publisher_port,
const QString &server_port) :
QFrame(parent),
ui(new Ui::SidepanelMonitor),
_zmq_context(1),
Expand All @@ -20,8 +23,22 @@ SidepanelMonitor::SidepanelMonitor(QWidget *parent) :
_parent(parent)
{
ui->setupUi(this);
_timer = new QTimer(this);
this->set_load_tree_timeout_ms(_load_tree_default_timeout_ms);

if ( !address.isEmpty() )
{
ui->lineEdit_address->setText(address);
}
if ( !publisher_port.isEmpty() )
{
ui->lineEdit_publisher->setText(publisher_port);
}
if ( !server_port.isEmpty() )
{
ui->lineEdit_server->setText(server_port);
}

_timer = new QTimer(this);
connect( _timer, &QTimer::timeout, this, &SidepanelMonitor::on_timer );
}

Expand Down Expand Up @@ -97,7 +114,7 @@ void SidepanelMonitor::on_timer()
qDebug() << "Reload tree from server";
if( !getTreeFromServer() ) {
_connected = false;
ui->lineEdit->setDisabled(false);
ui->lineEdit_address->setDisabled(false);
_timer->stop();
connectionUpdate(false);
return;
Expand Down Expand Up @@ -127,8 +144,7 @@ bool SidepanelMonitor::getTreeFromServer()
zmq::socket_t zmq_client( _zmq_context, ZMQ_REQ );
zmq_client.connect( _connection_address_req.c_str() );

int timeout_ms = 1000;
zmq_client.setsockopt(ZMQ_RCVTIMEO,&timeout_ms, sizeof(int) );
zmq_client.setsockopt(ZMQ_RCVTIMEO, &_load_tree_timeout_ms, sizeof(int) );

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

Expand Down Expand Up @@ -187,13 +203,13 @@ bool SidepanelMonitor::getTreeFromServer()

void SidepanelMonitor::on_Connect()
{
if( !_connected)
if( !_connected )
{
QString address = ui->lineEdit->text();
QString address = ui->lineEdit_address->text();
if( address.isEmpty() )
{
address = ui->lineEdit->placeholderText();
ui->lineEdit->setText(address);
address = ui->lineEdit_address->placeholderText();
ui->lineEdit_address->setText(address);
}

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

int timeout_ms = 1;
_zmq_subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0);
_zmq_subscriber.setsockopt(ZMQ_RCVTIMEO,&timeout_ms, sizeof(int) );
_zmq_subscriber.setsockopt(ZMQ_RCVTIMEO, &timeout_ms, sizeof(int) );

if( !getTreeFromServer() )
{
failed = true;
_connected = false;
}
// After we try get a tree on connect, reset to the default timeout.
// This is done so that we only use the increased autoconnect timeout once.
this->set_load_tree_timeout_ms(_load_tree_default_timeout_ms);
}
catch(zmq::error_t& err)
{
Expand All @@ -241,9 +260,9 @@ void SidepanelMonitor::on_Connect()
if( !failed )
{
_connected = true;
ui->lineEdit->setDisabled(true);
ui->lineEdit_address->setDisabled(true);
ui->lineEdit_publisher->setDisabled(true);
_timer->start(20);
_timer->start(_timer_period_ms);
connectionUpdate(true);
}
else{
Expand All @@ -255,7 +274,7 @@ void SidepanelMonitor::on_Connect()
}
else{
_connected = false;
ui->lineEdit->setDisabled(false);
ui->lineEdit_address->setDisabled(false);
ui->lineEdit_publisher->setDisabled(false);
_timer->stop();

Expand Down
22 changes: 20 additions & 2 deletions bt_editor/sidepanel_monitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,26 @@ class SidepanelMonitor : public QFrame
Q_OBJECT

public:
explicit SidepanelMonitor(QWidget *parent = nullptr);
/// Timer period in milliseconds.
static constexpr int _timer_period_ms = 20;
/// Default timeout to get behavior tree, in milliseconds.
static constexpr int _load_tree_default_timeout_ms = 1000;
/// Timeout to get behavior tree during autoconnect, in milliseconds.
static constexpr int _load_tree_autoconnect_timeout_ms = 10000;

explicit SidepanelMonitor(QWidget *parent = nullptr,
const QString &address = "",
const QString &publisher_port = "",
const QString &server_port = "");
sea-bass marked this conversation as resolved.
Show resolved Hide resolved
~SidepanelMonitor();

void clear();

void set_load_tree_timeout_ms(const int timeout_ms)
{
_load_tree_timeout_ms = timeout_ms;
};

public slots:

void on_Connect();
Expand All @@ -44,11 +59,14 @@ private slots:
zmq::context_t _zmq_context;
zmq::socket_t _zmq_subscriber;

QTimer* _timer;

bool _connected;
std::string _connection_address_pub;
std::string _connection_address_req;
QTimer* _timer;
int _msg_count;

int _load_tree_timeout_ms; // Timeout to get behavior tree.
AbsBehaviorTree _loaded_tree;
std::unordered_map<int, int> _uid_to_index;

Expand Down
2 changes: 1 addition & 1 deletion bt_editor/sidepanel_monitor.ui
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit">
<widget class="QLineEdit" name="lineEdit_address">
<property name="maximumSize">
<size>
<width>16777215</width>
Expand Down