| This directory contains a simple python script for visualizing | 
 | the behavior of the WindowOrientationListener. | 
 |  | 
 |  | 
 | PREREQUISITES | 
 | ------------- | 
 |  | 
 | 1. Python 2.6 | 
 | 2. numpy | 
 | 3. matplotlib | 
 |  | 
 |  | 
 | USAGE | 
 | ----- | 
 |  | 
 | The tool works by scaping the debug log output from WindowOrientationListener | 
 | for interesting data and then plotting it. | 
 |  | 
 | 1. Enable the Window Orientation Listener debugging data log using the | 
 |    Development Settings in the Dev Tools application (Development.apk). | 
 |  | 
 | 2. Plug in the device.  Ensure that it is the only device plugged in | 
 |    since this script is of very little brain and will get confused otherwise. | 
 |  | 
 | 3. Run "orientationplot.py". | 
 |  | 
 | 4. When finished, remember to disable the debug log output since it is quite verbose! | 
 |  | 
 |  | 
 | WHAT IT ALL MEANS | 
 | ----------------- | 
 |  | 
 | The tool displays several time series graphs that plot the output of the | 
 | WindowOrientationListener.  Here you can see the raw accelerometer data, | 
 | filtered accelerometer data, measured tilt and orientation angle, confidence | 
 | intervals for the proposed orientation and accelerometer latency. | 
 |  | 
 | Things to look for: | 
 |  | 
 | 1. Ensure the filtering is not too aggressive.  If the filter cut-off frequency is | 
 |    less than about 1Hz, then the filtered accelorometer data becomes too smooth | 
 |    and the latency for orientation detection goes up.  One way to observe this | 
 |    is by holding the device vertically in one orientation then sharply turning | 
 |    it 90 degrees to a different orientation.  Compared the rapid changes in the | 
 |    raw accelerometer data with the smoothed out filtered data.  If the filtering | 
 |    is too aggressive, the filter response may lag by hundreds of milliseconds. | 
 |  | 
 | 2. Ensure that there is an appropriate gap between adjacent orientation angles | 
 |    for hysteresis.  Try holding the device in one orientation and slowly turning | 
 |    it 90 degrees.  Note that the confidence intervals will all drop to 0 at some | 
 |    point in between the two orientations; that is the gap.  The gap should be | 
 |    observed between all adjacent pairs of orientations when turning the device | 
 |    in either direction. | 
 |  | 
 |    Next try holding the device in one orientation and rapidly turning it end | 
 |    over end to a midpoint about 45 degrees between two opposing orientations. | 
 |    There should be no gap observed initially.  The algorithm should pick one | 
 |    of the orientations and settle into it (since it is obviously quite | 
 |    different from the original orientation of the device).  However, once it | 
 |    settles, the confidence values should start trending to 0 again because | 
 |    the measured orientation angle is now within the gap between the new | 
 |    orientation and the adjacent orientation. | 
 |  | 
 |    In other words, the hysteresis gap applies only when the measured orientation | 
 |    angle (say, 45 degrees) is between the current orientation's ideal angle | 
 |    (say, 0 degrees) and an adjacent orientation's ideal angle (say, 90 degrees). | 
 |  | 
 | 3. Accelerometer jitter.  The accelerometer latency graph displays the interval | 
 |    between sensor events as reported by the SensorEvent.timestamp field.  It | 
 |    should be a fairly constant 60ms.  If the latency jumps around wildly or | 
 |    greatly exceeds 60ms then there is a problem with the accelerometer or the | 
 |    sensor manager. | 
 |  | 
 | 4. The orientation angle is not measured when the tilt is too close to 90 or -90 | 
 |    degrees (refer to MAX_TILT constant).  Consequently, you should expect there | 
 |    to be no data.  Likewise, all dependent calculations are suppressed in this case | 
 |    so there will be no orientation proposal either. | 
 |  | 
 | 5. Each orientation has its own bound on allowable tilt angles.  It's a good idea to | 
 |    verify that these limits are being enforced by gradually varying the tilt of | 
 |    the device until it is inside/outside the limit for each orientation. | 
 |  | 
 | 6. Orientation changes should be significantly harder when the device is held | 
 |    overhead.  People reading on tablets in bed often have their head turned | 
 |    a little to the side, or they hold the device loosely so its orientation | 
 |    can be a bit unusual.  The tilt is a good indicator of whether the device is | 
 |    overhead. |