6 use Data::Dump qw(dump);
9 use Biblio::RFID::Reader;
10 use Biblio::RFID::RFID501;
14 my $evolis_dir = '/home/dpavlin/klin/Printer-EVOLIS'; # FIXME
15 use lib '/home/dpavlin/klin/Printer-EVOLIS/lib';
16 use Printer::EVOLIS::Parallel;
24 my $log_print = 'log.print';
25 mkdir $log_print unless -d $log_print;
29 'reader=s', => \$reader,
34 die "Usage: $0 print.txt\n" unless @ARGV;
38 foreach my $log_path ( glob( "$log_print/*.txt" ) ) {
39 warn "# loading $log_path";
40 open( my $in, '<', $log_path ) || die $!;
43 my ( $date, $sid, $nr ) = split(/,/,$_,3);
44 $programmed->{ $sid } = $nr;
45 $numbers->{ $nr } = $sid;
49 warn "# ", scalar keys %$numbers, " programmed cards found\n";
53 warn "# reading tab-delimited input: number login\@domain name surname\n";
56 my @a = split(/\t/,$_);
57 die "invalid: @a in line $_" if $a[0] !~ m/\d{12}/ && $a[1] !~ m/\@/;
58 push @queue, [ @a ] if ! $numbers->{ $a[0] } || $ENV{REPRINT};
62 @queue = sort { $b->[0] <=> $a->[0] } @queue;
64 print "# queue ", dump @queue;
66 my $rfid = Biblio::RFID::Reader->new( $reader );
67 $Biblio::RFID::debug = $debug;
73 , uc unpack('H2', $rfid->afi($tag))
75 , dump( $rfid->to_hash( $tag ) )
81 my @t = localtime(time);
82 return sprintf "%04d-%02d-%02dT%02d:%02d:%02d", $t[5]+1900,$t[4]+1,$t[3],$t[2],$t[1],$t[0];
88 my $log_path = "$log_print/" . iso_date . ".txt";
89 die "$log_path exists" if -e $log_path;
92 my ( $tag, $number ) = @_;
93 open(my $log, '>>', $log_path) || die "$log_path: $!";
95 print $log "$date,$tag,$number\n";
97 print "LOG $date $tag $number\n";
100 while ( $rfid->tags ) {
101 print "ERROR: remove all tags from output printer tray\n";
108 my @visible = $rfid->tags(
111 print localtime()." enter ", eval { tag($tag) };
114 if ( ! $programmed->{$tag} ) {
115 my $card = shift @queue;
116 my $number = $card->[0];
117 print "PROGRAM $tag $number\n";
121 $rfid->write_blocks( $tag => Biblio::RFID::RFID501->from_hash({ content => $number }) );
122 $rfid->write_afi( $tag => chr($afi) ) if $afi;
125 warn "RETRY PROGRAM $tag $number\n";
129 write_log $tag => $number;
130 $programmed->{$tag} = $number;
132 render_card; # pre-render next one
139 print_card if $programmed->{$tag};
143 warn localtime()." visible: ",join(' ',@visible),"\n";
151 $counters->{$_} = $p->command("Rco;$_") foreach ( qw/p c a m n l b e f i k s/ );
156 return unless @queue;
157 my @data = @{$queue[0]};
160 if ( $ENV{REPRINT} ) {
161 unlink $_ foreach glob("out/$nr.*");
165 if ( ! ( -e "out/$nr.front.pbm" && -e "out/$nr.back.pbm" ) ) {
166 print "RENDER @data\n";
167 system "$evolis_dir/scripts/inkscape-render.pl", "$evolis_dir/card/ffzg-2018-old-cards.svg", @data;
174 print "QUEUE EMPTY - printing finished\n";
175 print "$log_path ", -s $log_path, " bytes created\n";
179 my @data = @{$queue[0]};
181 print "PRINT @data\n";
183 my $p = Printer::EVOLIS::Parallel->new( '/dev/usb/lp0' );
185 my $before = _counters $p;
189 print "insert card ", $p->command( 'Si' ),$/;
191 print "eject card ", $p->command( 'Ser' ),$/;
196 system "$evolis_dir/scripts/evolis-driver.pl out/$nr.front.pbm out/$nr.back.pbm > /dev/usb/lp0";
200 my $after = _counters $p;
202 if ( $before->{p} = $after->{p} - 2 ) {
203 print "OK printerd card $nr\n";
205 die "ERROR printing card $nr\n";
208 warn "# counters ", dump( $before, $after );