#!/usr/bin/perl -w use strict; use Getopt::Std; use FileHandle; use Time::HiRes qw(time usleep); my %opt; if (!getopts('b:e:fp', \%opt) || !$ARGV[0]) { die "Usage: $0 [-b starttime] [-e endtime] [-f] [-p] logfile\n" . "-f ... replay as fast as possible, without pausing\n" . "-p ... at the end, want for a keypress\n"; } my $logfile = shift @ARGV; open my $logfh, '<', $logfile or die "Can't open $logfile: $!"; my $start_prog_time = time; my $start_log_time; while (my $line = <$logfh>) { chomp $line; $line =~ s/\A\s+//xms; my ($l_time, @data) = split(/\s+/, $line); next if ($opt{b} && $opt{b} > $l_time); next if ($opt{e} && $opt{e} < $l_time); print pack("C*", map { hex $_ } @data); flush STDOUT; if (!$opt{f}) { $start_log_time ||= $l_time; my $log_delay = $l_time - $start_log_time; my $real_delay = time - $start_prog_time; if ($real_delay < $log_delay) { print STDERR "usleep for ", $log_delay - $real_delay, "\n"; usleep(1000_000 * ($log_delay - $real_delay)); } } } if ($opt{p}) { print STDERR "Replay log finished - press a key: "; flush STDERR; $_ = ; }