.. _program_listing_file__tmp_ws_src_smacc2_smacc2_include_smacc2_client_base_components_cp_topic_subscriber.hpp: Program Listing for File cp_topic_subscriber.hpp ================================================ |exhale_lsh| :ref:`Return to documentation for file ` (``/tmp/ws/src/smacc2/smacc2/include/smacc2/client_base_components/cp_topic_subscriber.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp // Copyright 2021 RobosoftAI Inc. // // 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. /***************************************************************************************************************** * * Authors: Pablo Inigo Blasco, Brett Aldrich * ******************************************************************************************************************/ #pragma once #include #include #include #include namespace smacc2 { namespace components { using namespace smacc2::default_events; template class CpTopicSubscriber : public smacc2::ISmaccComponent { public: std::optional queueSize; typedef MessageType TMessageType; CpTopicSubscriber() { initialized_ = false; } CpTopicSubscriber(std::string topicname) { topicName_ = topicname; } virtual ~CpTopicSubscriber() {} smacc2::SmaccSignal onFirstMessageReceived_; smacc2::SmaccSignal onMessageReceived_; std::function postMessageEvent; std::function postInitialMessageEvent; template boost::signals2::connection onMessageReceived( void (T::*callback)(const MessageType &), T * object) { return this->getStateMachine()->createSignalConnection(onMessageReceived_, callback, object); } template boost::signals2::connection onFirstMessageReceived( void (T::*callback)(const MessageType &), T * object) { return this->getStateMachine()->createSignalConnection( onFirstMessageReceived_, callback, object); } template void onOrthogonalAllocation() { this->postMessageEvent = [=](auto msg) { auto event = new EvTopicMessage(); event->msgData = msg; this->postEvent(event); }; this->postInitialMessageEvent = [=](auto msg) { auto event = new EvTopicInitialMessage(); event->msgData = msg; this->postEvent(event); }; } void onInitialize() override { if (!initialized_) { firstMessage_ = true; if (!queueSize) queueSize = 1; RCLCPP_INFO_STREAM( getLogger(), "[" << this->getName() << "] Subscribing to topic: " << topicName_); rclcpp::SensorDataQoS qos; if (queueSize) qos.keep_last(*queueSize); std::function fn = [this](auto msg) { this->messageCallback(*msg); }; sub_ = this->getNode()->template create_subscription(topicName_, qos, fn); this->initialized_ = true; } } private: typename rclcpp::Subscription::SharedPtr sub_; bool firstMessage_; bool initialized_; std::string topicName_; void messageCallback(const MessageType & msg) { if (firstMessage_) { postInitialMessageEvent(msg); onFirstMessageReceived_(msg); firstMessage_ = false; } postMessageEvent(msg); onMessageReceived_(msg); } }; } // namespace components } // namespace smacc2