Difference between revisions of "Code/tp-theft-lcars"
|  (release) |  (+choice) | ||
| Line 1: | Line 1: | ||
| <pre> | <pre> | ||
| #!/usr/bin/perl | #!/usr/bin/perl | ||
| − | # tp-theft-lcars v0. | + | # tp-theft-lcars v0.2 (http://thinkwiki.org/wiki/Script_for_theft_alarm_using_HDAPS) | 
| # This script uses the HDAPS accelerometer found on recent ThinkPad models | # This script uses the HDAPS accelerometer found on recent ThinkPad models | ||
| # to emit an audio alarm when the laptop is tilted. In sufficiently | # to emit an audio alarm when the laptop is tilted. In sufficiently | ||
| Line 9: | Line 9: | ||
| # | # | ||
| # Here comes a modified version which requires an internet connection and gnash. | # Here comes a modified version which requires an internet connection and gnash. | ||
| − | # It shows a LCARS red alert flash animation from Star Trek  | + | # It shows a LCARS red alert flash animation from Star Trek instead of a beep. | 
| + | # You may choose your favourite by adding/removing the sharps. | ||
| use strict; | use strict; | ||
| Line 18: | Line 19: | ||
| my $volume = 70; | my $volume = 70; | ||
| − | my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/LCARS_prey_emergency_scan_analysis.swf"; | + | # Voyager alert system status | 
| + | my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/alert%20system%20status.swf"; | ||
| + | |||
| + | # Voyager self destruct | ||
| + | # my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/voyager%20self%20destruct.swf"; | ||
| + | |||
| + | # Voyager red alert memory allocation | ||
| + | # my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/red%20alert%20memory%20allocation.swf"; | ||
| + | |||
| + | # TNG ancillary red alert monitor | ||
| + | # my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/lcars_ancillary_red_alert_monitor.swf"; | ||
| + | |||
| + | # Captain Kirk to the bridge | ||
| + | # my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/cin/tos%20red%20alert%20panel.swf"; | ||
| + | |||
| + | # retro red alert  | ||
| + | # my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/ano%20gifs/st_original_redalert.swf"; | ||
| + | |||
| + | # DS9: USS Defiant red alert  | ||
| + | # my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/LCARS%20Defiant%20red%20alert.swf"; | ||
| + | |||
| + | # Voyager emergency scan | ||
| + | # my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/LCARS_prey_emergency_scan_analysis.swf"; | ||
| ############################## | ############################## | ||
Latest revision as of 09:21, 14 November 2010
#!/usr/bin/perl
# tp-theft-lcars v0.2 (http://thinkwiki.org/wiki/Script_for_theft_alarm_using_HDAPS)
# This script uses the HDAPS accelerometer found on recent ThinkPad models
# to emit an audio alarm when the laptop is tilted. In sufficiently
# populated environments, it can be used as a laptop theft deterrent.
#
# This file is placed in the public domain and may be freely distributed.
#
# Here comes a modified version which requires an internet connection and gnash.
# It shows a LCARS red alert flash animation from Star Trek instead of a beep.
# You may choose your favourite by adding/removing the sharps.
use strict;
use warnings;
##############################
# Audio volume (0..100)
my $volume = 70;
# Voyager alert system status
my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/alert%20system%20status.swf";
# Voyager self destruct
# my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/voyager%20self%20destruct.swf";
# Voyager red alert memory allocation
# my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/red%20alert%20memory%20allocation.swf";
# TNG ancillary red alert monitor
# my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/lcars_ancillary_red_alert_monitor.swf";
# Captain Kirk to the bridge
# my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/cin/tos%20red%20alert%20panel.swf";
# retro red alert 
# my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/ano%20gifs/st_original_redalert.swf";
# DS9: USS Defiant red alert 
# my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/LCARS%20Defiant%20red%20alert.swf";
# Voyager emergency scan
# my $play_cmd = "gtk-gnash --fullscreen http://www.lcars.org.uk/lcars_files/LCARS_prey_emergency_scan_analysis.swf";
##############################
# 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;
##############################
# 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: $?";
($play_cmd) &
EOF
    }
    select(undef, undef, undef, $interval); # sleep
}
