【IT168技术文档】
背景
重力感应器(Gravitational Sensor,简称为GSensor),类似于Accelerometer和Tilt Sensor, 用于测量倾斜度的感应器。严格定义来说,Accelerometer和Tilt Sensor是有区别的,Accelerometer可以测量三维,而Tilt Sensor只能测量二维。术语的定义见 Accelerometer 和 Tilt_sensor 。
Accelerometer被广泛用于手机等移动设备上,同时用于Wii的手柄上,Wii游戏的移动就是根据Accelerometer测量的数据进行移动的。
简介
重力感应器(Gravitational Sensor, Accelerometer)已经被广泛应用于Windows Mobile设备上,可是由于MS没有官方定义和提供统一的API,为重力感应器的开发带来不便,本文讲述如何在HTC和Samsung设备上进行重力感应器的开发,实现统一访问了GSensor的类库,在实现过程中使用了Singleton,Simple Factory和Observer模式。
原理
根据设备的内在能力,Accelerometer能够测量一维,二维或者三维的重力加速度。关于 Accelerometer的原理可以参考wikipedia的文章Accelerometer,我不详细介绍了,我主要介绍一下软件开发相关的。
图1 源自于《Samsung Mobile Innovator Windows Mobile API Programming Guide》
从上图可以看出重力信息只是和设备本身有关,和设备在相对位置无关。例如设备平放在水平的桌面上,对这长的屏幕前后移动设备(如下图2),Y轴会发生变化。
图2 源自于 Windows Mobile Unified Sensor API
另外的情况,设备长的屏幕垂直放(如下图3),上下移动,也是Y轴在发生变化。
图3 源自于 Windows Mobile Unified Sensor API
Samsung 的手机可以输入 *#0*# 启动LCD Test 程序来测试Accelerometer的运行状况。
原罪
Windows Mobile 6.5及以下的设备,是没有统一的API操作GSensor,MS一直没有统一包括GSensor在内的所有Sensor的接口(其他Sensors包括Light Sensor,Stylus Sensor等等),甚至连WM7也没有官方答复,关于MS的答复可以参考下面链接 Windows Mobile finally getting a Unified Sensor API, support for capacitive screens? Update: Answer – No.
没有统一的API,各个手机硬件厂商都需要开发自己的API,其中以HTC和samsung最为出名。开始的时候,各个厂商都不公开自己的API,导致Windows Mobile的开发人员只能通过反向工程(Reverse Engineering)等非正当手段获取API,哪怕获取了厂商的API,开发的程序也不能同时支持多种硬件设备。幸运的是Koush 封装了一个托管版本的 Windows Mobile Unified Sensor API ,同时支持HTC和Samsung。下面我会介绍如何使用native c++分别调用HTC和Samsung的GSensor API。
Samsung GSensor API
Samsung已经公开了自己的API,可以在 Samsung Mobile Innovator Windows Mobile SDK 1.1 注册下载和安装。里面包含的Samsung官方的GSensor API。 使用Samsung的API需要安装一个Cab。Cab在 C:\Program Files\Samsung Windows Mobile SDK\redist\smi_wm_sdk_redist_1_1_0.cab
GSensor API定义见 C:\Program Files\Samsung Windows Mobile SDK\inc\smiAccelerometer.h