/[RFID]/3m-810.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 /3m-810.pl

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

revision 29 by dpavlin, Mon Apr 6 13:10:40 2009 UTC revision 63 by dpavlin, Thu Feb 11 10:52:14 2010 UTC
# Line 8  use Data::Dump qw/dump/; Line 8  use Data::Dump qw/dump/;
8  use Carp qw/confess/;  use Carp qw/confess/;
9  use Getopt::Long;  use Getopt::Long;
10  use File::Slurp;  use File::Slurp;
11    use JSON;
12    use POSIX qw(strftime);
13    
14  use IO::Socket::INET;  use IO::Socket::INET;
15    
16  my $meteor_server = '192.168.1.13:4671';  my $debug = 0;
17    
18    my $tags_data;
19    my $tags_security;
20    my $visible_tags;
21    
22    my $meteor_server; # = '192.168.1.13:4671';
23  my $meteor_fh;  my $meteor_fh;
24    
25  sub meteor {  sub meteor {
# Line 19  sub meteor { Line 27  sub meteor {
27          push @a, scalar localtime() if $a[0] =~ m{^info};          push @a, scalar localtime() if $a[0] =~ m{^info};
28    
29          if ( ! defined $meteor_fh ) {          if ( ! defined $meteor_fh ) {
30                  warn "# open connection to $meteor_server";                  if ( $meteor_fh =
31                  $meteor_fh = IO::Socket::INET->new(                                  IO::Socket::INET->new(
32                                  PeerAddr => $meteor_server,                                          PeerAddr => $meteor_server,
33                                  Timeout => 1,                                          Timeout => 1,
34                  ) || warn "can't connect to meteor $meteor_server: $!"; # FIXME warn => die for production                                  )
35                  $meteor_fh = 0; # don't try again                  ) {
36                            warn "# meteor connected to $meteor_server";
37                    } else {
38                            warn "can't connect to meteor $meteor_server: $!";
39                            $meteor_fh = 0;
40                    }
41          }          }
42    
43          warn ">> meteor ",dump( @a );          if ( $meteor_fh ) {
44          print $meteor_fh "ADDMESSAGE test ",join('|',@a),"\n" if $meteor_fh;                  warn ">> meteor ",dump( @a );
45                    print $meteor_fh "ADDMESSAGE test ",join('|',@a),"\n"
46            }
47  }  }
48    
49  my $debug = 0;  my $listen_port = 9000;                  # pick something not in use
50    my $server_url  = "http://localhost:$listen_port";
51    
52    sub http_server {
53    
54            my $server = IO::Socket::INET->new(
55                    Proto     => 'tcp',
56                    LocalPort => $listen_port,
57                    Listen    => SOMAXCONN,
58                    Reuse     => 1
59            );
60                                                                      
61            die "can't setup server" unless $server;
62    
63            print "Server $0 ready at $server_url\n";
64    
65            sub static {
66                    my ($client,$path) = @_;
67    
68                    $path = "www/$path";
69                    $path .= 'rfid.html' if $path =~ m{/$};
70    
71                    return unless -e $path;
72    
73                    my $type = 'text/plain';
74                    $type = 'text/html' if $path =~ m{\.htm};
75                    $type = 'application/javascript' if $path =~ m{\.js};
76    
77                    print $client "HTTP/1.0 200 OK\r\nContent-Type: $type\r\n\r\n";
78                    open(my $html, $path);
79                    while(<$html>) {
80                            print $client $_;
81                    }
82                    close($html);
83    
84                    return $path;
85            }
86    
87            while (my $client = $server->accept()) {
88                    $client->autoflush(1);
89                    my $request = <$client>;
90    
91                    warn "WEB << $request\n" if $debug;
92    
93                    if ($request =~ m{^GET (/.*) HTTP/1.[01]}) {
94                            my $method = $1;
95                            my $param;
96                            if ( $method =~ s{\?(.+)}{} ) {
97                                    foreach my $p ( split(/[&;]/, $1) ) {
98                                            my ($n,$v) = split(/=/, $p, 2);
99                                            $param->{$n} = $v;
100                                    }
101                                    warn "WEB << param: ",dump( $param ) if $debug;
102                            }
103                            if ( my $path = static( $client,$1 ) ) {
104                                    warn "WEB >> $path" if $debug;
105                            } elsif ( $method =~ m{/scan} ) {
106                                    my $tags = scan_for_tags();
107                                    my $json = { time => time() };
108                                    map {
109                                            my $d = decode_tag($_);
110                                            $d->{sid} = $_;
111                                            $d->{security} = $tags_security->{$_};
112                                            push @{ $json->{tags} },  $d;
113                                    } keys %$tags;
114                                    print $client "HTTP/1.0 200 OK\r\nContent-Type: application/x-javascript\r\n\r\n",
115                                            $param->{callback}, "(", to_json($json), ")\r\n";
116                            } elsif ( $method =~ m{/program} ) {
117    
118                                    my $status = 501; # Not implementd
119    
120                                    foreach my $p ( keys %$param ) {
121                                            next unless $p =~ m/^tag_(\S+)/;
122                                            my $tag = $1;
123                                            my $content = "\x04\x11\x00\x01" . $param->{$p};
124                                            $content = "\x00" if $param->{$p} eq 'blank';
125                                            $status = 302;
126    
127                                            warn "PROGRAM $tag $content\n";
128                                            write_tag( $tag, $content );
129                                    }
130    
131                                    print $client "HTTP/1.0 $status $method\r\nLocation: $server_url\r\n\r\n";
132    
133                            } else {
134                                    print $client "HTTP/1.0 404 Unkown method\r\n";
135                            }
136                    } else {
137                            print $client "HTTP/1.0 500 No method\r\n";
138                    }
139                    close $client;
140            }
141    
142            die "server died";
143    }
144    
145    
146    my $last_message = {};
147    sub _message {
148            my $type = shift @_;
149            my $text = join(' ',@_);
150            my $last = $last_message->{$type};
151            if ( $text ne $last ) {
152                    warn $type eq 'diag' ? '# ' : '', $text, "\n";
153                    $last_message->{$type} = $text;
154            }
155    }
156    
157    sub _log { _message('log',@_) };
158    sub diag { _message('diag',@_) };
159    
160  my $device    = "/dev/ttyUSB0";  my $device    = "/dev/ttyUSB0";
161  my $baudrate  = "19200";  my $baudrate  = "19200";
# Line 41  my $stopbits  = "1"; Line 165  my $stopbits  = "1";
165  my $handshake = "none";  my $handshake = "none";
166    
167  my $program_path = './program/';  my $program_path = './program/';
168    my $secure_path = './secure/';
169    
170    # http server
171    my $http_server = 1;
172    
173    # 3M defaults: 8,4
174    my $max_rfid_block = 16;
175    my $read_blocks = 8;
176    
177  my $response = {  my $response = {
178          'd500090400110a0500027250'                              => 'version?',          'd500090400110a0500027250'                              => 'version?',
# Line 63  GetOptions( Line 195  GetOptions(
195          'stopbits=i'  => \$stopbits,          'stopbits=i'  => \$stopbits,
196          'handshake=s' => \$handshake,          'handshake=s' => \$handshake,
197          'meteor=s'    => \$meteor_server,          'meteor=s'    => \$meteor_server,
198            'http-server!' => \$http_server,
199  ) or die $!;  ) or die $!;
200    
201  my $verbose = $debug > 0 ? $debug-- : 0;  my $verbose = $debug > 0 ? $debug-- : 0;
# Line 98  it under the same terms ans Perl itself. Line 231  it under the same terms ans Perl itself.
231    
232  =cut  =cut
233    
234  my $tags_data;  my $item_type = {
235  my $visible_tags;          1 => 'Book',
236            6 => 'CD/CD ROM',
237            2 => 'Magazine',
238            13 => 'Book with Audio Tape',
239            9 => 'Book with CD/CD ROM',
240            0 => 'Other',
241    
242            5 => 'Video',
243            4 => 'Audio Tape',
244            3 => 'Bound Journal',
245            8 => 'Book with Diskette',
246            7 => 'Diskette',
247    };
248    
249    warn "## known item type: ",dump( $item_type ) if $debug;
250    
251  my $port=new Device::SerialPort($device) || die "can't open serial port $device: $!\n";  my $port=new Device::SerialPort($device) || die "can't open serial port $device: $!\n";
252  warn "using $device $handshake $baudrate $databits $parity $stopbits" if $debug;  warn "using $device $handshake $baudrate $databits $parity $stopbits" if $debug;
# Line 109  $databits=$port->databits($databits); Line 256  $databits=$port->databits($databits);
256  $parity=$port->parity($parity);  $parity=$port->parity($parity);
257  $stopbits=$port->stopbits($stopbits);  $stopbits=$port->stopbits($stopbits);
258    
259  print "## using $device $baudrate $databits $parity $stopbits debug: $debug verbose: $verbose\n";  warn "## using $device $baudrate $databits $parity $stopbits debug: $debug verbose: $verbose\n";
260    
261  # Just in case: reset our timing and buffers  # Just in case: reset our timing and buffers
262  $port->lookclear();  $port->lookclear();
# Line 132  cmd( 'D5 00  05   04 00 11 Line 279  cmd( 'D5 00  05   04 00 11
279  cmd( 'D6 00  0C   13  04  01 00  02 00  03 00  04 00   AAF2','FIXME: stats?',  cmd( 'D6 00  0C   13  04  01 00  02 00  03 00  04 00   AAF2','FIXME: stats?',
280       'D6 00  0C   13  00  02 01 01 03 02 02 03  00     E778', sub { assert() }  );       'D6 00  0C   13  00  02 01 01 03 02 02 03  00     E778', sub { assert() }  );
281    
282  # start scanning for tags  sub scan_for_tags {
283    
284  cmd( 'D6 00  05   FE     00  05         FA40', "scan for tags, retry $_",          my @tags;
          'D6 00  0F   FE  00 00  05 ', sub { # 01 E00401003123AA26  941A         # seen, serial length: 8  
                 my $rest = shift || die "no rest?";  
                 my $nr = ord( substr( $rest, 0, 1 ) );  
   
                 if ( ! $nr ) {  
                         print "no tags in range\n";  
                         update_visible_tags();  
                         meteor( 'info-none-in-range' );  
                         $tags_data = {};  
                 } else {  
285    
286                          my $tags = substr( $rest, 1 );          cmd( 'D6 00  05   FE     00  05         FA40', "scan for tags",
287                     'D6 00  0F   FE  00 00  05 ', sub { # 01 E00401003123AA26  941A         # seen, serial length: 8
288                            my $rest = shift || die "no rest?";
289                            my $nr = ord( substr( $rest, 0, 1 ) );
290    
291                            if ( ! $nr ) {
292                                    _log "no tags in range\n";
293                                    update_visible_tags();
294                                    meteor( 'info-none-in-range' );
295                                    $tags_data = {};
296                            } else {
297    
298                          my $tl = length( $tags );                                  my $tags = substr( $rest, 1 );
299                          die "wrong length $tl for $nr tags: ",dump( $tags ) if $tl =! $nr * 8;                                  my $tl = length( $tags );
300                                    die "wrong length $tl for $nr tags: ",dump( $tags ) if $tl =! $nr * 8;
301    
302                          my @tags;                                  push @tags, uc(unpack('H16', substr($tags, $_ * 8, 8))) foreach ( 0 .. $nr - 1 );
303                          push @tags, uc(unpack('H16', substr($tags, $_ * 8, 8))) foreach ( 0 .. $nr - 1 );                                  warn "## tags ",as_hex($tags), " [$tl] = ",dump( $tags ) if $debug;
304                          warn "## tags ",as_hex($tags), " [$tl] = ",dump( $tags ) if $debug;                                  _log "$nr tags in range: ", join(',', @tags ) , "\n";
                         print "$nr tags in range: ", join(',', @tags ) , "\n";  
305    
306                          meteor( 'info-in-range', join(' ',@tags));                                  meteor( 'info-in-range', join(' ',@tags));
307    
308                          update_visible_tags( @tags );                                  update_visible_tags( @tags );
309                            }
310                  }                  }
311          }          );
 ) while(1);  
 #) foreach ( 1 .. 100 );  
312    
313            diag "tags: ",dump( @tags );
314            return $tags_data;
315    
316    }
317    
318    # start scanning for tags
319    
320    if ( $http_server ) {
321            http_server;
322    } else {
323            while (1) {
324                    scan_for_tags;
325                    sleep 1;
326            }
327    }
328    
329    die "over and out";
330    
331  sub update_visible_tags {  sub update_visible_tags {
332          my @tags = @_;          my @tags = @_;
# Line 173  sub update_visible_tags { Line 335  sub update_visible_tags {
335          $visible_tags = {};          $visible_tags = {};
336    
337          foreach my $tag ( @tags ) {          foreach my $tag ( @tags ) {
338                    $visible_tags->{$tag}++;
339                  if ( ! defined $last_visible_tags->{$tag} ) {                  if ( ! defined $last_visible_tags->{$tag} ) {
340                          if ( defined $tags_data->{$tag} ) {                          if ( defined $tags_data->{$tag} ) {
341  #                               meteor( 'in-range', $tag );  #                               meteor( 'in-range', $tag );
# Line 180  sub update_visible_tags { Line 343  sub update_visible_tags {
343                                  meteor( 'read', $tag );                                  meteor( 'read', $tag );
344                                  read_tag( $tag );                                  read_tag( $tag );
345                          }                          }
                         $visible_tags->{$tag}++;  
346                  } else {                  } else {
347                          warn "## using cached data for $tag" if $debug;                          warn "## using cached data for $tag" if $debug;
348                  }                  }
# Line 190  sub update_visible_tags { Line 352  sub update_visible_tags {
352                                  meteor( 'write', $tag );                                  meteor( 'write', $tag );
353                                  write_tag( $tag );                                  write_tag( $tag );
354                  }                  }
355                    if ( -e "$secure_path/$tag" ) {
356                                    meteor( 'secure', $tag );
357                                    secure_tag( $tag );
358                    }
359          }          }
360    
361          foreach my $tag ( keys %$last_visible_tags ) {          foreach my $tag ( keys %$last_visible_tags ) {
# Line 206  my $tag_data_block; Line 372  my $tag_data_block;
372  sub read_tag_data {  sub read_tag_data {
373          my ($start_block,$rest) = @_;          my ($start_block,$rest) = @_;
374          die "no rest?" unless $rest;          die "no rest?" unless $rest;
375    
376            my $last_block = 0;
377    
378          warn "## DATA [$start_block] ", dump( $rest ) if $debug;          warn "## DATA [$start_block] ", dump( $rest ) if $debug;
379          my $tag = uc(unpack('H16',substr( $rest, 0, 8 )));          my $tag = uc(unpack('H16',substr( $rest, 0, 8 )));
380          my $blocks = ord(substr($rest,8,1));          my $blocks = ord(substr($rest,8,1));
# Line 215  sub read_tag_data { Line 384  sub read_tag_data {
384                  warn "## block ",as_hex( $block ) if $debug;                  warn "## block ",as_hex( $block ) if $debug;
385                  my $ord   = unpack('v',substr( $block, 0, 2 ));                  my $ord   = unpack('v',substr( $block, 0, 2 ));
386                  my $expected_ord = $nr + $start_block;                  my $expected_ord = $nr + $start_block;
387                  die "got block $ord, expected block $expected_ord from ",dump( $block ) if $ord != $expected_ord;                  warn "got block $ord, expected block $expected_ord from ",dump( $block ) if $ord != $expected_ord;
388                  my $data  = substr( $block, 2 );                  my $data  = substr( $block, 2 );
389                  die "data payload should be 4 bytes" if length($data) != 4;                  die "data payload should be 4 bytes" if length($data) != 4;
390                  warn sprintf "## tag %9s %02d %s |%-4s|\n", $tag, $ord, as_hex( $data ), $data;                  warn sprintf "## tag %9s %02d: %s |%-4s|\n", $tag, $ord, as_hex( $data ), $data;
391                  $tag_data_block->{$tag}->[ $ord ] = $data;                  $tag_data_block->{$tag}->[ $ord ] = $data;
392                    $last_block = $ord;
393          }          }
394          $tags_data->{ $tag } = join('', @{ $tag_data_block->{$tag} });          $tags_data->{ $tag } = join('', @{ $tag_data_block->{$tag} });
395          print "DATA $tag ",dump( $tags_data ), "\n";  
396            my $item_type_nr = ord(substr( $tags_data->{$tag}, 3, 1 ));
397            print "DATA $tag ",dump( $tags_data ), " item type: ", ( $item_type->{ $item_type_nr } || "UNKWOWN '$item_type_nr'" ), "\n";
398    
399            return $last_block + 1;
400    }
401    
402    my $saved_in_log;
403    
404    sub decode_tag {
405            my $tag = shift;
406    
407            my $data = $tags_data->{$tag} || die "no data for $tag";
408    
409            my ( $u1, $set_item, $u2, $type, $content, $br_lib, $custom ) = unpack('C4Z16Nl>',$data);
410            my $hash = {
411                    u1 => $u1,
412                    u2 => $u2,
413                    set => ( $set_item & 0xf0 ) >> 4,
414                    total => ( $set_item & 0x0f ),
415    
416                    type => $type,
417                    content => $content,
418    
419                    branch => $br_lib >> 20,
420                    library => $br_lib & 0x000fffff,
421    
422                    custom => $custom,
423            };
424    
425            if ( ! $saved_in_log->{$tag}++ ) {
426                    open(my $log, '>>', 'rfid-log.txt');
427                    print $log strftime( "%Y-%m-%d %H:%M:%S", localtime ), ",$tag,$content\n";
428                    close($log);
429            }
430    
431            return $hash;
432  }  }
433    
434  sub read_tag {  sub read_tag {
# Line 232  sub read_tag { Line 438  sub read_tag {
438    
439          print "read_tag $tag\n";          print "read_tag $tag\n";
440    
441          cmd(          my $start_block = 0;
442                  "D6 00  0D  02      $tag   00   03     1CC4", "read $tag offset: 0 blocks: 3",  
443                  "D6 00  0F  FE  00 00  05 01   $tag    941A", sub {          while ( $start_block < $max_rfid_block ) {
444                          print "FIXME: tag $tag ready?\n";  
445                  },                  cmd(
446                  "D6 00  1F  02 00", sub { # $tag  03   00 00   04 11 00 01   01 00   31 32 33 34   02 00   35 36 37 38    531F\n";                           sprintf( "D6 00  0D  02      $tag   %02x   %02x     ffff", $start_block, $read_blocks ),
447                          read_tag_data( 0, @_ );                                  "read $tag offset: $start_block blocks: $read_blocks",
448                  },                          "D6 00  1F  02 00", sub { # $tag  03   00 00   04 11 00 01   01 00   31 32 33 34   02 00   35 36 37 38    531F\n";
449          );                                  $start_block = read_tag_data( $start_block, @_ );
450                                    warn "# read tag upto $start_block\n";
451                            },
452                            "D6 00  0F  FE  00 00  05 01   $tag    941A", sub {
453                                    print "FIXME: tag $tag ready? (expected block read instead)\n";
454                            },
455                    );
456    
457            }
458    
459            my $security;
460    
461          cmd(          cmd(
462                  "D6 00  0D  02      $tag   03   04     3970", "read $tag offset: 3 blocks: 4",                  "D6 00 0B 0A $tag 1234", "check security $tag",
463                  "D6 00  25  02 00", sub { # $tag   04                         03 00   30 30 00 00   04 00   00 00 00 00                    "D6 00 0D 0A 00", sub {
464                          read_tag_data( 3, @_ );                          my $rest = shift;
465                            my $from_tag;
466                            ( $from_tag, $security ) = ( substr($rest,0,8), substr($rest,8,1) );
467                            die "security from other tag: ",as_hex( $from_tag ) if $from_tag ne str2bytes( $tag );
468                            $security = as_hex( $security );
469                            $tags_security->{$tag} = $security;
470                            warn "# SECURITY $tag = $security\n";
471                  }                  }
472          );          );
473    
474            print "TAG $tag ", dump(decode_tag( $tag ));
475  }  }
476    
477  sub write_tag {  sub write_tag {
478          my ($tag) = @_;          my ($tag,$data) = @_;
479    
480          my $path = "$program_path/$tag";          my $path = "$program_path/$tag";
481            $data = read_file( $path ) if -e $path;
482    
483            die "no data" unless $data;
484    
485            my $hex_data;
486    
487          my $data = read_file( $path );          if ( $data =~ s{^hex\s+}{} ) {
488                    $hex_data = $data;
489                    $hex_data =~ s{\s+}{}g;
490            } else {
491    
492                    $data .= "\0" x ( 4 - ( length($data) % 4 ) );
493    
494                    my $max_len = $max_rfid_block * 4;
495    
496                    if ( length($data) > $max_len ) {
497                            $data = substr($data,0,$max_len);
498                            warn "strip content to $max_len bytes\n";
499                    }
500    
501                    $hex_data = unpack('H*', $data);
502            }
503    
504          print "write_tag $tag = $data\n";          my $len = length($hex_data) / 2;
505            # pad to block size
506            $hex_data .= '00' x ( 4 - $len % 4 );
507            my $blocks = sprintf('%02x', length($hex_data) / 4);
508    
509            print "write_tag $tag = ",dump( $data ), " [$len/$blocks] == $hex_data\n";
510    
511          cmd(          cmd(
512                  "D6 00  26  04  $tag  00 06 00  04 11 00 01  61 61 61 61  62 62 62 62  63 63 63 63  64 64 64 64  00 00 00 00  FD3B", "write $tag",                  "d6 00  ff  04  $tag  00 $blocks 00  $hex_data  ffff", "write $tag",
513                  "D6 00  0D  04 00  $tag  06  AFB1", sub { assert() },                  "d6 00  0d  04 00  $tag  $blocks  afb1", sub { assert() },
514          ) foreach ( 1 .. 3 ); # XXX 3M software does this three times!          ); # foreach ( 1 .. 3 ); # XXX 3m software does this three times!
515    
516          my $to = $path;          my $to = $path;
517          $to .= '.' . time();          $to .= '.' . time();
# Line 271  sub write_tag { Line 519  sub write_tag {
519          rename $path, $to;          rename $path, $to;
520          print ">> $to\n";          print ">> $to\n";
521    
522            # force re-read of tag
523            delete $tags_data->{$tag};
524            delete $visible_tags->{$tag};
525    }
526    
527    sub secure_tag {
528            my ($tag) = @_;
529    
530            my $path = "$secure_path/$tag";
531            my $data = substr(read_file( $path ),0,2);
532    
533            cmd(
534                    "d6 00  0c  09  $tag $data 1234", "secure $tag -> $data",
535                    "d6 00  0c  09 00  $tag  1234", sub { assert() },
536            );
537    
538            my $to = $path;
539            $to .= '.' . time();
540    
541            rename $path, $to;
542            print ">> $to\n";
543  }  }
544    
545  exit;  exit;
# Line 305  sub writechunk Line 574  sub writechunk
574  {  {
575          my $str=shift;          my $str=shift;
576          my $count = $port->write($str);          my $count = $port->write($str);
577            my $len = length($str);
578            die "wrong write length $count != $len in ",as_hex( $str ) if $count != $len;
579          print "#> ", as_hex( $str ), "\t[$count]\n" if $debug;          print "#> ", as_hex( $str ), "\t[$count]\n" if $debug;
580  }  }
581    
# Line 371  sub crcccitt { Line 642  sub crcccitt {
642  sub checksum {  sub checksum {
643          my ( $bytes, $checksum ) = @_;          my ( $bytes, $checksum ) = @_;
644    
         my $xor = crcccitt( substr($bytes,1) ); # skip D6  
         warn "## checksum ",dump( $bytes, $xor, $checksum ) if $debug;  
   
645          my $len = ord(substr($bytes,2,1));          my $len = ord(substr($bytes,2,1));
646          my $len_real = length($bytes) - 1;          my $len_real = length($bytes) - 1;
647    
648          if ( $len_real != $len ) {          if ( $len_real != $len ) {
649                  print "length wrong: $len_real != $len\n";                  print "length wrong: $len_real != $len\n";
650                  $bytes = substr($bytes,0,2) . chr($len_real) . substr($bytes,4);                  $bytes = substr($bytes,0,2) . chr($len_real) . substr($bytes,3);
651          }          }
652    
653            my $xor = crcccitt( substr($bytes,1) ); # skip D6
654            warn "## checksum ",dump( $bytes, $xor, $checksum ) if $debug;
655    
656          if ( defined $checksum && $xor ne $checksum ) {          if ( defined $checksum && $xor ne $checksum ) {
657                  print "checksum doesn't match: ", as_hex($xor), " != ", as_hex($checksum), " data: ", as_hex($bytes), "\n";                  print "checksum doesn't match: ", as_hex($xor), " != ", as_hex($checksum), " data: ", as_hex($bytes), "\n";
658                  return $bytes . $xor;                  return $bytes . $xor;
# Line 392  sub checksum { Line 663  sub checksum {
663  our $dispatch;  our $dispatch;
664    
665  sub readchunk {  sub readchunk {
666          sleep 1;        # FIXME remove  #       sleep 1;        # FIXME remove
667    
668          # read header of packet          # read header of packet
669          my $header = read_bytes( 2, 'header' );          my $header = read_bytes( 2, 'header' );
# Line 421  sub readchunk { Line 692  sub readchunk {
692          warn "?? payload dispatch to ",dump( $payload, $dispatch, $to ) if $debug;          warn "?? payload dispatch to ",dump( $payload, $dispatch, $to ) if $debug;
693    
694          if ( defined $to ) {          if ( defined $to ) {
695                  my $rest = substr( $payload, length($to) );                  my $rest = substr( $payload, length($to) ) if length($to) < length($payload);
696                  warn "## DISPATCH payload to with rest", dump( $payload, $to, $rest ) if $debug;                  warn "## DISPATCH payload to with rest", dump( $payload, $to, $rest ) if $debug;
697                  $dispatch->{ $to }->( $rest );                  $dispatch->{ $to }->( $rest );
698          } else {          } else {
699                  print "NO DISPATCH for ",dump( $full ),"\n";                  print "NO DISPATCH for ",as_hex( $full ),"\n";
700          }          }
701    
702          return $data;          return $data;

Legend:
Removed from v.29  
changed lines
  Added in v.63

  ViewVC Help
Powered by ViewVC 1.1.26