6 use Time::HiRes qw(gettimeofday);
9 my ($class, $args) = @_;
13 driver => $args->{driver} || '--',
20 car_img => $args->{car_img},
23 track => $args->{track},
31 sub gui { return shift->{gui}; }
33 sub track { return shift->{track}; }
36 my ($self, $key, $val) = @_;
38 return 1 if !defined $self->{$key} && !defined $val
39 || (defined $self->{$key} && defined $val
40 && $self->{$key} eq $val);
47 my ($self, $val, $time) = @_;
49 return if $self->same('throttle', $val);
51 if ($self->track->{start_in_progress} && $val) {
52 $self->{early_start} = 1;
53 $self->gui->set_name($self->{order}, 'Early start!');
56 if ($self->{in_pit_lane} && defined $val) {
57 $self->{last_finish_time} = $time;
59 $self->leave_pit_lane;
63 $self->gui->set_throttle($self->{order}, $val);
68 my ($self, $val) = @_;
70 return if $self->same('fuel', $val);
71 $self->gui->set_fuel($self->{order}, $val);
83 my ($self, $name) = @_;
85 return if $self->same('car_img', $name);
86 $self->gui->set_car_icon($self->{order}, $name);
90 my ($self, $lap_nr) = @_;
93 $self->{avg_lap} = undef;
94 $self->{lap} = $lap_nr;
95 $self->gui->set_avg_lap($self->{order}, undef);
96 $self->gui->set_lap($self->{order}, $lap_nr);
100 return if $self->same('lap', $lap_nr);
101 $self->gui->set_lap($self->{order}, $lap_nr);
102 if ($self->track->{race_running} && $self->{lap} > 1) {
103 my $now = $self->{last_finish_time};
104 my $avg = ($now - $self->track->{race_running_since})
105 / ($self->{lap} - 1);
106 $self->{avg_lap} = $avg;
107 $self->gui->set_avg_lap($self->{order}, $self->{avg_lap});
112 my ($self, $lap_time) = @_;
114 if (!defined $lap_time) {
115 $self->gui->set_best_lap($self->{order}, undef);
116 $self->{best_lap} = undef;
119 return if $self->same('laptime', $lap_time);
121 $self->gui->set_laptime($self->{order}, $lap_time);
123 if (defined $lap_time) {
124 if ($lap_time > 1.0 && !$self->{in_pit_lane}
125 && $self->track->{race_running}
126 && (!defined $self->{best_lap}
127 || $self->{best_lap} > $lap_time
130 $self->{best_lap} = $lap_time;
131 my $global = $self->{track}->check_best_lap($lap_time,
134 $self->gui->set_best_lap($self->{order}, $lap_time,
141 my ($self, $driver_name) = @_;
143 return if $self->same('driver', $driver_name);
144 $self->gui->set_name($self->{order}, $driver_name);
150 return if $self->{in_pit_lane};
152 $self->{in_pit_lane} = 1;
159 return if !$self->{in_pit_lane};
161 $self->{in_pit_lane} = 0;
166 my ($self, $pos) = @_;
168 $self->{order} = $pos;
170 $self->gui->set_name($self->{order}, $self->{driver});
171 $self->gui->set_car_icon($self->{order}, $self->{car_img});
172 $self->gui->set_throttle($self->{order}, $self->{throttle});
173 $self->gui->set_lap($self->{order}, $self->{lap});
174 $self->gui->set_laptime($self->{order}, $self->{laptime});
175 $self->gui->set_best_lap($self->{order}, $self->{best_lap});
176 $self->gui->set_avg_lap($self->{order}, $self->{avg_lap});
177 $self->gui->set_fuel($self->{order}, $self->{fuel});
178 $self->gui->set_car_id($self->{order}, $self->{id} + 1);
179 $self->gui->set_distance($self->{order},
180 $self->{time_diff}, $self->{lap_diff});
181 $self->gui->set_state($self->{order}, $self->{state});
182 if ($self->{in_pit_lane}) {
183 $self->gui->enter_pit_lane;
190 if ($self->{in_pit_lane}) {
191 $self->{state} = 'pit';
192 } elsif ($self->{running}) {
193 $self->{state} = 'go';
194 } elsif ($self->{finished}) {
195 $self->{state} = 'finished';
196 } elsif ($self->{early_start}) {
197 $self->{state} = 'disqualified';
199 $self->{state} = 'greenflag';
202 $self->gui->set_state($self->{order}, $self->{state});
209 $self->set_laptime(undef);
210 $self->{in_pit_lane} = 0;
211 $self->{early_start} = undef;
212 $self->{last_finish_time} = undef;
213 $self->{first_finish_time} = undef;
214 $self->{time_diff} = undef;
215 $self->{lap_diff} = undef;
219 my ($self, $time, $regular) = @_;
221 if (defined $self->{last_finish_time}
222 && $time - $self->{last_finish_time} < 2) {
224 $self->{last_finish_time} = $time;
225 if ($regular && $self->{in_pit_lane}) {
226 $self->leave_pit_lane;
232 if (defined $self->{first_finish_time}) {
233 $self->set_laptime($time - $self->{first_finish_time});
236 $self->enter_pit_lane;
239 $self->{first_finish_time} = $self->{last_finish_time} = $time;
241 if ($self->track->{race_running}) {
242 $self->set_lap($self->{lap} + 1);
248 sub recalc_distance {
249 my ($self, $lap_first, $time_first) = @_;
251 return if !defined $lap_first || !defined $self->{lap}
252 || !defined $time_first || !defined $self->{first_finish_time};
256 if ($self->{lap} == $lap_first) {
257 if ($self->{first_finish_time} == $time_first) {
258 $time = $self->{first_finish_time}
259 - $self->track->{race_running_since};
261 $self->{time_diff} = $self->{first_finish_time}
265 $self->{lap_diff} = $lap_first - $self->{lap};
268 $self->gui->set_distance($self->{order}, $time,
269 $self->{lap_diff}, $self->{time_diff});