1 | import { throttle } from '../../utils';
|
2 | import { CallbackManager, MethodHandler } from '../../utils/handler';
|
3 | const callbackManager = new CallbackManager();
|
4 | let devicemotionListener;
|
5 |
|
6 |
|
7 |
|
8 | export const stopAccelerometer = ({ success, fail, complete } = {}) => {
|
9 | const res = {};
|
10 | const handle = new MethodHandler({ name: 'stopAccelerometer', success, fail, complete });
|
11 | try {
|
12 | window.removeEventListener('devicemotion', devicemotionListener, true);
|
13 | return handle.success(res);
|
14 | }
|
15 | catch (e) {
|
16 | res.errMsg = e.message;
|
17 | return handle.fail(res);
|
18 | }
|
19 | };
|
20 | const INTERVAL_MAP = {
|
21 | game: {
|
22 | interval: 20,
|
23 | frequency: 50
|
24 | },
|
25 | ui: {
|
26 | interval: 60,
|
27 | frequency: 16.67
|
28 | },
|
29 | normal: {
|
30 | interval: 200,
|
31 | frequency: 5
|
32 | }
|
33 | };
|
34 |
|
35 |
|
36 |
|
37 | export const startAccelerometer = ({ interval = 'normal', success, fail, complete } = {}) => {
|
38 | const handle = new MethodHandler({ name: 'startAccelerometer', success, fail, complete });
|
39 | try {
|
40 | if (window.DeviceMotionEvent) {
|
41 | const intervalObj = INTERVAL_MAP[interval];
|
42 | if (devicemotionListener) {
|
43 | stopAccelerometer();
|
44 | }
|
45 | devicemotionListener = throttle((evt) => {
|
46 | var _a, _b, _c;
|
47 | callbackManager.trigger({
|
48 | x: ((_a = evt.acceleration) === null || _a === void 0 ? void 0 : _a.x) || 0,
|
49 | y: ((_b = evt.acceleration) === null || _b === void 0 ? void 0 : _b.y) || 0,
|
50 | z: ((_c = evt.acceleration) === null || _c === void 0 ? void 0 : _c.z) || 0
|
51 | });
|
52 | }, intervalObj.interval);
|
53 | window.addEventListener('devicemotion', devicemotionListener, true);
|
54 | }
|
55 | else {
|
56 | throw new Error('accelerometer is not supported');
|
57 | }
|
58 | return handle.success();
|
59 | }
|
60 | catch (e) {
|
61 | return handle.fail({ errMsg: e.message });
|
62 | }
|
63 | };
|
64 |
|
65 |
|
66 |
|
67 | export const onAccelerometerChange = callback => {
|
68 | callbackManager.add(callback);
|
69 | };
|
70 |
|
71 |
|
72 |
|
73 | export const offAccelerometerChange = callback => {
|
74 | callbackManager.remove(callback);
|
75 | };
|