X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=slotcarman;fp=slotcarman;h=5e3a04f15fda27453305d2b139f53dcd59e29465;hb=6476b9984754241f18fe4268543016776518c386;hp=0efe3f30da91ee6c46ad0376b56454013893989b;hpb=5341c13d51c282a68cb9fdeb92b15711630d33e7;p=slotcarman.git diff --git a/slotcarman b/slotcarman index 0efe3f3..5e3a04f 100755 --- a/slotcarman +++ b/slotcarman @@ -3,39 +3,62 @@ use strict; use utf8; +use Getopt::Std; + use Gtk2 '-init'; use Glib qw(TRUE FALSE); +use Time::HiRes qw(time usleep); use SCX::GUI; use SCX::Track; use SCX::Reader; +use SCX::LogReader; use SCX::RaceParser; +my %opt; +if (!getopts('b:e:ft:l:', \%opt)) { + usage(); +} + +if (($opt{t} && $opt{l}) + || (!$opt{l} && ($opt{b} || $opt{e} || $opt{f}))) { + usage(); +} + my $gui = SCX::GUI->new({ img_height => 100 }); my $track = SCX::Track->new({ gui => $gui }); my $logfile = 'log'; -my $tty = '/dev/ttyUSB0'; - -if (defined $ARGV[0] && $ARGV[0] eq '-') { - $logfile = undef; - $tty = '-'; -} my $parser = SCX::RaceParser->new({ track => $track, logfile => $logfile, }); -my $reader = eval { - SCX::Reader->new({ - filename => $tty, - parser => $parser, - }); -}; +my ($log_reader, $tty_reader); -if ($@) { - print STDERR "Demo mode only: $@"; +if ($opt{l}) { # Log file replay mode + $log_reader = SCX::LogReader->new({ + filename => $opt{l}, + begin_time => $opt{b}, + end_time => $opt{e}, + }); +} else { + my $tty = $opt{t} || '/dev/ttyUSB0'; + + $tty_reader = eval { + SCX::Reader->new({ + filename => $tty, + parser => $parser, + }); + }; + + if ($@) { + if ($opt{t}) { + exit 1; + } + print STDERR "Demo mode only: $@"; + } } $track->car(0)->set_model('F1 Ferrari'); @@ -50,8 +73,11 @@ $track->car(0)->set_driver('Ferrari'); $track->car(1)->set_driver('McLaren'); $track->car(2)->set_driver('Xsara'); -if ($reader) { - Glib::IO->add_watch(fileno($reader->fh), 'in', \&scx_read, $reader); +if ($tty_reader) { + Glib::IO->add_watch(fileno($tty_reader->fh), 'in', + \&scx_read, $tty_reader); +} elsif ($log_reader) { + Glib::Idle->add(\&log_read_start, [ $log_reader, $parser, $opt{f} ]); } else { # Just display some random values @@ -107,3 +133,34 @@ sub scx_read { return TRUE; } +sub usage { + die "Usage: $0 [-t tty_line]\n" + . "or: $0 -l logfile [-b starttime] [-e endtime] [-f]\n" + . "-f ... replay as fast as possible\n"; +} + + +sub log_read_start { + my ($data) = @_; + my ($logreader, $parser, $fast) = @$data; + + our ($starttime, $log_starttime); + + my ($l_time, @data) = $logreader->get_data(); + return FALSE if !$l_time; + + my $now = time; + $starttime ||= $now; + + $log_starttime ||= $l_time; + + my $time_diff = ($l_time - $log_starttime) - ($now - $starttime); + if (!$fast && $time_diff > 0) { + # print "sleeping for $time_diff s\n"; + usleep(1_000_000 * $time_diff); + } + + $parser->add_data($l_time, @data); + + return TRUE; +}