xmove4.0以開放式的結構滿足擴充性的要求。所有無線協定,底層算法和控制邏輯全部上移到pc端。節點隻根據接受的控制邏輯傳回傳感器資料。新的架構使得開發新應用非常友善。
本節将主要介紹xmove應用開發api及其使用。
我們将以開發“空中滑鼠”應用為例,介紹開發應用的方法。
空中滑鼠是通過陀螺儀傳感器采集的旋轉資料,傳遞給pc機,在空中旋轉節點即可控制pc滑鼠的功能。由于需要滑鼠左右鍵,是以最低節點需求是含鍵盤的節點。
在vs中建立c#類庫工程,引用xfrmwork.xmove.interface 基類庫的dll檔案。該檔案包含了xmove的核心基類和抽象邏輯。若您曾經做過這步,可以跳過。添加功能時僅需在該工程中添加新的類即可。
注意,需将該工程的dll輸出路徑修改為xmove應用插件檔案夾xmoveplugin。這樣就可以不用手動拷貝了。
xmove應用基類是abstractapp,它提供基礎的服務和接口。新應用從abstractapp繼承。
為了能被xfrmwork插件搜尋器搜尋到,需要添加xfrmworkattribute插件标記。四個參數分别是: app名稱,接口限制(應用固定為iprogramwpf), 說明介紹,和圖檔資源位址(友善主架構顯示應用logo)、
生成工程,運作xmove主程式,如下圖所示,xfrmwork已經成功加載該應用。
要想擷取節點傳遞來的資訊,首先要配置應用程式節點映射。節點映射一般在預設情況下給出映射到哪個節點組的哪個節點,并給出其名稱和最低節點功能需求。
在應用程式啟動時,首先嘗試讀取硬碟中存儲的節點映射表,否則嘗試重建預設映射表。是以必須重寫重建函數:
如上案例所示,隻增加一個節點,名稱是手持裝置,預設組别為0,組内id是左手節點。最低要求是xnodehid(包含鍵盤的mems節點)
若您允許使用者在應用中修改映射表的表項數量,需要重寫以下屬性:
由于空中滑鼠隻需一個節點,是以不需要改變節點映射項數量,return false. 預設是return false的。此時,使用者在運作時修改數量的按鈕将不可用。
基類已經将從外部讀取映射表,和結束程式時存儲映射表的功能實作,作為開發者的您可以不關心這些問題。您隻需關心重建函數和ismountchangedeable屬性。
為了盡可能降低節點工作功耗,應該給出應用程式所需的節點重新整理速率,是否需要陀螺儀等屬性。節點工作狀态的描述類為:
其中nodeworkmode類描述了節點目前的工作狀态,而nodecontrolledworkmode類從nodeworkmode繼承,描述目前對該節點所有工作狀态需求的彙總。
nodecontrolledworkmode類會自動彙總所有應用對該節點需求,求出能滿足所有應用的最低需求。進而在應用發生改變時,控制節點切換到相應模式。
其中函數的定義為:
參數分别為該程式的引用,是否能開啟陀螺儀和重新整理速度。 由于陀螺儀是傳感器中的耗電大戶,是以應該在不需要的情形下盡可能關閉之。
應用一般有兩種類型:
隔一段時間擷取傳感器資料,實作重新整理,但并不關心資料是否是最新的
隻有當新資料到來時才會觸發應用事件。
我們分别将将它們稱作定時器型應用和事件型應用。對于空中滑鼠而言,應屬于事件型應用。
首先必須獲得映射表定義的節點的引用:
xnodegroupmanager是節點管理器類,通過單例模式提供友善的通路權限,索引器中,可以按上述格式,擷取節點引用。
定時器型應用不關心資料是否是最新的,但需要穩定的定時實作重新整理。要想實作定時重新整理,需要重寫以下字段:
應用程式管理器會為重寫該字段的每個應用提供定時器支援,在點選開啟按鈕後,會自動啟動定時器,按下停止後關閉。應用程式可不關心其具體實作。
至于在定時到來時要處理的邏輯,可以通過重寫dataprocess()函數:
值得注意的是,lefthandxnodehid是該類的節點引用持有者。這樣,系統會在每隔1/25秒執行該函數。
另外一種類型是事件型應用,它對處理性能的要求更低,也更靈活。應用應該通過事件的方式訂閱節點管理器發出的通知:如節點擷取新資料,建立新連接配接或斷開連接配接等。
要想配置成事件型應用,您需要将processpersecond屬性中傳回值改為0,這樣系統就不會提供定時器了。
對于空中滑鼠應用,可以隻關心節點傳遞來的新資料通知。在開啟時,需要将處理方法挂接在該事件上,如下程式所示:
關閉應用時,将該事件取消挂接:
lefthandxnodehid_onprogramevent是處理事件,其功能與上述dataprocess()描述完全一緻,此處從略。
若您同時需要定時器和事件,可以将processpersecond設定成需要的值,同時挂載事件,與1,2描述一緻,此處從略。
在很多情形下,您可能需要開發帶ui控件的應用。此時的開發要比一般情形複雜。具體實作方法和您的具體設計有關。目前僅提供wpf内置的usercontrol控件的支援。
若您對mvvm結構很熟悉,則推薦采用這種開發方式,此時,需要讓您開發的類實作iview接口:
我們假設您對mvvm模式已經很熟悉,需要另外設計viewmodel,該類中是dynidentitytrainnerui, 在構造函數中,實作資料上下文綁定。
若您對mvvm不熟悉,通常的解決辦法是從usercontrol類繼承。但是c#隻支援單繼承,通常的辦法是實作xmove基本應用的所有接口,這對于開發者是不合适的,是以我提供了一個ui類,解決了這一問題:
在開發時,您需要從abstractuiapp類繼承,此時可獲得界面設計器的支援,其他的開發方式和上述一緻,此處不贅述。
除了以上可能要修改的屬性和重寫函數外,還有兩個函數可能需要重寫:
loadmainresource函數在使用者将其拖到應用清單時執行,若加載大型資源時必須重寫該函數,而不是定義在initprocess函數中,因為使用者随時都可能開啟或關閉程式,不應該在此函數中過分耗時。
例如空中滑鼠,它需要在第一次初始化時加載svm識别模型。用于手勢識别。
除此之外,還有對應的釋放函數。和初始化需要的注意點一緻:
一些管理型應用,不僅需要擷取節點的資料,還需要知悉整個系統的工作狀态,此時就需要獲得一些擴充功能。
系統提供在基類中提供了兩個服務者,解決了以上問題:
分别是通信管理器接口和程式管理器接口,它封裝了和限制了應用對管理器的控制權限,提供了可讀的一些有用資訊。
例如,在thisprogrammanager的幫助下,應用可以開啟或關閉另外一個應用,可以在界面上添加或删除新的ui元件,
與其類似的是,可以開啟或關閉通信方法,或擷取已開啟通信方法的枚舉等。
由于系統使用和開發環境都是基于專業使用者的,是以以開放的精神,api提供的接口的權限都達到甚至超過了實際應用的最大需求。在開發應用時,您應該考慮隻讀取資料,而不非法寫入或修改核心狀态資料,這可能會導緻系統崩潰或出現不可預見的問題。
xmove開發環境内置了xfrmwork的全部功能集合,同時有.net framework作為支援,您所需的大部分函數和功能類都可以在其中找到,這包括網絡通信,資料庫,圖形ui等。您可以參考詳細開發文檔,此處不進行較長的描述。
您可以将您的工程編譯為dll,提供給使用者。在目前架構下,無法實作自動更新,是以需要手動拷貝。未來架構會加入自動更新功能。
本文較詳細的介紹了在xmove架構下開發新應用的方法和注意事項。目前xmove架構已經支援多達20多種應用,涉及節點管理,人機互動,虛拟現實等應用,我會在後續文章中繼續介紹。