[XMOVE自主设计的体感方案] XMove Studio管理系统(二)应用开发API简要介绍
一. XMove的開放式應用開發框架簡介
XMove4.0以開放式的結構滿足擴展性的要求。所有無線協議,底層算法和控制邏輯全部上移到PC端。節點只根據接受的控制邏輯返回傳感器數據。新的架構使得開發新應用非常方便。
本節將主要介紹XMove應用開發API及其使用。
二. 注冊新應用
我們將以開發“空中鼠標”應用為例,介紹開發應用的方法。
空中鼠標是通過陀螺儀傳感器采集的旋轉數據,傳遞給PC機,在空中旋轉節點即可控制PC鼠標的功能。由于需要鼠標左右鍵,因此最低節點需求是含鍵盤的節點。
1.環境搭建
在VS中新建C#類庫工程,引用XFrmWork.XMove.Interface 基類庫的dll文件。該文件包含了XMove的核心基類和抽象邏輯。若您曾經做過這步,可以跳過。添加功能時僅需在該工程中添加新的類即可。
注意,需將該工程的dll輸出路徑修改為XMove應用插件文件夾XMovePlugin。這樣就可以不用手動拷貝了。
2. 繼承基類
XMove應用基類是AbstractApp,它提供基礎的服務和接口。新應用從AbstractApp繼承。
[XFrmWorkAttribute("空中鼠標", "IProgramWPF", "利用陀螺儀實現的空中鼠標系統", "/XFrmWork.XMove.Program;component/Images/空中鼠標.jpg")]public class SkyMouse : AbstractApp{//在此處添加代碼邏輯}為了能被XFrmWork插件搜索器搜索到,需要添加XFrmWorkAttribute插件標記。四個參數分別是: APP名稱,接口約束(應用固定為IProgramWPF), 說明介紹,和圖片資源地址(方便主框架顯示應用Logo)、
3. 查看效果
生成工程,運行XMove主程序,如下圖所示,XFrmWork已經成功加載該應用。
三.節點映射和配置節點工作狀態
1. 節點映射配置
要想獲取節點傳遞來的信息,首先要配置應用程序節點映射。節點映射一般在默認情況下給出映射到哪個節點組的哪個節點,并給出其名稱和最低節點功能需求。
在應用程序啟動時,首先嘗試讀取硬盤中存儲的節點映射表,否則嘗試重建默認映射表。因此必須重寫重建函數:
public override void RebuildNodeRelation(){myProgramRoutedNode = new NodeRoutedCollection();myProgramRoutedNode.Add(new ProgramNodeRegeistration(){Name = "手持設備",GroupID = 0,SelectedID = NodeID.LeftHandNode,MinRequiredNodeType= XMoveStaticsHelper.QueryAbstractNodeString(typeof(XNodeHID))});}
如上案例所示,只增加一個節點,名稱是手持設備,默認組別為0,組內ID是左手節點。最低要求是XNodeHID(包含鍵盤的MEMS節點)
若您允許用戶在應用中修改映射表的表項數量,需要重寫以下屬性:
由于空中鼠標只需一個節點,因此不需要改變節點映射項數量,return false. 默認是return false的。此時,用戶在運行時修改數量的按鈕將不可用。
public override bool isMountChangedeable{get { return false; }}?
基類已經將從外部讀取映射表,和結束程序時存儲映射表的功能實現,作為開發者的您可以不關心這些問題。您只需關心重建函數和isMountChangedeable屬性。
2. 配置節點工作狀態
為了盡可能降低節點工作功耗,應該給出應用程序所需的節點刷新速率,是否需要陀螺儀等屬性。節點工作狀態的描述類為:
其中NodeWorkMode類描述了節點當前的工作狀態,而NodeControlledWorkMode類從NodeWorkMode繼承,描述當前對該節點所有工作狀態需求的匯總。
NodeControlledWorkMode類會自動匯總所有應用對該節點需求,求出能滿足所有應用的最低需求。從而在應用發生改變時,控制節點切換到相應模式。
public override void ConfigNodeWorkMode(){LeftHandXNodeHID.neededWorkMode.SetWorkMode(this,true, NodeFreshSpeed.一秒32次);}?
其中函數的定義為:
public void SetWorkMode(IProgramWPF program,bool gyroEnable, NodeFreshSpeed speed){myNeededList.Add(program, new Tuple<bool, NodeFreshSpeed>(gyroEnable, speed));RefreshData();}?
參數分別為該程序的引用,是否能開啟陀螺儀和刷新速度。 ?由于陀螺儀是傳感器中的耗電大戶,因此應該在不需要的情形下盡可能關閉之。
四.獲取傳感器數據
應用一般有兩種類型:
- 隔一段時間獲取傳感器數據,實現刷新,但并不關心數據是否是最新的
- 只有當新數據到來時才會觸發應用事件。
我們分別將將它們稱作定時器型應用和事件型應用。對于空中鼠標而言,應屬于事件型應用。
首先必須獲得映射表定義的節點的引用:
LeftHandXNodeHID = XNodeGroupManager.Instance[myProgramRoutedNode[0]] as XNodeHID;XNodeGroupManager是節點管理器類,通過單例模式提供方便的訪問權限,索引器中,可以按上述格式,獲取節點引用。
1. 定時器型應用
定時器型應用不關心數據是否是最新的,但需要穩定的定時實現刷新。要想實現定時刷新,需要重寫以下字段:
public override int ProcessPerSecond{get{return 25;}}?
應用程序管理器會為重寫該字段的每個應用提供定時器支持,在點擊開啟按鈕后,會自動啟動定時器,按下停止后關閉。應用程序可不關心其具體實現。
至于在定時到來時要處理的邏輯,可以通過重寫DataProcess()函數:
public override bool DataProcess(){VirtualKey.VKMouse(1, (int)(-LeftHandXNodeHID.GyroZ / 20), (int)(LeftHandXNodeHID.GyroY / 20), 0, 0);switch (LeftHandXNodeHID.thisKeyChanged){case KeyBoardChanged.KEYUP_DOWN: //左鍵 VirtualKey.VKMouse(0x0002, 0, 0, 0, 0); //按下break;case KeyBoardChanged.KEYUP_UP:VirtualKey.VKMouse(0x0004, 0, 0, 0, 0); //彈起break;case KeyBoardChanged.KEYDOWN_DOWN: //右鍵 VirtualKey.VKMouse(0x0008, 0, 0, 0, 0); //按下break;case KeyBoardChanged.KEYDOWN_UP: //右鍵VirtualKey.VKMouse(0x0010, 0, 0, 0, 0); //彈起break;case KeyBoardChanged.KEYLEFT_DOWN: //滾輪移動VirtualKey.VKMouse(0x0800, 0, 0, -(int)(LeftHandXNodeHID.GyroX), 0); // break;}return true;}?
? ? 值得注意的是,LeftHandXNodeHID是該類的節點引用持有者。這樣,系統會在每隔1/25秒執行該函數。
2. 事件型應用
另外一種類型是事件型應用,它對處理性能的要求更低,也更靈活。應用應該通過事件的方式訂閱節點管理器發出的通知:如節點獲取新數據,建立新連接或斷開連接等。
要想配置成事件型應用,您需要將ProcessPerSecond屬性中返回值改為0,這樣系統就不會提供定時器了。
對于空中鼠標應用,可以只關心節點傳遞來的新數據通知。在開啟時,需要將處理方法掛接在該事件上,如下程序所示:
public override bool InitProcess(){LeftHandXNodeHID = XNodeGroupManager.Instance[myProgramRoutedNode[0]] as XNodeHID;LeftHandXNodeHID.OnXNodeEvent += LeftHandXNodeHID_OnProgramEvent;//除此之外,您可以添加其他初始化的函數return true;}?
關閉應用時,將該事件取消掛接:
public override bool CloseProcess(){LeftHandXNodeHID.OnXNodeEvent -= LeftHandXNodeHID_OnProgramEvent;return true;}LeftHandXNodeHID_OnProgramEvent是處理事件,其功能與上述DataProcess()描述完全一致,此處從略。
3. 混合型應用
若您同時需要定時器和事件,可以將ProcessPerSecond設置成需要的值,同時掛載事件,與1,2描述一致,此處從略。
五. 開發有UI控件的應用
在很多情形下,您可能需要開發帶UI控件的應用。此時的開發要比一般情形復雜。具體實現方法和您的具體設計有關。目前僅提供WPF內置的UserControl控件的支持。
1. 使用MVVM結構開發
若您對MVVM結構很熟悉,則推薦采用這種開發方式,此時,需要讓您開發的類實現IView接口:
我們假設您對MVVM模式已經很熟悉,需要另外設計ViewModel,該類中是DynIdentityTrainnerUI, 在構造函數中,實現數據上下文綁定。
public class DynIdentityTrainner : AbstractApp, IView{DynIdentityTrainner() {myDynIdentityTrainnerUI.DataContext = this; //實現綁定 }DynIdentityTrainnerUI myDynIdentityTrainnerUI = new DynIdentityTrainnerUI();public UserControl thisUserControl //IView接口成員:返回要顯示的UI控件{get { return myDynIdentityTrainnerUI; }}public FrmState thisFrmState //IView接口成員:返回要放置的位置{get { return FrmState.Large; } } }?
2. 不使用MVVM開發
若您對MVVM不熟悉,通常的解決辦法是從UserControl類繼承。但是C#只支持單繼承,通常的辦法是實現XMove基本應用的所有接口,這對于開發者是不合適的,因此我提供了一個UI類,解決了這一問題:
public class AbstractUIApp : UserControl, IProgramWPF, IProgramNodeChangeable, IView, IRelationComputeable{//實現代碼}?
在開發時,您需要從AbstractUIApp類繼承,此時可獲得界面設計器的支持,其他的開發方式和上述一致,此處不贅述。
六. 其他注意點
1.可能要重寫的其他函數
除了以上可能要修改的屬性和重寫函數外,還有兩個函數可能需要重寫:
? ?LoadMainResource函數在用戶將其拖到應用列表時執行,若加載大型資源時必須重寫該函數,而不是定義在InitProcess函數中,因為用戶隨時都可能開啟或關閉程序,不應該在此函數中過分耗時。
例如空中鼠標,它需要在第一次初始化時加載SVM識別模型。用于手勢識別。
public override bool LoadMainResource(){mySVMMethod = new SVMMethod();mySVMMethod.LoadSVMModel(PublicName);return true;}? ?除此之外,還有對應的釋放函數。和初始化需要的注意點一致:
public override bool ReleaseMainResource(){//釋放所需的非托管資源}
? ?2. 兩個輔助外部管理器
一些管理型應用,不僅需要獲取節點的數據,還需要知悉整個系統的工作狀態,此時就需要獲得一些擴展功能。
系統提供在基類中提供了兩個服務者,解決了以上問題:
public AbstractCommManager thisCommManager { get; set; }public IProgramManager thisProgramManager { get; set; }? ? ? 分別是通信管理器接口和程序管理器接口,它封裝了和限制了應用對管理器的控制權限,提供了可讀的一些有用信息。
例如,在thisProgramManager的幫助下,應用可以開啟或關閉另外一個應用,可以在界面上添加或刪除新的UI組件,
/// <summary>/// 應用程序管理器/// </summary>public interface IProgramManager{bool BeginOneProcess(IProgramWPF rc);bool StopOneProcess(IProgramWPF rc);void AddUserControl(UserControl value, FrmState thisState, string title);void RemoveUserControl(UserControl value);IEnumerable<NodeEnumKeyPair> GetAllEnumerable { get; }IEnumerable<IProgramWPF> GetActivePrograms { get; }}? ? ?與其類似的是,可以開啟或關閉通信方法,或獲取已開啟通信方法的枚舉等。
3. 安全性
由于系統使用和開發環境都是基于專業用戶的,因此以開放的精神,API提供的接口的權限都達到甚至超過了實際應用的最大需求。在開發應用時,您應該考慮只讀取數據,而不非法寫入或修改核心狀態數據,這可能會導致系統崩潰或出現不可預見的問題。
4. 其他API
XMove開發環境內置了XFrmWork的全部功能集合,同時有.NET FrameWork作為支持,您所需的大部分函數和功能類都可以在其中找到,這包括網絡通信,數據庫,圖形UI等。您可以參考詳細開發文檔,此處不進行詳細描述。
5.發布
您可以將您的工程編譯為dll,提供給用戶。在目前框架下,無法實現自動升級,因此需要手動拷貝。未來框架會加入自動升級功能。
七. 總結
本文較詳細的介紹了在XMove框架下開發新應用的方法和注意事項。目前XMove框架已經支持多達20多種應用,涉及節點管理,人機交互,虛擬現實等應用,我會在后續文章中繼續介紹。
若您感興趣,歡迎聯系我 ?buptzym@bupt.edu.cn
?
總結
以上是生活随笔為你收集整理的[XMOVE自主设计的体感方案] XMove Studio管理系统(二)应用开发API简要介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net Reflection(反射)-
- 下一篇: win10系统下使用大漠插件后台截图卡住