@wemap/positioning 2.0.0 → 2.1.0

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.
Files changed (71) hide show
  1. package/.eslintrc.json +4 -2
  2. package/debug/absolute-attitude.html +16 -0
  3. package/debug/gnss-wifi-pdr.html +16 -0
  4. package/debug/gnss-wifi.html +16 -0
  5. package/debug/imu.html +16 -0
  6. package/debug/inclination.html +16 -0
  7. package/debug/pdr.html +16 -0
  8. package/debug/pose.html +16 -0
  9. package/debug/positioning.html +16 -0
  10. package/debug/relative-attitude.html +16 -0
  11. package/package.json +6 -4
  12. package/src/PositioningHandler.js +96 -34
  13. package/src/components/AbsoluteAttitudeComponent.jsx +104 -0
  14. package/src/components/GnssWifiComponent.jsx +46 -0
  15. package/src/components/GnssWifiPdrComponent.jsx +85 -0
  16. package/src/components/ImuComponent.jsx +100 -0
  17. package/src/components/InclinationComponent.jsx +53 -0
  18. package/src/components/PdrComponent.jsx +88 -0
  19. package/src/components/PoseComponent.jsx +74 -0
  20. package/src/components/PositioningComponent.jsx +26 -0
  21. package/src/components/PositioningInclinationComponent.jsx +76 -0
  22. package/src/components/PositioningPoseComponent.jsx +111 -0
  23. package/src/components/RelativeAttitudeComponent.jsx +82 -0
  24. package/src/components/StartStopComponent.jsx +50 -0
  25. package/src/components/Utils.js +74 -0
  26. package/src/components/index.js +30 -0
  27. package/src/errors/AskImuOnDesktopError.js +9 -0
  28. package/src/errors/GeolocationApiMissingError.js +9 -0
  29. package/src/errors/GeolocationPermissionDeniedError.js +9 -0
  30. package/src/errors/GeolocationPositionUnavailableError.js +9 -0
  31. package/src/errors/IpResolveServerError.js +9 -0
  32. package/src/errors/MissingAccelerometerError.js +11 -0
  33. package/src/errors/MissingGyroscopeError.js +11 -0
  34. package/src/errors/MissingMagnetometerError.js +9 -0
  35. package/src/errors/MissingSensorError.js +14 -0
  36. package/src/events/EventType.js +20 -0
  37. package/src/events/ProviderError.js +52 -0
  38. package/src/events/ProviderEvent.js +35 -0
  39. package/src/index.js +2 -2
  40. package/src/providers/Constants.js +5 -0
  41. package/src/providers/FakeAbsolutePositionProvider.js +56 -0
  42. package/src/providers/Provider.js +218 -0
  43. package/src/providers/ProviderOptions.js +28 -0
  44. package/src/providers/ProvidersLogger.js +77 -0
  45. package/src/providers/attitude/AbsoluteAttitudeProvider.js +207 -0
  46. package/src/providers/attitude/EkfAttitude.js +238 -0
  47. package/src/providers/attitude/EkfAttitude.spec.js +116 -0
  48. package/src/providers/attitude/RelativeAttitudeProvider.js +129 -0
  49. package/src/providers/others/ImuProvider.js +186 -0
  50. package/src/providers/others/InclinationProvider.js +107 -0
  51. package/src/providers/others/MapMatchingProvider.js +147 -0
  52. package/src/providers/pose/GnssWifiPdrProvider.js +233 -0
  53. package/src/providers/pose/PoseProvider.js +90 -0
  54. package/src/providers/pose/pdr/PdrProvider.js +352 -0
  55. package/src/providers/pose/pdr/helpers/HeadingUnlocker.js +41 -0
  56. package/src/providers/pose/pdr/helpers/HeadingUnlocker.spec.js +26 -0
  57. package/src/providers/pose/pdr/helpers/Smoother.js +90 -0
  58. package/src/providers/pose/pdr/helpers/Smoother.spec.js +424 -0
  59. package/src/providers/pose/pdr/helpers/ThugDetector.js +37 -0
  60. package/src/providers/pose/pdr/steps/StepDetection.js +7 -0
  61. package/src/providers/pose/pdr/steps/StepDetectionLadetto.js +67 -0
  62. package/src/providers/pose/pdr/steps/StepDetectionMinMaxPeaks.js +80 -0
  63. package/src/providers/pose/pdr/steps/StepDetectionMinMaxPeaks2.js +108 -0
  64. package/src/providers/position/GnssWifiProvider.js +129 -0
  65. package/src/providers/position/IpProvider.js +75 -0
  66. package/src.old/providers/GnssPdrLocationSource.js +1 -1
  67. package/webpack/webpack.dev.js +1 -1
  68. package/debug/index.html +0 -15
  69. package/debug/index.old.html +0 -37
  70. package/scripts/release-github.js +0 -216
  71. package/src/providers/FakeLocationSource.js +0 -36
