Windows Mobile Sensors API庫的設計

來源:互聯網
上載者:User
背景

熱烈歡迎 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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.