def juggle_route(route_name, segment_number, qlog): r = Route(route_name) logs = r.qlog_paths() if qlog else r.log_paths() if segment_number is not None: logs = logs[segment_number:segment_number + 1] if None in logs: fallback_answer = input( "At least one of the rlogs in this segment does not exist, would you like to use the qlogs? (y/n) : " ) if fallback_answer == 'y': logs = r.qlog_paths() if segment_number is not None: logs = logs[segment_number:segment_number + 1] else: print( f"Please try a different {'segment' if segment_number is not None else 'route'}" ) return all_data = [] pool = multiprocessing.Pool(24) for d in pool.map(load_segment, logs): all_data += d tempfile = NamedTemporaryFile(suffix='.rlog') save_log(tempfile.name, all_data, compress=False) del all_data juggle_file(tempfile.name)
def juggle_route(route_or_segment_name, segment_count, qlog, can, layout): segment_start = 0 if 'cabana' in route_or_segment_name: query = parse_qs(urlparse(route_or_segment_name).query) api = CommaApi(get_token()) logs = api.get( f'v1/route/{query["route"][0]}/log_urls?sig={query["sig"][0]}&exp={query["exp"][0]}' ) elif route_or_segment_name.startswith( "http://") or route_or_segment_name.startswith( "https://") or os.path.isfile(route_or_segment_name): logs = [route_or_segment_name] else: route_or_segment_name = SegmentName(route_or_segment_name, allow_route_name=True) segment_start = max(route_or_segment_name.segment_num, 0) if route_or_segment_name.segment_num != -1 and segment_count is None: segment_count = 1 r = Route(route_or_segment_name.route_name.canonical_name) logs = r.qlog_paths() if qlog else r.log_paths() segment_end = segment_start + segment_count if segment_count else None logs = logs[segment_start:segment_end] if None in logs: ans = input( f"{logs.count(None)}/{len(logs)} of the rlogs in this segment are missing, would you like to fall back to the qlogs? (y/n) " ) if ans == 'y': logs = r.qlog_paths()[segment_start:segment_end] else: print("Please try a different route or segment") return all_data = [] with multiprocessing.Pool(24) as pool: for d in pool.map(load_segment, logs): all_data += d if not can: all_data = [d for d in all_data if d.which() not in ['can', 'sendcan']] # Infer DBC name from logs dbc = None for cp in [m for m in all_data if m.which() == 'carParams']: try: DBC = __import__(f"selfdrive.car.{cp.carParams.carName}.values", fromlist=['DBC']).DBC dbc = DBC[cp.carParams.carFingerprint]['pt'] except Exception: pass break with tempfile.NamedTemporaryFile(suffix='.rlog', dir=juggle_dir) as tmp: save_log(tmp.name, all_data, compress=False) del all_data start_juggler(tmp.name, dbc, layout)
def juggle_route(route_name, segment_number, segment_count, qlog, can, layout): if 'cabana' in route_name: query = parse_qs(urlparse(route_name).query) api = CommaApi(get_token()) logs = api.get( f'v1/route/{query["route"][0]}/log_urls?sig={query["sig"][0]}&exp={query["exp"][0]}' ) elif route_name.startswith("http://") or route_name.startswith( "https://") or os.path.isfile(route_name): logs = [route_name] else: r = Route(route_name) logs = r.qlog_paths() if qlog else r.log_paths() if segment_number is not None: logs = logs[segment_number:segment_number + segment_count] if None in logs: fallback_answer = input( "At least one of the rlogs in this segment does not exist, would you like to use the qlogs? (y/n) : " ) if fallback_answer == 'y': logs = r.qlog_paths() if segment_number is not None: logs = logs[segment_number:segment_number + segment_count] else: print( f"Please try a different {'segment' if segment_number is not None else 'route'}" ) return all_data = [] with multiprocessing.Pool(24) as pool: for d in pool.map(load_segment, logs): all_data += d if not can: all_data = [d for d in all_data if d.which() not in ['can', 'sendcan']] # Infer DBC name from logs dbc = None for cp in [m for m in all_data if m.which() == 'carParams']: try: DBC = __import__(f"selfdrive.car.{cp.carParams.carName}.values", fromlist=['DBC']).DBC dbc = DBC[cp.carParams.carFingerprint]['pt'] except (ImportError, KeyError, AttributeError): pass break tempfile = NamedTemporaryFile(suffix='.rlog', dir=juggle_dir) save_log(tempfile.name, all_data, compress=False) del all_data start_juggler(tempfile.name, dbc, layout)
def juggle_route(route_name, segment_number, qlog, can, layout): if route_name.startswith("http://") or route_name.startswith( "https://") or os.path.isfile(route_name): logs = [route_name] else: r = Route(route_name) logs = r.qlog_paths() if qlog else r.log_paths() if segment_number is not None: logs = logs[segment_number:segment_number + 1] if None in logs: fallback_answer = input( "At least one of the rlogs in this segment does not exist, would you like to use the qlogs? (y/n) : " ) if fallback_answer == 'y': logs = r.qlog_paths() if segment_number is not None: logs = logs[segment_number:segment_number + 1] else: print( f"Please try a different {'segment' if segment_number is not None else 'route'}" ) return all_data = [] pool = multiprocessing.Pool(24) for d in pool.map(load_segment, logs): all_data += d if not can: all_data = [d for d in all_data if d.which() not in ['can', 'sendcan']] # Infer DBC name from logs dbc = None for cp in [m for m in all_data if m.which() == 'carParams']: try: DBC = __import__(f"selfdrive.car.{cp.carParams.carName}.values", fromlist=['DBC']).DBC dbc = DBC[cp.carParams.carFingerprint]['pt'] except (ImportError, KeyError, AttributeError): pass break tempfile = NamedTemporaryFile(suffix='.rlog', dir=juggle_dir) save_log(tempfile.name, all_data, compress=False) del all_data juggle_file(tempfile.name, dbc, layout)
#!/usr/bin/env python3 import sys from common.params import Params from tools.lib.route import Route from tools.lib.logreader import LogReader if __name__ == "__main__": r = Route(sys.argv[1]) cp = [m for m in LogReader(r.qlog_paths()[0]) if m.which() == 'carParams'] Params().put("CarParams", cp[0].carParams.as_builder().to_bytes())
#!/usr/bin/env python3 import sys from collections import Counter from pprint import pprint from tqdm import tqdm from tools.lib.route import Route from tools.lib.logreader import LogReader if __name__ == "__main__": r = Route(sys.argv[1]) cnt: Counter = Counter() for q in tqdm(r.qlog_paths()): lr = LogReader(q) car_events = [m for m in lr if m.which() == 'carEvents'] for car_event in car_events: for e in car_event.carEvents: cnt[e.name] += 1 pprint(cnt)
wrong_fuzzy = 0 good_fuzzy = 0 dongles = [] for route in tqdm(routes): route = route.rstrip() dongle_id, time = route.split('|') if dongle_id in dongles: continue if NO_API: qlog_path = f"cd:/{dongle_id}/{time}/0/qlog.bz2" else: route = Route(route) qlog_path = route.qlog_paths()[0] if qlog_path is None: continue try: lr = LogReader(qlog_path) dongles.append(dongle_id) for msg in lr: if msg.which() == "pandaStates": if msg.pandaStates[0].pandaType not in [ 'uno', 'blackPanda', 'dos' ]: break
if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('--level', default='DEBUG') parser.add_argument('--addr', default='127.0.0.1') parser.add_argument("route", type=str, nargs='*', help="route name + segment number for offline usage") args = parser.parse_args() logs = None if len(args.route): r = Route(args.route[0]) logs = r.qlog_paths() if len(args.route) == 2 and logs: n = int(args.route[1]) logs = [logs[n]] min_level = LEVELS[args.level] if logs: for log in logs: if log: lr = LogReader(log) for m in lr: if m.which() == 'logMessage': print_logmessage(m.logMonoTime, m.logMessage, min_level)
#!/usr/bin/env python3 import os from tqdm import tqdm from common.file_helpers import mkdirs_exists_ok from tools.lib.logreader import LogReader from tools.lib.route import Route import argparse if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("route", help="The route name") parser.add_argument("segment", type=int, help="The index of the segment") args = parser.parse_args() out_path = os.path.join("jpegs", f"{args.route.replace('|', '_')}_{args.segment}") mkdirs_exists_ok(out_path) r = Route(args.route) lr = list(LogReader(r.qlog_paths()[args.segment])) for msg in tqdm(lr): if msg.which() == 'thumbnail': with open(os.path.join(out_path, f"{msg.thumbnail.frameId}.jpg"), 'wb') as f: f.write(msg.thumbnail.thumbnail)
print(f"[{t / 1e9:.6f}] {source} {msg.pid} {msg.tag} - {m}") if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('--level', default='DEBUG') parser.add_argument('--addr', default='127.0.0.1') parser.add_argument("route", type=str, nargs='*', help="route name + segment number for offline usage") args = parser.parse_args() logs = None if len(args.route): r = Route(args.route[0]) logs = [q if r is None else r for (q, r) in zip(r.qlog_paths(), r.log_paths())] if len(args.route) == 2 and logs: n = int(args.route[1]) logs = [logs[n]] min_level = LEVELS[args.level] if logs: for log in logs: if log: lr = LogReader(log) for m in lr: if m.which() == 'logMessage': print_logmessage(m.logMonoTime, m.logMessage, min_level) elif m.which() == 'androidLog':
from tools.lib.logreader import LogReader from tools.lib.route import Route import argparse if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("route", help="The route name") parser.add_argument("segment", type=int, help="The index of the segment") args = parser.parse_args() out_path = os.path.join("jpegs", f"{args.route.replace('|', '_')}_{args.segment}") mkdirs_exists_ok(out_path) r = Route(args.route) path = r.log_paths()[args.segment] or r.qlog_paths()[args.segment] lr = list(LogReader(path)) for msg in tqdm(lr): if msg.which() == 'thumbnail': with open(os.path.join(out_path, f"{msg.thumbnail.frameId}.jpg"), 'wb') as f: f.write(msg.thumbnail.thumbnail) elif msg.which() == 'navThumbnail': with open( os.path.join(out_path, f"nav_{msg.navThumbnail.frameId}.jpg"), 'wb') as f: f.write(msg.navThumbnail.thumbnail)
parser = argparse.ArgumentParser() parser.add_argument('--level', default='DEBUG') parser.add_argument('--addr', default='127.0.0.1') parser.add_argument("route", type=str, nargs='*', help="route name + segment number for offline usage") args = parser.parse_args() logs = None if len(args.route): r = Route(args.route[0]) logs = [ q_log if r_log is None else r_log for (q_log, r_log) in zip(r.qlog_paths(), r.log_paths()) ] if len(args.route) == 2 and logs: n = int(args.route[1]) logs = [logs[n]] min_level = LEVELS[args.level] if logs: for log in logs: if log: lr = LogReader(log) for m in lr: if m.which() == 'logMessage': print_logmessage(m.logMonoTime, m.logMessage,