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

From ThinkWiki
Jump to: navigation, search
 
m
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 && !(defined($alarm_file) && -f $alarm_file)) {
+
     if ($tilted
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
 
}
 

Revision as of 18:41, 10 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