8 use Time::HiRes qw(gettimeofday);
9 use Glib qw(TRUE FALSE);
12 our $SEMAPHORE_STEP = 1000;
15 my ($class, $args) = @_;
19 $self->{gui} = $args->{gui} or croak;
20 $self->{race_running} = 0;
21 $self->{lap_counting_up} = 1;
26 $self->{cars}->[$i] = SCX::Car->new({
36 sub car { return shift->{cars}->[shift]; }
41 return if $self->{race_running} || $self->{start_in_progress};
42 $self->{race_running} = 0;
43 $self->{start_in_progress} = 1;
44 $self->{semaphore} = 0;
45 $self->{gui}->show_semaphore(0);
46 Glib::Timeout->add($SEMAPHORE_STEP, \&semaphore_step, $self);
52 return FALSE if !$self->{start_in_progress} && !$self->{race_running};
55 if ($self->{semaphore} <= 5) {
56 $self->{gui}->show_semaphore($self->{semaphore});
57 my $timeout = $SEMAPHORE_STEP;
58 $timeout += $SEMAPHORE_STEP * rand()
59 if $self->{semaphore} == 5;
60 Glib::Timeout->add($timeout, \&semaphore_step, $self);
61 } elsif ($self->{semaphore} == 6) {
62 $self->{race_running} = 1;
63 $self->{race_running_since} = gettimeofday;
64 $self->{start_in_progress} = undef;
65 $self->{gui}->show_semaphore(0);
66 Glib::Timeout->add(3*$SEMAPHORE_STEP, \&semaphore_step, $self);
68 $self->{gui}->show_semaphore(undef);
69 $self->{semaphore} = undef;
77 $self->{race_running} = 0;
81 my ($self, $rounds) = @_;
84 $self->{gui}->rounds('0/' . $rounds);
85 $self->{race_rounds} = $rounds;
87 $self->{gui}->rounds('0');
88 $self->{race_rounds} = 0;
90 $self->{race_time} = 0;
91 $self->{best_lap} = undef;
93 $self->{gui}->show_semaphore(undef);
94 $self->{race_running} = 0;
95 $self->{start_in_progress} = 0;
97 $self->{gui}->time('00:00');
98 $self->{gui}->best_lap('0.00');
101 $self->car($car)->set_order($car);
102 $self->car($car)->set_lap(0);
103 $self->car($car)->set_laptime(undef);
108 my ($self, $time, $who) = @_;
110 return if !defined $time || $time == 0;
112 if (!defined $self->{best_lap}
113 || $time < $self->{best_lap}) {
114 $self->{best_lap} = $time;
115 $self->{gui}->best_lap(sprintf("%.2f", $time), $who);