Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
208 changes: 118 additions & 90 deletions MotionKit.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// MotionKit
//
// Created by Haroon on 14/02/2015.
// Launched under the Creative Commons License. You're free to use MotionKit.
// Launched under the Creative Commons License. You're free to use MotionKit.
//
// The original Github repository is https://github.com/MHaroonBaig/MotionKit
// The official blog post and documentation is https://medium.com/@PyBaig/motionkit-the-missing-ios-coremotion-wrapper-written-in-swift-99fcb83355d0
Expand Down Expand Up @@ -60,20 +60,24 @@ class MotionKit {
if manager.accelerometerAvailable {
manager.accelerometerUpdateInterval = interval
manager.startAccelerometerUpdatesToQueue(NSOperationQueue()) {
(data: CMAccelerometerData!, error: NSError!) in
(data: CMAccelerometerData?, error: NSError?) in
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change really works.. errors went on on newer swift version 2


if let isError = error {
NSLog("Error: %@", isError)
}
valX = data.acceleration.x
valY = data.acceleration.y
valZ = data.acceleration.z

if values != nil{
values!(x: valX,y: valY,z: valZ)
if data != nil {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change works as well! :)

valX = data!.acceleration.x
valY = data!.acceleration.y
valZ = data!.acceleration.z

if values != nil{
values!(x: valX,y: valY,z: valZ)
}

let absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ)
self.delegate?.retrieveAccelerometerValues!(valX, y: valY, z: valZ, absoluteValue: absoluteVal)
}
var absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ)
self.delegate?.retrieveAccelerometerValues!(valX, y: valY, z: valZ, absoluteValue: absoluteVal)
}

} else {
Expand All @@ -98,20 +102,24 @@ class MotionKit {
if manager.gyroAvailable{
manager.gyroUpdateInterval = interval
manager.startGyroUpdatesToQueue(NSOperationQueue()) {
(data: CMGyroData!, error: NSError!) in
(data: CMGyroData?, error: NSError?) in

if let isError = error{
NSLog("Error: %@", isError)
}
valX = data.rotationRate.x
valY = data.rotationRate.y
valZ = data.rotationRate.z

if values != nil{
values!(x: valX, y: valY, z: valZ)
if data != nil {
valX = data!.rotationRate.x
valY = data!.rotationRate.y
valZ = data!.rotationRate.z

if values != nil{
values!(x: valX, y: valY, z: valZ)
}

let absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ)
self.delegate?.retrieveGyroscopeValues!(valX, y: valY, z: valZ, absoluteValue: absoluteVal)
}
var absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ)
self.delegate?.retrieveGyroscopeValues!(valX, y: valY, z: valZ, absoluteValue: absoluteVal)
}

} else {
Expand All @@ -126,29 +134,33 @@ class MotionKit {
* Starts magnetometer updates, providing data to the given handler through the given queue.
* You can access the retrieved values either by a Trailing Closure or through a Delegate.
*/
@availability(iOS, introduced=5.0)
@available(iOS, introduced=5.0)
func getMagnetometerValues (interval: NSTimeInterval = 0.1, values: ((x: Double, y:Double, z:Double) -> ())? ){

var valX: Double!
var valY: Double!
var valZ: Double!
if manager.magnetometerAvailable {
manager.magnetometerUpdateInterval = interval
manager.startMagnetometerUpdatesToQueue(NSOperationQueue()){
(data: CMMagnetometerData!, error: NSError!) in
manager.startMagnetometerUpdatesToQueue(NSOperationQueue()) {
(data: CMMagnetometerData?, error: NSError?) in

if let isError = error{
NSLog("Error: %@", isError)
}
valX = data.magneticField.x
valY = data.magneticField.y
valZ = data.magneticField.z

if values != nil{
values!(x: valX, y: valY, z: valZ)
if data != nil {
valX = data!.magneticField.x
valY = data!.magneticField.y
valZ = data!.magneticField.z

if values != nil{
values!(x: valX, y: valY, z: valZ)
}

let absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ)
self.delegate?.retrieveMagnetometerValues!(valX, y: valY, z: valZ, absoluteValue: absoluteVal)
}
var absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ)
self.delegate?.retrieveMagnetometerValues!(valX, y: valY, z: valZ, absoluteValue: absoluteVal)
}

} else {
Expand All @@ -171,16 +183,19 @@ class MotionKit {

if manager.deviceMotionAvailable{
manager.deviceMotionUpdateInterval = interval
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){
(data: CMDeviceMotion!, error: NSError!) in
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()) {
(data: CMDeviceMotion?, error: NSError?) in

if let isError = error{
NSLog("Error: %@", isError)
}
if values != nil{
values!(deviceMotion: data)

if data != nil {
if values != nil{
values!(deviceMotion: data!)
}
self.delegate?.retrieveDeviceMotionObject!(data!)
}
self.delegate?.retrieveDeviceMotionObject!(data)
}

} else {
Expand All @@ -200,21 +215,24 @@ class MotionKit {
var valZ: Double!
if manager.deviceMotionAvailable{
manager.deviceMotionUpdateInterval = interval
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){
(data: CMDeviceMotion!, error: NSError!) in
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()) {
(data: CMDeviceMotion?, error: NSError?) in

if let isError = error{
NSLog("Error: %@", isError)
}
valX = data.userAcceleration.x
valY = data.userAcceleration.y
valZ = data.userAcceleration.z

if values != nil{
values!(x: valX, y: valY, z: valZ)
}
if data != nil {
valX = data!.userAcceleration.x
valY = data!.userAcceleration.y
valZ = data!.userAcceleration.z

self.delegate?.getAccelerationValFromDeviceMotion!(valX, y: valY, z: valZ)
if values != nil{
values!(x: valX, y: valY, z: valZ)
}

self.delegate?.getAccelerationValFromDeviceMotion!(valX, y: valY, z: valZ)
}
}

} else {
Expand All @@ -228,28 +246,30 @@ class MotionKit {
* method.
*/
func getGravityAccelerationFromDeviceMotion (interval: NSTimeInterval = 0.1, values: ((x:Double, y:Double, z:Double) -> ())? ) {

var valX: Double!
var valY: Double!
var valZ: Double!
if manager.deviceMotionAvailable{
manager.deviceMotionUpdateInterval = interval
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){
(data: CMDeviceMotion!, error: NSError!) in
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()) {
(data: CMDeviceMotion?, error: NSError?) in

if let isError = error{
if let isError = error {
NSLog("Error: %@", isError)
}
valX = data.gravity.x
valY = data.gravity.y
valZ = data.gravity.z

if values != nil{
values!(x: valX, y: valY, z: valZ)
}
if data != nil {
var valX: Double!
var valY: Double!
var valZ: Double!

valX = data!.gravity.x
valY = data!.gravity.y
valZ = data!.gravity.z

var absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ)
self.delegate?.getGravityAccelerationValFromDeviceMotion!(valX, y: valY, z: valZ)
if values != nil{
values!(x: valX, y: valY, z: valZ)
}

self.delegate?.getGravityAccelerationValFromDeviceMotion!(valX, y: valY, z: valZ)
}
}

} else {
Expand All @@ -267,17 +287,20 @@ class MotionKit {

if manager.deviceMotionAvailable{
manager.deviceMotionUpdateInterval = interval
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){
(data: CMDeviceMotion!, error: NSError!) in
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()) {
(data: CMDeviceMotion?, error: NSError?) in

if let isError = error{
NSLog("Error: %@", isError)
}
if values != nil{
values!(attitude: data.attitude)
}

self.delegate?.getAttitudeFromDeviceMotion!(data.attitude)
if data != nil {
if values != nil{
values!(attitude: data!.attitude)
}

self.delegate?.getAttitudeFromDeviceMotion!(data!.attitude)
}
}

} else {
Expand All @@ -297,22 +320,24 @@ class MotionKit {
var valZ: Double!
if manager.deviceMotionAvailable{
manager.deviceMotionUpdateInterval = interval
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){
(data: CMDeviceMotion!, error: NSError!) in
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()) {
(data: CMDeviceMotion?, error: NSError?) in

if let isError = error{
NSLog("Error: %@", isError)
}
valX = data.rotationRate.x
valY = data.rotationRate.y
valZ = data.rotationRate.z

if values != nil{
values!(x: valX, y: valY, z: valZ)
}
if data != nil {
valX = data!.rotationRate.x
valY = data!.rotationRate.y
valZ = data!.rotationRate.z

var absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ)
self.delegate?.getRotationRateFromDeviceMotion!(valX, y: valY, z: valZ)
if values != nil {
values!(x: valX, y: valY, z: valZ)
}

self.delegate?.getRotationRateFromDeviceMotion!(valX, y: valY, z: valZ)
}
}

} else {
Expand All @@ -334,23 +359,26 @@ class MotionKit {
var valAccuracy: Int32!
if manager.deviceMotionAvailable{
manager.deviceMotionUpdateInterval = interval
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){
(data: CMDeviceMotion!, error: NSError!) in
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()) {
(data: CMDeviceMotion?, error: NSError?) in

if let isError = error{
if let isError = error {
NSLog("Error: %@", isError)
}
valX = data.magneticField.field.x
valY = data.magneticField.field.y
valZ = data.magneticField.field.z
valAccuracy = data.magneticField.accuracy.value

if data != nil {
valX = data!.magneticField.field.x
valY = data!.magneticField.field.y
valZ = data!.magneticField.field.z
valAccuracy = data!.magneticField.accuracy.rawValue

if values != nil{
values!(x: valX, y: valY, z: valZ, accuracy: valAccuracy)
}

self.delegate?.getMagneticFieldFromDeviceMotion!(valX, y: valY, z: valZ)
if values != nil {
values!(x: valX, y: valY, z: valZ, accuracy: valAccuracy)
}

self.delegate?.getMagneticFieldFromDeviceMotion!(valX, y: valY, z: valZ)
}
}

} else {
Expand All @@ -369,36 +397,36 @@ class MotionKit {
/* MARK :- INSTANTANIOUS METHODS START HERE */

func getAccelerationAtCurrentInstant (values: (x:Double, y:Double, z:Double) -> ()){
self.getAccelerationFromDeviceMotion(interval: 0.5) { (x, y, z) -> () in
self.getAccelerationFromDeviceMotion(0.5) { (x, y, z) -> () in
values(x: x,y: y,z: z)
self.stopDeviceMotionUpdates()
}
}

func getGravitationalAccelerationAtCurrentInstant (values: (x:Double, y:Double, z:Double) -> ()){
self.getGravityAccelerationFromDeviceMotion(interval: 0.5) { (x, y, z) -> () in
self.getGravityAccelerationFromDeviceMotion(0.5) { (x, y, z) -> () in
values(x: x,y: y,z: z)
self.stopDeviceMotionUpdates()
}
}

func getAttitudeAtCurrentInstant (values: (attitude: CMAttitude) -> ()){
self.getAttitudeFromDeviceMotion(interval: 0.5) { (attitude) -> () in
self.getAttitudeFromDeviceMotion(0.5) { (attitude) -> () in
values(attitude: attitude)
self.stopDeviceMotionUpdates()
}

}

func getMageticFieldAtCurrentInstant (values: (x:Double, y:Double, z:Double) -> ()){
self.getMagneticFieldFromDeviceMotion(interval: 0.5) { (x, y, z, accuracy) -> () in
self.getMagneticFieldFromDeviceMotion(0.5) { (x, y, z, accuracy) -> () in
values(x: x,y: y,z: z)
self.stopDeviceMotionUpdates()
}
}

func getGyroValuesAtCurrentInstant (values: (x:Double, y:Double, z:Double) -> ()){
self.getRotationRateFromDeviceMotion(interval: 0.5) { (x, y, z) -> () in
self.getRotationRateFromDeviceMotion(0.5) { (x, y, z) -> () in
values(x: x,y: y,z: z)
self.stopDeviceMotionUpdates()
}
Expand Down Expand Up @@ -447,7 +475,7 @@ class MotionKit {
* Discussion:
* Stops magnetometer updates.
*/
@availability(iOS, introduced=5.0)
@available(iOS, introduced=5.0)
func stopmagnetometerUpdates() {
self.manager.stopMagnetometerUpdates()
NSLog("Magnetometer Updates Status - Stopped")
Expand Down