X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=DWeather%2Flib%2FDWeather%2FSerial.pm;h=cbd6cbebc244694485f9be027328b903937d2d5f;hb=4f77e5fc357ae3bce202fe32fe4a5333aa1ee446;hp=44da24f7cbe7a2fde0db1f00822deb8d852d22c7;hpb=dc4a7b485f2c395471e3f7b64667da3625dcdc64;p=dweather.git diff --git a/DWeather/lib/DWeather/Serial.pm b/DWeather/lib/DWeather/Serial.pm index 44da24f..cbd6cbe 100644 --- a/DWeather/lib/DWeather/Serial.pm +++ b/DWeather/lib/DWeather/Serial.pm @@ -4,35 +4,52 @@ use strict; -package Serial; +package DWeather::Serial; use POSIX qw(:termios_h); use Fcntl; -our @ISA = qw(IO::File); +use AnyEvent; +use base qw(AnyEvent::Handle); -# Linux-specific Baud-Rates +# Linux-specific Baud-Rates (for reference really) use constant B57600 => 0010001; use constant B115200 => 0010002; use constant B230400 => 0010003; use constant B460800 => 0010004; use constant CRTSCTS => 020000000000; +# +# my $h = DWeather::Serial->new("/dev/ttyXXX", 19200 [,cs7] [,odd] [,rtscts]); +# +# all parameters are optional +# +# you are expected to add AE callbacks as required, all this module +# does is create the AE::Handle and associates an IO::File handle with it +# +# default is /dev/ttyS0, 9600 8N1 no handshaking +# +# the tty is set to raw mode. +# +# returns a subclassed AE::Handle +# sub new { my $pkg = shift; my $class = ref $pkg || $pkg; my $device = shift || "/dev/ttyS0"; - my $self = $pkg->SUPER::new($device, O_RDWR|O_NOCTTY|O_EXCL|O_NDELAY) || return; + my $fh = IO::File->new($device, O_RDWR|O_NOCTTY|O_EXCL|O_NDELAY) || return; + my $self = $class->new(fh => $fh); # get my attributes - $$self->{ORIGTERM} = POSIX::Termios->new(); - my $term = $$self->{TERM} = POSIX::Termios->new(); - $$self->{ORIGTERM}->getattr(fileno($self)); - $term->getattr(fileno($self)); + $self->{ORIGTERM} = POSIX::Termios->new(); + my $term = $self->{TERM} = POSIX::Termios->new(); + $self->{ORIGTERM} = $self->{ORIGTERM}->getattr(fileno($fh)); + $term->getattr(fileno($fh)); my ($speed) = grep {/^\d+$/} @_; + $speed ||= 9600; my $baud; { no strict 'refs'; @@ -62,29 +79,30 @@ sub new $cflag |= CRTSCTS if grep /rtscts$/, $@; $term->setcflag($cflag); $term->setlflag($lflag); $term->setoflag($oflag); $term->setiflag($iflag); - $term->setattr(fileno($self), TCSANOW); + $term->setattr(fileno($fh), TCSANOW); + $self->{device} = $device; + $self->{speed} = $speed; return $self; } sub getattr { my $self = shift; - $$self->{TERM}->getattr; - return $$self->{TERM}; + $self->{TERM}->getattr(fileno($self->fh)); + return $self->{TERM}; } sub setattr { my $self = shift; - my $attr = shift || $$self->{TERM}; - $attr->setattr(fileno($self), &POSIX::TCSANOW); + my $attr = shift || $self->{TERM}; + $attr->setattr(fileno($self->fh), &POSIX::TCSANOW); } -sub close +sub DESTROY { my $self = shift; - $self->setattr($$self->{ORIGTERM}); - $self->SUPER::close; + $self->setattr($self->{ORIGTERM}); } 1;