blob: a2c3bee8c503ab28d9ce322dcf00703eeb84383c [file] [log] [blame]
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "compass.h"
DeviceOrientation::DeviceOrientation(Cordova *cordova): CPlugin(cordova), _validData(false) {
_compass.connectToBackend();
connect(&_compass, SIGNAL(readingChanged()), SLOT(updateSensor()));
connect(&_compass, SIGNAL(sensorError(int)), SLOT(sensorError(int)));
}
void DeviceOrientation::getHeading(int scId, int ecId, QVariantMap options) {
Q_UNUSED(options);
if (_compass.isConnectedToBackend() || !_compass.start()) {
this->callback(ecId, "CompassError.COMPASS_NOT_SUPPORTED");
return;
}
_successCallbacks << scId;
_errorCallbacks << ecId;
if (_validData) {
reportResult();
return;
}
}
void DeviceOrientation::sensorError(int error) {
Q_UNUSED(error);
for (int ecId: _errorCallbacks) {
this->callback(ecId, "CompassError.COMPASS_INTERNAL_ERR");
}
_errorCallbacks.clear();
_successCallbacks.clear();
_validData = false;
}
void DeviceOrientation::reportResult() {
QVariantMap obj;
obj.insert("magneticHeading", _azymuth);
obj.insert("trueHeading", _azymuth);
obj.insert("headingAccuracy", _accuracy);
obj.insert("timestamp", _timestamp);
for (int scId: _successCallbacks) {
this->cb(scId, obj);
}
_errorCallbacks.clear();
_successCallbacks.clear();
}
void DeviceOrientation::updateSensor(){
QCompassReading *heading = _compass.reading();
_azymuth = heading->azimuth();
_accuracy = heading->calibrationLevel();
_timestamp = QDateTime::currentDateTime().toMSecsSinceEpoch();
_validData = true;
reportResult();
}