社区编辑申请
注册/登录
浅析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在线商店细则已由微软发布
责任编辑:彭凡 来源: 博客园

同话题下的热门内容

大反转,iOS15.6比iOS14.8优化更好,续航提升很满意,推荐升级佩洛西窜台,苹果躺枪?iPhone14或延迟发布抖音 iOS 推荐 Feed 容器化总结携程小程序生态之Taro跨端解决方案注意!iOS 15.4.1 还剩余 七 天,你会选择升级吗?iOS16新测试版发布,消失5年的功能回归马化腾:为什么你们不在乎QQ等级,不用QQ了吗?使用 Swift Package 插件生成代码

编辑推荐

2017年9月编程语言排行榜:Java、C与C++三巨头还能统治排行榜多久?初学者最容易学的六种编程语言CVPR 2017论文解读:特征金字塔网络FPN手把手教你搭建PHP版RabbitMQ消息队列开发环境及Demo实践微信小程序“反编译”实战(一):解包
我收藏的内容
点赞
收藏

51CTO技术栈公众号