added --test option and real printing
[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 my $evolis_dir = '/home/dpavlin/klin/Printer-EVOLIS'; # FIXME
14 use lib '/home/dpavlin/klin/Printer-EVOLIS/lib';
15 use Printer::EVOLIS::Parallel;
16
17 my $loop = 1;
18 my $reader = '3M';
19 my $debug = 0;
20 my $afi   = 0x42;
21 my $test  = 0;
22
23 GetOptions(
24         'loop!'     => \$loop,
25         'reader=s', => \$reader,
26         'debug+'    => \$debug,
27         'test+'     => \$test,
28 ) || die $!;
29
30 die "Usage: $0 print.txt\n" unless @ARGV;
31
32 my @queue;
33 my @done;
34 warn "# reading tab-delimited input\n";
35 while(<>) {
36         chomp;
37         my @a = split(/\t/,$_);
38         push @queue, [ @a ];
39 }
40
41 print "# queue ", dump @queue;
42
43 my $rfid = RFID::Biblio::Reader->new( $reader );
44 $RFID::Biblio::debug = $debug;
45
46 sub tag {
47         my $tag = shift;
48         return $tag
49                 , " AFI: "
50                 , uc unpack('H2', $rfid->afi($tag))
51                 , " "
52                 , dump( RFID::Biblio::RFID501->to_hash( $rfid->blocks($tag) ) )
53                 , $/
54                 ;
55 }
56
57 sub print_card;
58
59 while ( $rfid->tags ) {
60         print "ERROR: remove all tags from output printer tray\n";
61         sleep 1;
62 }
63
64 print_card;
65
66 my $persistant_path = '/tmp/programmed.storable';
67 my $programmed;
68 if ( -e $persistant_path ) {
69         $programmed = retrieve($persistant_path);
70         warn "# loaded ", scalar keys %$programmed, " programmed cards\n";
71 }
72
73 do {
74         my @visible = $rfid->tags(
75                 enter => sub {
76                         my $tag = shift;
77                         print localtime()." enter ", eval { tag($tag) };
78                         return if $@;
79
80                         if ( ! $programmed->{$tag} ) {
81                                 my $card = shift @queue;
82                                 my $number = $card->[0];
83                                 print "PROGRAM $tag $number\n";
84                                 $rfid->write_blocks( $tag => RFID::Biblio::RFID501->from_hash({ content => $number }) );
85                                 $rfid->write_afi( $tag => chr($afi) ) if $afi;
86
87                                 $programmed->{$tag} = $number;
88                                 store $programmed, $persistant_path;
89                         }
90
91                 },
92                 leave => sub {
93                         my $tag = shift;
94
95                         print_card if $programmed->{$tag};
96                 },
97         );
98
99         warn localtime()." visible: ",join(' ',@visible),"\n";
100
101         sleep 1;
102 } while $loop;
103
104 sub print_card {
105
106         if ( ! @queue ) {
107                 print "QUEUE EMPTY - printing finished\n";
108                 exit;
109         }
110
111         my @data = @{$queue[0]};
112         print "XXX print_card @data\n";
113
114         if ( $test ) {
115
116                 my $p = Printer::EVOLIS::Parallel->new( '/dev/usb/lp0' );
117                 print "insert card ", $p->command( 'Si' ),$/;
118                 sleep 1;
119                 print "eject card ", $p->command( 'Ser' ),$/;
120
121         } else {
122
123                 system "$evolis_dir/scripts/inkscape-render.pl", "$evolis_dir/card/ffzg-2010.svg", @data;
124                 my $nr = $data[0];
125                 system "$evolis_dir/scripts/evolis-driver.pl out/$nr.front.pbm out/$nr.back.pbm > /dev/usb/lp0";
126
127         }
128
129 }
130