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部分的总体类图设计:

sensor_api_uml

下面文章分部分讲述。

GSensor设计

sensor_api_uml2

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的设计

sensor_api_uml3

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

Observer的设计

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

sensor_api_uml4

我使用了一个开源的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的设计

sensor_api_uml5 

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,如需转载请自行联系原作者


相关文章
|
1月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
90 9
|
1月前
|
存储 开发框架 .NET
.NET 8 实现无实体库表 API 部署服务
【10月更文挑战第12天】在.NET 8中,可通过以下步骤实现无实体库表的API部署:首先安装.NET 8 SDK及开发工具,并选用轻量级Web API框架如ASP.NET Core;接着创建新项目并设计API,利用内存数据结构模拟数据存储;最后配置项目设置并进行测试与部署。此方法适用于小型项目或临时解决方案,但对于大规模应用仍需考虑持久化存储以确保数据可靠性与可扩展性。
|
2月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
2月前
|
JSON 资源调度 JavaScript
Vue框架中Ajax请求的实现方式:使用axios库或fetch API
选择 `axios`还是 `fetch`取决于项目需求和个人偏好。`axios`提供了更丰富的API和更灵活的错误处理方式,适用于需要复杂请求配置的场景。而 `fetch`作为现代浏览器的原生API,使用起来更为简洁,但在旧浏览器兼容性和某些高级特性上可能略显不足。无论选择哪种方式,它们都能有效地在Vue应用中实现Ajax请求的功能。
42 4
|
3月前
|
API 数据库 索引
indexedDB 操作库IDBWRAPPER 教程翻译及API翻译第二部分part2
indexedDB 操作库IDBWRAPPER 教程翻译及API翻译第二部分part2
|
3月前
|
开发框架 JavaScript .NET
【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found
【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found
|
3月前
|
JSON API 网络架构
【Azure Developer】Azure REST API: 如何通过 API查看 Recovery Services Vaults(恢复保管库)的备份策略信息? 如备份中是否含有虚拟机的Disk
【Azure Developer】Azure REST API: 如何通过 API查看 Recovery Services Vaults(恢复保管库)的备份策略信息? 如备份中是否含有虚拟机的Disk
|
4月前
|
SQL 并行计算 API
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
|
4月前
|
自然语言处理 PyTorch API
`transformers`库是Hugging Face提供的一个开源库,它包含了大量的预训练模型和方便的API,用于自然语言处理(NLP)任务。在文本生成任务中,`transformers`库提供了许多预训练的生成模型,如GPT系列、T5、BART等。这些模型可以通过`pipeline()`函数方便地加载和使用,而`generate()`函数则是用于生成文本的核心函数。
`transformers`库是Hugging Face提供的一个开源库,它包含了大量的预训练模型和方便的API,用于自然语言处理(NLP)任务。在文本生成任务中,`transformers`库提供了许多预训练的生成模型,如GPT系列、T5、BART等。这些模型可以通过`pipeline()`函数方便地加载和使用,而`generate()`函数则是用于生成文本的核心函数。
|
6月前
|
算法 Linux Windows
FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass
在Windows环境下为FFmpeg集成字幕渲染库libass涉及多个步骤,包括安装freetype、libxml2、gperf、fontconfig、fribidi、harfbuzz和libass。每个库的安装都需要下载源码、配置、编译和安装,并更新PKG_CONFIG_PATH环境变量。最后,重新配置并编译FFmpeg以启用libass及相关依赖。完成上述步骤后,通过`ffmpeg -version`确认libass已成功集成。
145 1
FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass