]> www.fi.muni.cz Git - slotcarman.git/blob - SCX/LogPrinter.pm
Log printing/annotating app
[slotcarman.git] / SCX / LogPrinter.pm
1 #!/usr/bin/perl -w
2
3 package SCX::LogPrinter;
4
5 use strict;
6
7 use base qw(SCX::Parser);
8
9 our $UNIQ_TIMEOUT = 2.0;
10
11 sub new {
12         my ($class, $args) = @_;
13
14         my $self = SCX::Parser->new();
15         bless $self, $class;
16
17         $self->{dump_bad_bytes} = 1 if $args->{dump_bad_bytes};
18         $self->{dump_strange}   = 1 if $args->{dump_strage};
19         $self->{uniq_only}      = 1 if $args->{uniq_only};
20         $self->{skip_types}     = $args->{skip_types};
21
22         return $self;
23 }
24
25 sub cond_print {
26         my ($self, $key, @vals) = @_;
27
28         return if $self->{skip_types}->{$key};
29
30         if ($key !~ /finish_line/ || @vals) {
31                 my $val = join('|', @vals);
32                 return if $self->{uniq_only}
33                         && defined $self->{uniq}->{$key}
34                         && $self->{uniq}->{$key} eq $val;
35
36                 $self->{uniq}->{$key} = $val;
37         } else {
38                 my $time = $self->now;
39                 return if $self->{uniq_only}
40                         && defined $self->{uniq}->{$key}
41                         && $time - $self->{uniq}->{$key} < $UNIQ_TIMEOUT;
42                 $self->{uniq}->{$key} = $time;
43         }
44
45         $self->do_print($key, @vals);
46 }
47
48 sub stringify_data {
49         my (@data) = @_;
50
51         return join(' ', map { sprintf("%02X", $_) } @data);
52 }
53
54 sub do_print {
55         my ($self, @data) = @_;
56
57         print join(' ', $self->now, @data), "\n";
58 }
59
60 sub bad_bytes {
61         my ($self, @data) = @_;
62
63         return if !$self->{dump_bad_bytes};
64         $self->do_print('bad_bytes', stringify_data(@data));
65 }
66
67 sub strange_packet {
68         my ($self, $name, @data) = @_;
69
70         return if !$self->{dump_strage};
71         $self->do_print('strange', $name, stringify_data(@data));
72 }
73
74 sub unknown_packet {
75         my ($self, @data) = @_;
76
77         $self->do_print('unknown_packet', stringify_data(@data));
78 }
79
80 sub bus_free_time {
81         my ($self, @data) = @_;
82
83         $self->cond_print('bus_free_time', @data);
84 }
85
86 sub car_programming {
87         my ($self, @data) = @_;
88
89         $self->cond_print('car_programming', @data);
90 }
91
92 sub reset {
93         my ($self, @data) = @_;
94
95         $self->cond_print('reset', @data);
96 }
97
98 sub standings {
99         my ($self, @data) = @_;
100
101         $self->cond_print('standings', @data);
102 }
103
104 sub car_lap_time {
105         my ($self, $car, @data) = @_;
106
107         $self->cond_print('car_lap_time_' . $car, @data);
108 }
109
110 sub race_setup {
111         my ($self, @data) = @_;
112
113         $self->cond_print('race_setup', @data);
114 }
115
116 sub fuel_level {
117         my ($self, @data) = @_;
118
119         my @newdata;
120         if ($self->{prev_fuel_levels}) {
121                 for my $i (0..5) {
122                         if ($self->{prev_fuel_levels}->[$i] < $data[$i]) {
123                                 push @newdata, $data[$i] . '+';
124                         } else {
125                                 push @newdata, $data[$i] . ' ';
126                         }
127                 }
128         }
129         $self->{prev_fuel_levels} = \@data;
130                         
131         $self->cond_print('fuel_level', @newdata);
132 }
133
134 sub brake_set {
135         my ($self, @data) = @_;
136
137         $self->cond_print('brake_set', @data);
138 }
139
140 sub qualification {
141         my ($self, @data) = @_;
142
143         $self->cond_print('qualification', @data);
144 }
145
146 sub end_of_race {
147         my ($self, @data) = @_;
148
149         $self->cond_print('end_of_race', @data);
150 }
151
152 sub race_start {
153         my ($self, @data) = @_;
154
155         $self->cond_print('race_start', @data);
156 }
157
158 sub display_change {
159         my ($self, @data) = @_;
160
161         $self->cond_print('display_change', @data);
162 }
163
164 sub finish_line {
165         my ($self, $regular, @cars) = @_;
166
167         for my $car (@cars) {
168                 $self->cond_print('finish_line_' . $car, $regular);
169         }
170 }
171
172 sub controller_status {
173         my ($self, @ctrls) = @_;
174
175         my @data;
176         for my $c (@ctrls) {
177                 if (!defined $c) {
178                         push @data, '-';
179                         next;
180                 }
181
182                 push @data, sprintf('% 2d', $c->{throttle})
183                         . ($c->{button} ? '/' : '.');
184                 # Ignore lights for now
185         }
186
187         $self->cond_print('controller', @data);
188 }
189
190 1;