updated compass information
This commit is contained in:
parent
07814dbde2
commit
1eef462494
@ -1,5 +1,6 @@
|
|||||||
import {Injectable} from '@angular/core';
|
import {EventEmitter, Injectable} from '@angular/core';
|
||||||
import {BehaviorSubject, combineLatest} from "rxjs";
|
import {BehaviorSubject, combineLatest} from "rxjs";
|
||||||
|
import {debounceTime} from "rxjs/operators";
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: 'root'
|
providedIn: 'root'
|
||||||
@ -7,17 +8,20 @@ import {BehaviorSubject, combineLatest} from "rxjs";
|
|||||||
export class PhysicsService {
|
export class PhysicsService {
|
||||||
private motionTimestamp;
|
private motionTimestamp;
|
||||||
|
|
||||||
|
requireCalibration = new EventEmitter();
|
||||||
|
calibrate?: number;
|
||||||
|
|
||||||
info = new BehaviorSubject(null);
|
info = new BehaviorSubject(null);
|
||||||
motion = new BehaviorSubject<DeviceMotionEvent>(null);
|
motion = new BehaviorSubject<DeviceMotionEvent>(null);
|
||||||
orientation = new BehaviorSubject<DeviceOrientationEvent>(null);
|
orientation = new BehaviorSubject<DeviceOrientationEvent>(null);
|
||||||
position = new BehaviorSubject<Coordinates>(null);
|
position = new BehaviorSubject<Position>(null);
|
||||||
speed = new BehaviorSubject(null);
|
speed = new BehaviorSubject(null);
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
// Gather physical data
|
// Gather physical data
|
||||||
window.addEventListener('deviceorientation', orientation => this.orientation.next(orientation));
|
window.addEventListener('deviceorientation', orientation => this.orientation.next(orientation));
|
||||||
window.addEventListener('devicemotion', motion => this.motion.next(motion));
|
window.addEventListener('devicemotion', motion => this.motion.next(motion));
|
||||||
navigator.geolocation.watchPosition(pos => this.position.next(pos.coords));
|
navigator.geolocation.watchPosition(position => this.position.next(position));
|
||||||
|
|
||||||
// Calculate speed from motion events
|
// Calculate speed from motion events
|
||||||
this.motion.subscribe(event => {
|
this.motion.subscribe(event => {
|
||||||
@ -34,20 +38,26 @@ export class PhysicsService {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Combine data into one nice package
|
// Combine data into one nice package
|
||||||
combineLatest(this.position, this.orientation, this.speed).subscribe(data => {
|
combineLatest(this.position, this.orientation.pipe(debounceTime(200)), this.speed).subscribe(data => {
|
||||||
if(!data[0]) return;
|
if(!data[0]) return;
|
||||||
|
|
||||||
let info = {
|
let info = {
|
||||||
accuracy: data[0].accuracy,
|
accuracy: data[0].coords.accuracy,
|
||||||
altitude: data[0].altitude,
|
altitude: data[0].coords.altitude,
|
||||||
altitudeAccuracy: data[0].altitudeAccuracy,
|
altitudeAccuracy: data[0].coords.altitudeAccuracy,
|
||||||
heading: data[0].heading,
|
heading: data[0].coords.heading,
|
||||||
latitude: data[0].latitude,
|
latitude: data[0].coords.latitude,
|
||||||
longitude: data[0].longitude,
|
longitude: data[0].coords.longitude,
|
||||||
speed: data[0].speed
|
speed: data[0].coords.speed
|
||||||
};
|
};
|
||||||
|
|
||||||
if(info.heading == null && !!data[1]) info.heading = data[1].alpha;
|
if(info.heading == null && !!data[1]) {
|
||||||
|
if(!data[1].absolute && this.calibrate == null) this.requireCalibration.emit();
|
||||||
|
this.calibrate = 0;
|
||||||
|
info.heading = data[1].alpha + this.calibrate;
|
||||||
|
if(this.calibrate > 360) this.calibrate -= 360;
|
||||||
|
if(this.calibrate < 0) this.calibrate += 360
|
||||||
|
}
|
||||||
if(info.speed == null && !!data[2]) info.speed = Math.sqrt(data[2].x**2 + data[2].y**2 + data[2].z**2);
|
if(info.speed == null && !!data[2]) info.speed = Math.sqrt(data[2].x**2 + data[2].y**2 + data[2].z**2);
|
||||||
|
|
||||||
this.info.next(info);
|
this.info.next(info);
|
||||||
|
Loading…
Reference in New Issue
Block a user