Code/tp-theft-basic

From ThinkWiki
Revision as of 04:56, 11 April 2007 by Thinker (Talk | contribs) (Undo corruption)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  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

}