1# Stationary开发指导
2
3
4## 场景介绍
5
6当应用需要获取当前设备状态时,可以调用Stationary模块,例如:需要判断当前设备处于绝对静止状态或者相对静止状态。
7
8详细的接口介绍请参考[Stationary接口](../../reference/apis-multimodalawareness-kit/js-apis-stationary.md)。
9
10## 设备状态类型参数说明
11
12| 名称 | 描述 |
13| -------- | -------- |
14| still | 绝对静止。 |
15| relativeStill | 相对静止。 |
16
17## 订阅设备状态事件参数说明
18
19| 变量                             | 值    | 说明                                       |
20| ------------------------------ | ---- | ---------------------------------------- |
21| ENTER         | 1    | 订阅进入事件。   |
22| EXIT | 2   | 订阅退出事件。 |
23| ENTER_EXIT | 3   | 订阅进入和退出事件。 |
24
25## 返回设备状态参数说明
26
27| 变量                             | 值    | 说明                                       |
28| ------------------------------ | ---- | ---------------------------------------- |
29| ENTER         | 1    | 返回进入状态。   |
30| EXIT | 2   | 返回退出状态。 |
31
32## 接口说明
33
34| 接口名                                                       | 描述                                                         |
35| ------------------------------------------------------------ | ------------------------------------------------------------ |
36| on(activity: ActivityType, event: ActivityEvent, reportLatencyNs: number, callback: Callback<ActivityResponse>): void | 订阅设备状态,结果通过callback返回。 |
37| once(activity: ActivityType, callback: Callback<ActivityResponse>): void | 查询设备状态,结果通过callback返回。 |
38| off(activity: ActivityType, event: ActivityEvent, callback?: Callback<ActivityResponse>): void | 取消订阅设备状态。                                 |
39
40## 约束与限制
41
42设备需要支持加速度传感器。
43目前只提供了算法框架,api接口测试框架的调用返回结果为:data={"type":3,"value":-1};
44如需相对静止和绝对静止能力,则具体算法需要开发者自己在device_status/libs/src/algorithm实现,可参考案例如下:
45
46   ```ts
47   algoPara_.resultantAcc =
48      sqrt((algoPara_.x * algoPara_.x) + (algoPara_.y * algoPara_.y) + (algoPara_.z * algoPara_.z));
49   if ((algoPara_.resultantAcc > RESULTANT_ACC_LOW_THRHD) && (algoPara_.resultantAcc < RESULTANT_ACC_UP_THRHD)) {
50      if (state_ == STILL) {
51         return;
52      }
53      counter_--;
54      if (counter_ == 0) {
55         counter_ = COUNTER_THRESHOLD;
56         UpdateStateAndReport(VALUE_ENTER, STILL, TYPE_ABSOLUTE_STILL);
57      }
58   } else {
59      counter_ = COUNTER_THRESHOLD;
60      if (state_ == UNSTILL) {
61         return;
62      }
63      UpdateStateAndReport(VALUE_EXIT, UNSTILL, TYPE_ABSOLUTE_STILL);
64   }
65   ```
66
67## 开发步骤
68
691. 订阅绝对静止的进入事件,1秒上报一次。
70
71   ```ts
72   import { stationary } from '@kit.MultimodalAwarenessKit';
73   import { BusinessError } from '@kit.BasicServicesKit';
74   let reportLatencyNs = 1000000000;
75   try {
76      stationary.on('still', stationary.ActivityEvent.ENTER, reportLatencyNs, (data) => {
77         console.log('data='+ JSON.stringify(data));
78      })
79   } catch (error) {
80      let message = (error as BusinessError).message;
81      console.error('stationary on failed:' + message);
82   }
83   ```
84
852. 查询绝对静止状态的进入事件。
86
87   ```ts
88   import { stationary } from '@kit.MultimodalAwarenessKit';
89   import { BusinessError } from '@kit.BasicServicesKit';
90   try {
91      stationary.once('still', (data) => {
92         console.log('data='+ JSON.stringify(data));
93      })
94   } catch (error) {
95      let message = (error as BusinessError).message;
96      console.error('stationary once failed:' + message);
97   }
98   ```
99
1003. 取消订阅绝对静止状态的进入事件。
101
102   ```ts
103   import { stationary } from '@kit.MultimodalAwarenessKit';
104   import { BusinessError } from '@kit.BasicServicesKit';
105   try {
106      stationary.off('still', stationary.ActivityEvent.ENTER, (data) => {
107         console.log('data='+ JSON.stringify(data));
108      })
109   } catch (error) {
110      let message = (error as BusinessError).message;
111      console.error('stationary off failed:' + message);
112   }
113   ```
114