]> www.fi.muni.cz Git - slotcarman.git/blobdiff - SCX/Reader.pm
More fixes.
[slotcarman.git] / SCX / Reader.pm
index 59f7ca3df85f403cf64b2883078824d194b4c756..5422a4b4c43ea5f201ed65e1a1a1473ddb2499e7 100644 (file)
@@ -11,7 +11,7 @@ use POSIX;
 use SCX::CRC;
 
 our $PACKET_SIZE = 9; # 9 bytes + 0x05
-our $LOG_ROTATE  = 600;
+our $LOG_FILE_LIMIT = 10_000_000; # bytes
 
 sub new {
        my ($class, $args) = @_;
@@ -33,24 +33,18 @@ sub new {
        open my $logfh, '>', "$logfile.$log_gen"
        or die "Can't open $logfile.$log_gen: $!";
 
-       my $now = gettimeofday;
-
        my $self = {
                portname  => $portname,
                fh        => $fh,
                logfile   => $logfile,
                logfh     => $logfh,
                log_gen   => $log_gen,
-               log_start => $now,
-               starttime => $now,
                track     => $args->{track},
                bytes     => [],
        };
 
        bless $self, $class;
 
-       $self->track->reset;
-
        return $self;
 }
 
@@ -100,6 +94,7 @@ sub read {
                $self->log_bytes(\@packet, $rv);
                $self->track->packet_received($self->{last_read_time});
        }
+
        if (@bad_bytes) {
                while (@bytes && $bytes[0] != 0x55) {
                        push @bad_bytes, shift @bytes;
@@ -110,30 +105,40 @@ sub read {
        @{ $self->{bytes} } = @bytes;
 }
 
-sub log_bytes {
-       my ($self, $bytes, $msg) = @_;
-
-       return if !@$bytes;
-
-       $msg = defined $msg ? ' # ' . $msg : '';
+sub log_print {
+       my ($self, @data) = @_;
 
-       my $now = $self->{last_read_time};
+       my $size = $self->{logfh}->tell;
 
-       if ($now - $self->{log_start} >= $LOG_ROTATE) {
+       if ($size >= $LOG_FILE_LIMIT) {
                close $self->{logfh};
                $self->{log_gen} = $self->{log_gen} ? 0 : 1;
                open my $fh, '>', $self->{logfile} . '.' . $self->{log_gen}
                        or die "Can't open $self->{logfile}.$self->{log_gen}: $!";
                $self->{logfh} = $fh;
-               $self->{log_start} = $now;
        }
 
-       $self->{logfh}->print(sprintf('% 10.3f', $now - $self->{starttime}),
-               (map { sprintf(" %02x", $_) } @$bytes),
-               $msg, "\n");
+       $self->{logfh}->print(sprintf('% 10.3f ', $self->{last_read_time}),
+               join(' ', @data, "\n"));
        $self->{logfh}->flush;
 }
 
+sub log_bytes {
+       my ($self, $bytes, $msg) = @_;
+
+       return if !@$bytes;
+
+       $msg = defined $msg ? '# ' . $msg : '';
+
+       $self->log_print((map { sprintf("%02x", $_) } @$bytes), $msg);
+}
+
+sub log_cmd {
+       my ($self, @args) = @_;
+
+       $self->log_print('cmd', @args);
+}
+
 our %COMMANDS = (
        0xAA => \&bus_free_time_packet,
        0xCC => \&car_programming_packet,
@@ -199,9 +204,10 @@ sub reset_packet {
                || $bytes[4] != 0xAA
                || $bytes[5] != 0xAA;
 
+       $self->log_cmd('reset');
        $self->track->reset;
 
-       return $msg; # FIXME - to be implemented
+       return $msg;
 }
 
 sub standings_packet {
@@ -219,7 +225,7 @@ sub standings_packet {
 
        push @standings, map { $_ != 0xFF ? $_ & (0x07) : () } @bytes;
 
-       return $msg; # FIXME - to be implemented
+       return $msg; # We do internal standings handling
 }
 
 sub lap_time_packet {
@@ -233,36 +239,9 @@ 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)
-               + ($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
-               }
-       }
-=cut
-
        return $msg;
 }
 
-
 sub race_setup_packet {
        my ($self, @bytes) = @_;
 
@@ -274,16 +253,18 @@ sub race_setup_packet {
                || $bytes[4] != 0xFF
                || $bytes[5] != 0xFF;
 
-       $self->track->race_setup($bytes[0] == 0x00
+       my $rounds = $bytes[0] == 0x00
                ? 0
                : ($bytes[1] & 0x0F) * 256
                        + ($bytes[2] & 0x0F) * 16
-                       + ($bytes[3] & 0x0F));
+                       + ($bytes[3] & 0x0F);
+
+       $self->log_cmd('race_setup', $rounds);
+       $self->track->race_setup($rounds);
 
        return $msg;
 }
 
-
 sub fuel_level_packet {
        my ($self, @bytes) = @_;
 
@@ -302,6 +283,7 @@ sub fuel_level_packet {
                $bytes[2] >> 4, $bytes[2] & 0x0f,
        );
 
+       $self->log_cmd('fuel', @fuel);
        for my $car (0..5) {
                $self->track->car($car)->set_fuel($fuel[$car]);
        }
@@ -328,6 +310,7 @@ sub qualification_packet {
                || $bytes[4] != 0xFF
                || $bytes[5] != 0xFF;
 
+       $self->log_cmd('qualification_start');
        $self->track->qualification_start;
 
        return $msg;
@@ -345,6 +328,7 @@ sub end_of_race_packet {
                || $bytes[4] != 0xFF
                || $bytes[5] != 0xFF;
 
+       $self->log_cmd('race_end');
        $self->track->race_end;
 
        return $msg;
@@ -362,6 +346,7 @@ sub race_start_packet {
                || $bytes[4] != 0xAA
                || $bytes[5] != 0xAA;
 
+       $self->log_cmd('race_start');
        $self->track->race_start;
 
        return $msg;
@@ -409,6 +394,7 @@ sub finish_line_packet {
                push @cars_finished, $i if $byte == 0xE7;
        }
 
+       $self->log_cmd('finish_line', $regular, @cars_finished);
        $self->track->finish_line(
                $self->{last_read_time},
                $regular,
@@ -432,11 +418,7 @@ sub controller_status_packet {
        my $msg = 'Strange controller_status packet'
                if $fail;
 
-       my @fuel = (
-               $bytes[1] >> 4, $bytes[1] & 0x0f,
-               $bytes[2] >> 4, $bytes[2] & 0x0f,
-               $bytes[3] >> 4, $bytes[3] & 0x0f,
-       );
+       my @log_data;
 
        for my $car (0..5) {
                my $byte = $bytes[$car];
@@ -444,6 +426,7 @@ sub controller_status_packet {
                if ($byte == 0xAA) {
                        $self->track->car($car)->set_throttle(undef, undef,
                                $self->{last_read_time});
+                       push @log_data, 'undef', '0';
                        next;
                }
 
@@ -451,11 +434,14 @@ sub controller_status_packet {
                my $backbutton = !($byte & 0x10);
                my $throttle = $byte & 0x0f;
 
+               push @log_data, $throttle, $backbutton ? 1 : 0;
                $self->track->car($car)->set_throttle($throttle, $backbutton,
                        $self->{last_read_time});
                $self->track->car($car)->set_light($light);
        }
 
+       $self->log_cmd('throttle', @log_data);
+
        return $msg;
 }