Skip to content
This repository was archived by the owner on Nov 30, 2022. It is now read-only.

Commit 295ae9b

Browse files
authored
Add set_read_order reader API (#54)
* Implement new set_read_order API for storage Signed-off-by: Emerson Knapp <[email protected]>
1 parent 35de152 commit 295ae9b

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

.github/workflows/test.yml

+13-1
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,24 @@ jobs:
3030

3131
name: ROS 2 ${{ matrix.ros }}
3232
steps:
33-
- name: Build and run tests
33+
- run: |
34+
echo "repositories: {}" > /tmp/deps.repos
35+
- run: |
36+
cat > /tmp/deps.repos <<EOF
37+
repositories:
38+
rosbag2:
39+
type: git
40+
url: https://github.com/ros2/rosbag2
41+
version: rolling
42+
EOF
43+
if: ${{ matrix.ros == 'rolling' }}
44+
- name: Build and test
3445
id: action-ros-ci
3546
uses: ros-tooling/[email protected]
3647
with:
3748
package-name: rosbag2_storage_mcap
3849
target-ros2-distro: ${{ matrix.ros }}
50+
vcs-repo-file-url: /tmp/deps.repos
3951
- uses: actions/upload-artifact@v1
4052
with:
4153
name: colcon-logs

rosbag2_storage_mcap/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ endif()
5757
# COMPATIBILITY(foxy, galactic, humble) - 0.17.x is the Rolling release.
5858
if(${rosbag2_storage_VERSION} VERSION_GREATER_EQUAL 0.17.0)
5959
list(APPEND MCAP_COMPILE_DEFS ROSBAG2_STORAGE_MCAP_HAS_STORAGE_FILTER_TOPIC_REGEX)
60+
list(APPEND MCAP_COMPILE_DEFS ROSBAG2_STORAGE_MCAP_HAS_SET_READ_ORDER)
6061
endif()
6162

6263
target_compile_definitions(${PROJECT_NAME} PRIVATE ${MCAP_COMPILE_DEFS})

rosbag2_storage_mcap/src/mcap_storage.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@ class MCAPStorage : public rosbag2_storage::storage_interfaces::ReadWriteInterfa
174174
std::string get_storage_identifier() const override;
175175

176176
/** BaseReadInterface **/
177+
#ifdef ROSBAG2_STORAGE_MCAP_HAS_SET_READ_ORDER
178+
void set_read_order(const rosbag2_storage::ReadOrder&) override;
179+
#endif
177180
bool has_next() override;
178181
std::shared_ptr<rosbag2_storage::SerializedBagMessage> read_next() override;
179182
std::vector<rosbag2_storage::TopicMetadata> get_all_topics_and_types() override;
@@ -458,6 +461,35 @@ void MCAPStorage::ensure_summary_read() {
458461
}
459462
}
460463

464+
#ifdef ROSBAG2_STORAGE_MCAP_HAS_SET_READ_ORDER
465+
void MCAPStorage::set_read_order(const rosbag2_storage::ReadOrder& read_order) {
466+
auto next_read_order = read_order_;
467+
switch (read_order.sort_by) {
468+
case rosbag2_storage::ReadOrder::ReceivedTimestamp:
469+
if (read_order.reverse) {
470+
next_read_order = mcap::ReadMessageOptions::ReadOrder::ReverseLogTimeOrder;
471+
} else {
472+
next_read_order = mcap::ReadMessageOptions::ReadOrder::LogTimeOrder;
473+
}
474+
break;
475+
case rosbag2_storage::ReadOrder::File:
476+
if (!read_order.reverse) {
477+
next_read_order = mcap::ReadMessageOptions::ReadOrder::FileOrder;
478+
} else {
479+
throw std::runtime_error("Reverse file order reading not implemented.");
480+
}
481+
break;
482+
case rosbag2_storage::ReadOrder::PublishedTimestamp:
483+
throw std::runtime_error("PublishedTimestamp read order not yet implemented in ROS 2");
484+
break;
485+
}
486+
if (next_read_order != read_order_) {
487+
read_order_ = next_read_order;
488+
reset_iterator();
489+
}
490+
}
491+
#endif
492+
461493
bool MCAPStorage::has_next() {
462494
if (!linear_iterator_) {
463495
return false;

0 commit comments

Comments
 (0)