diff --git a/kura/emulator/org.eclipse.kura.emulator.position/META-INF/MANIFEST.MF b/kura/emulator/org.eclipse.kura.emulator.position/META-INF/MANIFEST.MF index a7ace3fb3a4..ea47eb97c19 100644 --- a/kura/emulator/org.eclipse.kura.emulator.position/META-INF/MANIFEST.MF +++ b/kura/emulator/org.eclipse.kura.emulator.position/META-INF/MANIFEST.MF @@ -12,7 +12,7 @@ Import-Package: javax.xml.parsers, javax.xml.stream, org.eclipse.kura;version="[1.0,2.0)", org.eclipse.kura.configuration;version="[1.1,2.0)", - org.eclipse.kura.position;version="[1.3,1.4)", + org.eclipse.kura.position;version="[1.4,1.5)", org.osgi.framework;version="1.7.0", org.osgi.service.component;version="1.2.0", org.osgi.service.event;version="1.3.0", diff --git a/kura/emulator/org.eclipse.kura.emulator.position/src/main/java/org/eclipse/kura/emulator/position/PositionServiceImpl.java b/kura/emulator/org.eclipse.kura.emulator.position/src/main/java/org/eclipse/kura/emulator/position/PositionServiceImpl.java index a0cc2fbe995..ad90b3b453a 100644 --- a/kura/emulator/org.eclipse.kura.emulator.position/src/main/java/org/eclipse/kura/emulator/position/PositionServiceImpl.java +++ b/kura/emulator/org.eclipse.kura.emulator.position/src/main/java/org/eclipse/kura/emulator/position/PositionServiceImpl.java @@ -16,9 +16,12 @@ import java.net.URL; import java.time.LocalDateTime; import java.time.ZoneId; +import java.util.Arrays; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -28,6 +31,7 @@ import javax.xml.parsers.SAXParserFactory; import org.eclipse.kura.configuration.ConfigurableComponent; +import org.eclipse.kura.position.GNSSType; import org.eclipse.kura.position.NmeaPosition; import org.eclipse.kura.position.PositionListener; import org.eclipse.kura.position.PositionLockedEvent; @@ -240,4 +244,9 @@ public void unregisterListener(String listenerId) { public LocalDateTime getDateTime() { return LocalDateTime.ofInstant(this.currentTime.toInstant(), ZoneId.systemDefault()); } + + @Override + public Set getGnssType() { + return new HashSet<>(Arrays.asList(GNSSType.GPS)); + } } diff --git a/kura/org.eclipse.kura.api/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.api/META-INF/MANIFEST.MF index fe4ef5dd9fe..42824059041 100644 --- a/kura/org.eclipse.kura.api/META-INF/MANIFEST.MF +++ b/kura/org.eclipse.kura.api/META-INF/MANIFEST.MF @@ -70,7 +70,7 @@ Export-Package: org.eclipse.kura;version="1.7.0", org.eclipse.kura.net.status.wifi;version="1.0.0", org.eclipse.kura.net.vlan;version="1.0.0", org.eclipse.kura.net.wifi;version="2.5.0", - org.eclipse.kura.position;version="1.3.0", + org.eclipse.kura.position;version="1.4.0", org.eclipse.kura.security;version="1.3.0", org.eclipse.kura.security.keystore;version="1.1.0", org.eclipse.kura.security.tamper.detection;version="1.0.0", diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/GNSSType.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/GNSSType.java new file mode 100644 index 00000000000..301e0b4a94d --- /dev/null +++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/GNSSType.java @@ -0,0 +1,37 @@ +package org.eclipse.kura.position; + +import java.util.HashMap; +import java.util.Map; + +public enum GNSSType { + UNKNOWN("Unknown"), + OTHER("Other"), + BEIDOU("Beidou"), + GALILEO("Galileo"), + GLONASS("Glonass"), + GPS("Gps"), + IRNSS("IRNSS"), + QZSS("QZSS"); + + private String value; + + private static Map valuesMap = new HashMap<>(); + + static { + for (GNSSType type : GNSSType.values()) { + valuesMap.put(type.getValue(), type); + } + } + + private GNSSType(String value) { + this.value = value; + } + + public String getValue() { + return this.value; + } + + public static GNSSType fromValue(String value) { + return valuesMap.get(value); + } +} diff --git a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionService.java index 75321464025..33bdd9d0095 100644 --- a/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionService.java +++ b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionService.java @@ -13,6 +13,7 @@ package org.eclipse.kura.position; import java.time.LocalDateTime; +import java.util.Set; import org.osgi.annotation.versioning.ProviderType; import org.osgi.util.position.Position; @@ -112,6 +113,15 @@ public interface PositionService { @Deprecated public String getLastSentence(); + /** + * Returns the GNSS System used to get the position information @reference GNSSType. Could be one or more system (eg: GPS + GLONASS). + * + * If empty, no recognized GNSS System Type is available. + * + * @since 2.8 + */ + public Set getGnssType(); + /** * Registers position listener * diff --git a/kura/org.eclipse.kura.linux.position/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.linux.position/META-INF/MANIFEST.MF index 92a16548741..70f2e1c81c0 100644 --- a/kura/org.eclipse.kura.linux.position/META-INF/MANIFEST.MF +++ b/kura/org.eclipse.kura.linux.position/META-INF/MANIFEST.MF @@ -17,7 +17,7 @@ Import-Package: de.taimos.gpsd4java.api;version="[1.0,2.0)", org.eclipse.kura.comm;version="[1.0,2.0)", org.eclipse.kura.configuration;version="[1.1,2.0)", org.eclipse.kura.net.modem;version="[2.0,3.0)", - org.eclipse.kura.position;version="[1.3,1.4)", + org.eclipse.kura.position;version="[1.4,1.5)", org.eclipse.kura.usb;version="[1.0,2.0)", org.osgi.framework, org.osgi.service.component;version="1.2.0", diff --git a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GpsDevice.java b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GpsDevice.java index 7e8c6cfc844..1342018192e 100644 --- a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GpsDevice.java +++ b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GpsDevice.java @@ -16,11 +16,13 @@ import java.io.BufferedInputStream; import java.io.InputStream; +import java.util.Set; import org.eclipse.kura.comm.CommConnection; import org.eclipse.kura.comm.CommURI; import org.eclipse.kura.linux.position.NMEAParser.Code; import org.eclipse.kura.linux.position.NMEAParser.ParseException; +import org.eclipse.kura.position.GNSSType; import org.eclipse.kura.position.NmeaPosition; import org.eclipse.kura.position.PositionException; import org.eclipse.kura.position.PositionListener; @@ -81,6 +83,10 @@ public synchronized String getTimeNmea() { return this.nmeaParser.getTimeNmea(); } + public synchronized Set getGnssType() { + return this.nmeaParser.getGnssType(); + } + public void disconnect() { this.listener = null; this.commThread.disconnect(); diff --git a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GpsdPositionProvider.java b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GpsdPositionProvider.java index 9bcc359cb71..02c0bfccff5 100644 --- a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GpsdPositionProvider.java +++ b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GpsdPositionProvider.java @@ -18,7 +18,10 @@ import java.time.Duration; import java.time.LocalDateTime; import java.time.ZoneOffset; +import java.util.HashSet; +import java.util.List; import java.util.OptionalInt; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -27,6 +30,7 @@ import java.util.concurrent.atomic.AtomicReference; import org.eclipse.kura.linux.position.GpsDevice.Listener; +import org.eclipse.kura.position.GNSSType; import org.eclipse.kura.position.NmeaPosition; import org.osgi.util.measurement.Measurement; import org.osgi.util.measurement.Unit; @@ -40,6 +44,7 @@ import de.taimos.gpsd4java.types.DeviceObject; import de.taimos.gpsd4java.types.DevicesObject; import de.taimos.gpsd4java.types.ENMEAMode; +import de.taimos.gpsd4java.types.SATObject; import de.taimos.gpsd4java.types.SKYObject; import de.taimos.gpsd4java.types.TPVObject; import de.taimos.gpsd4java.types.subframes.SUBFRAMEObject; @@ -49,6 +54,7 @@ public class GpsdPositionProvider implements PositionProvider, IObjectListener { private static final Logger logger = LoggerFactory.getLogger(GpsdPositionProvider.class); private final AtomicReference internalStateReference = new AtomicReference<>( new GpsdInternalState()); + private final AtomicReference> gnssType = new AtomicReference<>(new HashSet<>()); private GPSdEndpoint gpsEndpoint; private PositionServiceOptions configuration; @@ -164,6 +170,11 @@ public PositionProviderType getType() { return PositionProviderType.GPSD; } + @Override + public Set getGnssType() { + return this.gnssType.get(); + } + @Override public void handleATT(ATTObject att) { // Noting to do. @@ -181,7 +192,18 @@ public void handleDevices(DevicesObject devices) { @Override public void handleSKY(SKYObject sky) { - // Noting to do. + + List satellites = sky.getSatellites(); + Set newGnssTypeSet = new HashSet<>(); + + for (SATObject object : satellites) { + if (object.getUsed()) { + newGnssTypeSet.add(getGnssTypeFromPrn(object.getPRN())); + } + } + + this.gnssType.set(newGnssTypeSet); + } @Override @@ -262,6 +284,21 @@ private Measurement toMetersPerSecondMeasurement(double value, double error) { return new Measurement(Double.isNaN(value) ? 0.0d : value, Double.isNaN(error) ? 0.0d : error, Unit.m_s); } + /* + * GNSS Type PRNs ranges retrieved from + * {@link https://github.com/taimos/GPSd4Java/blob/6c92bac30d98121bb212bcc7f2426c48ce592433/src/main/java/de/taimos/ + * gpsd4java/types/SATObject.java#L44} + */ + private GNSSType getGnssTypeFromPrn(int prnId) { + if (prnId >= 1 && prnId <= 63) { + return GNSSType.GPS; + } else if (prnId >= 64 && prnId <= 96) { + return GNSSType.GLONASS; + } else { + return GNSSType.OTHER; + } + } + private class GpsdInternalState { private final long creationInstantNanos; diff --git a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/NMEAParser.java b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/NMEAParser.java index 0134a5beb35..8ade38cebb8 100644 --- a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/NMEAParser.java +++ b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/NMEAParser.java @@ -15,8 +15,11 @@ import static java.lang.Math.toRadians; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import org.eclipse.kura.position.GNSSType; import org.eclipse.kura.position.NmeaPosition; import org.osgi.util.measurement.Measurement; import org.osgi.util.measurement.Unit; @@ -47,6 +50,10 @@ public class NMEAParser { private char latitudeHemisphere = 0; private char longitudeHemisphere = 0; + private Set gnssType = new HashSet<>(); + private int gnssTypeUpdateCounter = 0; + private static final int GNSSTYPE_RESET_COUNTER = 50; + /** * Fill the fields of GPS position depending of the type of the sentence * @@ -70,6 +77,9 @@ public boolean parseSentence(String sentence) throws ParseException { * $GS = Glonass * $GN = GNSS, that is GPS + Glonass + possibly others */ + + parseGnssType(tokens.get(0)); + if (!tokens.get(0).startsWith("$G")) { // Not a valid token. Return. throw new ParseException(Code.INVALID); @@ -92,6 +102,65 @@ public boolean parseSentence(String sentence) throws ParseException { return this.validPosition; } + private void parseGnssType(String token) { + + if (this.gnssTypeUpdateCounter > GNSSTYPE_RESET_COUNTER) { + this.gnssType.clear(); + this.gnssTypeUpdateCounter = 0; + } + + String id = token.substring(1, 3); + + GNSSType type = getGnssTypeFromSentenceId(id); + + if (!type.equals(GNSSType.UNKNOWN)) { + this.gnssType.add(type); + } + + this.gnssTypeUpdateCounter++; + } + + /* + * Also 'GN' is a possible GNSSType, representing the Mixed GNSS System (GPS+GALILEO or GPS+GLONASS for example). + * + * But, if the device is capable to emit GN sentences, it must emit also the single-id ones. So we are still able to + * extract the specific GNSS System. See {@link + * https://receiverhelp.trimble.com/alloy-gnss/en-us/NMEA-0183messages_GNS.html} + * + * As example, if the device emits GN messages due to a GP/GA combination, it will emit three sentences: GN, GP, GA. + * + * Info about the correlation GNSS System / NMEA Sentence at + * {@link https://en.wikipedia.org/wiki/NMEA_0183#NMEA_sentence_format} + * + */ + private GNSSType getGnssTypeFromSentenceId(String type) { + + switch (type) { + + case "GP": + return GNSSType.GPS; + + case "BD": + case "GB": + return GNSSType.BEIDOU; + + case "GA": + return GNSSType.GALILEO; + + case "GL": + return GNSSType.GLONASS; + + case "GI": + return GNSSType.IRNSS; + + case "GQ": + return GNSSType.QZSS; + + default: + return GNSSType.UNKNOWN; + } + } + private void parseVTGSentence(List tokens) { if (tokens.size() > 7 && !tokens.get(7).isEmpty()) { // conversion km/h in m/s : 1 km/h -> 0,277777778 m/s @@ -261,7 +330,6 @@ boolean computeNMEACksum(String nmeaMessageIn) { final int starpos = nmeaMessageIn.indexOf('*'); final String strChecksum = nmeaMessageIn.substring(starpos + 1, nmeaMessageIn.length() - 1); final int parsedChecksum = Integer.parseInt(strChecksum, 16); // Check sum is coded in hex string - int actualChecksum = 0; for (int i = 1; i < starpos; i++) { actualChecksum ^= nmeaMessageIn.charAt(i); @@ -372,6 +440,10 @@ public char getLongitudeHemisphere() { return this.longitudeHemisphere; } + public Set getGnssType() { + return this.gnssType; + } + public enum Code { INVALID, BAD_CHECKSUM, diff --git a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/PositionProvider.java b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/PositionProvider.java index 552d36829ea..3c4d578dc91 100644 --- a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/PositionProvider.java +++ b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/PositionProvider.java @@ -14,8 +14,10 @@ package org.eclipse.kura.linux.position; import java.time.LocalDateTime; +import java.util.Set; import org.eclipse.kura.linux.position.GpsDevice.Listener; +import org.eclipse.kura.position.GNSSType; import org.eclipse.kura.position.NmeaPosition; import org.osgi.util.position.Position; @@ -44,4 +46,6 @@ public void init(PositionServiceOptions configuration, Listener gpsDeviceListene public PositionProviderType getType(); + public Set getGnssType(); + } diff --git a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/PositionServiceImpl.java b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/PositionServiceImpl.java index f4c333e72a9..1f3223b47fc 100644 --- a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/PositionServiceImpl.java +++ b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/PositionServiceImpl.java @@ -17,11 +17,13 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.eclipse.kura.KuraErrorCode; import org.eclipse.kura.KuraException; import org.eclipse.kura.configuration.ConfigurableComponent; +import org.eclipse.kura.position.GNSSType; import org.eclipse.kura.position.NmeaPosition; import org.eclipse.kura.position.PositionListener; import org.eclipse.kura.position.PositionLockedEvent; @@ -199,6 +201,11 @@ public LocalDateTime getDateTime() { } } + @Override + public Set getGnssType() { + return this.currentProvider.getGnssType(); + } + @Override public void registerListener(String listenerId, PositionListener positionListener) { this.positionListeners.put(listenerId, positionListener); @@ -294,4 +301,4 @@ public void onGpsDeviceAvailabilityChanged() { updateInternal(); } -} \ No newline at end of file +} diff --git a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/SerialDevicePositionProvider.java b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/SerialDevicePositionProvider.java index 57c11cb00c9..9ac0f596bc0 100644 --- a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/SerialDevicePositionProvider.java +++ b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/SerialDevicePositionProvider.java @@ -14,9 +14,11 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.Set; import org.eclipse.kura.comm.CommURI; import org.eclipse.kura.linux.position.GpsDevice.Listener; +import org.eclipse.kura.position.GNSSType; import org.eclipse.kura.position.NmeaPosition; import org.osgi.service.io.ConnectionFactory; import org.osgi.util.measurement.Measurement; @@ -227,6 +229,11 @@ public PositionProviderType getType() { return PositionProviderType.SERIAL; } + @Override + public Set getGnssType() { + return this.gpsDevice.getGnssType(); + } + protected GpsDevice getGpsDevice() { return this.gpsDevice; } diff --git a/kura/org.eclipse.kura.rest.position.provider/META-INF/MANIFEST.MF b/kura/org.eclipse.kura.rest.position.provider/META-INF/MANIFEST.MF index 0ec4b433fd2..5f36d89eb1a 100644 --- a/kura/org.eclipse.kura.rest.position.provider/META-INF/MANIFEST.MF +++ b/kura/org.eclipse.kura.rest.position.provider/META-INF/MANIFEST.MF @@ -16,7 +16,7 @@ Import-Package: javax.annotation.security;version="1.2.0", org.eclipse.kura.message;version="[1.0,2.0)", org.eclipse.kura.cloudconnection.message;version="[1.0,2.0)", org.eclipse.kura.comm;version="[1.0,2.0)", - org.eclipse.kura.position;version="[1.3,1.4)", + org.eclipse.kura.position;version="[1.4,1.5)", org.eclipse.kura.crypto;version="[1.3,2.0)", org.eclipse.kura.request.handler.jaxrs;version="[1.0,2.0)", org.eclipse.kura.request.handler.jaxrs.annotation;version="[1.0,2.0)", diff --git a/kura/test/org.eclipse.kura.linux.position.test/src/test/java/org/eclipse/kura/linux/position/PositionServiceTest.java b/kura/test/org.eclipse.kura.linux.position.test/src/test/java/org/eclipse/kura/linux/position/PositionServiceTest.java index 28218637984..e74622eb675 100644 --- a/kura/test/org.eclipse.kura.linux.position.test/src/test/java/org/eclipse/kura/linux/position/PositionServiceTest.java +++ b/kura/test/org.eclipse.kura.linux.position.test/src/test/java/org/eclipse/kura/linux/position/PositionServiceTest.java @@ -31,12 +31,16 @@ import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; +import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import org.eclipse.kura.KuraException; import org.eclipse.kura.comm.CommConnection; import org.eclipse.kura.comm.CommURI; +import org.eclipse.kura.position.GNSSType; import org.eclipse.kura.position.NmeaPosition; import org.eclipse.kura.position.PositionListener; import org.eclipse.kura.position.PositionLockedEvent; @@ -498,6 +502,7 @@ public void testPositionListener() throws IOException, InterruptedException { public void testPositionDataFromGps() throws IOException, InterruptedException { final PositionServiceTestFixture fixture = new PositionServiceTestFixture( "$GPGGA,121041.000,4655.3772,N,01513.6390,E,1,06,1.7,478.3,M,44.7,M,,0000*5d\n" + + "$GLGSA,A,3,72,84,86,74,66,65,85,75,,,,,1.18,0.51,1.07*1C\n" + "$GPGSA,A,3,25,23,07,27,20,04,,,,,,,4.9,1.7,4.6*39\n" + "$GPRMC,121041.000,A,4655.3772,N,01513.6390,E,0.31,319.55,220517,,*7\n" + "$GNVTG,,,,,,,12.34,,,,*4a\n"); @@ -509,7 +514,7 @@ public void testPositionDataFromGps() throws IOException, InterruptedException { Thread.sleep(5000); - verify(listener, times(4)).newNmeaSentence(any()); + verify(listener, times(5)).newNmeaSentence(any()); verify(fixture.eventAdmin, times(1)).postEvent(argThat(isPositionLockedEvent)); verify(fixture.eventAdmin, times(0)).postEvent(argThat(isPositionLostEvent)); @@ -520,6 +525,7 @@ public void testPositionDataFromGps() throws IOException, InterruptedException { final String date = fixture.ps.getNmeaDate(); final String time = fixture.ps.getNmeaTime(); final String lastSentence = fixture.ps.getLastSentence(); + final Set gnssType = fixture.ps.getGnssType(); // from GGA assertEquals(1, nmeaPosition.getFixQuality()); @@ -550,6 +556,8 @@ public void testPositionDataFromGps() throws IOException, InterruptedException { assertEquals("$GNVTG,,,,,,,12.34,,,,*4a\n", lastSentence); + assertEquals(new HashSet<>(Arrays.asList(GNSSType.GPS, GNSSType.GLONASS)), gnssType); + fixture.ps.deactivate(); } diff --git a/kura/test/org.eclipse.kura.linux.position.test/src/test/java/org/eclipse/kura/linux/position/UseGpsdPositionProviderTest.java b/kura/test/org.eclipse.kura.linux.position.test/src/test/java/org/eclipse/kura/linux/position/UseGpsdPositionProviderTest.java index b718adfd1f9..dd583f7702c 100644 --- a/kura/test/org.eclipse.kura.linux.position.test/src/test/java/org/eclipse/kura/linux/position/UseGpsdPositionProviderTest.java +++ b/kura/test/org.eclipse.kura.linux.position.test/src/test/java/org/eclipse/kura/linux/position/UseGpsdPositionProviderTest.java @@ -22,10 +22,14 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import org.eclipse.kura.core.testutil.TestUtil; +import org.eclipse.kura.position.GNSSType; import org.junit.Test; import org.osgi.util.measurement.Measurement; import org.osgi.util.measurement.Unit; @@ -77,6 +81,7 @@ public void getPositionFromDevice2Stream() { whenNMEAStreamArriveFrom(DEVICE_2_1_JSON_STREAM); thenPositionIsNotNull(); + thenGnssTypeIs(new HashSet<>(Arrays.asList(GNSSType.GPS, GNSSType.GLONASS))); } @Test @@ -165,6 +170,39 @@ public void verifyPositionIsZeroFromDevice1Stream() { thenPositionIsZero(); } + @Test + public void getGnssTypeFromDevice1Stream() { + givenGpsdPositionProvider(); + givenProperties(defaultProperties()); + givenGpsdProviderIsStarted(); + + whenNMEAStreamArriveFrom(DEVICE1_JSON_STREAM); + + thenGnssTypeIs(new HashSet<>(Arrays.asList(GNSSType.GPS))); + } + + @Test + public void getGnssTypeFromDevice2Stream() { + givenGpsdPositionProvider(); + givenProperties(defaultProperties()); + givenGpsdProviderIsStarted(); + + whenNMEAStreamArriveFrom(DEVICE_2_1_JSON_STREAM); + + thenGnssTypeIs(new HashSet<>(Arrays.asList(GNSSType.GPS, GNSSType.GLONASS))); + } + + @Test + public void getGnssTypeFromDevice2Stream2() { + givenGpsdPositionProvider(); + givenProperties(defaultProperties()); + givenGpsdProviderIsStarted(); + + whenNMEAStreamArriveFrom(BOLTGATE_10_12_JSON_STREAM_2); + + thenGnssTypeIs(new HashSet<>(Arrays.asList(GNSSType.GPS, GNSSType.GLONASS))); + } + private void givenGpsdPositionProvider() { this.gpsdPositionProvider = new GpsdPositionProvider(); } @@ -267,6 +305,10 @@ private void thenPositionIsLocked() { assertTrue(this.gpsdPositionProvider.isLocked()); } + private void thenGnssTypeIs(Set types) { + assertEquals(types, this.gpsdPositionProvider.getGnssType()); + } + private void gpsdPositionProviderStart() { this.gpsdPositionProvider.start(); } diff --git a/kura/test/org.eclipse.kura.linux.position.test/src/test/resources/gpsd-raw-json-device-2-2.txt b/kura/test/org.eclipse.kura.linux.position.test/src/test/resources/gpsd-raw-json-device-2-2.txt index faed99c9631..601a4ab907c 100644 --- a/kura/test/org.eclipse.kura.linux.position.test/src/test/resources/gpsd-raw-json-device-2-2.txt +++ b/kura/test/org.eclipse.kura.linux.position.test/src/test/resources/gpsd-raw-json-device-2-2.txt @@ -128,6 +128,6 @@ {"class":"SKY","device":"/dev/pts/3","vdop":2.00,"hdop":1.60,"pdop":2.60,"nSat":18,"uSat":2,"satellites":[{"PRN":2,"el":30.0,"az":259.0,"ss":0.0,"used":false,"gnssid":0,"svid":2},{"PRN":4,"el":10.0,"az":86.0,"ss":0.0,"used":false,"gnssid":0,"svid":4},{"PRN":5,"el":26.0,"az":311.0,"ss":0.0,"used":false,"gnssid":0,"svid":5},{"PRN":9,"el":45.0,"az":80.0,"ss":23.0,"used":true,"gnssid":0,"svid":9},{"PRN":16,"el":11.0,"az":33.0,"ss":0.0,"used":false,"gnssid":0,"svid":16},{"PRN":20,"el":54.0,"az":294.0,"ss":0.0,"used":false,"gnssid":0,"svid":20},{"PRN":33,"el":30.0,"az":217.0,"ss":0.0,"used":false,"gnssid":1,"svid":120},{"PRN":36,"el":34.0,"az":155.0,"ss":0.0,"used":false,"gnssid":1,"svid":123},{"PRN":49,"el":36.0,"az":191.0,"ss":0.0,"used":false,"gnssid":1,"svid":136},{"PRN":69,"el":29.0,"az":103.0,"ss":14.0,"used":true,"gnssid":6,"svid":5},{"PRN":70,"el":71.0,"az":6.0,"ss":0.0,"used":false,"gnssid":6,"svid":6},{"PRN":71,"el":28.0,"az":308.0,"ss":0.0,"used":false,"gnssid":6,"svid":7},{"PRN":73,"el":20.0,"az":185.0,"ss":0.0,"used":false,"gnssid":6,"svid":9},{"PRN":79,"el":38.0,"az":41.0,"ss":18.0,"used":false,"gnssid":6,"svid":15},{"PRN":80,"el":61.0,"az":143.0,"ss":0.0,"used":false,"gnssid":6,"svid":16},{"PRN":85,"el":7.0,"az":244.0,"ss":0.0,"used":false,"gnssid":6,"svid":21},{"PRN":86,"el":20.0,"az":289.0,"ss":0.0,"used":false,"gnssid":6,"svid":22},{"PRN":87,"el":9.0,"az":349.0,"ss":0.0,"used":false,"gnssid":6,"svid":23}]} {"class":"SKY","device":"/dev/pts/3","vdop":2.00,"hdop":1.60,"pdop":2.60,"nSat":18,"uSat":2,"satellites":[{"PRN":2,"el":30.0,"az":259.0,"ss":0.0,"used":false,"gnssid":0,"svid":2},{"PRN":4,"el":10.0,"az":86.0,"ss":0.0,"used":false,"gnssid":0,"svid":4},{"PRN":5,"el":26.0,"az":311.0,"ss":0.0,"used":false,"gnssid":0,"svid":5},{"PRN":9,"el":45.0,"az":80.0,"ss":23.0,"used":true,"gnssid":0,"svid":9},{"PRN":16,"el":11.0,"az":33.0,"ss":0.0,"used":false,"gnssid":0,"svid":16},{"PRN":20,"el":54.0,"az":294.0,"ss":0.0,"used":false,"gnssid":0,"svid":20},{"PRN":33,"el":30.0,"az":217.0,"ss":0.0,"used":false,"gnssid":1,"svid":120},{"PRN":36,"el":34.0,"az":155.0,"ss":0.0,"used":false,"gnssid":1,"svid":123},{"PRN":49,"el":36.0,"az":191.0,"ss":0.0,"used":false,"gnssid":1,"svid":136},{"PRN":69,"el":29.0,"az":103.0,"ss":13.0,"used":true,"gnssid":6,"svid":5},{"PRN":70,"el":71.0,"az":6.0,"ss":0.0,"used":false,"gnssid":6,"svid":6},{"PRN":71,"el":28.0,"az":309.0,"ss":0.0,"used":false,"gnssid":6,"svid":7},{"PRN":73,"el":20.0,"az":185.0,"ss":0.0,"used":false,"gnssid":6,"svid":9},{"PRN":79,"el":38.0,"az":41.0,"ss":19.0,"used":false,"gnssid":6,"svid":15},{"PRN":80,"el":61.0,"az":143.0,"ss":0.0,"used":false,"gnssid":6,"svid":16},{"PRN":85,"el":7.0,"az":244.0,"ss":0.0,"used":false,"gnssid":6,"svid":21},{"PRN":86,"el":20.0,"az":289.0,"ss":0.0,"used":false,"gnssid":6,"svid":22},{"PRN":87,"el":9.0,"az":349.0,"ss":0.0,"used":false,"gnssid":6,"svid":23}]} {"class":"SKY","device":"/dev/pts/3","vdop":2.00,"hdop":1.60,"pdop":2.60,"nSat":18,"uSat":3,"satellites":[{"PRN":2,"el":30.0,"az":259.0,"ss":0.0,"used":false,"gnssid":0,"svid":2},{"PRN":4,"el":10.0,"az":86.0,"ss":0.0,"used":false,"gnssid":0,"svid":4},{"PRN":5,"el":26.0,"az":311.0,"ss":21.0,"used":true,"gnssid":0,"svid":5},{"PRN":9,"el":45.0,"az":80.0,"ss":29.0,"used":true,"gnssid":0,"svid":9},{"PRN":16,"el":11.0,"az":33.0,"ss":0.0,"used":false,"gnssid":0,"svid":16},{"PRN":20,"el":54.0,"az":294.0,"ss":0.0,"used":false,"gnssid":0,"svid":20},{"PRN":33,"el":30.0,"az":217.0,"ss":0.0,"used":false,"gnssid":1,"svid":120},{"PRN":36,"el":34.0,"az":155.0,"ss":0.0,"used":false,"gnssid":1,"svid":123},{"PRN":49,"el":36.0,"az":191.0,"ss":0.0,"used":false,"gnssid":1,"svid":136},{"PRN":69,"el":29.0,"az":103.0,"ss":9.0,"used":true,"gnssid":6,"svid":5},{"PRN":70,"el":71.0,"az":6.0,"ss":0.0,"used":false,"gnssid":6,"svid":6},{"PRN":71,"el":28.0,"az":309.0,"ss":0.0,"used":false,"gnssid":6,"svid":7},{"PRN":73,"el":21.0,"az":185.0,"ss":0.0,"used":false,"gnssid":6,"svid":9},{"PRN":79,"el":38.0,"az":41.0,"ss":20.0,"used":false,"gnssid":6,"svid":15},{"PRN":80,"el":62.0,"az":142.0,"ss":0.0,"used":false,"gnssid":6,"svid":16},{"PRN":85,"el":7.0,"az":244.0,"ss":0.0,"used":false,"gnssid":6,"svid":21},{"PRN":86,"el":20.0,"az":289.0,"ss":0.0,"used":false,"gnssid":6,"svid":22},{"PRN":87,"el":9.0,"az":349.0,"ss":0.0,"used":false,"gnssid":6,"svid":23}]} -{"class":"SKY","device":"/dev/pts/3","xdop":1.86,"ydop":4.35,"vdop":2.00,"tdop":2.23,"hdop":1.60,"gdop":5.91,"pdop":2.60,"nSat":18,"uSat":4,"satellites":[{"PRN":2,"el":30.0,"az":259.0,"ss":0.0,"used":false,"gnssid":0,"svid":2},{"PRN":4,"el":10.0,"az":86.0,"ss":19.0,"used":true,"gnssid":0,"svid":4},{"PRN":5,"el":26.0,"az":311.0,"ss":20.0,"used":true,"gnssid":0,"svid":5},{"PRN":9,"el":45.0,"az":80.0,"ss":29.0,"used":true,"gnssid":0,"svid":9},{"PRN":16,"el":11.0,"az":33.0,"ss":0.0,"used":false,"gnssid":0,"svid":16},{"PRN":20,"el":54.0,"az":294.0,"ss":0.0,"used":false,"gnssid":0,"svid":20},{"PRN":33,"el":30.0,"az":217.0,"ss":0.0,"used":false,"gnssid":1,"svid":120},{"PRN":36,"el":34.0,"az":155.0,"ss":0.0,"used":false,"gnssid":1,"svid":123},{"PRN":49,"el":36.0,"az":191.0,"ss":0.0,"used":false,"gnssid":1,"svid":136},{"PRN":69,"el":29.0,"az":103.0,"ss":8.0,"used":true,"gnssid":6,"svid":5},{"PRN":70,"el":71.0,"az":6.0,"ss":0.0,"used":false,"gnssid":6,"svid":6},{"PRN":71,"el":28.0,"az":309.0,"ss":0.0,"used":false,"gnssid":6,"svid":7},{"PRN":73,"el":21.0,"az":185.0,"ss":0.0,"used":false,"gnssid":6,"svid":9},{"PRN":79,"el":38.0,"az":41.0,"ss":20.0,"used":false,"gnssid":6,"svid":15},{"PRN":80,"el":62.0,"az":142.0,"ss":0.0,"used":false,"gnssid":6,"svid":16},{"PRN":85,"el":7.0,"az":244.0,"ss":0.0,"used":false,"gnssid":6,"svid":21},{"PRN":86,"el":20.0,"az":289.0,"ss":0.0,"used":false,"gnssid":6,"svid":22},{"PRN":87,"el":9.0,"az":349.0,"ss":0.0,"used":false,"gnssid":6,"svid":23}]} +{"class":"SKY","device":"/dev/pts/3","xdop":1.86,"ydop":4.35,"vdop":2.00,"tdop":2.23,"hdop":1.60,"gdop":5.91,"pdop":2.60,"nSat":18,"uSat":4,"satellites":[{"PRN":2,"el":30.0,"az":259.0,"ss":0.0,"used":false,"gnssid":0,"svid":2},{"PRN":4,"el":10.0,"az":86.0,"ss":19.0,"used":true,"gnssid":0,"svid":4},{"PRN":5,"el":26.0,"az":311.0,"ss":20.0,"used":true,"gnssid":0,"svid":5},{"PRN":9,"el":45.0,"az":80.0,"ss":29.0,"used":true,"gnssid":0,"svid":9},{"PRN":16,"el":11.0,"az":33.0,"ss":0.0,"used":false,"gnssid":0,"svid":16},{"PRN":20,"el":54.0,"az":294.0,"ss":0.0,"used":false,"gnssid":0,"svid":20},{"PRN":33,"el":30.0,"az":217.0,"ss":0.0,"used":false,"gnssid":1,"svid":120},{"PRN":36,"el":34.0,"az":155.0,"ss":0.0,"used":false,"gnssid":1,"svid":123},{"PRN":49,"el":36.0,"az":191.0,"ss":0.0,"used":false,"gnssid":1,"svid":136},{"PRN":69,"el":29.0,"az":103.0,"ss":8.0,"used":false,"gnssid":6,"svid":5},{"PRN":70,"el":71.0,"az":6.0,"ss":0.0,"used":false,"gnssid":6,"svid":6},{"PRN":71,"el":28.0,"az":309.0,"ss":0.0,"used":false,"gnssid":6,"svid":7},{"PRN":73,"el":21.0,"az":185.0,"ss":0.0,"used":false,"gnssid":6,"svid":9},{"PRN":79,"el":38.0,"az":41.0,"ss":20.0,"used":false,"gnssid":6,"svid":15},{"PRN":80,"el":62.0,"az":142.0,"ss":0.0,"used":false,"gnssid":6,"svid":16},{"PRN":85,"el":7.0,"az":244.0,"ss":0.0,"used":false,"gnssid":6,"svid":21},{"PRN":86,"el":20.0,"az":289.0,"ss":0.0,"used":false,"gnssid":6,"svid":22},{"PRN":87,"el":9.0,"az":349.0,"ss":0.0,"used":true,"gnssid":6,"svid":23}]} {"class":"DEVICE","path":"/dev/pts/3","activated":0} {"class":"DEVICE","path":"/dev/pts/3","activated":0} diff --git a/kura/test/org.eclipse.kura.rest.position.provider.test/META-INF/MANIFEST.MF b/kura/test/org.eclipse.kura.rest.position.provider.test/META-INF/MANIFEST.MF index 972f56a9b10..a342da9f39a 100644 --- a/kura/test/org.eclipse.kura.rest.position.provider.test/META-INF/MANIFEST.MF +++ b/kura/test/org.eclipse.kura.rest.position.provider.test/META-INF/MANIFEST.MF @@ -14,7 +14,7 @@ Import-Package: com.eclipsesource.json;version="0.9.5", org.eclipse.kura;version="1.6.0", org.eclipse.kura.core.util;version="1.3.0", org.eclipse.kura.message;version="1.4.0", - org.eclipse.kura.position;version="[1.3,1.4)", + org.eclipse.kura.position;version="[1.4,1.5)", org.junit;version="[4.12,5.0)", org.junit.rules;version="[4.12,5.0)", org.junit.experimental.runners;version="[4.12,5.0)",