added RFID_TCP to query serial readers over tcp socket
[Biblio-RFID.git] / lib / Biblio / RFID / Reader / INET.pm
1 package Biblio::RFID::Reader::INET;
2 use warnings;
3 use strict;
4 use base 'IO::Socket::INET';
5
6 use IO::Socket::INET;
7 use Time::HiRes qw(ualarm);
8 use Data::Dump qw(dump);
9
10 =head1 NAME
11
12 Biblio::RFID::Reader::INET - emulate serial port over TCP socket
13
14 =cut
15
16 sub write {
17         my $self = shift;
18         my $count = $self->SUPER::print(@_);
19         $self->flush;
20 #warn "XX ",ref($self), " write response: $count ", dump(@_);
21         return $count;
22 }
23
24 our $read_char_time = 1;
25 sub read_char_time { $read_char_time = $_[1] * 1_000 || 1_000_000 };
26 sub read_const_time {};
27
28 sub read {
29         my $self = shift;
30         my $len = shift || die "no length?";
31 #warn "XX ",ref($self), " read $len timeout $read_char_time";
32         my $buffer;
33         eval {
34                 local $SIG{ALRM} = sub { die "read timeout" };
35
36                 #warn "## read_serial $len timeout $read_char_time\n";
37
38                 ualarm $read_char_time;
39                 $len = $self->SUPER::read( $buffer, $len );
40                 ualarm 0;
41         };
42         if ( $@ ) {
43                 warn "ERROR: $@";
44                 $len = 0;
45         }
46
47         #warn "## read $len ",dump($buffer);
48         return ( $len, $buffer );
49 }
50
51 1;
52 __END__
53
54 =head1 SEE ALSO
55
56 L<Biblio::RFID::Reader::Serial>
57