9badbfe8518604d57ca6e29605459b1dca5fb8cb
[Biblio-RFID.git] / scripts / print.pl
1 #!/usr/bin/perl
2
3 use warnings;
4 use strict;
5
6 use Data::Dump qw(dump);
7 use Getopt::Long;
8 use lib 'lib';
9 use RFID::Biblio::Reader;
10 use RFID::Biblio::RFID501;
11 use Storable;
12
13 use lib '/home/dpavlin/klin/Printer-EVOLIS/lib';
14 use Printer::EVOLIS::Parallel;
15
16 my $loop = 1;
17 my $reader = '3M';
18 my $debug = 0;
19 my $afi   = 0x42;
20
21 GetOptions(
22         'loop!'     => \$loop,
23         'reader=s', => \$reader,
24         'debug+'    => \$debug,
25 ) || die $!;
26
27 die "Usage: $0 print.txt\n" unless @ARGV;
28
29 my @queue;
30 my @done;
31 warn "# reading tab-delimited input\n";
32 while(<>) {
33         chomp;
34         my @a = split(/\t/,$_);
35         push @queue, [ @a ];
36 }
37
38 print "# queue ", dump @queue;
39
40 my $rfid = RFID::Biblio::Reader->new( $reader );
41 $RFID::Biblio::debug = $debug;
42
43 sub tag {
44         my $tag = shift;
45         return $tag
46                 , " AFI: "
47                 , uc unpack('H2', $rfid->afi($tag))
48                 , " "
49                 , dump( RFID::Biblio::RFID501->to_hash( $rfid->blocks($tag) ) )
50                 , $/
51                 ;
52 }
53
54 sub print_card;
55
56 while ( $rfid->tags ) {
57         print "ERROR: remove all tags from output printer tray\n";
58         sleep 1;
59 }
60
61 print_card;
62
63 my $persistant_path = '/tmp/programmed.storable';
64 my $programmed;
65 if ( -e $persistant_path ) {
66         $programmed = retrieve($persistant_path);
67         warn "# loaded ", scalar keys %$programmed, " programmed cards\n";
68 }
69
70 do {
71         my @visible = $rfid->tags(
72                 enter => sub {
73                         my $tag = shift;
74                         print localtime()." enter ", eval { tag($tag) };
75                         return if $@;
76
77                         if ( ! $programmed->{$tag} ) {
78                                 my $card = shift @queue;
79                                 my $number = $card->[0];
80                                 print "PROGRAM $tag $number\n";
81                                 $rfid->write_blocks( $tag => RFID::Biblio::RFID501->from_hash({ content => $number }) );
82                                 $rfid->write_afi( $tag => chr($afi) ) if $afi;
83
84                                 $programmed->{$tag} = $number;
85                                 store $programmed, $persistant_path;
86                         }
87
88                 },
89                 leave => sub {
90                         my $tag = shift;
91
92                         print_card if $programmed->{$tag};
93                 },
94         );
95
96         warn localtime()." visible: ",join(' ',@visible),"\n";
97
98         sleep 1;
99 } while $loop;
100
101 sub print_card {
102
103         print "XXX print_card @{$queue[0]}\n";
104
105         my $p = Printer::EVOLIS::Parallel->new( '/dev/usb/lp0' );
106         print "insert card ", $p->command( 'Si' ),$/;
107         sleep 1;
108         print "eject card ", $p->command( 'Ser' ),$/;
109 }
110