#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $input=shift(@ARGV) || "/dev/hidraw2"; open(my $fh, '<', $input) or die("ERROR open $input ($!)\n"); binmode($fh); # Puffer leeren read_all_keys($fh); my $key; # schleife unterbrechen wenn ein Zeichen gesendet wurde while(!defined($key=read_key($fh))) { print localtime()."\n"; sleep(1); } # alle gesendeten Zeichen lesen. my @keys=($key,read_all_keys($fh)); print Dumper(\@keys); close($fh); ######################################################################## # Funktionen ######################################################################## # alle Zeichen im Puffer lesen sub read_all_keys { my $fh=shift; my @keys; while(defined(my $key = read_key($fh))) { push(@keys,$key) if(test_vals(0,$key)); } return @keys; } # ein Zeichen aus dem Puffer lesen sub read_key { my $fh=shift; my $key; eval{ local $SIG{ALRM}=sub{die}; my $buffer; alarm(1); read($fh,$buffer,8); alarm(0); my @l=unpack('CxC*',$buffer); if( test_vals(1,[@l[3..6]]) && test_vals(0,\@l)) { $key=[@l[0,1,2]]; } else { $key=[0,0,0]; } }; return $key } # haben alle Zeichen im Array den selben Wert? sub test_vals { my $val=shift; my $data=shift; my $ok=@$data; for(@$data) { $ok-- if($val == $_); } return $ok>0?1:0; }