@wemap/providers 3.1.12 → 3.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/debug/components/AbsoluteAttitudeComponent.jsx +6 -6
- package/debug/components/AbsolutePositionComponent.jsx +1 -2
- package/debug/components/GnssWifiComponent.jsx +1 -2
- package/debug/components/ImuComponent.jsx +4 -4
- package/debug/components/InclinationComponent.jsx +3 -6
- package/debug/components/RelativeAttitudeComponent.jsx +6 -6
- package/debug/components/StepDetectionComponent.jsx +2 -2
- package/package.json +6 -6
- package/src/ProvidersInterface.js +1 -1
- package/src/events/ProvidersLogger.js +2 -2
- package/src/providers/FakeProvider.spec.js +18 -3
- package/src/providers/Provider.js +12 -19
- package/src/providers/Provider.spec.js +2 -3
- package/src/providers/attitude/absolute/AbsoluteAttitudeFromBrowserProvider.js +3 -4
- package/src/providers/attitude/absolute/AbsoluteAttitudeFromRelAttProvider.js +8 -9
- package/src/providers/attitude/absolute/AbsoluteAttitudeProvider.js +6 -6
- package/src/providers/attitude/relative/RelativeAttitudeFromBrowserProvider.js +3 -3
- package/src/providers/attitude/relative/RelativeAttitudeFromEkfProvider.js +7 -7
- package/src/providers/attitude/relative/RelativeAttitudeFromInertialProvider.js +4 -4
- package/src/providers/attitude/relative/RelativeAttitudeProvider.js +4 -5
- package/src/providers/imu/AccelerometerProvider.js +5 -5
- package/src/providers/imu/GyroscopeProvider.js +5 -5
- package/src/providers/imu/ImuProvider.js +2 -2
- package/src/providers/inclination/InclinationFromAccProvider.js +4 -4
- package/src/providers/inclination/InclinationFromRelativeAttitudeProvider.js +4 -4
- package/src/providers/inclination/InclinationProvider.js +10 -4
- package/src/providers/others/BarcodeProvider.js +7 -0
- package/src/providers/others/CameraNativeProvider.js +7 -0
- package/src/providers/others/CameraProjectionMatrixProvider.js +7 -0
- package/src/providers/position/absolute/AbsolutePositionFromRelProvider.js +4 -6
- package/src/providers/position/absolute/AbsolutePositionProvider.js +4 -6
- package/src/providers/position/absolute/GnssWifiProvider.js +3 -3
- package/src/providers/position/absolute/IpProvider.js +4 -4
- package/src/providers/position/relative/ArCoreProvider.js +2 -2
- package/src/providers/position/relative/GeoRelativePositionFromArCoreProvider.js +11 -4
- package/src/providers/position/relative/GeoRelativePositionProvider.js +3 -4
- package/src/providers/position/relative/PdrProvider.js +5 -5
- package/src/providers/steps/StepDetectionProvider.js +6 -6
package/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Positioning / Navigation
|
|
2
|
+
|
|
3
|
+
## Algorithm description
|
|
4
|
+
|
|
5
|
+
The positioning/navigation algorithm can be described as follow:
|
|
6
|
+
|
|
7
|
+
+ If an absolute position is received by the system (GNSS, Wifi, Bluetooth, manually input...), this one is considered (by the system) only if one of the three following condition is true:
|
|
8
|
+
* It is the first absolute position received by the system
|
|
9
|
+
* Distance between this new position and the previously known position is higher than the new position accuracy (+ epsilon)
|
|
10
|
+
* Accuracy of the new position is clearly better than the previously known position accuracy
|
|
11
|
+
This is the **relocalization** phase.
|
|
12
|
+
|
|
13
|
+
+ If a relative position is received by the system (PDR or ArCore), this one is only considered if a relocalization phase already occurred.
|
|
14
|
+
|
|
15
|
+
+ If an itinerary is sent to the system, this one is used for map-matching. Map-matching is processed using the "point-to-network" algorithm at each step for the PDR and every 400ms for ArCore. Current constants of the map-matching algorithm are: min-distance: 1m, max-distance: 15m, max-angle: 20deg.
|
|
16
|
+
|
|
17
|
+
## Remarks about the behavior
|
|
18
|
+
|
|
19
|
+
Few remarks which come out of the previous description:
|
|
20
|
+
- You cannot move with PDR and ArCore until there has been relocalization.
|
|
21
|
+
- On a map, the relocalization phase is a "quick jump" of the blue dot, in AR, the scene camera will translate fast.
|
|
22
|
+
- ArCore is only used in our Android app when the library is available and up-to-date (see here: https://developers.google.com/ar/discover/supported-devices); otherwise, the PDR is used.
|
|
23
|
+
- If you want to mock the PDR, you can hold your phone in the direction you want to go then shake it vertically (ground-sky axis) to fake a step.
|
|
24
|
+
- You cannot mock ArCore; you have to test it by moving.
|
|
25
|
+
- If you fake the relative position with the PDR and you see your blue dot jump back to your initial position, that is probably caused by the relocalization algorithm, and it is normal.
|
|
26
|
+
- If you use a "manually input" and set a position that is not your real position (which is not recommended), your blue dot will probably jump back to your real position at the next GNSS or Wifi fix. That is normal behavior.
|
|
@@ -33,18 +33,18 @@ class AbsoluteAttitudeComponent extends React.Component {
|
|
|
33
33
|
|
|
34
34
|
this.providerFromBrowserId = AbsoluteAttitudeFromBrowser.addEventListener(
|
|
35
35
|
events => this.setState({ attitudeFromBrowser: events[0] }),
|
|
36
|
-
error => this.setState({ attitudeFromBrowser: error })
|
|
37
|
-
|
|
36
|
+
error => this.setState({ attitudeFromBrowser: error })
|
|
37
|
+
);
|
|
38
38
|
|
|
39
39
|
this.providerFromRelAttId = AbsoluteAttitudeFromRelAtt.addEventListener(
|
|
40
40
|
events => this.setState({ attitudeFromRelAtt: events[0] }),
|
|
41
|
-
error => this.setState({ attitudeFromRelAtt: error })
|
|
42
|
-
|
|
41
|
+
error => this.setState({ attitudeFromRelAtt: error })
|
|
42
|
+
);
|
|
43
43
|
|
|
44
44
|
this.providerId = AbsoluteAttitude.addEventListener(
|
|
45
45
|
events => this.setState({ attitude: events[0] }),
|
|
46
|
-
error => this.setState({ attitude: error })
|
|
47
|
-
|
|
46
|
+
error => this.setState({ attitude: error })
|
|
47
|
+
);
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
this.onDeviceOrientationEventListener = (e) => this.setState({ deviceorientation: e });
|
|
@@ -16,8 +16,7 @@ class AbsolutePositionComponent extends React.Component {
|
|
|
16
16
|
componentDidMount() {
|
|
17
17
|
this.providerId = AbsolutePosition.addEventListener(
|
|
18
18
|
events => this.onNewPosition(events[0]),
|
|
19
|
-
error => this.setState({ absolutePosition: error })
|
|
20
|
-
this.name
|
|
19
|
+
error => this.setState({ absolutePosition: error })
|
|
21
20
|
);
|
|
22
21
|
}
|
|
23
22
|
|
|
@@ -18,8 +18,7 @@ class GnssWifiComponent extends React.Component {
|
|
|
18
18
|
componentDidMount() {
|
|
19
19
|
this.providerId = GnssWifi.addEventListener(
|
|
20
20
|
events => this.onNewPosition(events[0]),
|
|
21
|
-
error => this.setState({ position: error })
|
|
22
|
-
this.name
|
|
21
|
+
error => this.setState({ position: error })
|
|
23
22
|
);
|
|
24
23
|
}
|
|
25
24
|
|
|
@@ -23,13 +23,13 @@ class ImuComponent extends React.Component {
|
|
|
23
23
|
componentDidMount() {
|
|
24
24
|
this.accelerometerProviderId = Accelerometer.addEventListener(
|
|
25
25
|
events => this.setState({ acc: events[0] }),
|
|
26
|
-
error => this.setState({ acc: error })
|
|
27
|
-
|
|
26
|
+
error => this.setState({ acc: error })
|
|
27
|
+
);
|
|
28
28
|
|
|
29
29
|
this.gyroscopeProviderId = Gyroscope.addEventListener(
|
|
30
30
|
events => this.setState({ gyr: events[0] }),
|
|
31
|
-
error => this.setState({ gyr: error })
|
|
32
|
-
|
|
31
|
+
error => this.setState({ gyr: error })
|
|
32
|
+
);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
componentWillUnmount() {
|
|
@@ -25,20 +25,17 @@ class InclinationComponent extends React.Component {
|
|
|
25
25
|
|
|
26
26
|
this.providerAccId = InclinationFromAcc.addEventListener(
|
|
27
27
|
events => this.setState({ inclinationFromAcc: events[0] }),
|
|
28
|
-
error => this.setState({ inclinationFromAcc: error })
|
|
29
|
-
this.name
|
|
28
|
+
error => this.setState({ inclinationFromAcc: error })
|
|
30
29
|
);
|
|
31
30
|
|
|
32
31
|
this.providerAttId = InclinationFromRelativeAttitude.addEventListener(
|
|
33
32
|
events => this.setState({ inclinationFromAtt: events[0] }),
|
|
34
|
-
error => this.setState({ inclinationFromAtt: error })
|
|
35
|
-
this.name
|
|
33
|
+
error => this.setState({ inclinationFromAtt: error })
|
|
36
34
|
);
|
|
37
35
|
|
|
38
36
|
this.providerId = Inclination.addEventListener(
|
|
39
37
|
events => this.setState({ inclination: events[0] }),
|
|
40
|
-
error => this.setState({ inclination: error })
|
|
41
|
-
this.name
|
|
38
|
+
error => this.setState({ inclination: error })
|
|
42
39
|
);
|
|
43
40
|
|
|
44
41
|
}
|
|
@@ -25,18 +25,18 @@ class RelativeAttitudeComponent extends React.Component {
|
|
|
25
25
|
|
|
26
26
|
this.providerFromBrowserId = RelativeAttitudeFromBrowser.addEventListener(
|
|
27
27
|
events => this.setState({ attitudeFromBrowser: events[0] }),
|
|
28
|
-
error => this.setState({ attitudeFromBrowser: error })
|
|
29
|
-
|
|
28
|
+
error => this.setState({ attitudeFromBrowser: error })
|
|
29
|
+
);
|
|
30
30
|
|
|
31
31
|
this.providerFromEkfId = RelativeAttitudeFromEkf.addEventListener(
|
|
32
32
|
events => this.setState({ attitudeFromEkf: events[0] }),
|
|
33
|
-
error => this.setState({ attitudeFromEkf: error })
|
|
34
|
-
|
|
33
|
+
error => this.setState({ attitudeFromEkf: error })
|
|
34
|
+
);
|
|
35
35
|
|
|
36
36
|
this.providerId = RelativeAttitude.addEventListener(
|
|
37
37
|
events => this.setState({ attitude: events[0] }),
|
|
38
|
-
error => this.setState({ attitude: error })
|
|
39
|
-
|
|
38
|
+
error => this.setState({ attitude: error })
|
|
39
|
+
);
|
|
40
40
|
|
|
41
41
|
window.addEventListener('deviceorientation', this.onDeviceOrientationEventListener, true);
|
|
42
42
|
}
|
|
@@ -17,8 +17,8 @@ class StepDetectionComponent extends React.Component {
|
|
|
17
17
|
componentDidMount() {
|
|
18
18
|
this.providerId = StepDetection.addEventListener(
|
|
19
19
|
events => this.setState({ stepDetected: events[0] }),
|
|
20
|
-
error => this.setState({ stepDetected: error })
|
|
21
|
-
|
|
20
|
+
error => this.setState({ stepDetected: error })
|
|
21
|
+
);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
componentWillUnmount() {
|
package/package.json
CHANGED
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
"Guillaume Pannetier <guillaume.pannetier@getwemap.com>"
|
|
9
9
|
],
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@wemap/geo": "^3.1.
|
|
12
|
-
"@wemap/graph": "^3.1.
|
|
11
|
+
"@wemap/geo": "^3.1.14",
|
|
12
|
+
"@wemap/graph": "^3.1.14",
|
|
13
13
|
"@wemap/logger": "^3.0.0",
|
|
14
|
-
"@wemap/maths": "^3.1.
|
|
15
|
-
"@wemap/osm": "^3.1.
|
|
14
|
+
"@wemap/maths": "^3.1.14",
|
|
15
|
+
"@wemap/osm": "^3.1.14",
|
|
16
16
|
"@wemap/utils": "^3.1.5",
|
|
17
17
|
"geomagnetism": "^0.1.0",
|
|
18
18
|
"lodash.isempty": "^4.4.0",
|
|
@@ -65,6 +65,6 @@
|
|
|
65
65
|
"lint": "eslint --ext .js,.jsx --quiet src",
|
|
66
66
|
"test": "mocha -r esm \"src/**/*.spec.js\""
|
|
67
67
|
},
|
|
68
|
-
"version": "3.1.
|
|
69
|
-
"gitHead": "
|
|
68
|
+
"version": "3.1.14",
|
|
69
|
+
"gitHead": "a79ee51029fda415610ca86a29e7a22d5f3ada60"
|
|
70
70
|
}
|
|
@@ -24,7 +24,7 @@ class ProvidersInterface {
|
|
|
24
24
|
*/
|
|
25
25
|
static addEventListener(eventType, onEvent, onError, watchOnly = false) {
|
|
26
26
|
const provider = this._getMetaProviderFromEventType(eventType);
|
|
27
|
-
const id = provider.addEventListener(events => onEvent(events[0].data), onError,
|
|
27
|
+
const id = provider.addEventListener(events => onEvent(events[0].data), onError, !watchOnly);
|
|
28
28
|
this.idListeners.set(id, provider);
|
|
29
29
|
return id;
|
|
30
30
|
}
|
|
@@ -30,7 +30,7 @@ class ProvidersLogger {
|
|
|
30
30
|
interval = setInterval(() => {
|
|
31
31
|
|
|
32
32
|
for (const [key, value] of Object.entries(pushEvents)) {
|
|
33
|
-
Logger.debug('Received ' + value + ' notifications from ' + pushEventsRef[key].
|
|
33
|
+
Logger.debug('Received ' + value + ' notifications from ' + pushEventsRef[key].pname + ' last second');
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
pushEvents = {};
|
|
@@ -58,7 +58,7 @@ class ProvidersLogger {
|
|
|
58
58
|
ProvidersLogger.initializeInterval();
|
|
59
59
|
|
|
60
60
|
const objectId = ProvidersLogger.getObjectId(object);
|
|
61
|
-
const objectClassName = object.
|
|
61
|
+
const objectClassName = object.pname;
|
|
62
62
|
|
|
63
63
|
Logger.debug(objectClassName + '[' + objectId + '].' + method);
|
|
64
64
|
}
|
|
@@ -5,9 +5,16 @@ import Provider from './Provider';
|
|
|
5
5
|
import EventType from '../events/EventType';
|
|
6
6
|
import { TimeUtils } from '@wemap/utils';
|
|
7
7
|
|
|
8
|
-
class FakeProvider1 extends Provider {
|
|
8
|
+
class FakeProvider1 extends Provider {
|
|
9
|
+
static get pname() {
|
|
10
|
+
return 'FakeProvider1';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
9
13
|
|
|
10
14
|
class FakeProvider2 extends Provider {
|
|
15
|
+
static get pname() {
|
|
16
|
+
return 'FakeProvider2';
|
|
17
|
+
}
|
|
11
18
|
get _availability() {
|
|
12
19
|
return Promise.reject(new Error());
|
|
13
20
|
}
|
|
@@ -16,6 +23,9 @@ class FakeProvider2 extends Provider {
|
|
|
16
23
|
}
|
|
17
24
|
|
|
18
25
|
class FakeProvider3 extends Provider {
|
|
26
|
+
static get pname() {
|
|
27
|
+
return 'FakeProvider3';
|
|
28
|
+
}
|
|
19
29
|
start() {
|
|
20
30
|
this.intervalId = setInterval(() => {
|
|
21
31
|
const fakePosition = new UserPosition(Math.random() * 45, Math.random() * 180);
|
|
@@ -29,6 +39,11 @@ class FakeProvider3 extends Provider {
|
|
|
29
39
|
}
|
|
30
40
|
|
|
31
41
|
class FakeProvider4 extends Provider {
|
|
42
|
+
|
|
43
|
+
static get pname() {
|
|
44
|
+
return 'FakeProvider4';
|
|
45
|
+
}
|
|
46
|
+
|
|
32
47
|
constructor() {
|
|
33
48
|
super();
|
|
34
49
|
this.fp3 = FakeProvider3.instance;
|
|
@@ -39,8 +54,8 @@ class FakeProvider4 extends Provider {
|
|
|
39
54
|
start() {
|
|
40
55
|
this.fp3id = this.fp3.addEventListener(
|
|
41
56
|
events => this.notify(events[0].clone()),
|
|
42
|
-
this.notifyError.bind(this)
|
|
43
|
-
|
|
57
|
+
this.notifyError.bind(this)
|
|
58
|
+
);
|
|
44
59
|
}
|
|
45
60
|
stop() {
|
|
46
61
|
this.fp3.removeEventListener(this.fp3id);
|
|
@@ -48,7 +48,7 @@ class Provider {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
if (this._instance) {
|
|
51
|
-
throw new Error(`Cannot instantiate ${this.
|
|
51
|
+
throw new Error(`Cannot instantiate ${this.pname} twice`);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
this.id = uniqueId++;
|
|
@@ -56,21 +56,16 @@ class Provider {
|
|
|
56
56
|
ProvidersLogger.addEvent(this, 'constructor');
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
get name() {
|
|
60
|
-
return this.constructor.name;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
59
|
/**
|
|
64
60
|
* Get the provider name
|
|
65
|
-
* @
|
|
66
|
-
* @abstract
|
|
61
|
+
* @returns {String} the provider name
|
|
67
62
|
*/
|
|
68
|
-
static get
|
|
69
|
-
return
|
|
63
|
+
static get pname() {
|
|
64
|
+
return 'Unknown';
|
|
70
65
|
}
|
|
71
66
|
|
|
72
|
-
get
|
|
73
|
-
return this.constructor.
|
|
67
|
+
get pname() {
|
|
68
|
+
return this.constructor.pname;
|
|
74
69
|
}
|
|
75
70
|
|
|
76
71
|
/**
|
|
@@ -87,7 +82,7 @@ class Provider {
|
|
|
87
82
|
* @returns {Promise} returns an availability promise
|
|
88
83
|
*/
|
|
89
84
|
get availability() {
|
|
90
|
-
if (ProvidersOptions.ignoreProviders.includes(this.
|
|
85
|
+
if (ProvidersOptions.ignoreProviders.includes(this.pname)) {
|
|
91
86
|
return Promise.reject(new ContainsIgnoredProviderError());
|
|
92
87
|
}
|
|
93
88
|
|
|
@@ -144,11 +139,10 @@ class Provider {
|
|
|
144
139
|
*
|
|
145
140
|
* @param {Function} onEvents
|
|
146
141
|
* @param {Function} onError
|
|
147
|
-
* @param {Object} callerName
|
|
148
142
|
* @param {Boolean} startIfNecessary
|
|
149
143
|
* @returns {Number}
|
|
150
144
|
*/
|
|
151
|
-
addEventListener(onEvents = noop, onError = noop,
|
|
145
|
+
addEventListener(onEvents = noop, onError = noop, startIfNecessary = true) {
|
|
152
146
|
const id = ++Provider._callbackUniqueId;
|
|
153
147
|
|
|
154
148
|
/**
|
|
@@ -158,8 +152,7 @@ class Provider {
|
|
|
158
152
|
id,
|
|
159
153
|
onEvents,
|
|
160
154
|
onError,
|
|
161
|
-
optional: !startIfNecessary
|
|
162
|
-
callerName
|
|
155
|
+
optional: !startIfNecessary
|
|
163
156
|
});
|
|
164
157
|
|
|
165
158
|
|
|
@@ -274,14 +267,14 @@ class Provider {
|
|
|
274
267
|
* @abstract
|
|
275
268
|
*/
|
|
276
269
|
start() {
|
|
277
|
-
throw new Error('Provider "' + this.
|
|
270
|
+
throw new Error('Provider "' + this.pname + '" does not @override start()');
|
|
278
271
|
}
|
|
279
272
|
|
|
280
273
|
/**
|
|
281
274
|
* @abstract
|
|
282
275
|
*/
|
|
283
276
|
stop() {
|
|
284
|
-
throw new Error('Provider "' + this.
|
|
277
|
+
throw new Error('Provider "' + this.pname + '" does not @override stop()');
|
|
285
278
|
}
|
|
286
279
|
|
|
287
280
|
|
|
@@ -294,7 +287,7 @@ class Provider {
|
|
|
294
287
|
ProvidersLogger.incrementNotifications(this);
|
|
295
288
|
|
|
296
289
|
// Add current provider to the list of providers for this event.
|
|
297
|
-
events.forEach(event => event.providersStack.unshift(this.
|
|
290
|
+
events.forEach(event => event.providersStack.unshift(this.pname));
|
|
298
291
|
|
|
299
292
|
// Notify callbacks
|
|
300
293
|
this._eventsCallbacks.forEach(({ onEvents }) => onEvents(events));
|
|
@@ -38,8 +38,7 @@ describe('Provider', () => {
|
|
|
38
38
|
|
|
39
39
|
it('default getter', () => {
|
|
40
40
|
const provider = FakeProvider1.instance;
|
|
41
|
-
expect(provider.
|
|
42
|
-
expect(provider.displayName).equals(FakeProvider1.name);
|
|
41
|
+
expect(provider.pname).equals(FakeProvider1.pname);
|
|
43
42
|
expect(provider.eventsType).is.empty;
|
|
44
43
|
expect(provider.hasNativeInterface).is.false;
|
|
45
44
|
expect(provider.nativeInterface).is.null;
|
|
@@ -50,7 +49,7 @@ describe('Provider', () => {
|
|
|
50
49
|
|
|
51
50
|
const fakeProvider1 = FakeProvider1.instance;
|
|
52
51
|
await expect(fakeProvider1.availability).to.be.fulfilled;
|
|
53
|
-
ProvidersOptions.ignoreProviders.push(FakeProvider1.
|
|
52
|
+
ProvidersOptions.ignoreProviders.push(FakeProvider1.pname);
|
|
54
53
|
await expect(fakeProvider1.availability).to.be.rejectedWith(ContainsIgnoredProviderError);
|
|
55
54
|
ProvidersOptions.ignoreProviders = [];
|
|
56
55
|
|
|
@@ -44,8 +44,8 @@ class AbsoluteAttitudeFromBrowserProvider extends Provider {
|
|
|
44
44
|
/**
|
|
45
45
|
* @override
|
|
46
46
|
*/
|
|
47
|
-
static get
|
|
48
|
-
return '
|
|
47
|
+
static get pname() {
|
|
48
|
+
return 'AbsoluteAttitudeFromBrowser';
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
/**
|
|
@@ -105,7 +105,6 @@ class AbsoluteAttitudeFromBrowserProvider extends Provider {
|
|
|
105
105
|
this.absolutePositionProviderId = AbsolutePosition.addEventListener(
|
|
106
106
|
events => this.onAbsolutePositionEvent(events[0]),
|
|
107
107
|
error => this.notifyError(error),
|
|
108
|
-
this.name,
|
|
109
108
|
false
|
|
110
109
|
);
|
|
111
110
|
}
|
|
@@ -189,7 +188,7 @@ class AbsoluteAttitudeFromBrowserProvider extends Provider {
|
|
|
189
188
|
|
|
190
189
|
const trueQuaternion = Quaternion.multiply(this.declinationQuaternion, this.magQuaternion);
|
|
191
190
|
const attitude = new Attitude(trueQuaternion, this.magQuaternionTimestamp,
|
|
192
|
-
this.constructor.DEFAULT_ACCURACY, this.
|
|
191
|
+
this.constructor.DEFAULT_ACCURACY, this.pname);
|
|
193
192
|
this.notify(this.createEvent(
|
|
194
193
|
EventType.AbsoluteAttitude,
|
|
195
194
|
attitude,
|
|
@@ -15,10 +15,10 @@ class AbsoluteAttitudeFromRelAttProvider extends Provider {
|
|
|
15
15
|
accuracy = 0;
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
static get
|
|
21
|
-
return '
|
|
18
|
+
* @override
|
|
19
|
+
*/
|
|
20
|
+
static get pname() {
|
|
21
|
+
return 'AbsoluteAttitudeFromRelAtt';
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
/**
|
|
@@ -42,15 +42,14 @@ class AbsoluteAttitudeFromRelAttProvider extends Provider {
|
|
|
42
42
|
|
|
43
43
|
this.relativeAttitudeProviderId = RelativeAttitude.addEventListener(
|
|
44
44
|
events => this.onRelativeAttitudeEvent(events[0]),
|
|
45
|
-
error => this.notifyError(error)
|
|
46
|
-
|
|
45
|
+
error => this.notifyError(error)
|
|
46
|
+
);
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
this.onAbsoluteAttitudeEvent(AbsoluteAttitude.lastEvent);
|
|
50
50
|
this.absoluteAttitudeProviderId = AbsoluteAttitude.addEventListener(
|
|
51
51
|
events => this.onAbsoluteAttitudeEvent(events[0]),
|
|
52
52
|
error => this.notifyError(error),
|
|
53
|
-
this.name,
|
|
54
53
|
false
|
|
55
54
|
);
|
|
56
55
|
}
|
|
@@ -91,7 +90,7 @@ class AbsoluteAttitudeFromRelAttProvider extends Provider {
|
|
|
91
90
|
/**
|
|
92
91
|
* Use absolute attitude events only when they are not from this provider
|
|
93
92
|
*/
|
|
94
|
-
if (absoluteAttitudeEvent.providersStack.includes(this.
|
|
93
|
+
if (absoluteAttitudeEvent.providersStack.includes(this.pname)) {
|
|
95
94
|
return;
|
|
96
95
|
}
|
|
97
96
|
this.absoluteAttitudeEvent = absoluteAttitudeEvent;
|
|
@@ -116,7 +115,7 @@ class AbsoluteAttitudeFromRelAttProvider extends Provider {
|
|
|
116
115
|
|
|
117
116
|
const absoluteQuat = Quaternion.multiply(this.zOffset, quaternion);
|
|
118
117
|
const newAccuracy = absoluteAttitudeAccuracy + this.accuracy;
|
|
119
|
-
const attitude = new Attitude(absoluteQuat, time, newAccuracy, this.
|
|
118
|
+
const attitude = new Attitude(absoluteQuat, time, newAccuracy, this.pname);
|
|
120
119
|
|
|
121
120
|
this.notify(this.createEvent(
|
|
122
121
|
EventType.AbsoluteAttitude,
|
|
@@ -25,8 +25,8 @@ class AbsoluteAttitudeProvider extends MetaProvider {
|
|
|
25
25
|
/**
|
|
26
26
|
* @override
|
|
27
27
|
*/
|
|
28
|
-
static get
|
|
29
|
-
return '
|
|
28
|
+
static get pname() {
|
|
29
|
+
return 'AbsoluteAttitude';
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/**
|
|
@@ -56,16 +56,16 @@ class AbsoluteAttitudeProvider extends MetaProvider {
|
|
|
56
56
|
error => {
|
|
57
57
|
this.attitudeFromBrowserErrored = true;
|
|
58
58
|
this.onError(error);
|
|
59
|
-
}
|
|
60
|
-
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
61
|
|
|
62
62
|
this.fromRelAttProviderId = AbsoluteAttitudeFromRelAtt.addEventListener(
|
|
63
63
|
events => this.onAttitudeFromRelAtt(events[0]),
|
|
64
64
|
error => {
|
|
65
65
|
this.attitudeFromRelAttErrored = true;
|
|
66
66
|
this.onError(error);
|
|
67
|
-
}
|
|
68
|
-
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
onError(error) {
|
|
@@ -31,8 +31,8 @@ class RelativeAttitudeFromBrowserProvider extends Provider {
|
|
|
31
31
|
/**
|
|
32
32
|
* @override
|
|
33
33
|
*/
|
|
34
|
-
static get
|
|
35
|
-
return '
|
|
34
|
+
static get pname() {
|
|
35
|
+
return 'RelativeAttitudeFromBrowser';
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
/**
|
|
@@ -93,7 +93,7 @@ class RelativeAttitudeFromBrowserProvider extends Provider {
|
|
|
93
93
|
const attitude = new Attitude(quaternion,
|
|
94
94
|
timestamp,
|
|
95
95
|
RelativeAttitudeFromInertialProvider.DEFAULT_DRIFT,
|
|
96
|
-
this.
|
|
96
|
+
this.pname
|
|
97
97
|
);
|
|
98
98
|
this.notify(this.createEvent(EventType.RelativeAttitude, attitude, timestamp));
|
|
99
99
|
};
|
|
@@ -29,8 +29,8 @@ class RelativeAttitudeFromEkfProvider extends Provider {
|
|
|
29
29
|
/**
|
|
30
30
|
* @override
|
|
31
31
|
*/
|
|
32
|
-
static get
|
|
33
|
-
return '
|
|
32
|
+
static get pname() {
|
|
33
|
+
return 'RelativeAttitudeFromEkf';
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
/**
|
|
@@ -56,13 +56,13 @@ class RelativeAttitudeFromEkfProvider extends Provider {
|
|
|
56
56
|
start() {
|
|
57
57
|
this.accelerometerProviderId = Accelerometer.addEventListener(
|
|
58
58
|
events => this.onAccelerometerEvent(events[0]),
|
|
59
|
-
error => this.notifyError(error)
|
|
60
|
-
|
|
59
|
+
error => this.notifyError(error)
|
|
60
|
+
);
|
|
61
61
|
|
|
62
62
|
this.gyroscopeProviderId = Gyroscope.addEventListener(
|
|
63
63
|
events => (this.gyroscopeEvent = events[0]),
|
|
64
|
-
error => this.notifyError(error)
|
|
65
|
-
|
|
64
|
+
error => this.notifyError(error)
|
|
65
|
+
);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
/**
|
|
@@ -99,7 +99,7 @@ class RelativeAttitudeFromEkfProvider extends Provider {
|
|
|
99
99
|
const attitude = new Attitude(quaternion,
|
|
100
100
|
timestamp,
|
|
101
101
|
RelativeAttitudeFromInertialProvider.DEFAULT_DRIFT,
|
|
102
|
-
this.
|
|
102
|
+
this.pname
|
|
103
103
|
);
|
|
104
104
|
this.notify(this.createEvent(
|
|
105
105
|
EventType.RelativeAttitude,
|
|
@@ -18,8 +18,8 @@ class RelativeAttitudeFromInertialProvider extends Provider {
|
|
|
18
18
|
/**
|
|
19
19
|
* @override
|
|
20
20
|
*/
|
|
21
|
-
static get
|
|
22
|
-
return '
|
|
21
|
+
static get pname() {
|
|
22
|
+
return 'RelativeAttitudeFromInertial';
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/**
|
|
@@ -50,8 +50,8 @@ class RelativeAttitudeFromInertialProvider extends Provider {
|
|
|
50
50
|
.finally(() => {
|
|
51
51
|
this.listenerId = this.provider.addEventListener(
|
|
52
52
|
events => this.notify(events[0].clone()),
|
|
53
|
-
error => this.notifyError(error)
|
|
54
|
-
|
|
53
|
+
error => this.notifyError(error)
|
|
54
|
+
);
|
|
55
55
|
});
|
|
56
56
|
|
|
57
57
|
}
|
|
@@ -17,8 +17,8 @@ class RelativeAttitudeProvider extends Provider {
|
|
|
17
17
|
/**
|
|
18
18
|
* @override
|
|
19
19
|
*/
|
|
20
|
-
static get
|
|
21
|
-
return '
|
|
20
|
+
static get pname() {
|
|
21
|
+
return 'RelativeAttitude';
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
/**
|
|
@@ -68,8 +68,8 @@ class RelativeAttitudeProvider extends Provider {
|
|
|
68
68
|
listenInertial = () => {
|
|
69
69
|
this.inertialProviderId = RelativeAttitudeFromInertial.addEventListener(
|
|
70
70
|
events => this.notify(events[0].clone()),
|
|
71
|
-
error => this.notifyError(error)
|
|
72
|
-
|
|
71
|
+
error => this.notifyError(error)
|
|
72
|
+
);
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
unlistenInertial = () => {
|
|
@@ -85,7 +85,6 @@ class RelativeAttitudeProvider extends Provider {
|
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
87
|
noop,
|
|
88
|
-
this.name,
|
|
89
88
|
false
|
|
90
89
|
);
|
|
91
90
|
};
|
|
@@ -6,9 +6,9 @@ import { Imu } from '../../Providers';
|
|
|
6
6
|
class AccelerometerProvider extends Provider {
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
static get
|
|
9
|
+
* @override
|
|
10
|
+
*/
|
|
11
|
+
static get pname() {
|
|
12
12
|
return 'Accelerometer';
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -32,8 +32,8 @@ class AccelerometerProvider extends Provider {
|
|
|
32
32
|
start() {
|
|
33
33
|
this.providerId = Imu.addEventListener(
|
|
34
34
|
events => this.parseImuEvents(events),
|
|
35
|
-
error => this.notifyError(error)
|
|
36
|
-
|
|
35
|
+
error => this.notifyError(error)
|
|
36
|
+
);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
/**
|
|
@@ -6,9 +6,9 @@ import { Imu } from '../../Providers';
|
|
|
6
6
|
class GyroscopeProvider extends Provider {
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
static get
|
|
9
|
+
* @override
|
|
10
|
+
*/
|
|
11
|
+
static get pname() {
|
|
12
12
|
return 'Gyroscope';
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -32,8 +32,8 @@ class GyroscopeProvider extends Provider {
|
|
|
32
32
|
start() {
|
|
33
33
|
this.providerId = Imu.addEventListener(
|
|
34
34
|
events => this.parseImuEvents(events),
|
|
35
|
-
error => this.notifyError(error)
|
|
36
|
-
|
|
35
|
+
error => this.notifyError(error)
|
|
36
|
+
);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
/**
|
|
@@ -14,8 +14,8 @@ class InclinationFromAccProvider extends Provider {
|
|
|
14
14
|
/**
|
|
15
15
|
* @override
|
|
16
16
|
*/
|
|
17
|
-
static get
|
|
18
|
-
return '
|
|
17
|
+
static get pname() {
|
|
18
|
+
return 'InclinationFromAcc';
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
/**
|
|
@@ -38,8 +38,8 @@ class InclinationFromAccProvider extends Provider {
|
|
|
38
38
|
start() {
|
|
39
39
|
this.providerId = Accelerometer.addEventListener(
|
|
40
40
|
events => this.onAccelerometerEvent(events[0]),
|
|
41
|
-
error => this.notifyError(error)
|
|
42
|
-
|
|
41
|
+
error => this.notifyError(error)
|
|
42
|
+
);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
/**
|
|
@@ -13,8 +13,8 @@ class InclinationFromRelativeAttitudeProvider extends Provider {
|
|
|
13
13
|
/**
|
|
14
14
|
* @override
|
|
15
15
|
*/
|
|
16
|
-
static get
|
|
17
|
-
return '
|
|
16
|
+
static get pname() {
|
|
17
|
+
return 'InclinationFromRelativeAttitude';
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
/**
|
|
@@ -48,8 +48,8 @@ class InclinationFromRelativeAttitudeProvider extends Provider {
|
|
|
48
48
|
[attitudeEvent]
|
|
49
49
|
));
|
|
50
50
|
},
|
|
51
|
-
error => this.notifyError(error)
|
|
52
|
-
|
|
51
|
+
error => this.notifyError(error)
|
|
52
|
+
);
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
/**
|
|
@@ -14,6 +14,13 @@ import {
|
|
|
14
14
|
*/
|
|
15
15
|
class InclinationProvider extends MetaProvider {
|
|
16
16
|
|
|
17
|
+
/**
|
|
18
|
+
* @override
|
|
19
|
+
*/
|
|
20
|
+
static get pname() {
|
|
21
|
+
return 'InclinationProvider';
|
|
22
|
+
}
|
|
23
|
+
|
|
17
24
|
/**
|
|
18
25
|
* @override
|
|
19
26
|
*/
|
|
@@ -40,8 +47,7 @@ class InclinationProvider extends MetaProvider {
|
|
|
40
47
|
this.provider = InclinationFromAcc;
|
|
41
48
|
this.providerId = this.provider.addEventListener(
|
|
42
49
|
events => this.notify(events[0].clone()),
|
|
43
|
-
error => this.notifyError(error)
|
|
44
|
-
this.name
|
|
50
|
+
error => this.notifyError(error)
|
|
45
51
|
);
|
|
46
52
|
};
|
|
47
53
|
|
|
@@ -52,8 +58,8 @@ class InclinationProvider extends MetaProvider {
|
|
|
52
58
|
() => {
|
|
53
59
|
InclinationFromRelativeAttitude.removeEventListener(this.providerId);
|
|
54
60
|
startInclinationFromAcc();
|
|
55
|
-
}
|
|
56
|
-
|
|
61
|
+
}
|
|
62
|
+
);
|
|
57
63
|
} else {
|
|
58
64
|
startInclinationFromAcc();
|
|
59
65
|
}
|
|
@@ -12,8 +12,8 @@ class AbsolutePositionFromRelProvider extends Provider {
|
|
|
12
12
|
/**
|
|
13
13
|
* @override
|
|
14
14
|
*/
|
|
15
|
-
static get
|
|
16
|
-
return '
|
|
15
|
+
static get pname() {
|
|
16
|
+
return 'AbsolutePositionFromRel';
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
/**
|
|
@@ -38,15 +38,13 @@ class AbsolutePositionFromRelProvider extends Provider {
|
|
|
38
38
|
|
|
39
39
|
this.providerId = GeoRelativePosition.addEventListener(
|
|
40
40
|
events => this.onRelativePositionEvent(events[0]),
|
|
41
|
-
error => this.notifyError(error)
|
|
42
|
-
this.name
|
|
41
|
+
error => this.notifyError(error)
|
|
43
42
|
);
|
|
44
43
|
|
|
45
44
|
this.onAbsolutePositionEvent(AbsolutePosition.lastEvent);
|
|
46
45
|
this.absolutePositionProviderId = AbsolutePosition.addEventListener(
|
|
47
46
|
events => this.onAbsolutePositionEvent(events[0]),
|
|
48
47
|
error => this.notifyError(error),
|
|
49
|
-
this.name,
|
|
50
48
|
false
|
|
51
49
|
);
|
|
52
50
|
|
|
@@ -70,7 +68,7 @@ class AbsolutePositionFromRelProvider extends Provider {
|
|
|
70
68
|
/**
|
|
71
69
|
* Use absolute position events only when they are not from this provider
|
|
72
70
|
*/
|
|
73
|
-
if (absolutePositionEvent.providersStack.includes(this.
|
|
71
|
+
if (absolutePositionEvent.providersStack.includes(this.pname)) {
|
|
74
72
|
return;
|
|
75
73
|
}
|
|
76
74
|
|
|
@@ -37,8 +37,8 @@ class AbsolutePositionProvider extends MetaProvider {
|
|
|
37
37
|
/**
|
|
38
38
|
* @override
|
|
39
39
|
*/
|
|
40
|
-
static get
|
|
41
|
-
return '
|
|
40
|
+
static get pname() {
|
|
41
|
+
return 'AbsolutePosition';
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
/**
|
|
@@ -67,8 +67,7 @@ class AbsolutePositionProvider extends MetaProvider {
|
|
|
67
67
|
.then(() => {
|
|
68
68
|
this.fromRelPosProviderId = AbsolutePositionFromRel.addEventListener(
|
|
69
69
|
events => this.onAbsolutePositionFromRel(events[0]),
|
|
70
|
-
noop
|
|
71
|
-
this.name
|
|
70
|
+
noop
|
|
72
71
|
);
|
|
73
72
|
})
|
|
74
73
|
.catch(() => {
|
|
@@ -77,8 +76,7 @@ class AbsolutePositionProvider extends MetaProvider {
|
|
|
77
76
|
|
|
78
77
|
this.gnssWifiProviderId = GnssWifi.addEventListener(
|
|
79
78
|
events => this.onAbsolutePosition(events[0], false),
|
|
80
|
-
noop
|
|
81
|
-
this.name
|
|
79
|
+
noop
|
|
82
80
|
);
|
|
83
81
|
|
|
84
82
|
}
|
|
@@ -26,8 +26,8 @@ class GnssWifiProvider extends Provider {
|
|
|
26
26
|
/**
|
|
27
27
|
* @override
|
|
28
28
|
*/
|
|
29
|
-
static get
|
|
30
|
-
return '
|
|
29
|
+
static get pname() {
|
|
30
|
+
return 'GnssWifi';
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/**
|
|
@@ -92,7 +92,7 @@ class GnssWifiProvider extends Provider {
|
|
|
92
92
|
timestamp,
|
|
93
93
|
coords.accuracy,
|
|
94
94
|
bearing,
|
|
95
|
-
this.
|
|
95
|
+
this.pname);
|
|
96
96
|
|
|
97
97
|
this.notify(this.createEvent(
|
|
98
98
|
EventType.AbsolutePosition, position, timestamp
|
|
@@ -14,10 +14,10 @@ import IpResolveServerError from '../../../errors/IpResolveServerError';
|
|
|
14
14
|
class IpProvider extends Provider {
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
static get
|
|
20
|
-
return 'IP
|
|
17
|
+
* @override
|
|
18
|
+
*/
|
|
19
|
+
static get pname() {
|
|
20
|
+
return 'IP';
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
/**
|
|
@@ -8,6 +8,13 @@ import {
|
|
|
8
8
|
|
|
9
9
|
class GeoRelativePositionFromArCoreProvider extends Provider {
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* @override
|
|
13
|
+
*/
|
|
14
|
+
static get pname() {
|
|
15
|
+
return 'GeoRelativePositionFromArCore';
|
|
16
|
+
}
|
|
17
|
+
|
|
11
18
|
/**
|
|
12
19
|
* @override
|
|
13
20
|
*/
|
|
@@ -22,13 +29,13 @@ class GeoRelativePositionFromArCoreProvider extends Provider {
|
|
|
22
29
|
|
|
23
30
|
this.arCoreProviderId = ArCore.addEventListener(
|
|
24
31
|
this.onArCoreEvents,
|
|
25
|
-
error => this.notifyError(error)
|
|
26
|
-
|
|
32
|
+
error => this.notifyError(error)
|
|
33
|
+
);
|
|
27
34
|
|
|
28
35
|
this.absoluteAttitudeProviderId = AbsoluteAttitude.addEventListener(
|
|
29
36
|
events => (this.absoluteAttitudeEvent = events[0]),
|
|
30
|
-
error => this.notifyError(error)
|
|
31
|
-
|
|
37
|
+
error => this.notifyError(error)
|
|
38
|
+
);
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
/**
|
|
@@ -11,8 +11,8 @@ class GeoRelativePositionProvider extends MetaProvider {
|
|
|
11
11
|
/**
|
|
12
12
|
* @override
|
|
13
13
|
*/
|
|
14
|
-
static get
|
|
15
|
-
return '
|
|
14
|
+
static get pname() {
|
|
15
|
+
return 'GeoRelativePosition';
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
/**
|
|
@@ -49,8 +49,7 @@ class GeoRelativePositionProvider extends MetaProvider {
|
|
|
49
49
|
this.notify(event.clone());
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
|
-
error => this.notifyError(error)
|
|
53
|
-
this.name
|
|
52
|
+
error => this.notifyError(error)
|
|
54
53
|
);
|
|
55
54
|
});
|
|
56
55
|
}
|
|
@@ -16,7 +16,7 @@ class PdrProvider extends Provider {
|
|
|
16
16
|
/**
|
|
17
17
|
* @override
|
|
18
18
|
*/
|
|
19
|
-
static get
|
|
19
|
+
static get pname() {
|
|
20
20
|
return 'PDR';
|
|
21
21
|
}
|
|
22
22
|
|
|
@@ -45,13 +45,13 @@ class PdrProvider extends Provider {
|
|
|
45
45
|
|
|
46
46
|
this.stepDetectionProviderId = StepDetection.addEventListener(
|
|
47
47
|
events => this.onStepEvent(events[0]),
|
|
48
|
-
error => this.notifyError(error)
|
|
49
|
-
|
|
48
|
+
error => this.notifyError(error)
|
|
49
|
+
);
|
|
50
50
|
|
|
51
51
|
this.absoluteAttitudeProviderId = AbsoluteAttitude.addEventListener(
|
|
52
52
|
events => (this.attitudeEvent = events[0]),
|
|
53
|
-
error => this.notifyError(error)
|
|
54
|
-
|
|
53
|
+
error => this.notifyError(error)
|
|
54
|
+
);
|
|
55
55
|
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -35,18 +35,18 @@ class StepDetectionProvider extends Provider {
|
|
|
35
35
|
|
|
36
36
|
this.accelerometerProviderId = Accelerometer.addEventListener(
|
|
37
37
|
events => this.onAccelerometerEvent(events[0]),
|
|
38
|
-
error => this.notifyError(error)
|
|
39
|
-
|
|
38
|
+
error => this.notifyError(error)
|
|
39
|
+
);
|
|
40
40
|
|
|
41
41
|
this.gyroscopeProviderId = Gyroscope.addEventListener(
|
|
42
42
|
events => (this.angularRateEvent = events[0]),
|
|
43
|
-
error => this.notifyError(error)
|
|
44
|
-
|
|
43
|
+
error => this.notifyError(error)
|
|
44
|
+
);
|
|
45
45
|
|
|
46
46
|
this.attitudeProviderId = RelativeAttitudeFromInertial.addEventListener(
|
|
47
47
|
events => (this.attitudeEvent = events[0]),
|
|
48
|
-
error => this.notifyError(error)
|
|
49
|
-
|
|
48
|
+
error => this.notifyError(error)
|
|
49
|
+
);
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
/**
|