foreach my $rfid ( @{ $self->{_readers} } ) {
if ( exists $triggers->{reader} ) {
- next unless $triggers->{reader}->($rfid);
+ if ( ! $triggers->{reader}->($rfid) ) {
+ # invalidate tags from other readers
+ if ( exists $self->{_tags} ) {
+ delete $self->{_tags}->{$_} foreach (
+ grep { $self->{_tags}->{$_}->{reader} eq ref $rfid } keys %{ $self->{_tags} }
+ );
+ }
+ next;
+ }
}
warn "# inventory on $rfid";
my $afi = shift || die "no afi?";
$afi = as_hex $afi;
+ my $retry = 0;
+
+retry:
cmd(
"09 $tag $afi", "write_afi $tag $afi", sub {
if ( my $rest = _matched $data => '09 00' ) {
my $tag_back = hex_tag substr($rest,0,8);
die "write_afi got $tag_back expected $tag" if $tag_back ne $tag;
- warn "# SECURITY ", hex_tag($tag), " AFI: ", as_hex($afi);
- } elsif ( $rest = _matched $data => '0A 06' ) {
- die "ERROR writing AFI to $tag ", as_hex($data);
+ warn "# SECURITY ", hex_tag($tag), " AFI: $afi";
+ } elsif ( $rest = _matched $data => '09 06' ) {
+ if ( $retry++ <= 30 ) { # FIXME lover this number?
+# warn "ERROR writing AFI $afi to $tag retry $retry\n";
+ goto retry;
+ }
+ die "ERROR writing AFI $afi to $tag ", as_hex($data);
} else {
die "IGNORED ",as_hex($data);
}
});
+
+ warn "INFO: tag $tag AFI $afi retry: $retry\n";
+
warn "## write_afi ", dump( $tag, $afi );
return $afi;
}
foreach my $tag ( $rfid->tags ) {
warn "visible $tag\n";
next unless $tag eq $sid;
- if ( $blank ) {
-warn dump( $blank );
+ if ( grep { defined $_ } values $blank ) {
my $type = ( grep { $blank->{$_} } keys %$blank )[0];
warn "BLANK $type $tag\n";
$rfid->write_blocks( $tag => Biblio::RFID::RFID501->$type );