package/.eslintrc.json CHANGED
@@ -17,7 +17,8 @@
17
17
  "sourceType": "module"
18
18
  },
19
19
  "plugins": [
20
- "react"
20
+ "react",
21
+ "jsdoc"
21
22
  ],
22
23
  "rules": {
23
24
  "accessor-pairs": [
@@ -457,7 +458,8 @@
457
458
  2,
458
459
  "never",
459
460
  {}
460
- ]
461
+ ],
462
+ "jsdoc/no-undefined-types": 1
461
463
  },
462
464
  "settings": {
463
465
  "react": {
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, user-scalable=no">
7
+ <title>Debug Absolute Attitude</title>
8
+ <script src="/js/positioning-components.js"></script>
9
+ </head>
10
+
11
+ <body>
12
+ <div id="app"></div>
13
+ <script>createReactElement(AbsoluteAttitudeComponent, document.getElementById('app'));</script>
14
+ </body>
15
+
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, user-scalable=no">
7
+ <title>Debug GnssWifiPdr</title>
8
+ <script src="/js/positioning-components.js"></script>
9
+ </head>
10
+
11
+ <body>
12
+ <div id="app"></div>
13
+ <script>createReactElement(GnssWifiPdrComponent, document.getElementById('app'));</script>
14
+ </body>
15
+
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, user-scalable=no">
7
+ <title>Debug Positioning</title>
8
+ <script src="/js/positioning-components.js"></script>
9
+ </head>
10
+
11
+ <body>
12
+ <div id="app"></div>
13
+ <script>createReactElement(GnssWifiComponent, document.getElementById('app'));</script>
14
+ </body>
15
+
16
+ </html>
package/debug/imu.html ADDED
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, user-scalable=no">
7
+ <title>Debug Imu</title>
8
+ <script src="/js/positioning-components.js"></script>
9
+ </head>
10
+
11
+ <body>
12
+ <div id="app"></div>
13
+ <script>createReactElement(ImuComponent, document.getElementById('app'));</script>
14
+ </body>
15
+
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, user-scalable=no">
7
+ <title>Debug Inclination</title>
8
+ <script src="/js/positioning-components.js"></script>
9
+ </head>
10
+
11
+ <body>
12
+ <div id="app"></div>
13
+ <script>createReactElement(InclinationComponent, document.getElementById('app'));</script>
14
+ </body>
15
+
16
+ </html>
package/debug/pdr.html ADDED
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, user-scalable=no">
7
+ <title>Debug PDR</title>
8
+ <script src="/js/positioning-components.js"></script>
9
+ </head>
10
+
11
+ <body>
12
+ <div id="app"></div>
13
+ <script>createReactElement(PdrComponent, document.getElementById('app'));</script>
14
+ </body>
15
+
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, user-scalable=no">
7
+ <title>Debug Pose</title>
8
+ <script src="/js/positioning-components.js"></script>
9
+ </head>
10
+
11
+ <body>
12
+ <div id="app"></div>
13
+ <script>createReactElement(PoseComponent, document.getElementById('app'));</script>
14
+ </body>
15
+
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, user-scalable=no">
7
+ <title>Debug Positioning</title>
8
+ <script src="/js/positioning-components.js"></script>
9
+ </head>
10
+
11
+ <body>
12
+ <div id="app"></div>
13
+ <script>createReactElement(PositioningComponent, document.getElementById('app'));</script>
14
+ </body>
15
+
16
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, user-scalable=no">
7
+ <title>Debug Relative Attitude</title>
8
+ <script src="/js/positioning-components.js"></script>
9
+ </head>
10
+
11
+ <body>
12
+ <div id="app"></div>
13
+ <script>createReactElement(RelativeAttitudeComponent, document.getElementById('app'));</script>
14
+ </body>
15
+
16
+ </html>
package/package.json CHANGED
@@ -8,12 +8,14 @@
8
8
  "Guillaume Pannetier <guillaume.pannetier@getwemap.com>"
9
9
  ],
10
10
  "dependencies": {
11
- "@wemap/geo": "^0.1.3",
11
+ "@wemap/geo": "^0.1.4",
12
12
  "@wemap/logger": "^0.1.4",
13
13
  "@wemap/maths": "^0.1.2",
14
+ "@wemap/utils": "^0.1.2",
14
15
  "file-saver": "^2.0.2",
15
16
  "geomagnetism": "^0.1.0",
16
17
  "jszip": "^3.2.2",
18
+ "lodash.isempty": "^4.4.0",
17
19
  "lodash.isnumber": "^3.0.3",
18
20
  "lodash.noop": "^3.0.1"
19
21
  },
@@ -34,6 +36,7 @@
34
36
  "dotenv": "^8.1.0",
35
37
  "eslint": "^6.2.2",
36
38
  "eslint-plugin-babel": "^5.3.0",
39
+ "eslint-plugin-jsdoc": "^15.9.1",
37
40
  "eslint-plugin-react": "^7.14.3",
38
41
  "esm": "^3.2.25",
39
42
  "jsdom": "^15.1.1",
@@ -75,8 +78,7 @@
75
78
  "stats": "webpack --config webpack/webpack.prod.js --profile --json > stats.json",
76
79
  "start": "webpack-dev-server --config webpack/webpack.dev.js --progress --inline --hot --https",
77
80
  "lint": "eslint --ext .js,.jsx --quiet src",
78
- "test": "mocha -r esm \"src/**/*.spec.js\"",
79
- "release": "node ./scripts/release-github.js"
81
+ "test": "mocha -r esm \"src/**/*.spec.js\""
80
82
  },
