// Copyright 2016 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 Subscriber.cxx * This file contains the implementation of the subscriber functions. * * This file was generated by the tool fastddsgen. */ #include "Subscriber.hpp" #include #include #include #include #include #include #include #include #include #include "SystemPubSubTypes.hpp" #include "msg.hpp" #include "DEBUG.hpp" using namespace eprosima::fastdds::dds; SubscriberApp::SubscriberApp( const int& domain_id) : factory_(nullptr) , participant_(nullptr) , subscriber_(nullptr) , bar_topic_(nullptr) , bar_reader_(nullptr) , bar_type_(new WeighingSystem::BarUpdatePubSubType()) , light_topic_(nullptr) , light_reader_(nullptr) , light_type_(new WeighingSystem::LightsUpdatePubSubType()) , infraredinfo_topic_(nullptr) , infraredinfo_reader_(nullptr) , infraredinfo_type_(new WeighingSystem::InfraredUpdatePubSubType()) , infraredcommand_topic_(nullptr) , infraredcommand_reader_(nullptr) , infraredcommand_type_(new WeighingSystem::InfraredCommandUpdatePubSubType()) , license_topic_(nullptr) , license_reader_(nullptr) , license_type_(new WeighingSystem::LicenseSnapUpdatePubSubType()) , scaleinfo_topic_(nullptr) , scaleinfo_reader_(nullptr) , scaleinfo_type_(new WeighingSystem::ScaleInfoPubSubType()) , samples_received_(0) , stop_(false) { // Create the participant DomainParticipantQos pqos = PARTICIPANT_QOS_DEFAULT; pqos.name("WeighingSystem_sub_participant"); pqos.wire_protocol().builtin.discovery_config.leaseDuration = Duration_t(60, 0); pqos.wire_protocol().builtin.discovery_config.leaseDuration_announcementperiod = Duration_t(30, 0); factory_ = DomainParticipantFactory::get_shared_instance(); participant_ = factory_->create_participant(domain_id, pqos, nullptr, StatusMask::none()); if (participant_ == nullptr) { throw std::runtime_error("WeighingSystem Participant initialization failed"); } // Register the type bar_type_.register_type(participant_); light_type_.register_type(participant_); infraredinfo_type_.register_type(participant_); infraredcommand_type_.register_type(participant_); license_type_.register_type(participant_); scaleinfo_type_.register_type(participant_); // Create the subscriber SubscriberQos sub_qos = SUBSCRIBER_QOS_DEFAULT; participant_->get_default_subscriber_qos(sub_qos); subscriber_ = participant_->create_subscriber(sub_qos, nullptr, StatusMask::none()); if (subscriber_ == nullptr) { throw std::runtime_error("WeighingSystem Subscriber initialization failed"); } // Create the topic TopicQos topic_qos = TOPIC_QOS_DEFAULT; participant_->get_default_topic_qos(topic_qos); bar_topic_ = participant_->create_topic("BarUpdate", bar_type_.get_type_name(), topic_qos); if (bar_topic_ == nullptr) { throw std::runtime_error("WeighingSystem::BarUpdate Topic initialization failed"); } // Create the reader DataReaderQos reader_qos = DATAREADER_QOS_DEFAULT; subscriber_->get_default_datareader_qos(reader_qos); reader_qos.reliability().kind = ReliabilityQosPolicyKind::RELIABLE_RELIABILITY_QOS; reader_qos.reliability().max_blocking_time = Duration_t(1, 0); reader_qos.durability().kind = DurabilityQosPolicyKind::TRANSIENT_LOCAL_DURABILITY_QOS; reader_qos.history().kind = HistoryQosPolicyKind::KEEP_LAST_HISTORY_QOS; reader_qos.history().depth = 1; reader_qos.resource_limits().max_samples = 200; reader_qos.resource_limits().max_instances = 1; reader_qos.resource_limits().max_samples_per_instance = 100; reader_qos.data_sharing().off(); bar_reader_ = subscriber_->create_datareader(bar_topic_, reader_qos, this, StatusMask::all()); if (bar_reader_ == nullptr) { throw std::runtime_error("WeighingSystem::BarUpdate DataReader initialization failed"); } // Create the topic topic_qos = TOPIC_QOS_DEFAULT; participant_->get_default_topic_qos(topic_qos); light_topic_ = participant_->create_topic("LightsUpdate", light_type_.get_type_name(), topic_qos); if (light_topic_ == nullptr) { throw std::runtime_error("WeighingSystem::LightsUpdate Topic initialization failed"); } // Create the reader reader_qos = DATAREADER_QOS_DEFAULT; subscriber_->get_default_datareader_qos(reader_qos); reader_qos.reliability().kind = ReliabilityQosPolicyKind::RELIABLE_RELIABILITY_QOS; reader_qos.reliability().max_blocking_time = Duration_t(1, 0); reader_qos.durability().kind = DurabilityQosPolicyKind::TRANSIENT_LOCAL_DURABILITY_QOS; reader_qos.history().kind = HistoryQosPolicyKind::KEEP_LAST_HISTORY_QOS; reader_qos.history().depth = 1; reader_qos.resource_limits().max_samples = 200; reader_qos.resource_limits().max_instances = 1; reader_qos.resource_limits().max_samples_per_instance = 100; reader_qos.data_sharing().off(); light_reader_ = subscriber_->create_datareader(light_topic_, reader_qos, this, StatusMask::all()); if (light_reader_ == nullptr) { throw std::runtime_error("WeighingSystem::LightsUpdate DataReader initialization failed"); } // Create the topic topic_qos = TOPIC_QOS_DEFAULT; participant_->get_default_topic_qos(topic_qos); infraredinfo_topic_ = participant_->create_topic("InfraredUpdate", infraredinfo_type_.get_type_name(), topic_qos); if (infraredinfo_topic_ == nullptr) { throw std::runtime_error("WeighingSystem::InfraredUpdate Topic initialization failed"); } // Create the reader reader_qos = DATAREADER_QOS_DEFAULT; subscriber_->get_default_datareader_qos(reader_qos); reader_qos.reliability().kind = ReliabilityQosPolicyKind::RELIABLE_RELIABILITY_QOS; reader_qos.reliability().max_blocking_time = Duration_t(1, 0); reader_qos.durability().kind = DurabilityQosPolicyKind::TRANSIENT_LOCAL_DURABILITY_QOS; reader_qos.history().kind = HistoryQosPolicyKind::KEEP_LAST_HISTORY_QOS; reader_qos.history().depth = 1; reader_qos.resource_limits().max_samples = 200; reader_qos.resource_limits().max_instances = 1; reader_qos.resource_limits().max_samples_per_instance = 100; reader_qos.data_sharing().off(); infraredinfo_reader_ = subscriber_->create_datareader(infraredinfo_topic_, reader_qos, this, StatusMask::all()); if (infraredinfo_reader_ == nullptr) { throw std::runtime_error("WeighingSystem::InfraredUpdate DataReader initialization failed"); } // Create the topic topic_qos = TOPIC_QOS_DEFAULT; participant_->get_default_topic_qos(topic_qos); infraredcommand_topic_ = participant_->create_topic("InfraredCommandUpdate", infraredcommand_type_.get_type_name(), topic_qos); if (infraredcommand_topic_ == nullptr) { throw std::runtime_error("WeighingSystem::InfraredCommandUpdate Topic initialization failed"); } // Create the reader reader_qos = DATAREADER_QOS_DEFAULT; subscriber_->get_default_datareader_qos(reader_qos); reader_qos.reliability().kind = ReliabilityQosPolicyKind::RELIABLE_RELIABILITY_QOS; reader_qos.reliability().max_blocking_time = Duration_t(1, 0); reader_qos.durability().kind = DurabilityQosPolicyKind::TRANSIENT_LOCAL_DURABILITY_QOS; reader_qos.history().kind = HistoryQosPolicyKind::KEEP_LAST_HISTORY_QOS; reader_qos.history().depth = 1; reader_qos.resource_limits().max_samples = 200; reader_qos.resource_limits().max_instances = 1; reader_qos.resource_limits().max_samples_per_instance = 100; reader_qos.data_sharing().off(); infraredcommand_reader_ = subscriber_->create_datareader(infraredcommand_topic_, reader_qos, this, StatusMask::all()); if (infraredcommand_reader_ == nullptr) { throw std::runtime_error("WeighingSystem::InfraredCommandUpdate DataReader initialization failed"); } // Create the topic topic_qos = TOPIC_QOS_DEFAULT; participant_->get_default_topic_qos(topic_qos); license_topic_ = participant_->create_topic("LicenseSnapUpdate", license_type_.get_type_name(), topic_qos); if (license_topic_ == nullptr) { throw std::runtime_error("WeighingSystem::LicenseSnapUpdate Topic initialization failed"); } // Create the reader reader_qos = DATAREADER_QOS_DEFAULT; subscriber_->get_default_datareader_qos(reader_qos); reader_qos.reliability().kind = ReliabilityQosPolicyKind::RELIABLE_RELIABILITY_QOS; reader_qos.reliability().max_blocking_time = Duration_t(1, 0); reader_qos.durability().kind = DurabilityQosPolicyKind::VOLATILE_DURABILITY_QOS; reader_qos.history().kind = HistoryQosPolicyKind::KEEP_LAST_HISTORY_QOS; reader_qos.history().depth = 1; reader_qos.resource_limits().max_samples = 200; reader_qos.resource_limits().max_instances = 1; reader_qos.resource_limits().max_samples_per_instance = 100; reader_qos.data_sharing().off(); license_reader_ = subscriber_->create_datareader(license_topic_, reader_qos, this, StatusMask::all()); if (license_reader_ == nullptr) { throw std::runtime_error("WeighingSystem::LicenseSnapUpdate DataReader initialization failed"); } // Create the topic topic_qos = TOPIC_QOS_DEFAULT; participant_->get_default_topic_qos(topic_qos); scaleinfo_topic_ = participant_->create_topic("ScaleInfo", scaleinfo_type_.get_type_name(), topic_qos); if (scaleinfo_topic_ == nullptr) { throw std::runtime_error("WeighingSystem::ScaleInfo Topic initialization failed"); } // Create the reader reader_qos = DATAREADER_QOS_DEFAULT; subscriber_->get_default_datareader_qos(reader_qos); reader_qos.reliability().kind = ReliabilityQosPolicyKind::RELIABLE_RELIABILITY_QOS; reader_qos.reliability().max_blocking_time = Duration_t(1, 0); reader_qos.durability().kind = DurabilityQosPolicyKind::VOLATILE_DURABILITY_QOS; reader_qos.history().kind = HistoryQosPolicyKind::KEEP_LAST_HISTORY_QOS; reader_qos.history().depth = 1; reader_qos.resource_limits().max_samples = 200; reader_qos.resource_limits().max_instances = 1; reader_qos.resource_limits().max_samples_per_instance = 100; reader_qos.data_sharing().off(); scaleinfo_reader_ = subscriber_->create_datareader(scaleinfo_topic_, reader_qos, this, StatusMask::all()); if (scaleinfo_reader_ == nullptr) { throw std::runtime_error("WeighingSystem::ScaleInfo DataReader initialization failed"); } } SubscriberApp::~SubscriberApp() { if (nullptr != participant_) { // Delete DDS entities contained within the DomainParticipant participant_->delete_contained_entities(); // Delete DomainParticipant factory_->delete_participant(participant_); } } void SubscriberApp::on_subscription_matched( DataReader* reader, const SubscriptionMatchedStatus& info) { if (info.current_count_change == 1) { DEBUG(reader->get_topicdescription()->get_name() << " Subscriber matched."); } else if (info.current_count_change == -1) { DEBUG(reader->get_topicdescription()->get_name() << " Subscriber unmatched."); } else { DEBUG(info.current_count_change << " is not a valid value for SubscriptionMatchedStatus current count change"); } } void SubscriberApp::on_data_available( DataReader* reader) { SampleInfo info; std::string topic_name = reader->get_topicdescription()->get_name(); DEBUG(topic_name << " Topic receviced."); if (topic_name == "BarUpdate") { WeighingSystem::BarUpdate sample_; while ((!is_stopped()) && (RETCODE_OK == reader->take_next_sample(&sample_, &info))) { if ((info.instance_state == ALIVE_INSTANCE_STATE) && info.valid_data) { { std::unique_lock lock(DdsMsgData::queue_cv_mtx_); DdsMsgData::BarUpdate_queue_.push(std::move(sample_)); lock.unlock(); } } } } else if (topic_name == "LightsUpdate") { WeighingSystem::LightsUpdate sample_; while ((!is_stopped()) && (RETCODE_OK == reader->take_next_sample(&sample_, &info))) { if ((info.instance_state == ALIVE_INSTANCE_STATE) && info.valid_data) { { std::unique_lock lock(DdsMsgData::queue_cv_mtx_); DdsMsgData::LightsUpdate_queue_.push(std::move(sample_)); lock.unlock(); } } } } else if (topic_name == "InfraredUpdate") { WeighingSystem::InfraredUpdate sample_; while ((!is_stopped()) && (RETCODE_OK == reader->take_next_sample(&sample_, &info))) { if ((info.instance_state == ALIVE_INSTANCE_STATE) && info.valid_data) { { std::unique_lock lock(DdsMsgData::queue_cv_mtx_); DdsMsgData::InfraredUpdate_queue_.push(std::move(sample_)); lock.unlock(); } } } } else if (topic_name == "InfraredCommandUpdate") { WeighingSystem::InfraredCommandUpdate sample_; while ((!is_stopped()) && (RETCODE_OK == reader->take_next_sample(&sample_, &info))) { if ((info.instance_state == ALIVE_INSTANCE_STATE) && info.valid_data) { { std::unique_lock lock(DdsMsgData::queue_cv_mtx_); DdsMsgData::InfraredCommandUpdate_queue_.push(std::move(sample_)); lock.unlock(); } } } } else if (topic_name == "LicenseSnapUpdate") { WeighingSystem::LicenseSnapUpdate sample_; while ((!is_stopped()) && (RETCODE_OK == reader->take_next_sample(&sample_, &info))) { if ((info.instance_state == ALIVE_INSTANCE_STATE) && info.valid_data) { { std::unique_lock lock(DdsMsgData::queue_cv_mtx_); DdsMsgData::LicenseSnapUpdate_queue_.push(std::move(sample_)); lock.unlock(); } } } } else if (topic_name == "ScaleInfo") { WeighingSystem::ScaleInfo sample_; while ((!is_stopped()) && (RETCODE_OK == reader->take_next_sample(&sample_, &info))) { if ((info.instance_state == ALIVE_INSTANCE_STATE) && info.valid_data) { { std::unique_lock lock(DdsMsgData::queue_cv_mtx_); DdsMsgData::ScaleInfo_queue_.push(std::move(sample_)); lock.unlock(); } } } } } void SubscriberApp::run(std::shared_ptr dev) { while (!is_stopped()) { { std::unique_lock period_lock(terminate_cv_mtx_); terminate_cv_.wait_for(period_lock, std::chrono::milliseconds(period_ms_), [this](){return is_stopped();}); } } } bool SubscriberApp::is_stopped() { return stop_.load(); } void SubscriberApp::stop() { stop_.store(true); terminate_cv_.notify_all(); }