File Coverage

blib/lib/AnyEvent/SerialPort.pm
Criterion Covered Total %
statement 44 44 100.0
branch 7 8 87.5
condition n/a
subroutine 10 10 100.0
pod 2 2 100.0
total 63 64 98.4


line stmt bran cond sub pod time code
1 1     1   1345 use strict;
  1         2  
  1         32  
2 1     1   5 use warnings;
  1         2  
  1         58  
3             package AnyEvent::SerialPort;
4             {
5             $AnyEvent::SerialPort::VERSION = '1.130171';
6             }
7              
8 1     1   6 use base 'AnyEvent::Handle';
  1         10  
  1         1253  
9              
10             use constant {
11 1         65 DEBUG => $ENV{ANYEVENT_SERIALPORT_DEBUG},
12 1     1   27522 };
  1         2  
13              
14 1     1   6 use Carp qw/croak carp/;
  1         2  
  1         61  
15 1     1   367 use Device::SerialPort qw/:PARAM :STAT 0.07/;
  1         214  
  1         28  
16 1     1   6 use Fcntl;
  1         2  
  1         365  
17 1     1   6 use Symbol qw(gensym);
  1         2  
  1         367  
18              
19             # ABSTRACT: AnyEvent::Handle subclass for serial ports
20              
21              
22             sub new {
23 4     4 1 4598 my $pkg = shift;
24 4         13 my %p = @_;
25 4 100       200 croak "Parameter serial_port is required" unless (exists $p{serial_port});
26              
27             # allow just a device name - to use defaults or array reference with
28             # device and settings
29 3         9 my $dev = delete $p{serial_port};
30 3         5 my @settings;
31 3 100       9 if (ref $dev) {
32 1         4 @settings = @$dev;
33 1         2 $dev = shift @settings;
34             }
35              
36 3         10 my $fh = gensym();
37 3 50       53 my $s = tie *$fh, 'Device::SerialPort', $dev or
38             croak "Could not tie serial port, $dev, to file handle: $!";
39              
40 3         42 foreach my $setting ([ baudrate => 9600 ],
41             [ databits => 8 ],
42             [ parity => 'none' ],
43             [ stopbits => 1 ],
44             [ datatype => 'raw' ],
45             @settings
46             ) {
47 16         96 my ($setter, @v) = @$setting;
48 16         75 $s->$setter(@v);
49             }
50 3         38 $s->write_settings();
51 3 100       272 sysopen($fh, $dev, O_RDWR|O_NOCTTY|O_NDELAY) or
52             croak "sysopen of '$dev' failed: $!";
53 2         17 $fh->autoflush(1);
54 2         97 my $self = $pkg->SUPER::new(fh => $fh, %p);
55 2         5912 $self->{serial_port} = $s;
56 2         9 $self;
57             }
58              
59              
60             sub serial_port {
61 2     2 1 1017 shift->{serial_port}
62             }
63              
64             1;
65              
66             __END__