diff --git a/plugins/datastreamer_plugin/datastreamer/FastDdsDataStreamer.cpp b/plugins/datastreamer_plugin/datastreamer/FastDdsDataStreamer.cpp index 4b084d2..61780a7 100644 --- a/plugins/datastreamer_plugin/datastreamer/FastDdsDataStreamer.cpp +++ b/plugins/datastreamer_plugin/datastreamer/FastDdsDataStreamer.cpp @@ -242,6 +242,13 @@ void FastDdsDataStreamer::on_domain_connection( connect_to_domain_(domain_id); } +void FastDdsDataStreamer::on_server_connection( + unsigned int domain_id, const std::string& server_ip, unsigned int server_port) +{ + DEBUG("FastDdsDataStreamer on_domain_connection " << domain_id); + connect_to_server_(domain_id, server_ip, server_port); +} + //////////////////////////////////////////////////// // AUXILIAR METHODS //////////////////////////////////////////////////// @@ -260,6 +267,19 @@ void FastDdsDataStreamer::connect_to_domain_( select_topics_dialog_.connect_to_domain(domain_id); } +void FastDdsDataStreamer::connect_to_server_( + unsigned int domain_id, const std::string& server_ip, unsigned int server_port) +{ + DEBUG("FastDdsDataStreamer connect_to_server_ " << server_ip<<":"<(domain, discovery_database_, listener_); } +void Handler::connect_to_server( + const uint32_t domain, const std::string& server_ip, unsigned int server_port) +{ + // Reset in case a Handler exist + reset(); + + // Create participant using discovery server + participant_ = std::make_unique(domain, discovery_database_, listener_, true, server_ip, server_port); +} + void Handler::register_type_from_xml( const std::string& xml_path) { diff --git a/plugins/datastreamer_plugin/fastdds/Handler.hpp b/plugins/datastreamer_plugin/fastdds/Handler.hpp index 7620c5d..9b3f8bf 100644 --- a/plugins/datastreamer_plugin/fastdds/Handler.hpp +++ b/plugins/datastreamer_plugin/fastdds/Handler.hpp @@ -67,6 +67,9 @@ class Handler void connect_to_domain( const uint32_t domain); + void connect_to_server( + const uint32_t domain, const std::string& server_ip, unsigned int server_port); + void register_type_from_xml( const std::string& xml_path); diff --git a/plugins/datastreamer_plugin/fastdds/Participant.cpp b/plugins/datastreamer_plugin/fastdds/Participant.cpp index 6db7080..ff2fb00 100644 --- a/plugins/datastreamer_plugin/fastdds/Participant.cpp +++ b/plugins/datastreamer_plugin/fastdds/Participant.cpp @@ -65,16 +65,33 @@ void ReaderHandlerDeleter::operator ()( Participant::Participant( DomainId_t domain_id, std::shared_ptr discovery_database, - FastDdsListener* listener) + FastDdsListener* listener, + bool use_discovery_server, + const std::string& server_ip, + const unsigned int& server_port) : listener_(listener) , discovery_database_(discovery_database) { // TODO check entities are created correctly + DomainParticipantQos participant_qos = default_participant_qos_(); + // Connect participat to server if discovery server is used + if(use_discovery_server){ + // Define server locator + eprosima::fastdds::rtps::Locator_t server_locator; + eprosima::fastdds::rtps::IPLocator::setIPv4(server_locator, server_ip); + server_locator.port = server_port; + server_locator.kind = LOCATOR_KIND_UDPv4; + // Set participant as SUPER CLIENT + participant_qos.wire_protocol().builtin.discovery_config.discoveryProtocol = eprosima::fastdds::rtps::DiscoveryProtocol::SUPER_CLIENT; + // Connect to remote server + participant_qos.wire_protocol().builtin.discovery_config.m_DiscoveryServers.push_back(server_locator); + } + // Create Domain Participant participant_ = DomainParticipantFactory::get_instance()->create_participant( domain_id, - default_participant_qos_(), + participant_qos, this, default_listener_mask_()); diff --git a/plugins/datastreamer_plugin/fastdds/Participant.hpp b/plugins/datastreamer_plugin/fastdds/Participant.hpp index 74ace0b..f4d4cca 100644 --- a/plugins/datastreamer_plugin/fastdds/Participant.hpp +++ b/plugins/datastreamer_plugin/fastdds/Participant.hpp @@ -86,7 +86,10 @@ class Participant : public eprosima::fastdds::dds::DomainParticipantListener Participant( eprosima::fastdds::dds::DomainId_t domain_id, std::shared_ptr discovery_database, - FastDdsListener* listener); + FastDdsListener* listener, + bool use_discovery_server = false, + const std::string& server_ip = "127.0.0.1", + const unsigned int& server_port = 11811); virtual ~Participant(); diff --git a/plugins/datastreamer_plugin/ui/topic_selection_dialog/Configuration.cpp b/plugins/datastreamer_plugin/ui/topic_selection_dialog/Configuration.cpp index e15812d..27e5eee 100644 --- a/plugins/datastreamer_plugin/ui/topic_selection_dialog/Configuration.cpp +++ b/plugins/datastreamer_plugin/ui/topic_selection_dialog/Configuration.cpp @@ -87,6 +87,8 @@ void Configuration::save_default_settings( settings.setValue(prefix + DISCARD_LARGE_ARRAYS_SETTINGS_TAG, data_type_configuration.discard_large_arrays); settings.setValue(prefix + XML_DATATYPE_FILES_SETTINGS_TAG, xml_datatypes_files); settings.setValue(prefix + DOMAIN_ID_SETTINGS_TAG, domain_id); + settings.setValue(prefix + SERVER_IP_SETTINGS_TAG, server_ip.c_str()); + settings.setValue(prefix + SERVER_PORT_SETTINGS_TAG, server_port); } void Configuration::load_default_settings( @@ -103,6 +105,8 @@ void Configuration::load_default_settings( data_type_configuration.discard_large_arrays).toBool(); xml_datatypes_files = settings.value(prefix + XML_DATATYPE_FILES_SETTINGS_TAG, xml_datatypes_files).toStringList(); domain_id = settings.value(prefix + DOMAIN_ID_SETTINGS_TAG, domain_id).toInt(); + server_ip = settings.value(prefix + SERVER_IP_SETTINGS_TAG, server_ip.c_str()).toString().toStdString(); + server_port = settings.value(prefix + SERVER_PORT_SETTINGS_TAG, server_port).toUInt(); } } /* namespace ui */ diff --git a/plugins/datastreamer_plugin/ui/topic_selection_dialog/Configuration.hpp b/plugins/datastreamer_plugin/ui/topic_selection_dialog/Configuration.hpp index 1444eea..0d52c8f 100644 --- a/plugins/datastreamer_plugin/ui/topic_selection_dialog/Configuration.hpp +++ b/plugins/datastreamer_plugin/ui/topic_selection_dialog/Configuration.hpp @@ -61,6 +61,9 @@ struct Configuration // DDS Configuration unsigned int domain_id = 0; QStringList xml_datatypes_files; // Empty in initialization + // Discovery server configuration + std::string server_ip = "127.0.0.1"; + unsigned int server_port = 11811; //////////////////// // Advance options @@ -87,6 +90,8 @@ struct Configuration constexpr static const char* DISCARD_LARGE_ARRAYS_SETTINGS_TAG = "discard_large_arrays"; constexpr static const char* XML_DATATYPE_FILES_SETTINGS_TAG = "xml_datatype_files"; constexpr static const char* DOMAIN_ID_SETTINGS_TAG = "domain_id_files"; + constexpr static const char* SERVER_IP_SETTINGS_TAG = "server_ip_files"; + constexpr static const char* SERVER_PORT_SETTINGS_TAG = "server_port_files"; }; diff --git a/plugins/datastreamer_plugin/ui/topic_selection_dialog/UiListener.hpp b/plugins/datastreamer_plugin/ui/topic_selection_dialog/UiListener.hpp index 3a7e1a4..890ebe1 100644 --- a/plugins/datastreamer_plugin/ui/topic_selection_dialog/UiListener.hpp +++ b/plugins/datastreamer_plugin/ui/topic_selection_dialog/UiListener.hpp @@ -51,6 +51,13 @@ struct UiListener static_cast(domain_id); } + virtual void on_server_connection( + unsigned int domain_id, const std::string& server_ip, unsigned int server_port){ + DEBUG("Calling on_server_connection " << domain_id << " " << server_ip << " " << server_port); + static_cast(domain_id); + static_cast(server_ip); + static_cast(server_port); + } }; } /* namespace ui */ diff --git a/plugins/datastreamer_plugin/ui/topic_selection_dialog/dialogselecttopics.cpp b/plugins/datastreamer_plugin/ui/topic_selection_dialog/dialogselecttopics.cpp index 134f4e3..eae8e74 100644 --- a/plugins/datastreamer_plugin/ui/topic_selection_dialog/dialogselecttopics.cpp +++ b/plugins/datastreamer_plugin/ui/topic_selection_dialog/dialogselecttopics.cpp @@ -45,6 +45,8 @@ DialogSelectTopics::DialogSelectTopics( , configuration_(configuration) , listener_(listener) , domain_id_connected_(configuration.domain_id) // This is initialized here as it does not come from configuration + , server_ip_(configuration.server_ip) + , server_port_(configuration.server_port) , select_all_topics_(QKeySequence(Qt::CTRL + Qt::Key_A), this) , deselect_all_topics_(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_A), this) { @@ -71,6 +73,12 @@ DialogSelectTopics::DialogSelectTopics( this, &DialogSelectTopics::on_connectionToDomain); + connect( + this, + &DialogSelectTopics::connection_to_server_signal, + this, + &DialogSelectTopics::on_connectionToServer); + ///// // Set shortcuts @@ -137,6 +145,14 @@ void DialogSelectTopics::connect_to_domain( emit connection_to_domain_signal(domain_id); } +void DialogSelectTopics::connect_to_server( + const uint32_t domain_id, + const std::string& server_ip, + unsigned int server_port) +{ + emit connection_to_server_signal(domain_id, utils::string_to_QString(server_ip), server_port); +} + void DialogSelectTopics::on_lineEditFilter_textChanged( const QString& search_string) { @@ -193,9 +209,16 @@ void DialogSelectTopics::on_change_domain_button_clicked() // Nevertheless lets check it if (domain_id != domain_id_connected_) { + // Get server ip and port before the reset called by on_domain_connection + QString server_ip = ui->server_ip->text(); + unsigned int server_port = ui->server_port->text().toUInt(); + // Call listener to connect to domain listener_->on_domain_connection( static_cast(domain_id)); + + // Set the server ip and port to the value before the reset called by on_domain_connection + on_connectionToServer(domain_id, server_ip, server_port); } } // In case the dialog is cancelled, do nothing @@ -204,6 +227,27 @@ void DialogSelectTopics::on_change_domain_button_clicked() delete change_domain_dialog; } +void DialogSelectTopics::on_use_discovery_server_button_clicked() { + DEBUG("Calling on_use_discovery_server_button_clicked"); + // Get server ip and port + QString server_ip = ui->server_ip->text(); + unsigned int server_port = ui->server_port->text().toUInt(); + + if (ui->use_discovery_server_button->isChecked()) { + // Call listener to connect to server + listener_->on_server_connection(domain_id_connected_, server_ip.toStdString(), server_port); + ui->use_discovery_server_button->setText("ON"); + ui->change_domain_button->setEnabled(false); + } else { + // Call listener to connect to domain + listener_->on_domain_connection(domain_id_connected_); + // Set the server ip and port to the value before the reset called by on_domain_connection + on_connectionToServer(domain_id_connected_, server_ip, server_port); + ui->use_discovery_server_button->setText("OFF"); + ui->change_domain_button->setEnabled(true); + } +} + void DialogSelectTopics::on_include_files_button_clicked() { DEBUG("Calling on_include_files_button_clicked"); @@ -336,6 +380,21 @@ void DialogSelectTopics::on_connectionToDomain( QString::number(domain_id_connected_)); } +void DialogSelectTopics::on_connectionToServer( + const uint32_t domain_id, + const QString& server_ip, + unsigned int server_port) +{ + domain_id_connected_ = domain_id; + server_ip_ = server_ip.toStdString(); + server_port_ = server_port; + + ui->current_domain_label->setText( + QString::number(domain_id_connected_)); + ui->server_ip->setText(server_ip_.c_str()); + ui->server_port->setText(QString::number(server_port_)); +} + void DialogSelectTopics::clean_topics_list_() { DEBUG("Calling clean_topics_list_"); @@ -352,6 +411,7 @@ void DialogSelectTopics::reset_to_configuration_() // FastDDS configuration // Set current domain on_connectionToDomain(configuration_.domain_id); + on_connectionToServer(configuration_.domain_id, utils::string_to_QString(configuration_.server_ip), configuration_.server_port); // Add XML files // First erase every data in the list @@ -390,6 +450,8 @@ void DialogSelectTopics::update_configuration_() // Domain id configuration_.domain_id = static_cast(domain_id_connected_); + configuration_.server_ip = server_ip_; + configuration_.server_port = server_port_; // Array configuration_.data_type_configuration.max_array_size = diff --git a/plugins/datastreamer_plugin/ui/topic_selection_dialog/dialogselecttopics.h b/plugins/datastreamer_plugin/ui/topic_selection_dialog/dialogselecttopics.h index e63365a..6160912 100644 --- a/plugins/datastreamer_plugin/ui/topic_selection_dialog/dialogselecttopics.h +++ b/plugins/datastreamer_plugin/ui/topic_selection_dialog/dialogselecttopics.h @@ -64,6 +64,10 @@ class DialogSelectTopics : public QDialog void connect_to_domain( const uint32_t domain_id); + void connect_to_server( + const uint32_t domain_id, + const std::string& server_ip, + unsigned int server_port); signals: void reset_view_signal(); @@ -76,6 +80,11 @@ class DialogSelectTopics : public QDialog void connection_to_domain_signal( const uint32_t domain_id); + void connection_to_server_signal( + const uint32_t domain_id, + const QString& server_ip, + const uint32_t server_port); + private slots: void on_lineEditFilter_textChanged( @@ -86,6 +95,8 @@ private slots: void on_change_domain_button_clicked(); + void on_use_discovery_server_button_clicked(); + void on_include_files_button_clicked(); void on_include_dir_button_clicked(); @@ -106,6 +117,11 @@ private slots: void on_connectionToDomain( const uint32_t domain_id); + void on_connectionToServer( + const uint32_t domain_id, + const QString& server_ip, + unsigned int server_port); + protected: void clean_topics_list_(); @@ -149,6 +165,9 @@ private slots: constexpr static const unsigned int TypeNameTableIndex_ = 1; unsigned int domain_id_connected_; + //! Variables storing discovery server information + std::string server_ip_; + unsigned int server_port_; QShortcut select_all_topics_; QShortcut deselect_all_topics_; diff --git a/plugins/datastreamer_plugin/ui/topic_selection_dialog/dialogselecttopics.ui b/plugins/datastreamer_plugin/ui/topic_selection_dialog/dialogselecttopics.ui index d474cdd..a48a409 100644 --- a/plugins/datastreamer_plugin/ui/topic_selection_dialog/dialogselecttopics.ui +++ b/plugins/datastreamer_plugin/ui/topic_selection_dialog/dialogselecttopics.ui @@ -335,6 +335,139 @@ + + + + + + Use Discovery Server + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 35 + 20 + + + + + + + + OFF + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + server IP: + + + + + + + 15 + + + 127.0.0.1 + + + + 0 + 0 + + + + + 100 + 25 + + + + + 120 + 30 + + + + + + + + server port: + + + + + + + 15 + + + 11811 + + + + 0 + 0 + + + + + 40 + 25 + + + + + 80 + 30 + + + + + + + + Qt::Horizontal + + + + 120 + 2 + + + + + +