+ $self->set_label('label_name', $row, $text);
+}
+
+sub set_car_id {
+ my ($self, $row, $text) = @_;
+
+ $self->set_label('label_car_id', $row, $text);
+}
+
+sub show_semaphore {
+ my ($self, $num) = @_;
+
+ my $win = $self->{semaphore_win};
+ if (defined $num) {
+ my $img = $self->{semaphore_img};
+ my $pixbuf = $self->{semaphore_images}->[$num];
+ $img->set_from_pixbuf($pixbuf);
+ $win->show;
+ } else {
+ $win->hide;
+ }
+}
+
+sub rounds {
+ my ($self, $text) = @_;
+
+ $self->set_label('label_lap_global', undef, $text);
+}
+
+sub time {
+ my ($self, $text) = @_;
+
+ $self->set_label('label_time_global', undef, format_race_time($text));
+}
+
+sub best_lap {
+ my ($self, $time, $who) = @_;
+
+ my $text = format_lap_time($time);
+ $text .= ' by ' . $who
+ if defined $who;
+ $self->set_label('label_best_lap_global', undef, $text);
+}
+
+sub format_race_time {
+ my ($seconds) = @_;
+
+ return '--' if !defined $seconds;
+
+ my $hours = int($seconds / 3600);
+ $seconds -= 3600 * $hours;
+
+ my $mins = int($seconds / 60);
+ $seconds -= 60 * $mins;
+
+ return $hours
+ ? sprintf('%d:%02d:%04.1f', $hours, $mins, $seconds)
+ : sprintf('%d:%04.1f', $mins, $seconds);
+}
+
+sub format_lap_time {
+ my ($seconds) = @_;
+
+ return defined $seconds
+ ? sprintf('%.2f', $seconds)
+ : '--';
+}
+
+sub set_state {
+ my ($self, $num, $name) = @_;
+
+ $self->set_image('image_status', $num, 'state', 'state '.$name);