# Tomi # http://e8y.net/blog/2006/10/26/p135.html # http://www.youtube.com/watch?v=aqKpECqwARI # thanks miyagawa: http://blog.bulknews.net/mt/archives/002053.html use strict; use Time::HiRes qw(sleep); use Win32API::File qw(:ALL); use Win32::GuiTest qw(:ALL); sub get_tilt { my @base; return sub { my $file = createFile("//./ShockMgr", "r ke") or die "Can't get ShockMgr device"; DeviceIoControl($file, 0x733fc, [], 0, my($buf), 0x24, my($bytes), []); my @data = unpack "x4s*", $buf if $buf; @base = @data[3, 2] unless @base; return { x => ($data[1] - $base[0]) / 20, y => ($data[0] - $base[1]) / 20, }; } } my $tilt = get_tilt(); while (1) { my $move = $tilt->(); my $keys = ''; if ($move->{x} > 0) { $keys .= "{RIGHT}" x int abs $move->{x} } elsif ($move->{x} < 0) { $keys .= "{LEFT}" x int abs $move->{x} } if ($move->{y} > 0) { $keys .= "{DOWN}" x int abs $move->{y} } elsif ($move->{y} < 0) { $keys .= "{UP}" x int abs $move->{y} } warn "$keys\n" if $keys; SendKeys($keys) if $keys; sleep 0.1; }