X-Git-Url: http://git.rot13.org/?p=Biblio-RFID.git;a=blobdiff_plain;f=lib%2FRFID%2FSerial%2F3M810.pm;h=8fffb787632fa2d875e1c74d699bd5b0923cca62;hp=880271103a17220351d9f1443c967db63c5f7f13;hb=3cb0945eb525dbb10ce4b0f4b1f7bdb34911e8b4;hpb=c3476d1cfedfd1770abaa6da174c416037550d5c diff --git a/lib/RFID/Serial/3M810.pm b/lib/RFID/Serial/3M810.pm index 8802711..8fffb78 100644 --- a/lib/RFID/Serial/3M810.pm +++ b/lib/RFID/Serial/3M810.pm @@ -200,6 +200,38 @@ sub read_blocks { return $tag_blocks; } +sub write_blocks { + my $tag = shift; + $tag = shift if ref $tag; + my $data = join('', @_); + + warn "## write_blocks ",dump($tag,$data); + + if ( length($data) % 4 ) { + $data .= '\x00' x ( 4 - length($data) % 4 ); + warn "# padded data to ",dump($data); + } + + my $hex_data = as_hex $data; + my $blocks = sprintf('%02x', length($data) / 4 ); + + cmd( + "04 $tag 00 $blocks 00 $hex_data", "write_blocks $tag [$blocks] $hex_data", sub { + my $data = shift; + if ( my $rest = _matched $data => '04 00' ) { + my $tag = substr($rest,0,8); + my $blocks = substr($rest,8,1); + warn "# WRITE ",as_hex($tag), " [$blocks]\n"; + } elsif ( my $rest = _matched $data => '04 06' ) { + warn "ERROR ",as_hex($rest); + } else { + die "UNSUPPORTED"; + } + } + ); + +} + sub read_afi { my $tag = shift; $tag = shift if ref $tag; @@ -223,7 +255,38 @@ sub read_afi { warn "IGNORED ",as_hex($data); } }); - return as_hex $afi; + warn "## read_afi ",dump($tag, $afi); + return $afi; +} + +sub write_afi { + my $tag = shift; + $tag = shift if ref $tag; + my $afi = shift || die "no afi?"; + + $afi = as_hex $afi; + + cmd( + "09 $tag $afi", "write_afi $tag $afi", sub { + my $data = shift; + + if ( my $rest = _matched $data => '09 00' ) { + + my $tag = substr($rest,0,8); + $afi = substr($rest,8,1); + + warn "# SECURITY ", hex_tag($tag), " AFI: ", as_hex($afi); + + } elsif ( my $rest = _matched $data => '0A 06' ) { + warn "ERROR writing AFI to $tag ", as_hex($data); + undef $afi; + } else { + warn "IGNORED ",as_hex($data); + undef $afi; + } + }); + warn "## write_afi ", dump( $tag, $afi ); + return $afi; } 1