1. Topics Covered

This program demonstrates XNA support for the accelerometer on WP7.
You may wish to download the source code,
open the project and refer to the source code while follow the discussion.
Topics covered in this tutorial includes:

AccelerometerDemo_Compute.cs: implements event service routines for
the accelerometer.

In our discussion, we will first look at AccelerometerDemo.cs followed by examining the implementation of the event
service routines.

External Resources: there are the usual background music and
sound effects, including two image objects: the basketball and the
background maze images. Other supporting images we will not be discussing
include the support for visualization of the accelerometer states (the large
orange arrows), and the display for coordinate markers: upper-left red
square representing the origin, the W marker representing (W, 0), and the H
marker representing the (0, H) positions. Please refer to the
Orientation Tutorial for
discussions on the coordinate markers.

4. Implementation Details:

The above listing shows a source code structure similar to to the
structure from the Pinch Zoom Touch
Panel Tutorial. The main difference is that in this case, at
Label E, we have defined local variables to support the programming
with the accelerometer:

mAccMeter: this object is our interface to the
accelerometer sensors. We will initialize this object, and through
it, activate the sensors, and receive data.

MShowAcceleration: this object is capable of showing the
magnitude and size of vectors as arrows in the middle of the screen.
This class is meant to help us visualize the accelerometer state and
is completely independent from programming with the accelerometer.
We will not go into the details of this class.

The Initialize() function:

The above listing shows that during initialization we must:

Instantiate the accelerometer object,

Register a event service routine (AccMeterChange()) to
service accelerometer reading changes, and

The above listing shows that, since accelerometer readings occurs
asynchronously, during the regular synchronous update there is actually
nothing much to do. Here at Label U1, we simple invoke the mBall's
update function. If mBall has non zero velocity or acceleration, it's
position will be updated accordingly.

4b. AccelerometerDemo_Compute.cs: This
file implements the services for the asynchronous events from the accelerometer
sampling thread.

The above listing shows, as in all cases of XNA asynchronous event
services, two functions are defined to service the asynchronous events
from the sampling thread.

UpdateBallAcceleration()

This function shows, accelerometer sampled values are returned as
three floating point values (X, Y, Z), each in the range between -2
to 2. Normal gravitation pull is -1. In this case, we simply use the
scaled (X,Y) values as the acceleration of the mBall to set the ball
in motion.

AccMeterChange()

This is the actual event service routine for the accelerometer
reading change events. Notice that since this routine is invoked
asynchronously by an external thread, it does not make any changes
to any of the instance variables. Instead, this routine creates a
lamba (function call) and request a thread-safe invocation of the
function.

5. Self Test and Exercises

If gravitational pull is -1, why does the accelerometer range supports to
values of -2? Try jerking the phone of give the phone a sudden shake to see the
orange arrow size grow very large as a result. Remember, F=ma, mass of the phone
is constant, if you apply a large force to the phone, you will get a large
acceleration reading.

Why can't I call mBall.SetAcceleration() directly from
AccMeterChange() service routine? Answer, AccMeterChange() is invoked
asynchronously from the accelerometer sampling thread. It is very possible that
the AccMeterChange() function is called at the very same time when
mBall.Update() is being called from our own Update() function. In
this case, we end up having two threads both trying to modify mBall's
acceleration values. We will end up with inconsistent results.

If we replace the control of the mBall x-movement from using the X readings
from the accelerometer to using the z-readings, how will I direct the ball to
move leftward? Answer: leftward, is -x direction, to get negative values from
the z-accelerometer, I must flip my phone upside-down.

Practice Project: give the ball a constant speed (e.g., 3) and use the
accelerometer reading to control the direction of the ball. In this case, the
ball should never speed up or slow down, just roll around reacting to how the
phone is tilted.