bradfitz / android-misc

Misc Android Tools/Hacks

This URL has Read+Write access

Brad Fitzpatrick (author)
Mon Dec 15 07:30:50 -0800 2008
android-misc / type.pl
24bd1bb7 » Brad Fitzpatrick 2008-12-14 misc stuff 1 #!/usr/bin/perl
f969642e » Brad Fitzpatrick 2008-12-14 make the device node if needed 2 # Author: Brad Fitzpatrick <brad@danga.com>, 2008-12-14
3 # License: whatever.
24bd1bb7 » Brad Fitzpatrick 2008-12-14 misc stuff 4
5 use strict;
f969642e » Brad Fitzpatrick 2008-12-14 make the device node if needed 6 use File::Temp;
24bd1bb7 » Brad Fitzpatrick 2008-12-14 misc stuff 7 use Time::HiRes qw(time);
8
9 my $boot_time = boot_time();
10
f969642e » Brad Fitzpatrick 2008-12-14 make the device node if needed 11 my $keyboard = "/dev/input/event2";
12 unless (-c $keyboard) {
13 require File::Temp;
14 my ($fh, $filename) = File::Temp::tempfile();
94f19c44 » Brad Fitzpatrick 2008-12-14 forgotten argument to mknod 15 unlink($filename); # race!
16 system("mknod", $filename, "c", 13, 66) and die "mknod failed.";
f969642e » Brad Fitzpatrick 2008-12-14 make the device node if needed 17 $keyboard = $filename;
18 }
19
20 system("stty", '-icanon', 'eol', "\001")
21 and die "stty failed";
22
23 open(my $fh, ">$keyboard")
24 or die "Opening keyboard for write failed.";
24bd1bb7 » Brad Fitzpatrick 2008-12-14 misc stuff 25
26 my %code_map = (
27 chr(127) => 14, # backspace
28 "\x1b[A" => 103, # up arrow
29 "\x1b[B" => 108, # down arrow
30 "\x1b[C" => 105, # left arrow
31 "\x1b[D" => 106, # right arrow
32 "\x1b[3~" => 111, # delete
33 ' ' => 57,
34 from(16, "qwertyuiop{}\n"),
35 from(30, "asdfghjkl;'"),
36 "\\" => 43,
37 from(44, "zxcvbnm,./"),
38 from(2, "1234567890"),
39 );
40
41 sub from {
42 my ($num, $letters) = @_;
43 my @ret;
44 foreach my $letter (split //, $letters) {
6b170f2a » Brad Fitzpatrick 2008-12-14 replace tabs 45 push @ret, ($letter => $num++);
24bd1bb7 » Brad Fitzpatrick 2008-12-14 misc stuff 46 }
47 return @ret;
48 }
49
50 while (1) {
51 my $key = getc(STDIN);
52
53 if ($key eq "\033") {
6b170f2a » Brad Fitzpatrick 2008-12-14 replace tabs 54 $key .= getc(STDIN);
55 $key .= getc(STDIN);
56 if ($key eq "\x1b[3") {
57 $key .= getc(STDIN);
58 }
24bd1bb7 » Brad Fitzpatrick 2008-12-14 misc stuff 59 }
60
61 my $shift_down = 0;
62 if ($key =~ /^[A-Z]$/) {
6b170f2a » Brad Fitzpatrick 2008-12-14 replace tabs 63 $shift_down = 1;
64 syswrite($fh, event(42, 1)); # left shift
65 $key = lc($key);
24bd1bb7 » Brad Fitzpatrick 2008-12-14 misc stuff 66 }
67
68 my $code = $code_map{$key};
69
70 unless (defined $code) {
6b170f2a » Brad Fitzpatrick 2008-12-14 replace tabs 71 if (length($key) == 1) {
72 print "UNKNOWN KEY! key=$key, ord=", ord($key), "\n";
73 } else {
74 $key =~ s/[^[:print:]]/sprintf("\\x%02x", ord($&))/eg;
75 print "UNKNOWN SEQUENCE: $key\n";
76 }
77 next;
24bd1bb7 » Brad Fitzpatrick 2008-12-14 misc stuff 78 }
79
80
81 syswrite($fh, event($code, 1));
82 syswrite($fh, event($code, 0));
83
84 if ($shift_down) {
6b170f2a » Brad Fitzpatrick 2008-12-14 replace tabs 85 # let it go
86 syswrite($fh, event(42, 0));
24bd1bb7 » Brad Fitzpatrick 2008-12-14 misc stuff 87 }
88
89 }
90
91 sub event {
92 my ($code, $down) = @_;
93 my $event_time = time() - $boot_time;
94 my $evtime_sec = int($event_time);
95 my $evtime_usec = int(($event_time - $evtime_sec) * 1e9);
96 return pack("LLSSl",
6b170f2a » Brad Fitzpatrick 2008-12-14 replace tabs 97 $evtime_sec, $evtime_usec,
98 1, # keyboard event
99 $code,
100 $down);
24bd1bb7 » Brad Fitzpatrick 2008-12-14 misc stuff 101 }
102
103 sub boot_time {
104 open(my $fh, "/proc/uptime") or die;
105 my $line = <$fh>;
106 $line =~ s/\s.*//;
107 return time() - $line;
108 }