regen: specify any list of sources

ooh this is pretty nice
pull/32736/head
Shane Smiskol 9 months ago
parent 900d68b8cf
commit ceb0b4abed
  1. 5
      selfdrive/test/process_replay/regen.py
  2. 11
      tools/lib/logreader.py

@ -6,6 +6,7 @@ import capnp
import numpy as np import numpy as np
from typing import Any from typing import Any
from functools import partial
from collections.abc import Iterable from collections.abc import Iterable
from openpilot.selfdrive.test.process_replay.process_replay import CONFIGS, FAKEDATA, ProcessConfig, replay_process, get_process_config, \ from openpilot.selfdrive.test.process_replay.process_replay import CONFIGS, FAKEDATA, ProcessConfig, replay_process, get_process_config, \
@ -14,7 +15,7 @@ from openpilot.selfdrive.test.process_replay.vision_meta import DRIVER_CAMERA_FR
from openpilot.selfdrive.test.update_ci_routes import upload_route from openpilot.selfdrive.test.update_ci_routes import upload_route
from openpilot.tools.lib.route import Route from openpilot.tools.lib.route import Route
from openpilot.tools.lib.framereader import FrameReader, BaseFrameReader, FrameType from openpilot.tools.lib.framereader import FrameReader, BaseFrameReader, FrameType
from openpilot.tools.lib.logreader import LogReader, LogIterable from openpilot.tools.lib.logreader import LogReader, LogIterable, auto_source, internal_source, internal_source_zst
from openpilot.tools.lib.helpers import save_log from openpilot.tools.lib.helpers import save_log
@ -75,7 +76,7 @@ def setup_data_readers(
assert device_type != "neo", "Driver camera not supported on neo segments. Use dummy dcamera." assert device_type != "neo", "Driver camera not supported on neo segments. Use dummy dcamera."
frs['driverCameraState'] = FrameReader(r.dcamera_paths()[sidx]) frs['driverCameraState'] = FrameReader(r.dcamera_paths()[sidx])
else: else:
lr = LogReader(f"cd:/{route.replace('|', '/')}/{sidx}/rlog.bz2") lr = LogReader(f"{route}/{sidx}/r", default_source=partial(auto_source, sources=[internal_source, internal_source_zst]))
frs = {} frs = {}
if needs_road_cam: if needs_road_cam:
frs['roadCameraState'] = FrameReader(f"cd:/{route.replace('|', '/')}/{sidx}/fcamera.hevc") frs['roadCameraState'] = FrameReader(f"cd:/{route.replace('|', '/')}/{sidx}/fcamera.hevc")

@ -179,23 +179,24 @@ def check_source(source: Source, *args) -> LogPaths:
return files return files
def auto_source(sr: SegmentRange, mode=ReadMode.RLOG) -> LogPaths: def auto_source(sr: SegmentRange, mode=ReadMode.RLOG, sources: list[Source] = None) -> LogPaths:
if mode == ReadMode.SANITIZED: if mode == ReadMode.SANITIZED:
return comma_car_segments_source(sr, mode) return comma_car_segments_source(sr, mode)
SOURCES: list[Source] = [internal_source, internal_source_zst, openpilotci_source, comma_api_source, comma_car_segments_source,] if sources is None:
sources: list[Source] = [internal_source, internal_source_zst, openpilotci_source, comma_api_source, comma_car_segments_source,]
exceptions = {} exceptions = {}
# for automatic fallback modes, auto_source needs to first check if rlogs exist for any source # for automatic fallback modes, auto_source needs to first check if rlogs exist for any source
if mode in [ReadMode.AUTO, ReadMode.AUTO_INTERACTIVE]: if mode in [ReadMode.AUTO, ReadMode.AUTO_INTERACTIVE]:
for source in SOURCES: for source in sources:
try: try:
return check_source(source, sr, ReadMode.RLOG) return check_source(source, sr, ReadMode.RLOG)
except Exception: except Exception:
pass pass
# Automatically determine viable source # Automatically determine viable source
for source in SOURCES: for source in sources:
try: try:
return check_source(source, sr, mode) return check_source(source, sr, mode)
except Exception as e: except Exception as e:
@ -260,7 +261,7 @@ are uploaded or auto fallback to qlogs with '/a' selector at the end of the rout
def __init__(self, identifier: str | list[str], default_mode: ReadMode = ReadMode.RLOG, def __init__(self, identifier: str | list[str], default_mode: ReadMode = ReadMode.RLOG,
default_source=auto_source, sort_by_time=False, only_union_types=False): default_source=auto_source, sort_by_time=False, only_union_types=False):
self.default_mode = default_mode self.default_mode = default_mode
self.default_source = default_source self.default_source = default_source # TODO: `default_source` name is confusing? should be `source` and should not be able to be overridden
self.identifier = identifier self.identifier = identifier
self.sort_by_time = sort_by_time self.sort_by_time = sort_by_time

Loading…
Cancel
Save