X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=SCX%2FReader.pm;h=7498e0a179c430aa082ff0da3cf37f6e4b9ecc0a;hb=041b40ba9d04693394c1472224cbb4285a0280c3;hp=08c72881f1bd9041df605e6eac4c469d23726144;hpb=345e8e96dea605056d0c35461c4f16234c247fba;p=slotcarman.git diff --git a/SCX/Reader.pm b/SCX/Reader.pm index 08c7288..7498e0a 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,8 @@ sub lap_time_packet { || $bytes[4] & 0x01 || $bytes[5] & 0x01; +=comment + # Moving to internal timekeeping my $nonzero = grep { $_ != 0 } @bytes; my $car = $bytes[0]; @@ -248,6 +257,7 @@ sub lap_time_packet { # all-zeros packet is sent after the race setup } } +=cut return $msg; } @@ -270,7 +280,7 @@ sub race_setup_packet { + $bytes[2] & 0x0F * 16 + $bytes[3] & 0x0F); - return $msg; # FIXME - to be implemented + return $msg; } @@ -337,7 +347,7 @@ sub end_of_race_packet { $self->track->race_end; - return $msg; # FIXME - to be implemented + return $msg; } @@ -354,7 +364,7 @@ sub race_start_packet { $self->track->race_start; - return $msg; # FIXME - to be implemented + return $msg; } @@ -388,29 +398,29 @@ sub finish_line_packet { my $msg = 'Strange finish_line packet' if $fail; - my $pit_lane_entry; - my $too_fast; + my $regular = 1; 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; + $regular = 0 + if $byte != 0xAA && $byte != 0xE7 && $byte != 0xFE; 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; - } + my $processed; + for my $car (@cars_finished) { + $processed ||= $self->track->car($car)->finish_line( + $self->{last_read_time}, $regular + ); } - return $msg; # FIXME - to be implemented + if ($processed) { + $self->track->recalc_order; + } + + return $msg; } sub controller_status_packet {