6

I have creating an application for apple watch. The Logic is, when the user rise their hand and tap a button from app. At that time I will fetch the accelerometer values. And whenever user rise their hand and meet the captured position, I have to send message to iPhone.

For me am getting the values correctly But, It will always give the values based on accelerometer. Which means user doesn't rise the hand but accelerometer values matched. So values will send to mobile.

func startUpadateAccelerometer() {
        self.motionManager.accelerometerUpdateInterval = 1.0 / 10.0
        self.motionManager.startAccelerometerUpdates(to: OperationQueue()) { (accelerometerData, error) -> Void in
            guard accelerometerData != nil else
            {
                print("There was an error: \(String(describing: error))")
                return
            }

            DispatchQueue.main.async {
                if(self.can_reset){
                    let differenceX : Bool = self.validateButtom(currentValue: accelerometerData!.acceleration.x, inititalValue: self.gravityReference.x)
                    let differenceY : Bool = self.validateButtom(currentValue: accelerometerData!.acceleration.y, inititalValue: self.gravityReference.y)

                    if(differenceX && differenceY && self.gravityOffsetDifference(currentValue: accelerometerData!.acceleration.x, referenceValue: self.gravityReference.x ) && self.gravityOffsetDifference(currentValue: accelerometerData!.acceleration.y, referenceValue: self.gravityReference.y)){
                        WKInterfaceDevice().play(.success)
//                        self.addLog(_logStr: EventsTypes.Achievements1.rawValue)

                        self.logString += String(format: "X: %0.3f Y: %0.3f Z: %0.3f  \n", accelerometerData!.acceleration.x,accelerometerData!.acceleration.y,accelerometerData!.acceleration.z)
                        self.m_XYZValueLbl.setText(self.logString)

                        self.is_RechedZeroPos = true
                        self.session?.sendMessage(["msg" : "\(self.logString)"], replyHandler: nil) { (error) in
                            NSLog("%@", "Error sending message: \(error)")
                        }

                    } else {
                        if(self.checkAchievements2_3(deviceMotionData: accelerometerData!.acceleration) == true) {
                            if self.is_RechedZeroPos == true {
                                self.addLog(_logStr: EventsTypes.Achievements2.rawValue)
                                self.is_RechedZeroPos = false
                            } else {
                                self.addLog(_logStr: EventsTypes.Achievements3.rawValue)
                            }
                        }
                    }
                } else {
                    self.gravityReference = accelerometerData!.acceleration
                    //self.logString = String(format: "Reference Acceleration   %0.3f   %0.3f   %0.3f  \n", self.gravityReference.x,self.gravityReference.y,self.gravityReference.z)
                    self.can_reset = true
                }
            }
        }
    }

func validateButtom(currentValue : Double , inititalValue : Double) -> Bool {
        if( currentValue == 0 && inititalValue == 0) {
            return true
        } else if( currentValue < 0 && inititalValue < 0) {
            return true
        } else if( currentValue > 0 && inititalValue > 0) {
            return true
        } else {
            return false
        }
    }



 func gravityOffsetDifference(currentValue : Double , referenceValue: Double) -> Bool {
        var difference : Double!
        if (fabs(currentValue) <= fabs(referenceValue)) {
            difference = fabs(referenceValue) - fabs(currentValue)
        } else {
            difference = fabs(currentValue) - fabs(referenceValue)
        }

        if (difference <= gravityOffset ) {
            return true
        } else {
            return false
        }
    }

Please guide me to get the values only when the user captured the position.

Muthu Sabarinathan
  • 1,198
  • 2
  • 21
  • 49
  • The following seems to be applicable to you: https://forums.developer.apple.com/thread/3657 – fishinear Nov 27 '17 at 14:36
  • I didn't get your question precisely. When user rise their hands and tap a button, you are storing accelerometer info. Do you want to compare and match the accelerometer info, if user rise their hands again? – Shamsudheen TK Nov 28 '17 at 14:06

1 Answers1

0

Accelerometers measure changes in velocity along the x, y, and z axes

Fetching accelerometer data

let motion = CMMotionManager()

func startAccelerometers() {
    // Make sure the accelerometer hardware is available.
    if self.motion.isAccelerometerAvailable {
        self.motion.accelerometerUpdateInterval = 1.0 / 60.0  // 60 Hz
        self.motion.startAccelerometerUpdates()

        // Configure a timer to fetch the data.
        self.timer = Timer(fire: Date(), interval: (1.0/60.0),
                           repeats: true, block: { (timer) in
                               // Get the accelerometer data.
                               if let data = self.motion.accelerometerData {
                                   let x = data.acceleration.x
                                   let y = data.acceleration.y
                                   let z = data.acceleration.z

                                   // Use the accelerometer data in your app.
                               }
                           })

        // Add the timer to the current run loop.
        RunLoop.current.add(self.timer!, forMode: .defaultRunLoopMode)
    }
}

Important

If your app relies on the presence of accelerometer hardware, configure the UIRequiredDeviceCapabilities key of its Info.plist file with the accelerometer value. For more information about the meaning of this key, see Information Property List Key Reference.

BuLB JoBs
  • 841
  • 4
  • 20