diff --git a/tools/lib/helpers.py b/tools/lib/helpers.py index 539d1ce34f..c184efe6a2 100644 --- a/tools/lib/helpers.py +++ b/tools/lib/helpers.py @@ -11,7 +11,7 @@ class RE: SEGMENT_NAME = r'{}(?:--|/)(?P[0-9]+)'.format(ROUTE_NAME) INDEX = r'-?[0-9]+' SLICE = r'(?P{})?:?(?P{})?:?(?P{})?'.format(INDEX, INDEX, INDEX) - SEGMENT_RANGE = r'{}(?:--|/)?(?P({}))?'.format(ROUTE_NAME, SLICE) + SEGMENT_RANGE = r'{}(?:--|/)?(?P({}))?/?(?P([qr]))?'.format(ROUTE_NAME, SLICE) BOOTLOG_NAME = ROUTE_NAME EXPLORER_FILE = r'^(?P{})--(?P[a-z]+\.[a-z0-9]+)$'.format(SEGMENT_NAME) diff --git a/tools/lib/route.py b/tools/lib/route.py index 17048773b2..d3df93ccda 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -251,3 +251,7 @@ class SegmentRange: @property def _slice(self): return self.m.group("slice") + + @property + def selector(self): + return self.m.group("selector") diff --git a/tools/lib/srreader.py b/tools/lib/srreader.py index 9824e0466b..2c08072e98 100644 --- a/tools/lib/srreader.py +++ b/tools/lib/srreader.py @@ -6,10 +6,10 @@ from openpilot.tools.lib.helpers import RE from openpilot.tools.lib.logreader import LogReader from openpilot.tools.lib.route import Route, SegmentRange -class ReadMode(enum.Enum): - RLOG = 0 # only read rlogs - QLOG = 1 # only read qlogs - #AUTO = 2 # default to rlogs, fallback to qlogs, not supported yet +class ReadMode(enum.StrEnum): + RLOG = "r" # only read rlogs + QLOG = "q" # only read qlogs + #AUTO = "a" # default to rlogs, fallback to qlogs, not supported yet def create_slice_from_string(s: str): @@ -71,8 +71,11 @@ def auto_source(*args, **kwargs): class SegmentRangeReader: - def __init__(self, segment_range: str, mode=ReadMode.RLOG, source=auto_source, sort_by_time=False): + def __init__(self, segment_range: str, default_mode=ReadMode.RLOG, source=auto_source, sort_by_time=False): sr = SegmentRange(segment_range) + + mode = default_mode if sr.selector is None else ReadMode(sr.selector) + self.lrs = source(sr, mode, sort_by_time) def __iter__(self): diff --git a/tools/lib/tests/test_srreader.py b/tools/lib/tests/test_srreader.py index 2a017be6ae..84521ae219 100644 --- a/tools/lib/tests/test_srreader.py +++ b/tools/lib/tests/test_srreader.py @@ -37,10 +37,11 @@ class TestSegmentRangeReader(unittest.TestCase): self.assertListEqual(list(segs), expected) @parameterized.expand([ - (f"{TEST_ROUTE}//",), + (f"{TEST_ROUTE}///",), (f"{TEST_ROUTE}---",), (f"{TEST_ROUTE}/-4:--2",), (f"{TEST_ROUTE}/-a",), + (f"{TEST_ROUTE}/j",), (f"{TEST_ROUTE}/0:1:2:3",), (f"{TEST_ROUTE}/:::3",), ]) @@ -49,14 +50,17 @@ class TestSegmentRangeReader(unittest.TestCase): sr = SegmentRange(segment_range) parse_slice(sr) - @parameterized.expand([ - (ReadMode.QLOG, 11643), - (ReadMode.RLOG, 70577), - ]) - def test_modes(self, mode, expected): - lr = SegmentRangeReader(TEST_ROUTE+"/0", mode) + def test_modes(self): + qlog_len = len(list(SegmentRangeReader(f"{TEST_ROUTE}/0", ReadMode.QLOG))) + rlog_len = len(list(SegmentRangeReader(f"{TEST_ROUTE}/0", ReadMode.RLOG))) + + self.assertLess(qlog_len * 6, rlog_len) + + def test_modes_from_name(self): + qlog_len = len(list(SegmentRangeReader(f"{TEST_ROUTE}/0/q"))) + rlog_len = len(list(SegmentRangeReader(f"{TEST_ROUTE}/0/r"))) - self.assertEqual(len(list(lr)), expected) + self.assertLess(qlog_len * 6, rlog_len) if __name__ == "__main__":