make programming die-proof
[Biblio-RFID.git] / scripts / print.pl
index ee762cf..f067038 100755 (executable)
@@ -15,6 +15,7 @@ use Printer::EVOLIS::Parallel;
 my $loop = 1;
 my $reader = '3M';
 my $debug = 0;
+my $afi   = 0x42;
 
 GetOptions(
        'loop!'     => \$loop,
@@ -49,8 +50,6 @@ sub tag {
                ;
 }
 
-my @stack;
-
 sub print_card;
 
 while ( $rfid->tags ) {
@@ -60,21 +59,30 @@ while ( $rfid->tags ) {
 
 print_card;
 
+my $programmed;
+
 do {
        my @visible = $rfid->tags(
                enter => sub {
                        my $tag = shift;
-                       print localtime()." enter ", tag($tag);
-                       push @stack, [ 'enter', $tag ];
-                       warn dump @stack;
+                       print localtime()." enter ", eval { tag($tag) };
+                       return if $@;
+
+                       if ( ! $programmed->{$tag} ) {
+                               my $card = shift @queue;
+                               my $number = $card->[0];
+                               print "PROGRAM $tag $number\n";
+                               $rfid->write_blocks( $tag => RFID::Biblio::RFID501->from_hash({ content => $number }) );
+                               $rfid->write_afi( $tag => chr($afi) ) if $afi;
+
+                               $programmed->{$tag} = $number;
+                       }
 
-                       print_card;
                },
                leave => sub {
                        my $tag = shift;
-                       print localtime()." leave ", tag($tag);
-                       push @stack, [ 'leave', $tag ];
-                       warn dump @stack;
+
+                       print_card if $programmed->{$tag};
                },
        );
 
@@ -85,10 +93,11 @@ do {
 
 sub print_card {
 
-       print "XXX print_card\n";
+       print "XXX print_card @{$queue[0]}\n";
 
        my $p = Printer::EVOLIS::Parallel->new( '/dev/usb/lp0' );
-       print "insert card ", $p->command( 'Si' );
-       print "eject card ", $p->command( 'Ser' );
+       print "insert card ", $p->command( 'Si' ),$/;
+       sleep 1;
+       print "eject card ", $p->command( 'Ser' ),$/;
 }