1094332d3Sopenharmony_ci# Motion
2094332d3Sopenharmony_ci
3094332d3Sopenharmony_ci## 简介
4094332d3Sopenharmony_ci
5094332d3Sopenharmony_ci基于HDF(Hardware Driver Foundation)驱动框架开发的Motion驱动,能够屏蔽硬件器件差异,为上层服务提供稳定的手势识别基础能力接口,包括Motion使能/去使能、Motion订阅/取消订阅等稳定的接口。
6094332d3Sopenharmony_ci
7094332d3Sopenharmony_ciMotion驱动模块如图1所示,上层为Framework层,提供MSDP服务,通过UHDF(User Hardware Driver Foundation)层的Motion Proxy与Motion Stub进行交互;而Motion Stub可调用Motion HDI实现类接口,从而实现上层服务的手势识别使能/去使能、手势识别订阅/取消订阅等能力。
8094332d3Sopenharmony_ci
9094332d3Sopenharmony_ci**图 1** Motion驱动模块架构图
10094332d3Sopenharmony_ci
11094332d3Sopenharmony_ci![](figures/motion-driver-module-architecture_zh.png)
12094332d3Sopenharmony_ci
13094332d3Sopenharmony_ci## 目录
14094332d3Sopenharmony_ci
15094332d3Sopenharmony_ciMotion驱动源代码目录结构如下所示:
16094332d3Sopenharmony_ci
17094332d3Sopenharmony_ci```
18094332d3Sopenharmony_ci/drivers/peripheral/motion
19094332d3Sopenharmony_ci├── hdi_service                          # motion模块对上层服务提供的驱动能力
20094332d3Sopenharmony_ci├── test                                 # motion模块测试代码
21094332d3Sopenharmony_ci│   └── unittest\hdi                     # motion模块hdi单元测试代码
22094332d3Sopenharmony_ci```
23094332d3Sopenharmony_ci
24094332d3Sopenharmony_ci## 说明
25094332d3Sopenharmony_ci
26094332d3Sopenharmony_ci### 接口说明
27094332d3Sopenharmony_ci
28094332d3Sopenharmony_ciMotion驱动模块为上层服务提供可直接调用的能力接口,涉及的主要功能有:使能/去使能手势识别、订阅/取消订阅手势识别数据等操作。Motion驱动模型对HDI开放的API接口功能如表1:
29094332d3Sopenharmony_ci
30094332d3Sopenharmony_ci**表 1**  Motion HDI 接口列表
31094332d3Sopenharmony_ci
32094332d3Sopenharmony_ci| 接口名                                                       | 功能描述                                                     |
33094332d3Sopenharmony_ci| ------------------------------------------------------------ | ------------------------------------------------------------ |
34094332d3Sopenharmony_ci| int32_t EnableMotion(int32_t motionType)                     | 使能一种手势识别类型,只有数据订阅者使能手势识别后,才能获取订阅的手势识别数据。 |
35094332d3Sopenharmony_ci| int32_t DisableMotion(int32_t motionType)                    | 去使能一种手势识别类型。                                     |
36094332d3Sopenharmony_ci| int32_t Register(const sptr\<IMotionCallback\> &callbackObj)   | 订阅者成功注册手势识别数据回调函数,系统会将获取到的手势识别数据上报给订阅者。 |
37094332d3Sopenharmony_ci| int32_t Unregister(const sptr\<IMotionCallback\> &callbackObj) | 订阅者取消注册手势识别数据回调函数。                           |
38094332d3Sopenharmony_ci
39094332d3Sopenharmony_ci### 使用说明
40094332d3Sopenharmony_ci
41094332d3Sopenharmony_ci本节以订阅拿起手势识别数据为例进行介绍。
42094332d3Sopenharmony_ci
43094332d3Sopenharmony_ci代码示例
44094332d3Sopenharmony_ci
45094332d3Sopenharmony_ci```
46094332d3Sopenharmony_ci#include "v1_0/imotion_interface.h"
47094332d3Sopenharmony_ci
48094332d3Sopenharmony_ci/* 手势识别回调服务类 */
49094332d3Sopenharmony_ciclass MotionCallbackService : public IMotionCallback {
50094332d3Sopenharmony_cipublic:
51094332d3Sopenharmony_ci    MotionCallbackService() = default;
52094332d3Sopenharmony_ci    virtual ~MotionCallbackService() = default;
53094332d3Sopenharmony_ci    int32_t OnDataEvent(const HdfMotionEvent &event) override;
54094332d3Sopenharmony_ci};
55094332d3Sopenharmony_ci
56094332d3Sopenharmony_ci/* 回调函数 */
57094332d3Sopenharmony_ciint32_t MotionCallbackService::OnDataEvent(const HdfMotionEvent &event)
58094332d3Sopenharmony_ci{
59094332d3Sopenharmony_ci    printf("moton :[%d], result[%d]:, status[%d]\n\r", event.motion, event.result, event.status);
60094332d3Sopenharmony_ci    return HDF_SUCCESS;
61094332d3Sopenharmony_ci}
62094332d3Sopenharmony_ci
63094332d3Sopenharmony_civoid MotionSample(void)
64094332d3Sopenharmony_ci{
65094332d3Sopenharmony_ci    int32_t ret;
66094332d3Sopenharmony_ci    sptr<IMotionInterface> g_motionInterface = nullptr;
67094332d3Sopenharmony_ci    sptr<IMotionCallback> g_motionCallback = new MotionCallbackService();
68094332d3Sopenharmony_ci    sptr<IMotionCallback> g_motionCallbackUnregistered = new MotionCallbackService();
69094332d3Sopenharmony_ci
70094332d3Sopenharmony_ci    /* 1.获取motion服务 */
71094332d3Sopenharmony_ci    g_motionInterface = IMotionInterface::Get();
72094332d3Sopenharmony_ci    if (g_motionInterface == nullptr) {
73094332d3Sopenharmony_ci        return;
74094332d3Sopenharmony_ci    }
75094332d3Sopenharmony_ci    /* 2.订阅者注册手势识别数据回调处理函数 */
76094332d3Sopenharmony_ci    ret = g_motionInterface->Register(g_motionCallback);
77094332d3Sopenharmony_ci    if (ret != 0) {
78094332d3Sopenharmony_ci        return;
79094332d3Sopenharmony_ci    }
80094332d3Sopenharmony_ci    /* 3.使能手势识别 */
81094332d3Sopenharmony_ci    ret = g_motionInterface->EnableMotion(HDF_MOTION_TYPE_PICKUP);
82094332d3Sopenharmony_ci    if (ret != 0) {
83094332d3Sopenharmony_ci        return;
84094332d3Sopenharmony_ci    }
85094332d3Sopenharmony_ci    /* 4.去使能手势识别 */
86094332d3Sopenharmony_ci    ret = g_motionInterface->DisableMotion(HDF_MOTION_TYPE_PICKUP);
87094332d3Sopenharmony_ci    if (ret != 0) {
88094332d3Sopenharmony_ci        return;
89094332d3Sopenharmony_ci    }
90094332d3Sopenharmony_ci    /* 5.取消手势识别数据订阅函数 */
91094332d3Sopenharmony_ci    ret = g_motionInterface->Unregister(g_motionCallback);
92094332d3Sopenharmony_ci    if (ret != 0) {
93094332d3Sopenharmony_ci        return;
94094332d3Sopenharmony_ci    }
95094332d3Sopenharmony_ci}
96094332d3Sopenharmony_ci```
97094332d3Sopenharmony_ci
98094332d3Sopenharmony_ci## 相关仓
99094332d3Sopenharmony_ci
100094332d3Sopenharmony_ci[驱动子系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/%E9%A9%B1%E5%8A%A8%E5%AD%90%E7%B3%BB%E7%BB%9F.md)
101094332d3Sopenharmony_ci
102094332d3Sopenharmony_ci[drivers_hdf_core](https://gitee.com/openharmony/drivers_hdf_core)
103094332d3Sopenharmony_ci
104094332d3Sopenharmony_ci[drivers_interface](https://gitee.com/openharmony/drivers_interface)
105094332d3Sopenharmony_ci
106094332d3Sopenharmony_ci[**drivers\_peripheral**](https://gitee.com/openharmony/drivers_peripheral)