use strict; start(); my $wait = 0.1; my($sumx, $sumy); open my $AMS,"./AMSTracker -s -u$wait |" or die $!; my $i = 0; while (<$AMS>) { last if $i++ > 1 / $wait; my $data = getpos($_); next unless $data; my($x, $y) = ($data->[0], $data->[2]); $sumx = $x unless $sumx; $sumy = $y unless $sumy; $sumx += $x; $sumx /= 2; $sumy += $y; $sumy /= 2; } close($AMS); print "$sumx / $sumy\n"; while (1) { open my $AMS,"./AMSTracker -s -u$wait |" or die $!; while (<$AMS>) { my $data = getpos($_); next unless $data; my($x, $y) = ($data->[0], $data->[2]); if (is_move($sumx, $x, 0)) { print "L: $x - $sumx\n"; lr($x - $sumx); } elsif (is_move($sumx, $x, 1)) { print "R: $x - $sumx\n"; lr($x - $sumx); } if (is_move($sumy, $y, 0)) { print "D: $y - $sumy\n"; ud($sumy - $y); } elsif (is_move($sumy, $y, 1)) { print "U: $y - $sumy\n"; ud($sumy - $y); } last; } close($AMS); } sub getpos { my $line = shift; chomp $line; my @data = split /\s+/, $line; shift @data; return unless @data == 3; return [ @data ]; } sub is_move { my($base, $now, $back) = @_; $back ? $base > $now + 10 : $base + 10 < $now; } sub start { open my $cmd, '|osascript'; print $cmd <