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