import QtQuick 2.0 import QtSensors 5.0 Item { property bool running: false property bool enabled: false//settings.getSettings("magnetometerSetting",true) property int azimuth: 0 property real calibration: 0.0 property variant data: [0,0,0,0,0] onEnabledChanged: { console.log("*** MAGNETOMETER: "+enabled) if (!enabled) running = false } Accelerometer { id: accel dataRate: 6 active: enabled && Qt.application.active } Magnetometer { id: mag dataRate: 6 returnGeoValues: true // not sure active: enabled && Qt.application.active onReadingChanged: { running = true var accelVec = [accel.reading.x, accel.reading.y, accel.reading.z] var magEast = crossProduct([mag.reading.x, mag.reading.y, mag.reading.z], accelVec) var magNorth = crossProduct(accelVec, magEast) magEast = normVec(magEast) magNorth = normVec(magNorth) var deviceHeading = [0., 1., -1.] //This is for portrait orientation on android var dotWithEast = dotProduct(deviceHeading, magEast) var dotWithNorth = dotProduct(deviceHeading, magNorth) var bearingRad = Math.atan2(dotWithEast, dotWithNorth) var t = ((bearingRad * 180 / Math.PI) - 360) %360 var bearingDeg = 360 - Math.abs(t) calibration = mag.reading.calibrationLevel azimuth = normalize360(bearingDeg) } function normalize360(angle) { var semiNormalized = angle % 360 return semiNormalized >= 0 ? semiNormalized : semiNormalized + 360 } function normalizeAngle(angle) { var newAngle = angle; if (newAngle <= -180) newAngle = newAngle + 360; if (newAngle > 180) newAngle = newAngle - 360; return newAngle; } function crossProduct(a, b) { if (a.length != 3 || b.length != 3) { return; } return [a[1]*b[2] - a[2]*b[1], a[2]*b[0] - a[0]*b[2], a[0]*b[1] - a[1]*b[0]]; } function normVec(a) { var compSq = 0. for(var i=0;i