@wemap/positioning 2.3.0 → 2.3.2

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/package.json CHANGED
@@ -81,5 +81,5 @@
81
81
  "lint": "eslint --ext .js,.jsx --quiet src",
82
82
  "test": "mocha -r esm \"src/**/*.spec.js\""
83
83
  },
84
- "version": "2.3.0"
84
+ "version": "2.3.2"
85
85
  }
@@ -1,11 +1,16 @@
1
+ /* eslint-disable max-statements */
1
2
  import EventType from './events/EventType';
2
3
  import PdrProvider from './providers/pose/pdr/PdrProvider';
3
4
  import GnssWifiPdrProvider from './providers/pose/GnssWifiPdrProvider';
4
5
  import PoseProvider from './providers/pose/PoseProvider';
5
- import ProviderOptions from './providers/ProviderOptions';
6
+ import PositioningOptions from './PositioningOptions';
6
7
  import InclinationProvider from './providers/others/InclinationProvider';
7
8
  import Logger from '@wemap/logger';
8
9
  import ArCoreAbsoluteProvider from './providers/pose/ArCoreAbsoluteProvider';
10
+ import ArCoreProvider from './providers/pose/ArCoreProvider';
11
+ import GnssWifiProvider from './providers/position/GnssWifiProvider';
12
+ import NoProviderFoundError from './errors/NoProviderFoundError';
13
+ import ProviderError from './events/ProviderError';
9
14
 
10
15
  /**
11
16
  * @private
@@ -27,60 +32,103 @@ class PositioningHandler {
27
32
  * @param {EventType[]} eventsType array of events to subscribe
28
33
  * @param {Function} onEvent Callback on events, first and only parameter is a: {@link ProviderEvent[]}.
29
34
  * @param {Function} onError Callback on errors, first and only parameter is a: {@link ProviderError[]}.
30
- * @param {ProviderOptions} options
35
+ * @param {PositioningOptions} options
31
36
  * @returns {Number} an id to stop or interact with
32
37
  */
