Introducción

Como les comenté en un post anterior, Windows Mobile 6.5 a través del API de gestos soporta el touch, el acelerómetro y el sensor de reconocimiento de sonrisas, sin embargo solo el acceso al touch es genérico (universal) y desarrollado completamente por Microsoft, para los demás sensores se debe consultar información específica de cada fabricante. Este post describe el acceso al acelerómetro.

Antes de empezar, me gustaría comentar mi inconformidad porque los grandes fabricantes de hardware como HTC (entre otros) no proveen un SDK ni documentación para acceder a los sensores específicos del dispositivo. Esta es una actitud contraria a la filosofía Microsoft de documentar sus SDK’s e impulsar que los desarrolladores aprendan y recorran la curva de aprendizaje en el menor tiempo posible.

Un acelerómetro es un sensor que mide la rata de cambio de velocidad a través del tiempo; existen diferentes tipos de acelerómetros pero trabajaremos con el Micro-Electro Mechanical System de la HTC Diamond para medir el vector de aceleración en tres valores (ejes) como se muestra en la Figura 1.

Figura 1. Micro-Electro Mechanical System

Este sensor (así como el GPS) es un dispositivo más de entrada que puede ser abierto, leído y cerrado. El cálculo de si el dispositivo se desplazó o no debe ser realizado por la aplicación que lee el dispositivo a través de una comparación con una lectura anterior.

SDK para la HTC Diamond

Como HTC no provee un SDK oficial para acceder al acelerómetro (al igual que LG), entonces nos vemos en la necesidad de utilizar SDK’s no oficiales; existe un buen hacker llamado Scott que hizo ingeniería inversa del código ensamblador ARM de las DLL’s propietarias que proveen la funcionalidad de lectura del sensor de la HTC DIamond y lo compartió aquí.

Scott encontró que la DLL HTCSensorSDK.dll es la encargado del acelerómetro y contiene:

·         Métodos: HTCSensorOpen, HTCSensorClose y HTCSensorGetDataOutput

·         Eventos: HTC_GSENSOR_SERVICESTART

·         Estructuras: SENSORDATA

Y la DLL HTCAPI.dll es la encargada del soporte del API de gestos y contiene:

Métodos: HTCNavOpen, HTCNavSetMode y HTCNavClose

Mensajes: WM_HTC_GESTURE y WM_HTC_TOUCH

Estructuras: HTCTOUCH_WPARAM

El procedimiento de lectura es similar al de un GPS porque debemos abrir el sensor con HTCSensorOpen, leerlo con HTCSensorGetDataOutput y cerrarlo con HTCSensorClose. La estructura SENSORDATA llenada por el método HTCSensorGetDataOutput contiene todos los valores X, Y, Z actuales de velocidad, por lo cual para calcular una aceleración debemos comparar una lectura actual con una anterior.

Pero el código anterior es no manejado, una versión C# P/Invoke del mismo está disponible aquí gracias a Koushik Dutta; el SDK construido por Koushit tiene una clase llamada HTCGSensor con un método llamado GetRawSensorData el cual utiliza el método nativo HTCSensorGetDataOutput y retorna un objeto vector de tipo GVector con las coordenadas de velocidad (X, Y,  Z) actuales. Gracias a estos dos héroes el acceso al acelerómetro de la HTC Diamond está ahora disponible para todos.

Aplicaciones que utilizan el SDK de la HTC Diamond

Si quieres ver el SDK no oficial en acción descarga esta aplicación de ejemplo de Chris Mitchell (Figura 2) la cual utiliza el sensor para subir o bajar el volumen del reproductor de Media Player cuando se agita (sacude) el teléfono.

Figura 2. Acelerómetro para el control del volumen.

El código que lee los datos del acelerómetro y que detecta si el teléfono está siendo agitado (sacudido) es simple como se muestra a continuación:

            //Get Sensor Date

            myGSensor1.GetSensorData(ref mySensorData);

 

            //Update screen with latest Sensor Data

            TiltX_txt.Text = mySensorData.TiltX.ToString();

            TiltY_txt.Text = mySensorData.TiltY.ToString();

            TiltZ_txt.Text = mySensorData.TiltZ.ToString();

            thetaX_txt.Text = mySensorData.AngleX.ToString();

            thetaY_txt.Text = mySensorData.AngleY.ToString();

 

            //Detect if the phone is being shook

            if (myGSensor1.DetectShake(mySensorDataOld, mySensorData, threshold_trackBar.Value * scalevalue, shakecounter, noshakecounter))

            {

                …

            }

Otro ejemplo de acceso al acelerómetro a través del SDK es este juego desarrollado por nuestros amigos de PocketMax (Figura 3); el juego se llama LunarTilt y consiste en una nave espacial que se conduce con el acelerómetro.

Figura 3. LunarTilt: juego que utiliza el SDK no oficial para acceder al acelerómetro.

Conclusión

El acceso al acelerómetro depende del fabricante del hardware. En este artículo se explicó las características y métodos de acceso al HTC Diamond a través de un SDK no oficial hackeado por la comunidad de desarrolladores de dispositivos móviles.

Saludos,

Javier Andrés Cáceres Alvis

http://speechflow.spaces.live.com/

http://software.intel.com/en-us/blogs/author/javierandrescaceres/