diff --git a/tools/replay/unlog_segment.py b/tools/replay/unlog_segment.py index 1e1f7de50a..cea3c96971 100755 --- a/tools/replay/unlog_segment.py +++ b/tools/replay/unlog_segment.py @@ -19,11 +19,11 @@ def input_ready(): return select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], []) -def replay(route, segment): +def replay(route, loop): route = route.replace('|', '/') - lr = LogReader(f"cd:/{route}/{segment}/rlog.bz2") - fr = FrameReader(f"cd:/{route}/{segment}/fcamera.hevc", readahead=True) + lr = LogReader(f"cd:/{route}/rlog.bz2") + fr = FrameReader(f"cd:/{route}/fcamera.hevc", readahead=True) # Build mapping from frameId to segmentId from encodeIdx, type == fullHEVC msgs = [m for m in lr if m.which() not in IGNORE] @@ -53,7 +53,12 @@ def replay(route, segment): if w not in socks: socks[w] = messaging.pub_sock(w) - socks[w].send(msg.to_bytes()) + + try: + if socks[w]: + socks[w].send(msg.to_bytes()) + except messaging.messaging_pyx.MultiplePublishersError: + socks[w] = None lag += (next_msg.logMonoTime - msg.logMonoTime) / 1e9 lag -= time.time() - start_time @@ -80,20 +85,20 @@ def replay(route, segment): new_time = msgs[i].logMonoTime + dt * 1e9 i = bisect.bisect_left(times, new_time) - i = min(i + 1, max_i) + i = (i + 1) % max_i if loop else min(i + 1, max_i) if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument("route") - parser.add_argument("segment", type=int) + parser.add_argument("--loop", action='store_true') + parser.add_argument("segment") args = parser.parse_args() orig_settings = termios.tcgetattr(sys.stdin) tty.setcbreak(sys.stdin) try: - replay(args.route, args.segment) + replay(args.segment, args.loop) termios.tcsetattr(sys.stdin, termios.TCSADRAIN, orig_settings) except: termios.tcsetattr(sys.stdin, termios.TCSADRAIN, orig_settings)