-
Notifications
You must be signed in to change notification settings - Fork 248
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
Notification of significant events during bag recording and playback #908
Merged
Merged
Changes from all commits
Commits
Show all changes
44 commits
Select commit
Hold shift + click to select a range
4d6c39d
Simple hacky prototype
gbiggs 1abc18f
Improved prototype with more flexibility and event information
gbiggs fef7111
Use the full relative file path for event info
gbiggs 0426473
Remove no-longer required dependency
gbiggs 0c69e02
Remove left-over merge
gbiggs 2be81a1
Change event names
gbiggs 27ea332
Add overrides to mocks
gbiggs 94a5125
Add missing include
gbiggs 344fa8a
Remove empty file
gbiggs 141801f
Remove unnecessary virtual
gbiggs 7986a31
Correct formatting
gbiggs 81cf14e
Add missing doc
gbiggs 23dfdf2
Reformat documentation
gbiggs db3f3ad
Change read event topic name
gbiggs ffd1740
Change read event topic name
gbiggs b2563f7
Simplify for loop
gbiggs d8e4117
Remove unnecessary blank line
gbiggs f23cb74
Change argument type to const
gbiggs 9371fac
Add events handling to mocks
gbiggs 8affe85
Add comment explaining 5-message split
gbiggs 6d2a2dd
Add integration tests for player and recorder
gbiggs 25338bc
Add ability to check if an event has callbacks
gbiggs e5249fb
Shift event topic publishing to a separate thread
gbiggs b8498ed
Fix formatting
gbiggs 4b2e2d7
Test SequentialReader event callbacks
gbiggs 93950c9
Test SequentialWriter event callbacks
gbiggs 4b3ef80
Document bag events
gbiggs 5a047fc
Check if joinable before joining
gbiggs 2f49b7e
Correct spelling mistake
gbiggs e6c5990
Correct spelling mistake
gbiggs 02a6cec
Reduce time wasted waiting for test to reach intended behaviour
gbiggs dc8ae99
Address test flakiness
gbiggs 9e3ace8
Improve size check
gbiggs 5d12203
Use constant for split size in tests
gbiggs 47bd578
Add missing header
gbiggs df2b23a
Allocate thread on the stack
gbiggs 83342db
Add getters for number of messages per 'file'
gbiggs d63e397
Replace magic number
gbiggs 824cb7a
Address unstable OSX build
gbiggs 44365e5
Make path in test cross-platform
gbiggs 2eb9924
Add missing virtual destructor
gbiggs d1c37d6
Follow uncrustify suggestion
gbiggs b8bc753
Fix rebase errors
gbiggs d74ff65
Remove double include
gbiggs File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,193 @@ | ||
// Copyright 2021 Open Source Robotics Foundation, 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. | ||
|
||
#ifndef ROSBAG2_CPP__BAG_EVENTS_HPP_ | ||
#define ROSBAG2_CPP__BAG_EVENTS_HPP_ | ||
|
||
#include <functional> | ||
#include <memory> | ||
#include <string> | ||
#include <vector> | ||
|
||
#include "rclcpp/function_traits.hpp" | ||
#include "rosbag2_cpp/visibility_control.hpp" | ||
|
||
namespace rosbag2_cpp | ||
{ | ||
|
||
namespace bag_events | ||
{ | ||
|
||
/** | ||
* \brief The types of bag events available for registering callbacks. | ||
*/ | ||
enum class BagEvent | ||
{ | ||
/// The output bag file has been split, starting a new file. | ||
WRITE_SPLIT, | ||
/// Reading of the input bag file has gone over a split, opening the next file. | ||
READ_SPLIT, | ||
}; | ||
|
||
/** | ||
* \brief The information structure passed to callbacks for the WRITE_SPLIT and READ_SPLIT events. | ||
*/ | ||
struct BagSplitInfo | ||
{ | ||
/// The URI of the file that was closed. | ||
std::string closed_file; | ||
/// The URI of the file that was opened. | ||
std::string opened_file; | ||
}; | ||
|
||
using BagSplitCallbackType = std::function<void (BagSplitInfo &)>; | ||
|
||
/** | ||
* \brief Use this structure to register callbacks with Writers. | ||
*/ | ||
struct WriterEventCallbacks | ||
{ | ||
/// The callback to call for the WRITE_SPLIT event. | ||
BagSplitCallbackType write_split_callback; | ||
}; | ||
|
||
/** | ||
* \brief Use this structure to register callbacks with Readers. | ||
*/ | ||
struct ReaderEventCallbacks | ||
{ | ||
/// The callback to call for the READ_SPLIT event. | ||
BagSplitCallbackType read_split_callback; | ||
}; | ||
|
||
/** | ||
* \brief Base class for event callbacks. | ||
* | ||
* This class should not be used directly. | ||
*/ | ||
class BagEventCallbackBase | ||
{ | ||
public: | ||
using SharedPtr = std::shared_ptr<BagEventCallbackBase>; | ||
using InfoPtr = std::shared_ptr<void>; | ||
|
||
virtual ~BagEventCallbackBase() | ||
{} | ||
|
||
virtual void execute(InfoPtr & info) = 0; | ||
|
||
virtual bool is_type(BagEvent event) const = 0; | ||
}; | ||
|
||
/** | ||
* \brief Templated class for storing an event callback. | ||
* | ||
* This class should not be used directly by users. | ||
*/ | ||
template<typename EventCallbackT> | ||
class BagEventCallback : public BagEventCallbackBase | ||
{ | ||
public: | ||
BagEventCallback(const EventCallbackT & callback, BagEvent event) | ||
: callback_(callback), | ||
event_(event) | ||
{} | ||
|
||
virtual ~BagEventCallback() | ||
{} | ||
|
||
void execute(InfoPtr & info) override | ||
{ | ||
callback_(*std::static_pointer_cast<EventCallbackInfoT>(info)); | ||
} | ||
|
||
bool is_type(BagEvent event) const override | ||
{ | ||
return event == event_; | ||
} | ||
|
||
private: | ||
using EventCallbackInfoT = typename std::remove_reference<typename | ||
rclcpp::function_traits::function_traits<EventCallbackT>::template argument_type<0>>::type; | ||
|
||
EventCallbackT callback_; | ||
BagEvent event_; | ||
}; | ||
|
||
/** | ||
* \brief The class used to manage event callbacks registered with a Writer or Reader. | ||
* | ||
* Each implementation of the Writer and Reader interfaces should store one instance of this type. | ||
* When new callbacks are registered, they should be passed to that instance using \ref | ||
* add_event_callback. When an event occurs, the callbacks registered for it can be called by | ||
* calling the \ref execute_callbacks method, passing in the event information. | ||
*/ | ||
class EventCallbackManager | ||
{ | ||
public: | ||
/** | ||
* \brief Add an event callback. | ||
* | ||
* \param callback The callback that should be called for the event. | ||
* \param event The event, one of the values of the \ref BagEvent enumeration. | ||
*/ | ||
template<typename EventCallbackT> | ||
void add_event_callback(const EventCallbackT & callback, const BagEvent event) | ||
{ | ||
auto cb = std::make_shared<BagEventCallback<EventCallbackT>>(callback, event); | ||
callbacks_.push_back(cb); | ||
} | ||
|
||
/** | ||
* \brief Check if a callback is registered for the given event. | ||
* | ||
* \param event The event, one of the values of the \ref BagEvent enumeration. | ||
* \return True if a callback is registered for the event, false otherwise. | ||
*/ | ||
bool has_callback_for_event(const BagEvent event) const | ||
{ | ||
for (auto & cb : callbacks_) { | ||
if (cb->is_type(event)) { | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
|
||
/** | ||
* \brief Execute all callbacks registered for the given event. | ||
* | ||
* The provided information value is passed to each callback by copy. | ||
* | ||
* \param event The event, one of the values of the \ref BagEvent enumeration. | ||
* \param info The information relevant to the event that has occurred. The type varies by event. | ||
*/ | ||
void execute_callbacks(const BagEvent event, BagEventCallbackBase::InfoPtr info) | ||
{ | ||
for (auto & cb : callbacks_) { | ||
if (cb->is_type(event)) { | ||
cb->execute(info); | ||
} | ||
} | ||
} | ||
|
||
private: | ||
std::vector<BagEventCallbackBase::SharedPtr> callbacks_; | ||
}; | ||
|
||
} // namespace bag_events | ||
|
||
} // namespace rosbag2_cpp | ||
|
||
#endif // ROSBAG2_CPP__BAG_EVENTS_HPP_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would some comments in this file explaining what the events are and how to implement them be useful? I'm just thinking of future contributors to
rosbag2
that may not have been privy to the discussions on this. Comments may help to reduce onboarding time and lessen potential confusion. Maybe.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch! That file was completely devoid of comments. I've documented the entities in it in ad46aaa. Please take a look.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The documentation is very thorough! Fantastic! Love it!