背景
热烈欢迎 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是一个抽象类,定义了统一的访问接口,主要提供三个主要的接口:
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的设计
这里使用了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的实现有点差异。但是目标是一致的,就是实现消息提供方和消息接收方的解耦。那个实现可以参考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的设计
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
本文转自Jake Lin博客园博客,原文链接:http://www.cnblogs.com/procoder/archive/2009/09/18/1568939.html,如需转载请自行联系原作者