X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=gui.pl;h=7cfe6085f24085b14aa7fdf8c1cfb32927d45423;hb=3b3c72e17a541d14f063c4c4f9093f42b271ff08;hp=1df07dea30af65a31b8c426d603b24d4ff5eafac;hpb=79abcddf3469dac53d814fa6de206b42acb917d1;p=slotcarman.git diff --git a/gui.pl b/gui.pl index 1df07de..7cfe608 100755 --- a/gui.pl +++ b/gui.pl @@ -6,119 +6,103 @@ use utf8; 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; }