81
- "version": "2.0.0"
83
+ "version": "2.1.0"
82
84
  }
@@ -1,60 +1,122 @@
1
- import noop from 'lodash.noop';
2
-
3
- import FakeLocationSource from './providers/FakeLocationSource';
1
+ import EventType from './events/EventType';
2
+ import PdrProvider from './providers/pose/pdr/PdrProvider';
3
+ import GnssWifiPdrProvider from './providers/pose/GnssWifiPdrProvider';
4
+ import PoseProvider from './providers/pose/PoseProvider';
5
+ import ProviderOptions from './providers/ProviderOptions';
6
+ import InclinationProvider from './providers/others/InclinationProvider';
7
+ import Logger from '@wemap/logger';
4
8
 
5
9
  /**
6
10
  * @private
7
11
  */
8
12
  class PositioningHandler {
9
13
 
10
- static State = {
11
- STARTING: 0,
12
- STARTED: 1,
13
- STOPPPED: 2
14
- };
15
-
16
- _state = PositioningHandler.State.STOPPPED;
14
+ providerInstances = [];
17
15
 
18
16
  /**
19
17
  * Constructor of PositioningHandler
20
- * @param {Function} _callback callback on new pose
21
18
  * @public
22
19
  */
23
- constructor(_callback) {
24
- const callback = _callback || noop;
25
- this.locationSource = new FakeLocationSource(pose => callback(pose));
20
+ constructor() {
21
+
26
22
  }
27
23
 
28
- startIfNecessary() {
24
+ /**
25
+ * Start to listen events
26
+ * @param {EventType[]} eventsType array of events to subscribe
27
+ * @param {Function} onEvent Callback on events, first and only parameter is a: {@link ProviderEvent[]}.
28
+ * @param {Function} onError Callback on errors, first and only parameter is a: {@link ProviderError[]}.
29
+ * @param {ProviderOptions} options
30
+ * @returns {Number} an id to stop or interact with
31
+ */
32
+ start(eventsType, onEvent, onError, options) {
29
33
 
30
- if (this._state === PositioningHandler.State.STARTING
31
- || this._state === PositioningHandler.State.STARTED) {
32
- const msg = 'Navigation already started';
33
- console.log(msg);
34
- return Promise.resolve(msg);
34
+ this.options = Object.assign(ProviderOptions, options);
35
+
36
+ const providerClass = this.findProvider(eventsType, this.options);
37
+
38
+ if (!providerClass) {
39
+ throw new Error('No provider found');
35
40
  }
36
41
 
37
- this._state = PositioningHandler.State.STARTING;
42
+ const provider = Reflect.construct(providerClass, [onEvent, onError, this.options]);
43
+ this.providerInstances[provider.id] = provider;
44
+ provider.start();
45
+
46
+ return provider.id;
47
+ }
48
+
49
+ /**
50
+ * @private
51
+ */
52
+ findProvider(eventsType, options) {
38
53
 
39
- const promise = this.locationSource.start();
40
- promise
41
- .then(() => (this._state = PositioningHandler.State.STARTED))
42
- .catch(() => (this._state = PositioningHandler.State.STOPPPED));
54
+ const wantPoseProvider = [EventType.AbsolutePosition, EventType.AbsoluteAttitude]
55
+ .every(elem => eventsType.includes(elem));
43
56
 
44
- return promise;
57
+ if (wantPoseProvider) {
58
+ if (options.ignoreProviders.includes(PdrProvider)) {
59
+ return PoseProvider;
60
+ }
61
+ if (options.waitInputPosition) {
62
+ return PdrProvider;
63
+ }
64
+ return GnssWifiPdrProvider;
65
+ }
66
+ if (eventsType.includes(EventType.Inclination)) {
67
+ return InclinationProvider;
68
+ }
69
+ return null;
45
70
  }
46
71
 
47
- stop() {
72
+ /**
73
+ * @public
74
+ */
75
+ stop(providerId) {
76
+ this.providerInstances[providerId].stop();
77
+ delete this.providerInstances[providerId];
78
+ }
48
79
 
49
- if (this._state === PositioningHandler.State.STOPPPED) {
50
- const msg = 'Navigation already stopped';
51
- console.log(msg);
52
- return Promise.resolve(msg);
80
+ /**
81
+ * @public
82
+ */
83
+ setPosition(id, position) {
84
+ const provider = this.providerInstances[id];
85
+ if (!provider) {
86
+ throw new Error('Unknown provider');
53
87
  }
88
+ if (!provider.setLocation) {
89
+ Logger.warn('Cannot set location to ' + provider.constructor.name);
90
+ }
91
+ provider.setLocation(position);
92
+ }
54
93
 
55
- this.locationSource.stop();
56
- this._state = PositioningHandler.State.STOPPPED;
57
- return Promise.resolve();
94
+ /**
95
+ * @public
96
+ */
97
+ setHeading(id, heading) {
98
+ const provider = this.providerInstances[id];
99
+ if (!provider) {
100
+ throw new Error('Unknown provider');
101
+ }
102
+ if (!provider.setHeading) {
103
+ Logger.warn('Cannot set heading to ' + provider.constructor.name);
104
+ }
105
+ provider.setHeading(heading);
106
+ }
107
+
108
+ /**
109
+ * @public
110
+ */
111
+ setItinerary(id, itinerary) {
112
+ const provider = this.providerInstances[id];
113
+ if (!provider) {
114
+ throw new Error('Unknown provider');
115
+ }
116
+ if (!provider.setItinerary) {
117
+ Logger.warn('Cannot set itinerary to ' + provider.constructor.name);
118
+ }
119
+ provider.setItinerary(itinerary);
58
120
  }
59
121
 
60
122
  }
@@ -0,0 +1,104 @@
1
+ import React from 'react';
2
+
3
+ import { WGS84 } from '@wemap/geo';
4
+
5
+ import AbsoluteAttitudeProvider from '../providers/attitude/AbsoluteAttitudeProvider';
6
+ import Utils from './Utils';
7
+ import EventType from '../events/EventType';
8
+
9
+ const userLocation = new WGS84(43.609275, 3.884236);
10
+
11
+ class AbsoluteAttitudeComponent extends React.Component {
12
+
13
+ constructor(props, context) {
14
+ super(props, context);
15
+
16
+ this.state = {
17
+ attitudeBrowser: null,
18
+ deviceorientation: null,
19
+ deviceorientationabsolute: null
20
+ };
21
+
22
+ this.absoluteAttitudeProvider = new AbsoluteAttitudeProvider(this.onEvent, this.onError);
23
+ this.absoluteAttitudeProvider.setLocation(userLocation);
24
+ }
25
+
26
+ componentDidMount() {
27
+ this.absoluteAttitudeProvider.start();
28
+
29
+ this.onDeviceOrientationEventListener = (e) => this.setState({ deviceorientation: e });
30
+ window.addEventListener('deviceorientation', this.onDeviceOrientationEventListener, true);
31
+
32
+
33
+ this.onDeviceOrientationAbsoluteEventListener = (e) => this.setState({ deviceorientationabsolute: e });
34
+ window.addEventListener('deviceorientationabsolute', this.onDeviceOrientationAbsoluteEventListener, true);
35
+ }
36
+
37
+ componentWillUnmount() {
38
+ this.absoluteAttitudeProvider.stop();
39
+
40
+ window.removeEventListener('deviceorientation', this.onDeviceOrientationEventListener, true);
41
+
42
+ window.removeEventListener('deviceorientationabsolute', this.onDeviceOrientationAbsoluteEventListener, true);
43
+ }
44
+
45
+ onEvent = events => {
46
+ events.forEach(event => {
47
+ if (event.dataType === EventType.AbsoluteAttitude) {
48
+ this.setState({ attitudeBrowser: event.data });
49
+ }
50
+ });
51
+ };
52
+
53
+ onError = events => {
54
+ events.forEach(event => {
55
+ if (event.dataType === EventType.AbsoluteAttitude) {
56
+ this.setState({ attitudeBrowser: event.error });
57
+ }
58
+ });
59
+ }
60
+
61
+ render() {
62
+
63
+ let rawRender = <span>Not available</span>;
64
+
65
+ if (this.state.deviceorientation && this.state.deviceorientation.webkitCompassHeading) {
66
+ const alpha = this.state.deviceorientation.alpha;
67
+ const beta = this.state.deviceorientation.beta;
68
+ const gamma = this.state.deviceorientation.gamma;
69
+ const webkitCompassHeading = this.state.deviceorientation.webkitCompassHeading;
70
+
71
+ if (alpha && beta && gamma && webkitCompassHeading) {
72
+ rawRender = <p>alpha: {alpha.toFixed(2)}, <br />
73
+ beta: {beta.toFixed(2)}, <br />
74
+ gamma: {gamma.toFixed(2)}, <br />
75
+ webkitCompassHeading: {webkitCompassHeading.toFixed(2)}</p>;
76
+ }
77
+
78
+ } else if (this.state.deviceorientationabsolute) {
79
+ const alpha = this.state.deviceorientationabsolute.alpha;
80
+ const beta = this.state.deviceorientationabsolute.beta;
81
+ const gamma = this.state.deviceorientationabsolute.gamma;
82
+
83
+ if (alpha && beta && gamma) {
84
+ rawRender = <p>alpha: {alpha.toFixed(2)}, <br />
85
+ beta: {beta.toFixed(2)}, <br />
86
+ gamma: {gamma.toFixed(2)}</p>;
87
+ }
88
+ }
89
+
90
+ const browserRender = Utils.renderAttitude(this.state.attitudeBrowser);
91
+
92
+ return (
93
+ <div>
94
+ <h3>Raw:</h3>
95
+ {rawRender}
96
+ <h3>From browser:</h3>
97
+ {browserRender}
98
+ </div>
99
+ );
100
+ }
101
+ }
102
+
103
+ export default AbsoluteAttitudeComponent;
104
+
@@ -0,0 +1,46 @@
1
+ import React from 'react';
2
+
3
+ import GnssWifiProvider from '../providers/position/GnssWifiProvider';
4
+ import Utils from './Utils';
5
+ import EventType from '../events/EventType';
6
+
7
+ class GnssWifiComponent extends React.Component {
8
+
9
+ constructor(props, context) {
10
+ super(props, context);
11
+ this.state = {position: null};
12
+
13
+ this.gnssWifiProvider = new GnssWifiProvider(this.onEvent, this.onError);
14
+ }
15
+
16
+
17
+ componentDidMount() {
18
+ this.gnssWifiProvider.start();
19
+ }
20
+
21
+ componentWillUnmount() {
22
+ this.gnssWifiProvider.stop();
23
+ }
24
+
25
+ onEvent = events => {
26
+ events.forEach(event => {
27
+ if (event.dataType === EventType.AbsolutePosition) {
28
+ this.setState({ position: event.data });
29
+ }
30
+ });
31
+ };
32
+
33
+ onError = events => {
34
+ events.forEach(event => {
35
+ if (event.dataType === EventType.AbsolutePosition) {
36
+ this.setState({ position: event.error });
37
+ }
38
+ });
39
+ }
40
+
41
+ render() {
42
+ return Utils.renderPosition(this.state.position);
43
+ }
44
+ }
45
+
46
+ export default GnssWifiComponent;
@@ -0,0 +1,85 @@
1
+ import isEmpty from 'lodash.isempty';
2
+ import React from 'react';
3
+
4
+ import {
5
+ Itinerary, WGS84UserPosition
6
+ } from '@wemap/geo';
7
+
8
+ import Utils from './Utils';
9
+ import EventType from '../events/EventType';
10
+ import GnssWifiPdrProvider from '../providers/pose/GnssWifiPdrProvider';
11
+
12
+ const INITIAL_LOCATION = new WGS84UserPosition(43.6091955, 3.8841255);
13
+ const ITINERARY = Itinerary.fromPoints([
14
+ [INITIAL_LOCATION.lat, INITIAL_LOCATION.lng],
15
+ [43.6091883, 3.8841242],
16
+ [43.6091709, 3.8842382],
17
+ [43.6091288, 3.884226],
18
+ [43.6091461, 3.884112]
19
+ ], false);
20
+
21
+ class GnssWifiPdrComponent extends React.Component {
22
+
23
+ constructor(props, context) {
24
+ super(props, context);
25
+ this.state = { position: null };
26
+
27
+ this.gnssWifiPdrProvider = new GnssWifiPdrProvider(this.onEvent, this.onError);
28
+ }
29
+
30
+
31
+ componentDidMount() {
32
+ this.gnssWifiPdrProvider.enableMapMatching(ITINERARY);
33
+ this.gnssWifiPdrProvider.start();
34
+ }
35
+
36
+ componentWillUnmount() {
37
+ this.gnssWifiPdrProvider.stop();
38
+ }
39
+
40
+ onEvent = events => {
41
+ const newState = {};
42
+ events.forEach(event => {
43
+ if (event.dataType === EventType.AbsolutePosition) {
44
+ newState.position = event.data;
45
+ } else if (event.dataType === EventType.AbsoluteAttitude) {
46
+ newState.attitude = event.data;
47
+ }
48
+ });
49
+ if (!isEmpty(newState)) {
50
+ this.setState(newState);
51
+ }
52
+ };
53
+
54
+ onError = events => {
55
+ const newState = {};
56
+ events.forEach(event => {
57
+ if (event.dataType === EventType.AbsolutePosition) {
58
+ newState.position = event.error;
59
+ } else if (event.dataType === EventType.AbsoluteAttitude) {
60
+ newState.attitude = event.error;
61
+ }
62
+ });
63
+ if (!isEmpty(newState)) {
64
+ this.setState(newState);
65
+ }
66
+ }
67
+
68
+ render() {
69
+
70
+ const attitudeRender = Utils.renderAttitude(this.state.attitude);
71
+ const positionRender = Utils.renderPosition(this.state.position);
72
+
73
+ return (
74
+ <div>
75
+ <h3>Position</h3>
76
+ {positionRender}
77
+ <h3>Attitude</h3>
78
+ {attitudeRender}
79
+ </div>
80
+
81
+ );
82
+ }
83
+ }
84
+
85
+ export default GnssWifiPdrComponent;