/[RFID]/cpr-m02.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /cpr-m02.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 82 by dpavlin, Fri Jul 9 23:10:05 2010 UTC revision 87 by dpavlin, Fri Jul 16 13:05:24 2010 UTC
# Line 10  use Getopt::Long; Line 10  use Getopt::Long;
10  use File::Slurp;  use File::Slurp;
11  use JSON;  use JSON;
12  use POSIX qw(strftime);  use POSIX qw(strftime);
13    use Time::HiRes;
14    
15  use IO::Socket::INET;  use IO::Socket::INET;
16    
17  my $debug = 2;  my $debug = 0;
18    
19  my $tags_data;  my $tags_data;
20  my $tags_security;  my $tags_security;
# Line 280  sub cpr_m02_checksum { Line 281  sub cpr_m02_checksum {
281                                  $crc = $crc >> 1;                                  $crc = $crc >> 1;
282                          }                          }
283                  }                  }
284                  warn sprintf('%d %04x', $i, $crc & 0xffff);  #               warn sprintf('%d %04x', $i, $crc & 0xffff);
285          }          }
286    
287          return pack('v', $crc);          return pack('v', $crc);
288  }  }
289    
290    sub cpr_psst_wait {
291            # Protocol Start Synchronization Time (PSST): 5ms < data timeout 12 ms
292            Time::HiRes::sleep 0.005;
293    }
294    
295  sub cpr {  sub cpr {
296          my $hex = shift;          my ( $hex, $description, $coderef ) = @_;
297          my $bytes = str2bytes($hex);          my $bytes = str2bytes($hex);
298          my $len = pack( 'c', length( $bytes ) + 3 );          my $len = pack( 'c', length( $bytes ) + 3 );
299          my $send = $len . $bytes;          my $send = $len . $bytes;
300          my $checksum = cpr_m02_checksum($send);          my $checksum = cpr_m02_checksum($send);
301          $send .= $checksum;          $send .= $checksum;
302    
303          warn ">> ", as_hex( $send );          warn ">> ", as_hex( $send ), "\t\t[$description]\n";
304          writechunk( $send );          $port->write( $send );
305          my $r_len = read_bytes( 1, 'response length' );  
306          $r_len = ord($r_len) - 1;          cpr_psst_wait;
307          my $data = read_bytes( $r_len, 'data' );  
308          warn "<< ", as_hex( $data );          my $r_len = $port->read(1);
309    
310            while ( ! $r_len ) {
311                    warn "# wait for response length 5ms\n";
312                    cpr_psst_wait;
313                    $r_len = $port->read(1);
314            }
315    
316            my $data_len = ord($r_len) - 1;
317            my $data = $port->read( $data_len );
318            warn "<< ", as_hex( $r_len . $data ),"\n";
319    
320            cpr_psst_wait;
321    
322            $coderef->( $data ) if $coderef;
323    
324    }
325    
326    # FF = COM-ADDR any
327    
328    cpr( 'FF  52 00',       'Boud Rate Detection' );
329    
330    cpr( 'FF  65',          'Get Software Version' );
331    
332    cpr( 'FF  66 00',       'Get Reader Info - General hard and firware' );
333    
334    cpr( 'FF  69',          'RF Reset' );
335    
336    
337    sub cpr_read {
338            my $uid = shift;
339            my $hex_uid = as_hex($uid);
340    
341            cpr( "FF  B0 23  01  $hex_uid 00 04", "Read Multiple Blocks $hex_uid" );
342    #       cpr( "FF  B0 2B  01  $hex_uid", "Get System Information $hex_uid" );
343    }
344    
345    
346    my $inventory;
347    
348    while(1) {
349    
350    cpr( 'FF  B0  01 00', 'ISO - Inventory', sub {
351            my $data = shift;
352            my $data_sets = ord(substr($data,3,1));
353            $data = substr($data,4);
354            foreach ( 1 .. $data_sets ) {
355                    my $tr_type = substr($data,0,1);
356                    die "FIXME only TR-TYPE=3 ISO 15693 supported" unless $tr_type eq "\x03";
357                    my $dsfid   = substr($data,1,1);
358                    my $uid     = substr($data,2,8);
359                    $inventory->{$uid}++;
360                    $data = substr($data,10);
361                    warn "# TAG $_ ",as_hex( $tr_type, $dsfid, $uid ),$/;
362    
363                    cpr_read( $uid );
364            }
365            warn "inventory: ",dump($inventory);
366    });
367    
368  }  }
369    
370  cpr( '00  52 00' );  #cpr( '', '?' );
371    
372  exit;  exit;
373  # initial hand-shake with device  # initial hand-shake with device
# Line 654  sub read_bytes { Line 719  sub read_bytes {
719                  my ( $c, $b ) = $port->read(1);                  my ( $c, $b ) = $port->read(1);
720                  die "no bytes on port: $!" unless defined $b;                  die "no bytes on port: $!" unless defined $b;
721                  warn "## got $c bytes: ", as_hex($b), "\n";                  warn "## got $c bytes: ", as_hex($b), "\n";
722                    last if $c == 0;
723                  $data .= $b;                  $data .= $b;
724          }          }
725          $desc ||= '?';          $desc ||= '?';

Legend:
Removed from v.82  
changed lines
  Added in v.87

  ViewVC Help
Powered by ViewVC 1.1.26