#!/usr/bin/perl -w package SCX::Reader; use strict; use Time::HiRes qw(time); use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK O_RDONLY); our $PACKET_SIZE = 9; # 9 bytes + 0x05 sub new { my ($class, $args) = @_; my $filename = $args->{filename} or die "filename not specified"; my $parser = $args->{parser} or die "parser not specified"; my $fh; if ($filename eq '-') { open($fh, '<&=STDIN'); my $flags = fcntl($fh, F_GETFL, 0); fcntl($fh, F_SETFL, $flags | O_NONBLOCK); } else { system 'stty', '-F', $filename, '115200', 'raw'; if ($?) { die "stty died with code $? (no permissions?)"; } sysopen($fh, $filename, O_RDONLY|O_NONBLOCK) or die "Can't open $filename: $!"; } my $self = { filename => $filename, fh => $fh, parser => $parser, }; bless $self, $class; return $self; } sub fh { return shift->{fh}; } sub read { my ($self) = @_; my $data; my $bytes_read = sysread $self->fh, $data, $PACKET_SIZE; die "Read error on $self->{filename}: $!" if !$bytes_read; my $now = time; my @bytes = unpack("C*", $data); $self->{parser}->add_data($now, @bytes); } 1;