Difference between revisions of "Code/tp-theft-basic"

From ThinkWiki
Jump to: navigation, search
m
(Undo corruption)
 
Line 37: Line 37:
 
     open(POS,"<",$pos_file) or die "Can't open HDAPS file $pos_file: $!\n";
 
     open(POS,"<",$pos_file) or die "Can't open HDAPS file $pos_file: $!\n";
 
     $_=<POS>;
 
     $_=<POS>;
     m/^\((-?\d ),(-?\d )\)$/ or die "Can't parse $pos_file content\n";
+
     m/^\((-?\d+),(-?\d+)\)$/ or die "Can't parse $pos_file content\n";
 
     return ($1,$2);
 
     return ($1,$2);
 
}
 
}
Line 44: Line 44:
 
     my $sum=0;
 
     my $sum=0;
 
     my $sumsq=0;
 
     my $sumsq=0;
     my $n=$#_ 1;
+
     my $n=$#_+1;
 
     for my $v (@_) {
 
     for my $v (@_) {
$sum = $v;
+
$sum += $v;
$sumsq = $v*$v;
+
$sumsq += $v*$v;
 
     }
 
     }
 
     return sqrt($n*$sumsq - $sum*$sum)/($n*($n-1));
 
     return sqrt($n*$sumsq - $sum*$sum)/($n*($n-1));
Line 72: Line 72:
 
     my $tilted = $xdev>$thresh || $ydev>$thresh;
 
     my $tilted = $xdev>$thresh || $ydev>$thresh;
  
     if ($tilted
+
     if ($tilted && !(defined($alarm_file) && -f $alarm_file)) {
 +
print "ALARM\n" if $verbose>0;
 +
$alarm_file = `mktemp /tmp/hdaps-tilt.XXXXXXXX` or die "mktemp: $?";
 +
chomp($alarm_file);
 +
system('/bin/bash', '-c', <<"EOF")==0 or die "Failed: $?";
 +
( trap \"aumix -L -f $alarm_file > /dev/null; rm -f $alarm_file" EXIT HUP QUIT TERM
 +
  aumix -S -f $alarm_file &&
 +
  aumix -v $volume -w 100 &&
 +
  $play_cmd) &
 +
EOF
 +
    }
 +
 
 +
    select(undef, undef, undef, $interval); # sleep
 +
}

Latest revision as of 04:56, 11 April 2007

  1. !/usr/bin/perl
  2. tp-theft v0.1 (http://thinkwiki.org/wiki/Script_for_theft_alarm_using_HDAPS)
  3. This script uses the HDAPS accelerometer found on recent ThinkPad models
  4. to emit an audio alarm when the laptop is tilted. In sufficiently
  5. populated environments, it can be used as a laptop theft deterrent.
  6. This file is placed in the public domain and may be freely distributed.

use strict; use warnings;

  1. Siren volume and content
  1. Audio volume (0..100)

my $volume = 70;

  1. Synthesize a siren for 1.0 seconds:

my $play_cmd = "sox -t nul /dev/null -t ossdsp /dev/dsp synth 1.0 sine 2000-4000 sine 4000-2000";

  1. Play a file:
  2. my $play_cmd = "play keep_your_hands_off_me.wav";
  1. Other tweakables

my $thresh = 0.20; # tilt threshold (increase value to decrease sensitivity) my $interval = 0.1; # sampling interval in seconds my $depth = 10; # number of recent samples to analyze my $pos_file='/sys/devices/platform/hdaps/position'; my $verbose = 1;

  1. Code

sub get_pos {

   open(POS,"<",$pos_file) or die "Can't open HDAPS file $pos_file: $!\n";
   $_=<POS>;
   m/^\((-?\d+),(-?\d+)\)$/ or die "Can't parse $pos_file content\n";
   return ($1,$2);

}

sub stddev {

   my $sum=0;
   my $sumsq=0;
   my $n=$#_+1;
   for my $v (@_) {

$sum += $v; $sumsq += $v*$v;

   }
   return sqrt($n*$sumsq - $sum*$sum)/($n*($n-1));

}

my (@XHIST, @YHIST); my ($x,$y) = get_pos; for (1..$depth) {

   push(@XHIST,$x);
   push(@YHIST,$y);

} my $alarm_file; # flags ongoing alarm (and stores saved mixer settings)

while (1) {

   my ($x,$y) = get_pos;
   shift(@XHIST); push(@XHIST,$x);
   shift(@YHIST); push(@YHIST,$y);
   my $xdev = stddev(@XHIST);
   my $ydev = stddev(@YHIST);
   # Print variance and history
   print "X: v=$xdev (".join(',',@XHIST).")  Y: v=$ydev (".join(",",@YHIST).")\n" if $verbose>1;
   my $tilted = $xdev>$thresh || $ydev>$thresh;
   if ($tilted && !(defined($alarm_file) && -f $alarm_file)) {

print "ALARM\n" if $verbose>0; $alarm_file = `mktemp /tmp/hdaps-tilt.XXXXXXXX` or die "mktemp: $?"; chomp($alarm_file); system('/bin/bash', '-c', <<"EOF")==0 or die "Failed: $?"; ( trap \"aumix -L -f $alarm_file > /dev/null; rm -f $alarm_file" EXIT HUP QUIT TERM

 aumix -S -f $alarm_file &&
 aumix -v $volume -w 100 &&
 $play_cmd) &

EOF

   }
   select(undef, undef, undef, $interval); # sleep

}