#!/usr/bin/perl -w package SCX::RaceParser; use strict; use IO::File; use FileHandle; use base qw(SCX::Parser); our $LOG_FILE_LIMIT = 10_000_000; # bytes sub new { my ($class, $args) = @_; my $self = SCX::Parser->new(); $self->{track} = $args->{track} or die "Track argument not given"; $self->{logfile} = $args->{logfile}; if ($self->{logfile}) { open my $fh, '>>', $self->{logfile} or die "Can't open $self->{logfile}: $!"; $self->{logfh} = $fh; } bless $self, $class; return $self; } sub log_print { my ($self, @data) = @_; my $size = $self->{logfh}->tell; if ($size >= $LOG_FILE_LIMIT) { close $self->{logfh}; my $gen = 8; while ($gen) { rename $self->{logfile} . '.' . $gen . '.bz2', $self->{logfile} . '.' . ($gen+1) . '.bz2'; $gen--; } rename $self->{logfile}, $self->{logfile} . '.1'; system 'bzip2 -9 ' . $self->{logfile} . '.1 &'; open my $fh, '>', $self->{logfile} or die "Can't open $self->{logfile}: $!"; $self->{logfh} = $fh; } $self->{logfh}->print(sprintf('% 10.3f ', $self->now), join(' ', map { sprintf('%02X', $_) } @data), "\n"); $self->{logfh}->flush; } sub log_packet { my ($self, @data) = @_; $self->track->packet_received($self->now); $self->log_print(@data) if $self->{logfile}; } sub bad_bytes { my ($self, @data) = @_; $self->log_print(@data) if $self->{logfile}; } sub track { return shift->{track} } sub race_setup { my ($self, $rounds) = @_; $self->track->race_setup($rounds, $self->now); } sub fuel_level { my ($self, @fuel) = @_; for my $car (0..5) { $self->track->car($car)->set_fuel($fuel[$car]); } } sub qualification { my ($self, $rounds, $cars) = @_; $self->track->qualification_setup($rounds, $cars, $self->now); } sub end_of_race { my ($self) = @_; $self->track->race_end; } sub race_start { my ($self) = @_; $self->track->race_start($self->now); } sub finish_line { my ($self, $regular, @cars_finished) = @_; $self->track->finish_line( $self->now, $regular, @cars_finished ); } sub controller_status { my ($self, @controllers) = @_; for my $car (0..5) { my $c = $controllers[$car]; $self->track->car($car)->set_throttle( $c->{throttle}, $c->{button}, $self->now ); $self->track->car($car)->set_light($c->{light}); } } sub standings { my ($self, @order) = @_; return 0; # for now for my $i (0..$#order) { my $car_id = $order[$i]; if ($self->track->car($car_id)->{order} != $i) { print $self->now(), " car $car_id out of order (we: ", $self->track->car($car_id)->{order}, ", controller unit: $i)\n"; } } } sub car_lap_time { my ($self, $car_id, $lap, $time) = @_; if ($self->track->car($car_id)->{lap} != $lap) { print $self->now(), " car $car_id lap mismatch - we: ", $self->track->car($car_id)->{lap}, ", controller unit: $lap\n"; } } 1;