@wemap/positioning 1.2.2 → 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 (108) 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 +124 -0
  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 +41 -2
  26. package/src/components/index.js +19 -2
  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 +3 -4
  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 +3 -3
  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/components/Utils.js +35 -0
  67. package/src.old/components/index.js +13 -0
  68. package/src.old/index.js +7 -0
  69. package/{src → src.old}/providers/GnssPdrLocationSource.js +1 -1
  70. package/src.old/providers/ProvidersLogger.js +77 -0
  71. package/webpack/webpack.dev.js +1 -1
  72. package/debug/index.html +0 -15
  73. package/debug/index.old.html +0 -37
  74. package/scripts/release-github.js +0 -216
  75. package/src.new/NavigationHandler.js +0 -62
  76. package/src.new/index.js +0 -3
  77. package/src.new/providers/FakeLocationSource.js +0 -39
  78. /package/{src → src.old}/Constants.js +0 -0
  79. /package/{src → src.old}/NavigationHandler.js +0 -0
  80. /package/{src → src.old}/Pose.js +0 -0
  81. /package/{src → src.old}/attitude/AttitudeHandler.js +0 -0
  82. /package/{src → src.old}/attitude/EkfAttitude.js +0 -0
  83. /package/{src → src.old}/attitude/EkfAttitude.spec.js +0 -0
  84. /package/{src → src.old}/components/AbsoluteAttitude.jsx +0 -0
  85. /package/{src → src.old}/components/Imu.jsx +0 -0
  86. /package/{src → src.old}/components/LocationSource.jsx +0 -0
  87. /package/{src → src.old}/components/Logger.jsx +0 -0
  88. /package/{src → src.old}/components/NavigationDebugApp.jsx +0 -0
  89. /package/{src → src.old}/components/Others.jsx +0 -0
  90. /package/{src → src.old}/components/RelativeAttitude.jsx +0 -0
  91. /package/{src → src.old}/providers/FixedLocationImuLocationSource.js +0 -0
  92. /package/{src → src.old}/providers/GnssLocationSource.js +0 -0
  93. /package/{src → src.old}/providers/IPLocationSource.js +0 -0
  94. /package/{src → src.old}/providers/LocationSource.js +0 -0
  95. /package/{src → src.old}/providers/PdrLocationSource.js +0 -0
  96. /package/{src → src.old}/providers/pdr/HeadingUnlocker.js +0 -0
  97. /package/{src → src.old}/providers/pdr/HeadingUnlocker.spec.js +0 -0
  98. /package/{src → src.old}/providers/pdr/Smoother.js +0 -0
  99. /package/{src → src.old}/providers/pdr/Smoother.spec.js +0 -0
  100. /package/{src → src.old}/providers/pdr/ThugDetector.js +0 -0
  101. /package/{src → src.old}/providers/steps/StepDetection.js +0 -0
  102. /package/{src → src.old}/providers/steps/StepDetectionLadetto.js +0 -0
  103. /package/{src → src.old}/providers/steps/StepDetectionMinMaxPeaks.js +0 -0
  104. /package/{src → src.old}/providers/steps/StepDetectionMinMaxPeaks2.js +0 -0
  105. /package/{src → src.old}/sensors/SensorsCompatibility.js +0 -0
  106. /package/{src → src.old}/sensors/SensorsCompatibility.spec.js +0 -0
  107. /package/{src → src.old}/sensors/SensorsLogger.js +0 -0
  108. /package/{src → src.old}/sensors/SensorsLoggerUtils.js +0 -0
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": "1.2.2"
83
+ "version": "2.1.0"
82
84
  }
