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

New DDS example: Basic Configuration HelloWorld [12329] #2122

Merged
merged 31 commits into from
Dec 21, 2021
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
26c2e6c
Refs #12329: HelloWorldExample: OptionParser included and number of c…
juanlofer-eprosima Aug 13, 2021
c5ff671
Refs #12329: Minor changes
juanlofer-eprosima Sep 1, 2021
82eb657
Refs #12329: Uncrustify
juanlofer-eprosima Sep 1, 2021
9ac57b1
Fix windows warnings
juanlofer-eprosima Sep 2, 2021
6d9cce6
Refs #12329: Included PR #2122 requested changes
juanlofer-eprosima Sep 10, 2021
8108fc1
Refs #12329: Uncrustify
juanlofer-eprosima Sep 10, 2021
d03d9b5
Refs #12329: Added optionparser to example for standalone support
juanlofer-eprosima Sep 14, 2021
136d1c9
Refs #12329: Moved helloworld example to basic config example
juanlofer-eprosima Sep 14, 2021
1dcbd03
Refs #12329: Restored original HelloWorld example
juanlofer-eprosima Sep 14, 2021
8bf37e2
Refs #12329: Updated README
juanlofer-eprosima Sep 14, 2021
88f20d0
Refs #12329: Attempt to fix Windows tests
juanlofer-eprosima Sep 16, 2021
d94e2b1
Refs #12329: Included PR #2122 more requested changes
juanlofer-eprosima Sep 20, 2021
630a595
Refs #12329: Included PR #2122 more requested changes
juanlofer-eprosima Sep 20, 2021
ec0b2f7
Refs #12329: Fix uncrustify test
juanlofer-eprosima Sep 20, 2021
78d8b40
Refs #12329: Reordered includes
juanlofer-eprosima Sep 21, 2021
708906d
Refs #12519: Added More comments to headers and improved README
juanlofer-eprosima Sep 29, 2021
d5ee057
Refs #12329: Renamed files
juanlofer-eprosima Sep 29, 2021
8d246e3
Refs #12329: Reformatted comments
juanlofer-eprosima Sep 30, 2021
e31aab7
Refs #12329: Rerenamed files
juanlofer-eprosima Sep 30, 2021
0730209
Refs #12329: Transient_local fix and transient_local/reliable clarifi…
juanlofer-eprosima Oct 1, 2021
a0e0689
Refs #12329: uncrustify
juanlofer-eprosima Oct 1, 2021
8340e47
Refs #12329: uncrustify fix
juanlofer-eprosima Oct 1, 2021
0807449
Refs #12329: Removed --samples warning
juanlofer-eprosima Oct 4, 2021
f923898
Refs #12329: Tiny change
juanlofer-eprosima Oct 4, 2021
393c5d7
Refs #12329: Apply suggestions
Dec 17, 2021
a367c2f
Refs #12329: apply suggestions
Dec 20, 2021
96c3766
Refs #12329: update Readme
Dec 20, 2021
1b4f427
Refs #12329: fix shm not created
Dec 20, 2021
14d24cb
Refs #12329: remove windows warnings
Dec 21, 2021
7f1d938
Refs #12329: apply suggestions over comments
Dec 21, 2021
8bc41a9
Refs #12329: apply very important suggestion T.T
Dec 21, 2021
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,295 @@
// Copyright 2021 Proyectos y Sistemas de Mantenimiento SL (eProsima).
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
* @file BasicConfigurationPublisher.cpp
*
*/

#include <csignal>
#include <thread>

#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/publisher/Publisher.hpp>
#include <fastdds/dds/publisher/qos/DataWriterQos.hpp>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/rtps/transport/shared_mem/SharedMemTransportDescriptor.h>
#include <fastdds/rtps/transport/UDPv4TransportDescriptor.h>
#include <fastdds/rtps/transport/UDPv6TransportDescriptor.h>
#include <fastrtps/attributes/ParticipantAttributes.h>
#include <fastrtps/attributes/PublisherAttributes.h>

#include "BasicConfigurationPublisher.h"

using namespace eprosima::fastdds::dds;
using namespace eprosima::fastdds::rtps;

std::atomic<bool> HelloWorldPublisher::stop_(false);
std::mutex HelloWorldPublisher::PubListener::wait_matched_cv_mtx_;
std::condition_variable HelloWorldPublisher::PubListener::wait_matched_cv_;

HelloWorldPublisher::HelloWorldPublisher()
: participant_(nullptr)
, publisher_(nullptr)
, topic_(nullptr)
, writer_(nullptr)
, type_(new HelloWorldPubSubType())
{
}

bool HelloWorldPublisher::is_stopped()
{
return stop_;
}

void HelloWorldPublisher::stop()
{
stop_ = true;
PubListener::awake();
}

