use Gtk2 '-init';
use Glib qw(TRUE FALSE);
+use SCX::GUI;
+use SCX::Track;
use SCX::Reader;
+use SCX::RaceParser;
-my @controllers = (0, 0, 0, 0, 0, 0);
-my $no_reader = 0;
+my $gui = SCX::GUI->new({ img_height => 120 });
+my $track = SCX::Track->new({ gui => $gui });
-my $builder = Gtk2::Builder->new;
-$builder->add_from_file('slotcarman.glade');
+my $logfile = 'log';
+my $tty = '/dev/ttyUSB0';
-my $window = $builder->get_object('slotcarman');
-
-$builder->connect_signals(undef);
-$window->show();
-
-sub quit {
- Gtk2->main_quit;
- return FALSE;
+if (defined $ARGV[0] && $ARGV[0] eq '-') {
+ $logfile = undef;
+ $tty = '-';
}
-my $reader = SCX::Reader->new({
- portname => '/dev/ttyUSB0',
- logfile => 'log',
- callback => \&do_packet,
-}) if !$no_reader;
+my $parser = SCX::RaceParser->new({
+ track => $track,
+ logfile => $logfile,
+});
-sub scx_read {
- my $event = shift;
+my $reader = eval {
+ SCX::Reader->new({
+ filename => $tty,
+ parser => $parser,
+ });
+};
- $reader->read();
- return TRUE;
+if ($@) {
+ print STDERR "Demo mode only: $@";
}
-Glib::IO->add_watch(fileno($reader->fh), 'in', \&scx_read, 1)
- if !$no_reader;
-
-Gtk2->main();
-
-sub do_packet {
- my (@data) = @_;
-
- if ($data[0] == 0xff) { # controller status
- for my $controller (1..6) {
- my $byte = $data[$controller];
- next if defined $controllers[$controller-1]
- && $controllers[$controller-1] == $byte;
- $controllers[$controller-1] = $byte;
-
- my $progressbar = $builder->get_object(
- 'progressbar_controller'.$controller);
- if ($byte == 0xaa) {
- $progressbar->set_text('inactive');
- $progressbar->set_fraction(0);
- next;
- }
- my $light = !($byte & 0x20);
- my $backbutton = !($byte & 0x10);
- my $speed = $byte & 0x0f;
-
- my $text = ($backbutton ? '+' : '') . $speed;
- $progressbar->set_text($text);
- $progressbar->set_fraction($speed / 12);
- }
- } elsif ($data[0] == 0xd6) { # fuel status
- my @fuel = (0,
- $data[1] >> 4, $data[1] & 0x0f,
- $data[2] >> 4, $data[2] & 0x0f,
- $data[3] >> 4, $data[3] & 0x0f,
- );
- for my $car (1..6) {
- next if defined $controllers[$car-1]
- &&$controllers[$car-1] == $fuel[$car];
-
- my $progressbar = $builder->get_object(
- 'progressbar_fuel'.$car);
- $progressbar->set_fraction($fuel[$car]/8);
- }
- } else {
- print "Unknown packet",
- (map { sprintf(" %02x", $_) } @data), "\n";
- }
+$track->car(0)->set_model('F1 Ferrari');
+$track->car(1)->set_model('F1 McLaren');
+$track->car(2)->set_model('F1 Williams');
+$track->car(3)->set_model('Citroen Xsara');
+$track->car(4)->set_model('Citroen C4');
+$track->car(5)->set_model('Ford Focus');
+
+$track->car(0)->set_driver('Ivi');
+$track->car(1)->set_driver('Filípek');
+$track->car(2)->set_driver('Táta');
+
+if ($reader) {
+ Glib::IO->add_watch(fileno($reader->fh), 'in', \&scx_read, $reader);
+} else {
+ # Just display some random values
+
+ $gui->rounds('5/13');
+ $gui->time('53.4');
+ $gui->best_lap('12.3');
+
+ my $now = time;
+ $track->{race_running_since} = $now;
+ $track->{race_running} = 1;
+
+ $track->finish_line($now + 0.5, 1, 2);
+ $track->finish_line($now + 0.7, 1, 1);
+ $track->finish_line($now + 4.9, 1, 1);
+ $track->finish_line($now + 5.3, 1, 2);
+ $track->finish_line($now + 7.2, 1, 1);
+ $track->finish_line($now + 8.1, 0, 2);
+# $track->car(0)->set_lap(13);
+# $track->car(1)->set_lap(11);
+# $track->car(2)->set_lap(10);
+# $track->car(3)->set_lap(undef);
+# $track->car(4)->set_lap(undef);
+# $track->car(5)->set_lap(undef);
+
+ $track->car(0)->set_laptime(9.12322);
+ $track->car(1)->set_laptime(15.313);
+ $track->car(2)->set_laptime(5.989);
+
+ $track->car(0)->set_fuel(6);
+ $track->car(1)->set_fuel(2);
+ $track->car(2)->set_fuel(8);
+
+ $track->car(0)->set_throttle(0);
+ $track->car(1)->set_throttle(8, 1);
+ $track->car(2)->set_throttle(12);
}
-
-__END__
-use Gtk2 '-init';
-my $window = Gtk2::Window->new('toplevel');
-$window->signal_connect(delete_event => sub { Gtk2->main_quit; return FALSE });
-$window->set_title("Slot Cars Manager");
+$gui->show;
-$window->set_border_width(10);
-
-my $button = Gtk2::Button->new("Button 1");
-$button->signal_connect(clicked => \&callback, 'button 1');
-
-my $box1 = Gtk2::HBox->new(FALSE, 0);
-$window->add($box1);
-$box1->pack_start($button, TRUE, TRUE, 0);
-
-$button->show;
-$button = Gtk2::Button->new("Button 2");
-$button->signal_connect(clicked => \&callback, 'button 2');
-$box1->pack_start($button, TRUE, TRUE, 0);
+Gtk2->main();
-$button->show;
-$box1->show;
-$window->show;
+exit 0;
-Gtk2->main();
+sub quit {
+ Gtk2->main_quit;
+ return FALSE;
+}
+sub scx_read {
+ my ($event, $fh, $reader) = @_;
-sub callback
-{
- my ($button, $data) = @_;
-
- print "Hello again - $data was pressed\n";
+ $reader->read();
+ return TRUE;
}