X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=scripts%2Fprint.pl;h=701447eb197b09c593b69229f619c49d8d05dffb;hb=4097fd6b4aceb437839c3b45440cdb9061ee6088;hp=cf76823fa84dc9d3f54202ccd4b747610e58c925;hpb=47777d7d30bd7b3632234e8a93391970336574db;p=Biblio-RFID.git diff --git a/scripts/print.pl b/scripts/print.pl index cf76823..701447e 100755 --- a/scripts/print.pl +++ b/scripts/print.pl @@ -32,17 +32,21 @@ GetOptions( die "Usage: $0 print.txt\n" unless @ARGV; -my $persistant_path = '/tmp/programmed.storable'; my $programmed; my $numbers; -if ( -e $persistant_path ) { - $programmed = retrieve($persistant_path); - warn "# loaded ", scalar keys %$programmed, " programmed cards\n"; - foreach my $tag ( keys %$programmed ) { - $numbers->{ $programmed->{$tag} } = $tag; +foreach my $log_path ( glob( "$log_print/*.txt" ) ) { + warn "# loading $log_path"; + open( my $in, '<', $log_path ) || die $!; + while(<$in>) { + chomp; + my ( $date, $sid, $nr ) = split(/,/,$_,3); + $programmed->{ $sid } = $nr; + $numbers->{ $nr } = $sid; } } +warn "# ", scalar keys %$numbers, " programmed cards found\n"; + my @queue; my @done; warn "# reading tab-delimited input: number login\@domain name surname\n"; @@ -53,6 +57,9 @@ while(<>) { push @queue, [ @a ] if ! $numbers->{ $a[0] }; } +# sort by card number +@queue = sort { $a->[0] <=> $b->[0] } @queue; + print "# queue ", dump @queue; my $rfid = Biblio::RFID::Reader->new( $reader ); @@ -75,10 +82,19 @@ sub iso_date { } sub print_card; +sub render_card; my $log_path = "$log_print/" . iso_date . ".txt"; die "$log_path exists" if -e $log_path; -open(my $log, '>', $log_path) || die "$log_path: $!"; + +sub write_log { + my ( $tag, $number ) = @_; + open(my $log, '>', $log_path) || die "$log_path: $!"; + my $date = iso_date; + print $log "$date,$tag,$number\n"; + close($log); + print "LOG $date $tag $number\n"; +} while ( $rfid->tags ) { print "ERROR: remove all tags from output printer tray\n"; @@ -98,13 +114,21 @@ do { my $card = shift @queue; my $number = $card->[0]; print "PROGRAM $tag $number\n"; - $rfid->write_blocks( $tag => Biblio::RFID::RFID501->from_hash({ content => $number }) ); - $rfid->write_afi( $tag => chr($afi) ) if $afi; + while ( 1 ) { + eval { + $rfid->write_blocks( $tag => Biblio::RFID::RFID501->from_hash({ content => $number }) ); + $rfid->write_afi( $tag => chr($afi) ) if $afi; + }; + last unless $!; + warn "RETRY PROGRAM $tag $number\n"; + sleep 1; + } + + write_log $tag => $number; $programmed->{$tag} = $number; - store $programmed, $persistant_path; - print $log iso_date, ",$tag,$number\n"; + render_card; # pre-render next one } }, @@ -120,32 +144,62 @@ do { sleep 1; } while $loop; +sub _counters { + my $p = shift; + my $counters; + $counters->{$_} = $p->command("Rco;$_") foreach ( qw/p c a m n l b e f i k s/ ); + return $counters; +} + +sub render_card { + return unless @queue; + my @data = @{$queue[0]}; + my $nr = $data[0]; + + if ( ! ( -e "out/$nr.front.pbm" && -e "out/$nr.front.pbm" ) ) { + print "RENDER @data\n"; + system "$evolis_dir/scripts/inkscape-render.pl", "$evolis_dir/card/ffzg-2010.svg", @data; + } +} + sub print_card { if ( ! @queue ) { print "QUEUE EMPTY - printing finished\n"; - close($log); print "$log_path ", -s $log_path, " bytes created\n"; exit; } my @data = @{$queue[0]}; - print "XXX print_card @data\n"; + my $nr = $data[0]; + print "PRINT @data\n"; + + my $p = Printer::EVOLIS::Parallel->new( '/dev/usb/lp0' ); + + my $before = _counters $p; if ( $test ) { - my $p = Printer::EVOLIS::Parallel->new( '/dev/usb/lp0' ); print "insert card ", $p->command( 'Si' ),$/; sleep 1; print "eject card ", $p->command( 'Ser' ),$/; } else { - system "$evolis_dir/scripts/inkscape-render.pl", "$evolis_dir/card/ffzg-2010.svg", @data; - my $nr = $data[0]; + render_card; system "$evolis_dir/scripts/evolis-driver.pl out/$nr.front.pbm out/$nr.back.pbm > /dev/usb/lp0"; } + my $after = _counters $p; + + if ( $before->{p} = $after->{p} - 2 ) { + print "OK printerd card $nr\n"; + } else { + die "ERROR printing card $nr\n"; + } + + warn "# counters ", dump( $before, $after ); + }