Leser: 22
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#!/usr/bin/perl use strict; use warnings; use Term::ReadKey; ReadMode('cbreak'); while(1) { my @chars=read_all(); print join(' ',@chars)."\n" if(@chars); sleep(1); print localtime()."\n"; } sub read_all { my @ret; while(defined(my $char=ReadKey(-1))) { push(@ret,sprintf('%02X',unpack('C',$char))); } return @ret; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; # input devide # bei mir ist die Tastatur "/dev/input/event1" my $input=shift(@ARGV) || "/dev/input/event1"; # die länge von time ist # auf einem 64BitOS 8 Byte lang, # auf einem 32BitOS 4 Byte lang! my $time_lenth=(`uname -m`=~/_64/)?8:4; # heraus finden welche läng es ist! open(my $fh, '<', $input) or die("ERROR open $input ($!)\n"); binmode($fh); while(1) { eval{ local $SIG{ALRM}=sub{die}; while(1) { my $buffer; # Ein Event einlesen alarm(1); read($fh,$buffer,$time_lenth+4+2+2+4); alarm(0); if(defined($buffer)) { # Ein event setzt sich aus # time, utime, eventtype eventcode und eventvalue zusammen. my ($time,$utime,$type,$code,$value)=unpack(($time_lenth==4?'L':'Q').'LSSl',$buffer); print localtime($time).", $utime ==> $type,$code,$value\n"; } } }; sleep(1); print localtime()."\n"; } close($fh);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; # meine USB-Tastatur liegt auf "/dev/hidraw2" my $input=shift(@ARGV) || "/dev/hidraw2"; open(my $fh, '<', $input) or die("ERROR open $input ($!)\n"); binmode($fh); while(1) { my @keys=read_all($fh); print Dumper(\@keys) if(@keys); print localtime()."\n"; sleep(1); } close($fh); sub read_all { my $fh=shift; my @keys; eval{ local $SIG{ALRM}=sub{die}; while(1) { my $buffer; alarm(1); read($fh,$buffer,8); alarm(0); my @l=unpack('CxC*',$buffer); # Fehler gemeldet (zu viele Tasten auf einmal) next if($l[3]==1 && $l[4]==1 && $l[5]==1 && $l[6]==1); push(@keys, [@l[0,1,2]]); } }; return @keys; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
#!/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; }