+sub semaphore_step {
+ my ($self) = @_;
+
+ return if !$self->{start_in_progress} && !$self->{race_running};
+
+ $self->{semaphore}++;
+ if ($self->{semaphore} <= 5) {
+ $self->{gui}->show_semaphore($self->{semaphore});
+ my $timeout = $SEMAPHORE_STEP;
+ $timeout += $SEMAPHORE_STEP * rand()
+ if $self->{semaphore} == 5;
+ Glib::Timeout->add($timeout, \&semaphore_step, $self);
+ } elsif ($self->{semaphore} == 6) {
+ $self->{race_running} = 1;
+ $self->{start_in_progress} = undef;
+ $self->{gui}->show_semaphore(0);
+ Glib::Timeout->add(3*$SEMAPHORE_STEP, \&semaphore_step, $self);
+ } else {
+ $self->{gui}->show_semaphore(undef);
+ $self->{semaphore} = undef;
+ }
+ return FALSE;