bool HelloWorldPublisher::init(
const std::string& topic_name,
uint32_t domain,
uint32_t num_wait_matched,
bool async,
TransportType transport,
bool reliable,
bool transient)
{
hello_.index(0);
memcpy(hello_.message().data(), "HelloWorld ", strlen("HelloWorld") + 1);

DomainParticipantQos pqos;
pqos.name("Participant_pub");
listener_.set_num_wait_matched(num_wait_matched);

// TRANSPORT CONFIG
// If it is set, not use default and set the transport
if (transport != DEFAULT)
{
pqos.transport().use_builtin_transports = false;

if (transport == UDPv4)
{
auto udp_transport = std::make_shared<UDPv4TransportDescriptor>();
pqos.transport().user_transports.push_back(udp_transport);
}
else if (transport == UDPv6)
{
auto udp_transport = std::make_shared<UDPv6TransportDescriptor>();
pqos.transport().user_transports.push_back(udp_transport);
}
}

// CREATE THE PARTICIPANT
participant_ = DomainParticipantFactory::get_instance()->create_participant(domain, pqos);

if (participant_ == nullptr)
{
return false;
}

// REGISTER THE TYPE
type_.register_type(participant_);

// CREATE THE PUBLISHER
publisher_ = participant_->create_publisher(PUBLISHER_QOS_DEFAULT, nullptr);

if (publisher_ == nullptr)
{
return false;
}

// CREATE THE TOPIC
topic_ = participant_->create_topic(topic_name, "HelloWorld", TOPIC_QOS_DEFAULT);

if (topic_ == nullptr)
{
return false;
}

// CREATE THE WRITER
DataWriterQos wqos = DATAWRITER_QOS_DEFAULT;

// Data sharing set in endpoint. If it is not default, set it to off
if (transport != DEFAULT)
{
wqos.data_sharing().off();
}
else
{
wqos.data_sharing().automatic(); // default
}

if (async)
{
wqos.publish_mode().kind = ASYNCHRONOUS_PUBLISH_MODE;
}
else
{
wqos.publish_mode().kind = SYNCHRONOUS_PUBLISH_MODE; // default
}

if (reliable)
{
wqos.reliability().kind = RELIABLE_RELIABILITY_QOS;
jparisu marked this conversation as resolved.
Show resolved Hide resolved
wqos.history().kind = KEEP_ALL_HISTORY_QOS;
}
else
{
wqos.reliability().kind = BEST_EFFORT_RELIABILITY_QOS; // default in this example (although default value for
// writters' qos actually is RELIABLE)
}

if (transient)
{
wqos.durability().kind = TRANSIENT_LOCAL_DURABILITY_QOS;
wqos.history().kind = KEEP_ALL_HISTORY_QOS; // store previously sent samples so they can be resent to newly
// matched DataReaders
}
else
{
wqos.durability().kind = VOLATILE_DURABILITY_QOS; // default in this example (although default value for
// writters' qos actually is TRANSIENT_LOCAL)
}

writer_ = publisher_->create_datawriter(topic_, wqos, &listener_);

if (writer_ == nullptr)
{
return false;
}
return true;
}

HelloWorldPublisher::~HelloWorldPublisher()
{
if (participant_ != nullptr)
{
if (publisher_ != nullptr)
{
if (writer_ != nullptr)
{
publisher_->delete_datawriter(writer_);
}
participant_->delete_publisher(publisher_);
}
if (topic_ != nullptr)
{
participant_->delete_topic(topic_);
}
DomainParticipantFactory::get_instance()->delete_participant(participant_);
}
}

void HelloWorldPublisher::PubListener::on_publication_matched(
eprosima::fastdds::dds::DataWriter*,
const eprosima::fastdds::dds::PublicationMatchedStatus& info)
{
if (info.current_count_change == 1)
{
matched_ = info.current_count;
std::cout << "Publisher matched." << std::endl;
if (enough_matched())
{
awake();
}
}
else if (info.current_count_change == -1)
{
matched_ = info.current_count;
std::cout << "Publisher unmatched." << std::endl;
}
else
{
std::cout << info.current_count_change
<< " is not a valid value for PublicationMatchedStatus current count change" << std::endl;
}
}

void HelloWorldPublisher::PubListener::set_num_wait_matched(
uint32_t num_wait_matched)
{
num_wait_matched_ = num_wait_matched;
}

bool HelloWorldPublisher::PubListener::enough_matched()
{
return matched_ >= num_wait_matched_;
}

void HelloWorldPublisher::PubListener::wait()
{
std::unique_lock<std::mutex> lck(wait_matched_cv_mtx_);
wait_matched_cv_.wait(lck, [this]
{
return enough_matched() || is_stopped();
});
}

void HelloWorldPublisher::PubListener::awake()
{
wait_matched_cv_.notify_all();
}

void HelloWorldPublisher::runThread(
uint32_t samples,
uint32_t sleep)
{
while (!is_stopped() && (samples == 0 || hello_.index() < samples))
{
if (listener_.enough_matched())
{
publish();
std::cout << "Message: " << hello_.message().data() << " with index: " << hello_.index()
<< " SENT" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(sleep));
}
else
{
listener_.wait();
}
}
}

void HelloWorldPublisher::run(
uint32_t samples,
uint32_t sleep)
{
stop_ = false;
std::thread thread(&HelloWorldPublisher::runThread, this, samples, sleep);
if (samples == 0)
{
std::cout << "Publisher running. Please press CTRL+C to stop the Publisher at any time." << std::endl;
}
else
{
std::cout << "Publisher running " << samples <<
" samples. Please press CTRL+C to stop the Publisher at any time." << std::endl;
}
signal(SIGINT, [](int signum)
{
std::cout << "SIGINT received, stopping Publisher execution." << std::endl;
static_cast<void>(signum); HelloWorldPublisher::stop();
jparisu marked this conversation as resolved.
Show resolved Hide resolved
});
thread.join();
}

void HelloWorldPublisher::publish()
{
hello_.index(hello_.index() + 1);
writer_->write(&hello_);
}
Loading