RFID_LISTEN=host:port to listen for TCP socket from reader
[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         if ( my $listen = $ENV{RFID_LISTEN} ) {
65                 my $server = Biblio::RFID::Reader::INET->new(
66                         Proto     => 'tcp',
67                         LocalAddr => $listen,
68                         Listen    => SOMAXCONN,
69                         Reuse     => 1
70                 );
71                                                                           
72                 die "can't setup server $listen: $!" unless $server;
73
74                 warn "RFID: waiting for reader connection to $listen";
75
76                 my $port = $server->accept();
77                 $port->autoflush(1);
78
79                 warn "## LISTEN $listen ", ref($port);
80                 $self->{port} = $port;
81                 $self->init;
82
83                 return $port;
84
85         }
86
87         my $settings = $self->serial_settings;
88         my @devices  = $ENV{RFID_DEVICE} ? ( $ENV{RFID_DEVICE} ) : glob '/dev/ttyUSB* /dev/ttyS*';
89         warn "# port devices ",dump(@devices);
90
91         foreach my $device ( @devices ) {
92
93                 next if $serial_device->{$device};
94
95                 if ( my $port = Device::SerialPort->new($device) ) {
96
97                         foreach my $opt ( qw/handshake baudrate databits parity stopbits/ ) {
98                                 $port->$opt( $settings->{$opt} );
99                         }
100
101                         $self->{port} = $port;
102
103                         warn "# probe by init $device ",ref($self);
104                         if ( $self->init ) {
105                                 warn "init OK ", ref($self), " $device settings ",dump $settings;
106                                 $serial_device->{$device} = $port;
107                                 last;
108                         } else {
109                                 $self->{port} = 0;
110                         }
111                 }
112         }
113
114         warn "# serial_device ",dump($serial_device);
115
116         return $self->{port};
117 }
118
119 1
120 __END__
121
122 =head1 SEE ALSO
123
124 L<Biblio::RFID::Reader::3M810>
125
126 L<Biblio::RFID::Reader::CPRM01>
127
128 L<Biblio::RFID::Reader::API>
129