浅析Windows Mobile Sensors API库的设计

移动开发
这里将介绍Windows Mobile Sensors API库的设计,希望本文能对大家了解Mobile Sensors API库有所帮助。

Windows Mobile 7正在开发过程中,相比较Android和iPhone的红火,Windows Mobile似乎还是不温不火。这里我们要谈到的是Windows Mobile Sensors API库的设计。

背景

热烈欢迎 simon_new88 同学加入 Mobile Sensors API - Native unified APIs for Windows Mobile Sensors 项目。为了他更快熟悉,我把GSensor的设计记录下来。关于该项目的一些信息可以参考 Windows Mobile下的重力感应器(Gravitational Sensor)开发Windows Mobile下使用CppUnitLite输出测试结果

简介

本文讲述Windows  Mobile Sensors API库中重力感应器部分(GSensor)的设计。讲述一个统一访问接口的Sensor库的设计方法和一些设计模式的应用。

需求

统一访问接口的Sensor库(Native unified APIs for Windows Mobile Sensors)的需求:

1.统一的API访问接口。由于为HTC和Samsung移动设备提供各自提供DLL来封装Sensor,所以提供不一样的访问接口。使用Windows  Mobile Sensors API库,应用开发人员在开发客户端(Client)代码时不需要知道具体设备的API,只是需要调用Windows  Mobile Sensors API库的统一接口就可以得到相应的GSensor运行信息。

2.统一输出GVector的单位。由于HTC和Samsung移动设备各自的GSensor库输出的GVector的单位是不一样的,HTC输出是-100到100的值,而Samsung又不一样。所以Windows  Mobile Sensors API库需要把输出值的单位进行统一。应用开发人员在开发客户端(Client)代码时,一套代码可以同时支持HTC和Samsung的移动设备。

设计

总体设计

GSensor部分的总体类图设计:

GSensor部分的总体类图 

下面文章分部分讲述。

GSensor设计

GSensor设计

GSensor是一个抽象类,定义了统一的访问接口,主要提供三个主要的接口:

1.取GVector信息接口。客户端调用GetGVector()函数可以得到实时的GVector信息。

2.事件订阅接口。当客户端调用Register()订阅GVector事件,通过Unregister()函数退订该事件。事件的发送通过Observer模式实现,后面讲到。

3.单位调整接口。客户端可以调用Scale()来调整想要的单位。

GetGVector(),Register()和Unregister()为纯虚函数。表示GSensor指定的契约(contract),其继承子类SamsungGSensor和HTCGSensor必须实现这些接口以厉行该契约。这两个子类在实现这些接口时分别调用各自平台相关的DLL来实现。

由于HTC的DLLHTCSensorSDK.dll没有定时回调函数的实现,所以在Windows  Mobile Sensors API库实现了一个ThreadTask类来定时查询GVector的信息。ThreadTask类封装了Start(),Stop()和ProcessTask()函数,Start()负责产生一个线程,Stop()负责结束由Start()产生的线程,而ProcessTask()负责定期执行任务。执行任务的具体内容在Process()中定义,Process()也是纯虚函数,也就是contract,由子类实现需要执行的具体任务,这里可以认为是Method Template模式的实现。HTCGSensor继承了ThreadTask类,然后重载了Process()定时查询GVector信息,然后通过调用GSensor的GVectorChanged()函数来通知Client。后面将讲Observer模式,怎么GSensor怎么通知Client。

GSensorFactory的设计

GSensorFactory的设计

这里使用了Simple Factory模式,客户端只是需要调用GSensorFactory就可以取出GSensor的指针,GSensorFactory可以判断设备类型取出SamsungGSensor或者HTCGSensor的实例。关于Simple Factory可以参考 我的实用设计模式之Simple Factory,Factory Method和Abstract Factory

Observer的设计

从需求看,Windows  Mobile Sensors API库需要实现事件订阅接口。当客户端订阅了消息时,客户端会自动接收到GVector信息,这个功能是使用Observer模式实现的。关于Observer模式可以参考 我的实用设计模式之Observer模式

Observer的设计

我使用了一个开源的Observer模式实现,和经典的Observer的实现有点差异。但是目标是一致的,就是实现消息提供方和消息接收方的解耦。那个实现可以参考Experiences of Implementing the Observer Design Pattern (Part 3)

Notifier是经典Observer模型的Abstract Subject。GSensor是Concrete Subject继承Notifier,通过调用notify()函数来通知Observers。Listener是经典Observer模式的Abstract Observer。和经典Observer模式有点不一样。Notifier通过Event类来通知Listener。而Listener增加了一层继承于GSensorListener。GSensorListener根据具体通知内容而定义。这里通过C++的模板类来实现的。关于这方面的实现可以参考Template metaprogramming

template <class interface_type>
class Listener : public interface_type

SensorTesterView是Concrete Observer。需要实现GSensor_GVectorChanged()来处理通知消息。

Singleton的设计

Singleton的设计 

SamsungGSensor和HTCGSensor分别设计为Singleton,因为不管有多少个消息订阅者(Listener)都只有一个消息发送方。也就是一套系统里面只有一个SamsungGSensor或者HTCGSensor的实例。

关于Mobile Sensors API项目

这个项目还是在起步阶段,当前实现了samsung的重力感应器,我把项目host到 Mobile Sensors API - Native unified APIs for Windows Mobile Sensors 了,我会持续改进,把各种sensors的实现到这个项目中。

由于我手头上没有HTC的机器,如果谁有兴趣可以加入到项目中帮我测试HTC设备,由于加入了Unit Test,测试变得很简单,只需要执行程序,参考测试输出文件就可以了,不需要调试。当然这个测试过程是一个不断迭代的过程,只是Unit Test把子过程简单化了。

源代码:http://mobilesensor.codeplex.com/SourceControl/ListDownloadableCommits.aspx

环境:VS2008 + WM 6 professional SDK + Samsung Windows Mobile SDK

【编辑推荐】

  1. 微软开始组织开发大型Windows Mobile应用程序
  2. Windows Mobile上使用WINCE自带数据库
  3. 微软将推出Windows Mobile应用软件商店
  4. 微软网络商店正式开始接受应用程序
  5. Windows Mobile在线商店细则已由微软发布
责任编辑:彭凡 来源: 博客园
相关推荐

2011-04-25 17:17:55

Gesture APIWindows Mob

2011-07-19 17:09:44

jQuery Mobi事件

2009-09-25 11:04:07

C++动态加载DLL

2011-07-19 17:03:31

jQuery Mobi默认配置

2009-11-03 12:52:38

VB.NET Wind

2022-11-24 13:17:43

2009-08-17 13:26:20

C#调用Windows

2009-08-17 13:18:01

C#调用Windows

2009-04-10 08:58:47

Windows Mob微软移动OS

2009-12-07 17:42:07

Windows Mob

2009-12-15 15:31:47

2009-04-08 09:17:54

Windows MobWINCE数据库

2009-06-30 10:48:49

WinCEWindows Mob

2009-05-17 10:48:19

微软Windows Mob移动OS

2009-07-08 10:02:41

Servlet 3.0

2010-02-02 10:10:58

Windows Mob

2009-03-06 19:14:41

Windows Pho微软

2009-03-09 18:53:26

WIndows MobSilverlight

2009-06-01 15:01:53

JPA实体状态API

2011-09-01 10:21:52

jQuery Mobi元素
点赞
收藏

51CTO技术栈公众号