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