X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=SCX%2FReader.pm;h=ff5894d459f115dcac243179bc483e730201ade2;hb=972687391b212153ee34a6ecf616fd1c1a53d01b;hp=873ffa058a09a451b217df87ed47196bd1efc37a;hpb=3a515aa5d4aeeedf2632ddfc25ba4834ee90493d;p=slotcarman.git diff --git a/SCX/Reader.pm b/SCX/Reader.pm index 873ffa0..ff5894d 100644 --- a/SCX/Reader.pm +++ b/SCX/Reader.pm @@ -49,6 +49,8 @@ sub new { bless $self, $class; + $self->track->reset; + return $self; } @@ -64,6 +66,8 @@ sub read { die "Read error on $self->{portname}: $!" if !$bytes_read; + $self->{last_read_time} = gettimeofday; + my @bytes = unpack("C*", $data); # print join(' ', map { sprintf(" %02x", $_) } @bytes), "\n"; @@ -94,6 +98,7 @@ sub read { my @packet = splice @bytes, 0, $PACKET_SIZE+1; my $rv = $self->handle_packet(@packet); $self->log_bytes(\@packet, $rv); + $self->track->packet_received($self->{last_read_time}); } if (@bad_bytes) { while (@bytes && $bytes[0] != 0x55) { @@ -112,7 +117,7 @@ sub log_bytes { $msg = defined $msg ? ' # ' . $msg : ''; - my $now = gettimeofday; + my $now = $self->{last_read_time}; if ($now - $self->{log_start} >= $LOG_ROTATE) { close $self->{logfh}; @@ -182,7 +187,7 @@ sub car_programming_packet { || $bytes[4] != 0xFF || $bytes[5] != 0xFF; - return $msg; + return $msg; # No need to handle this } sub reset_packet { @@ -194,6 +199,8 @@ sub reset_packet { || $bytes[4] != 0xAA || $bytes[5] != 0xAA; + $self->track->reset; + return $msg; # FIXME - to be implemented } @@ -226,6 +233,10 @@ sub lap_time_packet { || $bytes[4] & 0x01 || $bytes[5] & 0x01; +=comment + # Moving to internal timekeeping + my $nonzero = grep { $_ != 0 } @bytes; + my $car = $bytes[0]; my $round = 256*$bytes[1] + $bytes[2] + ($bytes[3] & 2 ? 256 : 0) @@ -233,10 +244,20 @@ 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 + } + } +=cut return $msg; } @@ -253,7 +274,13 @@ sub race_setup_packet { || $bytes[4] != 0xFF || $bytes[5] != 0xFF; - return $msg; # FIXME - to be implemented + $self->track->race_setup($bytes[0] == 0x00 + ? 0 + : ($bytes[1] & 0x0F) * 256 + + ($bytes[2] & 0x0F) * 16 + + ($bytes[3] & 0x0F)); + + return $msg; } @@ -301,7 +328,9 @@ sub qualification_packet { || $bytes[4] != 0xFF || $bytes[5] != 0xFF; - return $msg; # FIXME - to be implemented + $self->track->qualification_start; + + return $msg; } @@ -316,7 +345,9 @@ sub end_of_race_packet { || $bytes[4] != 0xFF || $bytes[5] != 0xFF; - return $msg; # FIXME - to be implemented + $self->track->race_end; + + return $msg; } @@ -331,7 +362,9 @@ sub race_start_packet { || $bytes[4] != 0xAA || $bytes[5] != 0xAA; - return $msg; # FIXME - to be implemented + $self->track->race_start; + + return $msg; } @@ -365,16 +398,32 @@ sub finish_line_packet { my $msg = 'Strange finish_line packet' if $fail; - return $msg; # FIXME - to be implemented -} + my $regular = 1; + my @cars_finished; + for my $i (0..5) { + my $byte = $bytes[$i]; + $regular = 0 + if $byte != 0xAA && $byte != 0xE7 && $byte != 0xFE; + + push @cars_finished, $i if $byte == 0xE7; + } + + $self->track->finish_line( + $self->{last_read_time}, + $regular, + @cars_finished + ); + + return $msg; +} 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 @@ -401,7 +450,8 @@ sub controller_status_packet { my $backbutton = !($byte & 0x10); my $throttle = $byte & 0x0f; - $self->track->car($car)->set_throttle($throttle); + $self->track->car($car)->set_throttle($throttle, + $self->{last_read_time}); $self->track->car($car)->set_light($light); $self->track->car($car)->set_backbutton($backbutton); }