added RFID_TCP to query serial readers over tcp socket
[Biblio-RFID.git] / lib / Biblio / RFID / Reader / Serial.pm
1 package Biblio::RFID::Reader::Serial;
2
3 use warnings;
4 use strict;
5
6 use Device::SerialPort qw(:STAT);
7 use Biblio::RFID::Reader::INET;
8 use Data::Dump qw(dump);
9
10 =head1 NAME
11
12 Biblio::RFID::Reader::Serial - base class for serial or serial over TCP RFID readers
13
14 =head1 METHODS
15
16 =head2 new
17
18 Open serial port (if needed) and init reader
19
20 =cut
21
22 sub new {
23         my $class = shift;
24         my $self = {@_};
25         bless $self, $class;
26
27         $self->port && return $self;
28 }
29
30
31 =head2 port
32
33 Tries to open usb serial ports C</dev/ttyUSB*> and serial ports C</dev/ttyS*>
34
35   my $serial_obj = $self->port;
36
37 To try just one device use C<RFID_DEVICE=/dev/ttyUSB1> enviroment variable
38
39 If you want to define serial connection over TCP socket, you have to export
40 enviroment variable C<RFID_TCP=hostname:port>.
41
42 =cut
43
44 our $serial_device;
45
46 sub port {
47         my $self = shift;
48
49         warn "## port ",dump( $self->{port} );
50
51         return $self->{port} if defined $self->{port};
52
53         if ( my $tcp = $ENV{RFID_TCP} ) {
54                 my $port = Biblio::RFID::Reader::INET->new(
55                         PeerAddr => $tcp,
56                         Proto    => 'tcp'
57                 );
58                 warn "## TCP $tcp ", ref($port);
59                 $self->{port} = $port;
60                 $self->init;
61                 return $port;
62         }
63
64         my $settings = $self->serial_settings;
65         my @devices  = $ENV{RFID_DEVICE} ? ( $ENV{RFID_DEVICE} ) : glob '/dev/ttyUSB* /dev/ttyS*';
66         warn "# port devices ",dump(@devices);
67
68         foreach my $device ( @devices ) {
69
70                 next if $serial_device->{$device};
71
72                 if ( my $port = Device::SerialPort->new($device) ) {
73
74                         foreach my $opt ( qw/handshake baudrate databits parity stopbits/ ) {
75                                 $port->$opt( $settings->{$opt} );
76                         }
77
78                         $self->{port} = $port;
79
80                         warn "# probe by init $device ",ref($self);
81                         if ( $self->init ) {
82                                 warn "init OK ", ref($self), " $device settings ",dump $settings;
83                                 $serial_device->{$device} = $port;
84                                 last;
85                         } else {
86                                 $self->{port} = 0;
87                         }
88                 }
89         }
90
91         warn "# serial_device ",dump($serial_device);
92
93         return $self->{port};
94 }
95
96 1
97 __END__
98
99 =head1 SEE ALSO
100
101 L<Biblio::RFID::Reader::3M810>
102
103 L<Biblio::RFID::Reader::CPRM01>
104
105 L<Biblio::RFID::Reader::API>
106