X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=SCX%2FReader.pm;h=72dcb2542e3993c9b2cfcb348b2ffe312aed6e98;hb=d311baf05cce488606946a68ffee19980681030b;hp=e3431ad425ad40e66acd33832eb2e73ed097082a;hpb=dda2866e78b9648e501050bfeee2aed36958aa10;p=slotcarman.git diff --git a/SCX/Reader.pm b/SCX/Reader.pm index e3431ad..72dcb25 100644 --- a/SCX/Reader.pm +++ b/SCX/Reader.pm @@ -226,7 +226,30 @@ sub lap_time_packet { || $bytes[4] & 0x01 || $bytes[5] & 0x01; - return $msg; # FIXME - to be implemented + my $nonzero = grep { $_ != 0 } @bytes; + + my $car = $bytes[0]; + my $round = 256*$bytes[1] + $bytes[2] + + ($bytes[3] & 2 ? 256 : 0) + + ($bytes[3] & 1 ? 1 : 0); + my $time = 256*$bytes[4] + $bytes[5] + + ($bytes[3] & 8 ? 256 : 0) + + ($bytes[3] & 4 ? 1 : 0); + 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; } @@ -241,6 +264,12 @@ sub race_setup_packet { || $bytes[4] != 0xFF || $bytes[5] != 0xFF; + $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 } @@ -289,6 +318,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 } @@ -304,6 +338,8 @@ sub end_of_race_packet { || $bytes[4] != 0xFF || $bytes[5] != 0xFF; + $self->track->race_end; + return $msg; # FIXME - to be implemented } @@ -319,6 +355,8 @@ sub race_start_packet { || $bytes[4] != 0xAA || $bytes[5] != 0xAA; + $self->track->race_start; + return $msg; # FIXME - to be implemented } @@ -353,16 +391,37 @@ sub finish_line_packet { my $msg = 'Strange finish_line packet' if $fail; + my $pit_lane_entry; + my $too_fast; + my @cars_finished; + for my $i (0..5) { + my $byte = $bytes[$i]; + + $pit_lane_entry = 1 if $byte == 0xF0; + $too_fast = 1 if $byte == 0xFF; + + push @cars_finished, $i if $byte == 0xE7; + } + + if ($pit_lane_entry) { + for my $car (@cars_finished) { + $self->track->car($car)->enter_pit_lane; + } + } else { + for my $car (@cars_finished) { + $self->track->car($car)->leave_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