]> www.fi.muni.cz Git - slotcarman.git/blob - SCX/Reader.pm
Make the main app use SCX::Parser
[slotcarman.git] / SCX / Reader.pm
1 #!/usr/bin/perl -w
2
3 package SCX::Reader;
4
5 use strict;
6
7 use Time::HiRes qw(time);
8 use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK O_RDONLY);
9
10 our $PACKET_SIZE = 9; # 9 bytes + 0x05
11
12 sub new {
13         my ($class, $args) = @_;
14
15         my $filename = $args->{filename}
16                 or die "filename not specified";
17         
18         my $parser = $args->{parser}
19                 or die "parser not specified";
20
21         my $fh;
22
23         if ($filename eq '-') {
24                 open($fh, '<&=STDIN');
25                 my $flags = fcntl($fh, F_GETFL, 0);
26                 fcntl($fh, F_SETFL, $flags | O_NONBLOCK);
27         } else {
28                 system 'stty', '-F', $filename, '115200', 'raw';
29                 if ($?) {
30                         die "stty died with code $? (no permissions?)";
31                 }
32
33                 sysopen($fh, $filename, O_RDONLY|O_NONBLOCK)
34                         or die "Can't open $filename: $!";
35         }
36
37         my $self = {
38                 filename  => $filename,
39                 fh        => $fh,
40                 parser    => $parser,
41         };
42
43         bless $self, $class;
44
45         return $self;
46 }
47
48 sub fh { return shift->{fh}; }
49
50 sub read {
51         my ($self) = @_;
52
53         my $data;
54         my $bytes_read = sysread $self->fh, $data, $PACKET_SIZE;
55         die "Read error on $self->{filename}: $!"
56                 if !$bytes_read;
57
58         my $now = time;
59
60         my @bytes = unpack("C*", $data);
61
62         $self->{parser}->add_data($now, @bytes);
63 }
64
65 1;
66