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 $track = SCX::Track->new({ gui => $gui, no_semaphore => $opt{f} });
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');
$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
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;
+}