1 // Copyright 2023-present 650 Industries. All rights reserved.
2 
3 import CoreMotion
4 import ExpoModulesCore
5 
6 private let EVENT_ACCELEROMETER_DID_UPDATE = "accelerometerDidUpdate"
7 
8 public final class AccelerometerModule: Module {
9   private lazy var motionManager = CMMotionManager()
10   private lazy var operationQueue = OperationQueue()
11 
definitionnull12   public func definition() -> ModuleDefinition {
13     Name("ExponentAccelerometer")
14 
15     Events(EVENT_ACCELEROMETER_DID_UPDATE)
16 
17     AsyncFunction("isAvailableAsync") {
18       return motionManager.isAccelerometerAvailable
19     }
20 
21     AsyncFunction("setUpdateInterval") { (intervalMs: Double) in
22       motionManager.accelerometerUpdateInterval = intervalMs / 1000.0
23     }
24 
25     OnStartObserving {
26       if motionManager.isAccelerometerActive {
27         return
28       }
29       motionManager.startAccelerometerUpdates(to: operationQueue) { [weak self] data, _ in
30         guard let acceleration = data?.acceleration else {
31           return
32         }
33         self?.sendEvent(EVENT_ACCELEROMETER_DID_UPDATE, [
34           "x": acceleration.x,
35           "y": acceleration.y,
36           "z": acceleration.z
37         ])
38       }
39     }
40 
41     OnStopObserving {
42       motionManager.stopAccelerometerUpdates()
43     }
44 
45     OnDestroy {
46       motionManager.stopAccelerometerUpdates()
47     }
48   }
49 }
50