diff --git a/selfdrive/debug/dump.py b/selfdrive/debug/dump.py index db18f4c622..514a415577 100755 --- a/selfdrive/debug/dump.py +++ b/selfdrive/debug/dump.py @@ -1,14 +1,14 @@ #!/usr/bin/env python3 -import os import sys import argparse import json import codecs -import cereal.messaging as messaging from hexdump import hexdump from cereal import log from cereal.services import SERVICE_LIST +from openpilot.tools.lib.logreader import raw_live_logreader + codecs.register_error("strict", codecs.backslashreplace_errors) @@ -22,32 +22,20 @@ if __name__ == "__main__": parser.add_argument('--no-print', action='store_true') parser.add_argument('--addr', default='127.0.0.1') parser.add_argument('--values', help='values to monitor (instead of entire event)') - parser.add_argument("socket", type=str, nargs='*', help="socket names to dump. defaults to all services defined in cereal") + parser.add_argument("socket", type=str, nargs='*', default=list(SERVICE_LIST.keys()), help="socket names to dump. defaults to all services defined in cereal") args = parser.parse_args() - if args.addr != "127.0.0.1": - os.environ["ZMQ"] = "1" - messaging.context = messaging.Context() - - poller = messaging.Poller() - - for m in args.socket if len(args.socket) > 0 else SERVICE_LIST: - messaging.sub_sock(m, poller, addr=args.addr) + lr = raw_live_logreader(args.socket, args.addr) values = None if args.values: values = [s.strip().split(".") for s in args.values.split(",")] - while 1: - polld = poller.poll(100) - for sock in polld: - msg = sock.receive() - with log.Event.from_bytes(msg) as log_evt: - evt = log_evt - + for msg in lr: + with log.Event.from_bytes(msg) as evt: if not args.no_print: if args.pipe: - sys.stdout.write(msg) + sys.stdout.write(str(msg)) sys.stdout.flush() elif args.raw: hexdump(msg) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 4d76f2a38f..24dfc75d47 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -16,7 +16,8 @@ import warnings from typing import Dict, Iterable, Iterator, List, Type from urllib.parse import parse_qs, urlparse -from cereal import log as capnp_log +from cereal import log as capnp_log, messaging +from cereal.services import SERVICE_LIST from openpilot.common.swaglog import cloudlog from openpilot.tools.lib.comma_car_segments import get_url as get_comma_segments_url from openpilot.tools.lib.openpilotci import get_url @@ -26,6 +27,7 @@ from openpilot.tools.lib.route import Route, SegmentRange LogMessage = Type[capnp._DynamicStructReader] LogIterable = Iterable[LogMessage] +RawLogIterable = Iterable[bytes] class _LogFileReader: @@ -292,6 +294,31 @@ are uploaded or auto fallback to qlogs with '/a' selector at the end of the rout return next(self.filter(msg_type), None) +ALL_SERVICES = list(SERVICE_LIST.keys()) + +def raw_live_logreader(services: List[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> RawLogIterable: + if addr != "127.0.0.1": + os.environ["ZMQ"] = "1" + messaging.context = messaging.Context() + + poller = messaging.Poller() + + for m in services: + messaging.sub_sock(m, poller, addr=addr) + + while True: + polld = poller.poll(100) + for sock in polld: + msg = sock.receive() + yield msg + + +def live_logreader(services: List[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> LogIterable: + for m in raw_live_logreader(services, addr): + with capnp_log.Event.from_bytes(m) as evt: + yield evt + + if __name__ == "__main__": import codecs # capnproto <= 0.8.0 throws errors converting byte data to string