@@ -174,6 +174,9 @@ class MCAPStorage : public rosbag2_storage::storage_interfaces::ReadWriteInterfa
174
174
std::string get_storage_identifier () const override ;
175
175
176
176
/* * BaseReadInterface **/
177
+ #ifdef ROSBAG2_STORAGE_MCAP_HAS_SET_READ_ORDER
178
+ void set_read_order (const rosbag2_storage::ReadOrder&) override ;
179
+ #endif
177
180
bool has_next () override ;
178
181
std::shared_ptr<rosbag2_storage::SerializedBagMessage> read_next () override ;
179
182
std::vector<rosbag2_storage::TopicMetadata> get_all_topics_and_types () override ;
@@ -458,6 +461,35 @@ void MCAPStorage::ensure_summary_read() {
458
461
}
459
462
}
460
463
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
+
461
493
bool MCAPStorage::has_next () {
462
494
if (!linear_iterator_) {
463
495
return false ;
0 commit comments