//--
// name: Smacking.ck
// desc: class and process for tracking smack events from sudden motion sensor
// only works with SMS-enabled laptops
//
// author: Rebecca Fiebrink + Ge Wang
// date: 2007
//--
// public class
public class Smacking
{
static Event @ the_event;
}
// initialize separately (due to a bug)
new Event @=> Smacking.the_event;
// smack detection threshold (less -> more sensitive)
15 => int threshold;
// pol rate
.01::second => dur poll_rate;
// recover time (after smack detection)
.10::second => dur recover_time;
// instantiate a Hid object
Hid hi;
HidMsg msg;
// open tilt sensor
if( !hi.openTiltSensor() )
{
<<< "tilt sensor unavailable", "" >>>;
me.exit();
}
// "doh"
<<< "hit me!", "" >>>;
// remember
HidMsg last;
// initialize
hi.read( 9, 0, last );
// infinite event loop
while( true )
{
// poll the tilt sensor, expect to get back 3 element array of ints
hi.read( 9, 0, msg );
// compute difference
(Math.abs(msg.x - last.x) + Math.abs(msg.y - last.y) + Math.abs(msg.z - last.z)) => int diff;
// check threshold
if (diff > threshold) {
// smack detected!
// <<< "ouch!" >>>;
// fire!
Smacking.the_event.broadcast();
// go
recover_time => now;
} else {
// uncomment the following to dynamically calibrate the smack sensor
// msg.x => last.x;
// msg.y => last.y;
// msg.z => last.z;
// advance
poll_rate => now;
}
}