@@ -0,0 +1,124 @@
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';
8
+
9
+ /**
10
+ * @private
11
+ */
12
+ class PositioningHandler {
13
+
14
+ providerInstances = [];
15
+
16
+ /**
17
+ * Constructor of PositioningHandler
18
+ * @public
19
+ */
20
+ constructor() {
21
+
22
+ }
23
+
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) {
33
+
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');
40
+ }
41
+
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) {
53
+
54
+ const wantPoseProvider = [EventType.AbsolutePosition, EventType.AbsoluteAttitude]
55
+ .every(elem => eventsType.includes(elem));
56
+
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;
70
+ }
71
+
72
+ /**
73
+ * @public
74
+ */
75
+ stop(providerId) {
76
+ this.providerInstances[providerId].stop();
77
+ delete this.providerInstances[providerId];
78
+ }
79
+
80
+ /**
81
+ * @public
82
+ */
83
+ setPosition(id, position) {
84
+ const provider = this.providerInstances[id];
85
+ if (!provider) {
86
+ throw new Error('Unknown provider');
87
+ }
88
+ if (!provider.setLocation) {
89
+ Logger.warn('Cannot set location to ' + provider.constructor.name);
90
+ }
91
+ provider.setLocation(position);
92
+ }
93
+
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);
120
+ }
121
+
122
+ }
123
+
124
+ export default PositioningHandler;
@@ -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;
@@ -0,0 +1,100 @@
1
+ import React from 'react';
2
+
3
+ import EventType from '../events/EventType';
4
+ import ImuProvider from '../providers/others/ImuProvider';
5
+ import Utils from './Utils';
6
+
7
+ class ImuComponent extends React.Component {
8
+
9
+ constructor(props, context) {
10
+ super(props, context);
11
+
12
+ this.state = {
13
+ acc: null,
14
+ gyr: null
15
+ };
16
+
17
+ this.imuProvider = new ImuProvider(this.onEvent, this.onError, {require: [
18
+ EventType.Acceleration, EventType.AngularRate
19
+ ]});
20
+ }
21
+
22
+ componentDidMount() {
23
+ this.imuProvider.start();
24
+ }
25
+
26
+ componentWillUnmount() {
27
+ this.imuProvider.stop();
28
+ }
29
+
30
+ onEvent = events => {
31
+ const newState = {};
32
+
33
+ events.forEach(event => {
34
+ if (event.dataType === EventType.Acceleration) {
35
+ newState.acc = event.data;
36
+ }
37
+ if (event.dataType === EventType.AngularRate) {
38
+ newState.gyr = event.data;
39
+ }
40
+ });
41
+
42
+ this.setState(newState);
43
+ };
44
+
45
+ onError = events => {
46
+ const newState = {};
47
+
48
+ events.forEach(event => {
49
+ if (event.dataType === EventType.Acceleration) {
50
+ newState.acc = event.error;
51
+ }
52
+ if (event.dataType === EventType.AngularRate) {
53
+ newState.gyr = event.error;
54
+ }
55
+ });
56
+
57
+ this.setState(newState);
58
+ }
59
+
60
+ render() {
61
+
62
+ let accelerometerString;
63
+ const acc = this.state.acc;
64
+ if (!acc) {
65
+ accelerometerString = 'Waiting';
66
+ } else if (acc instanceof Error) {
67
+ accelerometerString = Utils.renderError(acc);
68
+ } else {
69
+ accelerometerString = '[' + acc[0].toFixed(2)
70
+ + ', ' + acc[1].toFixed(2)
71
+ + ', ' + acc[2].toFixed(2)
72
+ + ']';
73
+ }
74
+
75
+ let gyroscopeString;
76
+ const gyr = this.state.gyr;
77
+ if (!gyr) {
78
+ gyroscopeString = 'Waiting';
79
+ } else if (gyr instanceof Error) {
80
+ gyroscopeString = Utils.renderError(gyr);
81
+ } else {
82
+ gyroscopeString = '[' + gyr[0].toFixed(2)
83
+ + ', ' + gyr[1].toFixed(2)
84
+ + ', ' + gyr[2].toFixed(2)
85
+ + ']';
86
+ }
87
+
88
+ return (
89
+ <div>
90
+ <h3>Acceleration</h3>
91
+ <p>{accelerometerString}</p>
92
+ <h3>Angular Velocity</h3>
93
+ <p>{gyroscopeString}</p>
94
+ </div>
95
+ );
96
+
97
+ }
98
+ }
99
+
100
+ export default ImuComponent;