3535
3636#include < functional>
3737#include < mutex>
38- #include < condition_variable>
3938
4039namespace urcl
4140{
@@ -89,7 +88,7 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
8988 virtual bool consume (VersionMessage& pkg) override
9089 {
9190 std::scoped_lock lock (version_information_mutex_);
92- version_information_ = std::make_shared< VersionInformation> ();
91+ version_information_ = VersionInformation ();
9392 version_information_->major = pkg.major_version_ ;
9493 version_information_->minor = pkg.minor_version_ ;
9594 version_information_->bugfix = pkg.svn_version_ ;
@@ -107,7 +106,8 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
107106 virtual bool consume (KinematicsInfo& pkg) override
108107 {
109108 URCL_LOG_DEBUG (" %s" , pkg.toString ().c_str ());
110- kinematics_info_ = std::make_shared<KinematicsInfo>(pkg);
109+ std::scoped_lock lock (kinematics_info_mutex_);
110+ kinematics_info_ = std::make_unique<KinematicsInfo>(pkg);
111111 return true ;
112112 }
113113
@@ -166,22 +166,22 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
166166 {
167167 URCL_LOG_DEBUG (" Robot mode is now %s" , robotModeString (static_cast <RobotMode>(pkg.robot_mode_ )).c_str ());
168168 std::scoped_lock lock (robot_mode_mutex_);
169- robot_mode_ = std::make_shared <RobotModeData>(pkg);
169+ robot_mode_ = std::make_unique <RobotModeData>(pkg);
170170 return true ;
171171 }
172172
173173 virtual bool consume (SafetyModeMessage& pkg) override
174174 {
175175 URCL_LOG_DEBUG (" Robot safety mode is now %s" , safetyModeString (pkg.safety_mode_type_ ).c_str ());
176176 std::scoped_lock lock (safety_mode_mutex_);
177- safety_mode_ = std::make_shared <SafetyModeMessage>(pkg);
177+ safety_mode_ = std::make_unique <SafetyModeMessage>(pkg);
178178 return true ;
179179 }
180180
181181 virtual bool consume (ConfigurationData& pkg) override
182182 {
183183 std::scoped_lock lock (configuration_data_mutex_);
184- configuration_data_ = std::make_shared <ConfigurationData>(pkg);
184+ configuration_data_ = std::make_unique <ConfigurationData>(pkg);
185185 return true ;
186186 }
187187
@@ -203,7 +203,12 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
203203 */
204204 std::shared_ptr<KinematicsInfo> getKinematicsInfo ()
205205 {
206- return kinematics_info_;
206+ std::scoped_lock lock (kinematics_info_mutex_);
207+ if (kinematics_info_ == nullptr )
208+ {
209+ return nullptr ;
210+ }
211+ return std::make_shared<KinematicsInfo>(*kinematics_info_);
207212 }
208213
209214 /* !
@@ -215,7 +220,11 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
215220 std::shared_ptr<RobotModeData> getRobotModeData ()
216221 {
217222 std::scoped_lock lock (robot_mode_mutex_);
218- return robot_mode_;
223+ if (robot_mode_ == nullptr )
224+ {
225+ return nullptr ;
226+ }
227+ return std::make_shared<RobotModeData>(*robot_mode_);
219228 }
220229
221230 /* !
@@ -227,7 +236,11 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
227236 std::shared_ptr<SafetyModeMessage> getSafetyModeMessage ()
228237 {
229238 std::scoped_lock lock (safety_mode_mutex_);
230- return safety_mode_;
239+ if (safety_mode_ == nullptr )
240+ {
241+ return nullptr ;
242+ }
243+ return std::make_shared<SafetyModeMessage>(*safety_mode_);
231244 }
232245
233246 /* !
@@ -240,7 +253,11 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
240253 std::shared_ptr<VersionInformation> getVersionInformation ()
241254 {
242255 std::scoped_lock lock (version_information_mutex_);
243- return version_information_;
256+ if (!version_information_.has_value ())
257+ {
258+ return nullptr ;
259+ }
260+ return std::make_shared<VersionInformation>(*version_information_);
244261 }
245262
246263 /* !
@@ -253,20 +270,25 @@ class PrimaryConsumer : public AbstractPrimaryConsumer
253270 std::shared_ptr<ConfigurationData> getConfigurationData ()
254271 {
255272 std::scoped_lock lock (configuration_data_mutex_);
256- return configuration_data_;
273+ if (configuration_data_ == nullptr )
274+ {
275+ return nullptr ;
276+ }
277+ return std::make_shared<ConfigurationData>(*configuration_data_);
257278 }
258279
259280private:
260281 std::function<void (ErrorCode&)> error_code_message_callback_;
261- std::shared_ptr<KinematicsInfo> kinematics_info_;
282+ std::mutex kinematics_info_mutex_;
283+ std::unique_ptr<KinematicsInfo> kinematics_info_;
262284 std::mutex robot_mode_mutex_;
263- std::shared_ptr <RobotModeData> robot_mode_;
285+ std::unique_ptr <RobotModeData> robot_mode_;
264286 std::mutex version_information_mutex_;
265- std::shared_ptr<VersionInformation> version_information_;
266- std::shared_ptr<ConfigurationData> configuration_data_;
287+ std::optional<VersionInformation> version_information_;
267288 std::mutex configuration_data_mutex_;
289+ std::unique_ptr<ConfigurationData> configuration_data_;
268290 std::mutex safety_mode_mutex_;
269- std::shared_ptr <SafetyModeMessage> safety_mode_;
291+ std::unique_ptr <SafetyModeMessage> safety_mode_;
270292};
271293
272294} // namespace primary_interface
0 commit comments