33
38
  start(eventsType, onEvent, onError, options) {
34
39
 
35
- this.options = Object.assign(ProviderOptions, options);
40
+ this.options = Object.assign({}, PositioningOptions, options);
36
41
 
37
- const providerClass = this.findProvider(eventsType, this.options);
38
-
39
- if (!providerClass) {
40
- throw new Error('No provider found');
42
+ const providerClass = PositioningHandler.findProvider(eventsType, this.options);
43
+ if (Array.isArray(providerClass)) {
44
+ onError(providerClass);
45
+ return null;
41
46
  }
42
-
43
47
  const provider = Reflect.construct(providerClass, [onEvent, onError, this.options]);
44
48
  this.providerInstances[provider.id] = provider;
45
49
  provider.start();
46
50
 
47
51
  return provider.id;
52
+
48
53
  }
49
54
 
50
55
  /**
51
56
  * @private
52
57
  */
53
- findProvider(eventsType, options) {
58
+ static findProvider(eventsType, _options) {
54
59
 
55
- const wantPoseProvider = [EventType.AbsolutePosition, EventType.AbsoluteAttitude]
56
- .every(elem => eventsType.includes(elem));
60
+ const options = Object.assign({}, PositioningOptions, _options);
57
61
 
58
- if (wantPoseProvider) {
62
+ let errors = [];
63
+ const canUse = (provider, others = []) => {
64
+ if (options.ignoreProviders.includes(provider.name)
65
+ || others.some(elem => options.ignoreProviders.includes(elem.name))) {
66
+ return false;
67
+ }
68
+ errors = provider.checkAvailabilityErrors();
69
+ return errors.length === 0;
70
+ };
59
71
 
60
- const arCoreAvailable = ArCoreAbsoluteProvider.checkAvailabilityErrors().length === 0;
72
+ const wantInclination = eventsType.length === 1
73
+ && eventsType.includes(EventType.Inclination);
61
74
 
62
- if ((options.ignoreProviders.includes(PdrProvider)
63
- && options.ignoreProviders.includes(ArCoreAbsoluteProvider))
64
- || (!options.ignoreProviders.includes(ArCoreAbsoluteProvider)
65
- && !arCoreAvailable)) {
66
- return PoseProvider;
75
+ if (wantInclination) {
76
+ if (canUse(InclinationProvider)) {
77
+ return InclinationProvider;
67
78
  }
79
+ if (errors.length !== 0) {
80
+ return errors;
81
+ }
82
+ return [new ProviderError(null, EventType.Inclination, new NoProviderFoundError())];
83
+ }
84
+
85
+ const wantPoseProvider = [EventType.AbsolutePosition, EventType.AbsoluteAttitude]
86
+ .every(elem => eventsType.includes(elem)) && eventsType.length === 2;
87
+
88
+ if (wantPoseProvider) {
68
89
 
69
90
  if (options.waitInputPosition) {
70
- if (!options.ignoreProviders.includes(ArCoreAbsoluteProvider) && arCoreAvailable) {
91
+ if (canUse(ArCoreAbsoluteProvider, [ArCoreProvider])) {
71
92
  return ArCoreAbsoluteProvider;
72
93
  }
73
- if (!options.ignoreProviders.includes(PdrProvider)) {
94
+ if (canUse(PdrProvider)) {
74
95
  return PdrProvider;
75
96
  }
97
+
98
+ return [
99
+ new ProviderError(null, EventType.AbsoluteAttitude, new NoProviderFoundError()),
100
+ new ProviderError(null, EventType.AbsolutePosition, new NoProviderFoundError())
101
+ ];
76
102
  }
77
103
 
78
- return GnssWifiPdrProvider;
79
- }
80
- if (eventsType.includes(EventType.Inclination)) {
81
- return InclinationProvider;
104
+ if (canUse(GnssWifiPdrProvider, [PdrProvider])) {
105
+ return GnssWifiPdrProvider;
106
+ }
107
+
108
+ if (canUse(PoseProvider)) {
109
+ return PoseProvider;
110
+ }
111
+
112
+ if (options.optionalEvents.includes(EventType.AbsoluteAttitude)
113
+ && canUse(GnssWifiProvider)) {
114
+ return GnssWifiProvider;
115
+ }
116
+
117
+ if (errors.length !== 0) {
118
+ return errors;
119
+ }
120
+
121
+ if (options.optionalEvents.includes(EventType.AbsoluteAttitude)) {
122
+ return [new ProviderError(null, EventType.AbsolutePosition, new NoProviderFoundError())];
123
+ }
124
+
125
+ return [
126
+ new ProviderError(null, EventType.AbsoluteAttitude, new NoProviderFoundError()),
127
+ new ProviderError(null, EventType.AbsolutePosition, new NoProviderFoundError())
128
+ ];
82
129
  }
83
- return null;
130
+
131
+ return [];
84
132
  }
85
133
 
86
134
  /**
@@ -0,0 +1,221 @@
1
+ import chai from 'chai';
2
+ import 'jsdom-global/register';
3
+
4
+ import PositioningHandler from './PositioningHandler';
5
+ import EventType from './events/EventType';
6
+ import InclinationProvider from './providers/others/InclinationProvider';
7
+ import GnssWifiPdrProvider from './providers/pose/GnssWifiPdrProvider';
8
+ import PoseProvider from './providers/pose/PoseProvider';
9
+ import PdrProvider from './providers/pose/pdr/PdrProvider';
10
+ import ArCoreAbsoluteProvider from './providers/pose/ArCoreAbsoluteProvider';
11
+ import GnssWifiProvider from './providers/position/GnssWifiProvider';
12
+ import ArCoreProvider from './providers/pose/ArCoreProvider';
13
+ import ProviderError from './events/ProviderError';
14
+ import { ProvidersName } from './providers/ProvidersList';
15
+
16
+ const expect = chai.expect;
17
+
18
+ function fakeUserAgent(userAgent) {
19
+ navigator.__defineGetter__('userAgent', () => userAgent);
20
+ }
21
+
22
+ function fakeNativeInterface(arcore = true) {
23
+ // We have to clear the cache here
24
+ ArCoreProvider._nativeProvider = null;
25
+
26
+ global.WemapProvidersAndroid = {getArCoreProvider: () => {
27
+ return { checkAvailability: () => arcore };
28
+ }};
29
+ }
30
+
31
+ function fakeGeolocation() {
32
+ navigator.__defineGetter__('geolocation', () => {
33
+ return {watchPosition: () => {}};
34
+ });
35
+ }
36
+
37
+ function config(userAgent, nativeInterface = false, arcore = false) {
38
+ if (userAgent) {
39
+ fakeUserAgent(userAgent);
40
+ }
41
+ if (nativeInterface) {
42
+ fakeNativeInterface(arcore);
43
+ } else {
44
+ delete global.WemapProvidersAndroid;
45
+ }
46
+ fakeGeolocation();
47
+ }
48
+
49
+ const CHROME_ANDROID_USER_AGENT = 'Mozilla/5.0 (Linux; Android 9; SM-G960F Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.157 Mobile Safari/537.36';
50
+
51
+ const CHROME_DESKTOP_USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36';
52
+
53
+ describe('PositioningHandler#findProvider', () => {
54
+
55
+ it('Inclination Desktop', () => {
56
+ config(CHROME_DESKTOP_USER_AGENT);
57
+ const provider = PositioningHandler.findProvider([EventType.Inclination]);
58
+ expect(provider[0]).to.be.instanceOf(ProviderError);
59
+ });
60
+
61
+ it('Inclination Mobile', () => {
62
+ config(CHROME_ANDROID_USER_AGENT);
63
+ const provider = PositioningHandler.findProvider([EventType.Inclination]);
64
+ expect(provider).to.be.equals(InclinationProvider);
65
+ });
66
+
67
+ it('Pose Desktop', () => {
68
+ config(CHROME_DESKTOP_USER_AGENT);
69
+ const provider = PositioningHandler.findProvider([EventType.AbsolutePosition, EventType.AbsoluteAttitude]);
70
+ expect(provider[0]).to.be.instanceOf(ProviderError);
71
+ });
72
+
73
+ it('Pose without PDR Desktop', () => {
74
+ config(CHROME_DESKTOP_USER_AGENT);
75
+ const provider = PositioningHandler.findProvider(
76
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
77
+ { ignoreProviders: [PdrProvider] }
78
+ );
79
+ expect(provider[0]).to.be.instanceOf(ProviderError);
80
+ });
81
+
82
+ it('Pose without ArCore Desktop', () => {
83
+ config(CHROME_DESKTOP_USER_AGENT);
84
+ const provider = PositioningHandler.findProvider(
85
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
86
+ { ignoreProviders: [ArCoreProvider] }
87
+ );
88
+ expect(provider[0]).to.be.instanceOf(ProviderError);
89
+ });
90
+
91
+ it('Pose with optional attitude Desktop', () => {
92
+ config(CHROME_DESKTOP_USER_AGENT);
93
+ const provider = PositioningHandler.findProvider([EventType.AbsolutePosition, EventType.AbsoluteAttitude]);
94
+ expect(provider[0]).to.be.instanceOf(ProviderError);
95
+ });
96
+
97
+ it('Pose with optional attitude without PDR Desktop', () => {
98
+ config(CHROME_DESKTOP_USER_AGENT);
99
+ const provider = PositioningHandler.findProvider(
100
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
101
+ {
102
+ ignoreProviders: [ProvidersName.Pdr],
103
+ optionalEvents: [EventType.AbsoluteAttitude]
104
+ }
105
+ );
106
+ expect(provider).to.be.equals(GnssWifiProvider);
107
+ });
108
+
109
+ it('Pose with optional attitude without ArCore Desktop', () => {
110
+ config(CHROME_DESKTOP_USER_AGENT);
111
+ const provider = PositioningHandler.findProvider(
112
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
113
+ {
114
+ ignoreProviders: [ProvidersName.ArCore],
115
+ optionalEvents: [EventType.AbsoluteAttitude]
116
+ }
117
+ );
118
+ expect(provider).to.be.equals(GnssWifiProvider);
119
+ });
120
+
121
+ it('Pose with optional attitude without PDR and ArCore Desktop', () => {
122
+ config(CHROME_DESKTOP_USER_AGENT);
123
+ const provider = PositioningHandler.findProvider(
124
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
125
+ {
126
+ ignoreProviders: [ProvidersName.Pdr, ProvidersName.ArCore],
127
+ optionalEvents: [EventType.AbsoluteAttitude]
128
+ }
129
+ );
130
+ expect(provider).to.be.equals(GnssWifiProvider);
131
+ });
132
+
133
+ it('Pose Mobile Web', () => {
134
+ config(CHROME_ANDROID_USER_AGENT);
135
+ const provider = PositioningHandler.findProvider([EventType.AbsolutePosition, EventType.AbsoluteAttitude]);
136
+ expect(provider).to.be.equals(GnssWifiPdrProvider);
137
+ });
138
+
139
+ it('Pose without PDR Mobile Web', () => {
140
+ config(CHROME_ANDROID_USER_AGENT);
141
+ const provider = PositioningHandler.findProvider(
142
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
143
+ { ignoreProviders: [ProvidersName.Pdr] }
144
+ );
145
+ expect(provider).to.be.equals(PoseProvider);
146
+ });
147
+
148
+ it('Pose without ArCore Mobile Web', () => {
149
+ config(CHROME_ANDROID_USER_AGENT);
150
+ const provider = PositioningHandler.findProvider(
151
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
152
+ { ignoreProviders: [ProvidersName.ArCore] }
153
+ );
154
+ expect(provider).to.be.equals(GnssWifiPdrProvider);
155
+ });
156
+
157
+ it('Pose without PDR and ArCore Mobile Web', () => {
158
+ config(CHROME_ANDROID_USER_AGENT);
159
+ const provider = PositioningHandler.findProvider(
160
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
161
+ { ignoreProviders: [ProvidersName.Pdr, ProvidersName.ArCore] }
162
+ );
163
+ expect(provider).to.be.equals(PoseProvider);
164
+ });
165
+
166
+ it('Pose with waitInputPosition Mobile Web', () => {
167
+ config(CHROME_ANDROID_USER_AGENT);
168
+ const provider = PositioningHandler.findProvider(
169
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
170
+ { waitInputPosition: true }
171
+ );
172
+ expect(provider).to.be.equals(PdrProvider);
173
+ });
174
+
175
+ it('Pose with waitInputPosition Mobile Native with ArCore', () => {
176
+ config(CHROME_ANDROID_USER_AGENT, true, true);
177
+ const provider = PositioningHandler.findProvider(
178
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
179
+ { waitInputPosition: true }
180
+ );
181
+ expect(provider).to.be.equals(ArCoreAbsoluteProvider);
182
+ });
183
+
184
+ it('Pose with waitInputPosition Mobile Native without ArCore', () => {
185
+ config(CHROME_ANDROID_USER_AGENT, true, false);
186
+ const provider = PositioningHandler.findProvider(
187
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
188
+ {
189
+ waitInputPosition: true,
190
+ ignoreProviders: [ProvidersName.ArCore]
191
+ }
192
+ );
193
+ expect(provider).to.be.equals(PdrProvider);
194
+ });
195
+
196
+ it('Pose with waitInputPosition without PDR Mobile Web', () => {
197
+ config(CHROME_ANDROID_USER_AGENT, false);
198
+ const provider = PositioningHandler.findProvider(
199
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
200
+ {
201
+ waitInputPosition: true,
202
+ ignoreProviders: [ProvidersName.Pdr]
203
+ }
204
+ );
205
+ expect(provider[0]).to.be.instanceOf(ProviderError);
206
+ expect(provider[1]).to.be.instanceOf(ProviderError);
207
+ });
208
+
209
+ it('Pose with waitInputPosition without ArCore Mobile Native', () => {
210
+ config(CHROME_ANDROID_USER_AGENT, true, true);
211
+ const provider = PositioningHandler.findProvider(
212
+ [EventType.AbsolutePosition, EventType.AbsoluteAttitude],
213
+ {
214
+ waitInputPosition: true,
215
+ ignoreProviders: [ProvidersName.ArCore]
216
+ }
217
+ );
218
+ expect(provider).to.be.equals(PdrProvider);
219
+ });
220
+
221
+ });
@@ -1,4 +1,4 @@
1
- const ProviderOptions = {
1
+ const PositioningOptions = {
2
2
 
3
3
  /**
4
4
  * Does provider have to wait an input position to start
@@ -20,9 +20,15 @@ const ProviderOptions = {
20
20
 
21
21
  /**
22
22
  * Providers listed here will not be used by PositioningHandler
23
- * List of {@link Provider}
23
+ * List of {@link Provider#name}
24
24
  */
25
- ignoreProviders: []
25
+ ignoreProviders: [],
26
+
27
+ /**
28
+ * Define the list of EventType that are optionals
29
+ * List of {@link EventType}
30
+ */
31
+ optionalEvents: []
26
32
  };
27
33
 
28
- export default ProviderOptions;
34
+ export default PositioningOptions;
@@ -46,6 +46,10 @@ class PositioningPoseComponent extends React.Component {
46
46
  }
47
47
  );
48
48
 
49
+ if (!this.id) {
50
+ return;
51
+ }
52
+
49
53
  setTimeout(() => {
50
54
  this.props.positioningHandler.setPosition(this.id, INITIAL_POSITION);
51
55
  this.props.positioningHandler.setHeading(this.id, INITIAL_HEADING);
@@ -0,0 +1,9 @@
1
+ const DEFAULT_MESSAGE = 'Unable to find a provider with your given parameters';
2
+
3
+ class NoProviderFoundError extends Error {
4
+ constructor(message) {
5
+ super(message || DEFAULT_MESSAGE);
6
+ }
7
+ }
8
+
9
+ export default NoProviderFoundError;
package/src/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import InclinationProvider from './providers/computed/InclinationProvider';
2
2
  import PositioningHandler from './PositioningHandler';
3
+ import EventType from './events/EventType';
4
+ import { ProvidersName } from './providers/ProvidersList';
3
5
 
4
6
  export {
5
- InclinationProvider, PositioningHandler
7
+ InclinationProvider, PositioningHandler, EventType, ProvidersName
6
8
  };
@@ -0,0 +1,44 @@
1
+ import GnssWifi from './position/GnssWifiProvider';
2
+ import Ip from './position/IpProvider';
3
+ import Pdr from './pose/pdr/PdrProvider';
4
+ import ArCore from './pose/ArCoreProvider';
5
+ import ArCoreAbsolute from './pose/ArCoreAbsoluteProvider';
6
+ import Inclination from './others/InclinationProvider';
7
+ import GnssWifiPdr from './pose/GnssWifiPdrProvider';
8
+ import Imu from './others/ImuProvider';
9
+ import AbsoluteAttitude from './attitude/AbsoluteAttitudeProvider';
10
+ import RelativeAttitude from './attitude/RelativeAttitudeProvider';
11
+
12
+ const ProvidersName = {
13
+ AbsoluteAttitude: AbsoluteAttitude.name,
14
+ ArCore: ArCore.name,
15
+ ArCoreAbsolute: ArCoreAbsolute.name,
16
+ GnssWifi: GnssWifi.name,
17
+ GnssWifiPdr: GnssWifiPdr.name,
18
+ Imu: Imu.name,
19
+ Inclination: Inclination.name,
20
+ Ip: Ip.name,
21
+ Pdr: Pdr.name,
22
+ RelativeAttitude: RelativeAttitude.name
23
+ };
24
+
25
+ const ProvidersModules = {
26
+ AbsoluteAttitude,
27
+ ArCore,
28
+ ArCoreAbsolute,
29
+ GnssWifi,
30
+ GnssWifiPdr,
31
+ Imu,
32
+ Inclination,
33
+ Ip,
34
+ Pdr,
35
+ RelativeAttitude
36
+ };
37
+
38
+ function getModuleFromName(name) {
39
+ return ProvidersModules[name];
40
+ }
41
+
42
+ export {
43
+ ProvidersName, getModuleFromName
44
+ };