X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=SCX%2FReader.pm;h=565af0fe13d94b25d1a9cfbfcd5b6dff511c70ac;hb=9aec101d497a8b3549b7150b0371e18c4c843f6a;hp=873ffa058a09a451b217df87ed47196bd1efc37a;hpb=3a515aa5d4aeeedf2632ddfc25ba4834ee90493d;p=slotcarman.git diff --git a/SCX/Reader.pm b/SCX/Reader.pm index 873ffa0..565af0f 100644 --- a/SCX/Reader.pm +++ b/SCX/Reader.pm @@ -226,6 +226,8 @@ sub lap_time_packet { || $bytes[4] & 0x01 || $bytes[5] & 0x01; + my $nonzero = grep { $_ != 0 } @bytes; + my $car = $bytes[0]; my $round = 256*$bytes[1] + $bytes[2] + ($bytes[3] & 2 ? 256 : 0) @@ -233,10 +235,19 @@ sub lap_time_packet { my $time = 256*$bytes[4] + $bytes[5] + ($bytes[3] & 8 ? 256 : 0) + ($bytes[3] & 4 ? 1 : 0); - $time *= 0.01024; - - $self->track->car($car)->set_lap($round); - $self->track->car($car)->set_laptime($time); + if ($time == 65535) { + $self->track->car($car)->enter_pit_lane; + } else { + $time *= 0.01024; + + if ($nonzero) { + $self->track->car($car)->set_lap($round); + $self->track->car($car)->set_laptime($time); + } else { + # FIXME - probably reset race time or whatever + # all-zeros packet is sent after the race setup + } + } return $msg; } @@ -253,6 +264,17 @@ sub race_setup_packet { || $bytes[4] != 0xFF || $bytes[5] != 0xFF; + for my $car (0..5) { + $self->track->car($car)->set_lap(0); + $self->track->car($car)->set_laptime(undef); + } + + $self->track->race_setup($bytes[0] == 0x00 + ? 0 + : $bytes[1] & 0x0F * 256 + + $bytes[2] & 0x0F * 16 + + $bytes[3] & 0x0F); + return $msg; # FIXME - to be implemented } @@ -301,6 +323,11 @@ sub qualification_packet { || $bytes[4] != 0xFF || $bytes[5] != 0xFF; + for my $car (0..5) { + $self->track->car($car)->set_lap(undef); + $self->track->car($car)->set_laptime(undef); + } + return $msg; # FIXME - to be implemented } @@ -316,6 +343,8 @@ sub end_of_race_packet { || $bytes[4] != 0xFF || $bytes[5] != 0xFF; + $self->track->race_end; + return $msg; # FIXME - to be implemented } @@ -331,6 +360,8 @@ sub race_start_packet { || $bytes[4] != 0xAA || $bytes[5] != 0xAA; + $self->track->race_start; + return $msg; # FIXME - to be implemented } @@ -365,16 +396,30 @@ sub finish_line_packet { my $msg = 'Strange finish_line packet' if $fail; + my $pit_lane_entry; + my @cars_finished; + for my $i (0..5) { + my $byte = $bytes[$i]; + + $pit_lane_entry = 1 if $byte == 0xF0; + push @cars_finished, $i if $byte == 0xE7; + } + + if ($pit_lane_entry) { + for my $car (@cars_finished) { + $self->track->car($car)->enter_pit_lane; + } + } + return $msg; # FIXME - to be implemented } - sub controller_status_packet { my ($self, @bytes) = @_; my $fail; for my $byte (@bytes) { - next if $byte == 0xA0; + next if $byte == 0xAA; $fail = 1 if ($byte & 0xC0) != 0xC0 || ($byte & 0x0F) > 12