建设电子商务网站策划书,海南省建设标准定额网站,沈阳网上注册公司流程,瑞安建设公司网站一. XMove的开放式应用开发框架简介 XMove4.0以开放式的结构满足扩展性的要求。所有无线协议#xff0c;底层算法和控制逻辑全部上移到PC端。节点只根据接受的控制逻辑返回传感器数据。新的架构使得开发新应用非常方便。 本节将主要介绍XMove应用开发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 Tuplebool, 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/// 应用程序管理器/// /summarypublic interface IProgramManager{bool BeginOneProcess(IProgramWPF rc);bool StopOneProcess(IProgramWPF rc);void AddUserControl(UserControl value, FrmState thisState, string title);void RemoveUserControl(UserControl value);IEnumerableNodeEnumKeyPair GetAllEnumerable { get; }IEnumerableIProgramWPF GetActivePrograms { get; }} 与其类似的是可以开启或关闭通信方法或获取已开启通信方法的枚举等。 3. 安全性 由于系统使用和开发环境都是基于专业用户的因此以开放的精神API提供的接口的权限都达到甚至超过了实际应用的最大需求。在开发应用时您应该考虑只读取数据而不非法写入或修改核心状态数据这可能会导致系统崩溃或出现不可预见的问题。 4. 其他API XMove开发环境内置了XFrmWork的全部功能集合同时有.NET FrameWork作为支持您所需的大部分函数和功能类都可以在其中找到这包括网络通信数据库图形UI等。您可以参考详细开发文档此处不进行详细描述。 5.发布 您可以将您的工程编译为dll提供给用户。在目前框架下无法实现自动升级因此需要手动拷贝。未来框架会加入自动升级功能。 七. 总结 本文较详细的介绍了在XMove框架下开发新应用的方法和注意事项。目前XMove框架已经支持多达20多种应用涉及节点管理人机交互虚拟现实等应用我会在后续文章中继续介绍。 若您感兴趣欢迎联系我 buptzymbupt.edu.cn