From a6159ebec3f94801b9d56fb2457854df6389cf7f Mon Sep 17 00:00:00 2001 From: SimoneFiorani Date: Fri, 27 Sep 2024 15:21:35 +0200 Subject: [PATCH 1/9] feat(api): added gnss type data to PositionService Signed-off-by: SimoneFiorani --- .../META-INF/MANIFEST.MF | 2 +- .../position/PositionServiceImpl.java | 5 ++ .../org.eclipse.kura.api/META-INF/MANIFEST.MF | 2 +- .../kura/position/PositionService.java | 5 ++ .../META-INF/MANIFEST.MF | 2 +- .../eclipse/kura/linux/position/GNSSType.java | 63 +++++++++++++++++++ .../kura/linux/position/GpsDevice.java | 4 ++ .../linux/position/GpsdPositionProvider.java | 31 ++++++++- .../kura/linux/position/NMEAParser.java | 32 ++++++++++ .../kura/linux/position/PositionProvider.java | 2 + .../linux/position/PositionServiceImpl.java | 7 ++- .../SerialDevicePositionProvider.java | 5 ++ .../META-INF/MANIFEST.MF | 2 +- .../META-INF/MANIFEST.MF | 2 +- 14 files changed, 157 insertions(+), 7 deletions(-) create mode 100644 kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GNSSType.java 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..383409e77cc 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 @@ -240,4 +240,9 @@ public void unregisterListener(String listenerId) { public LocalDateTime getDateTime() { return LocalDateTime.ofInstant(this.currentTime.toInstant(), ZoneId.systemDefault()); } + + @Override + public String getGnssSystem() { + return "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/PositionService.java b/kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionService.java index 75321464025..fd5ee2dcfeb 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 @@ -112,6 +112,11 @@ public interface PositionService { @Deprecated public String getLastSentence(); + /** + * Returns the GNSS System used to retrieve the position information. + */ + public String getGnssSystem(); + /** * 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/GNSSType.java b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GNSSType.java new file mode 100644 index 00000000000..4d83b84356a --- /dev/null +++ b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GNSSType.java @@ -0,0 +1,63 @@ +package org.eclipse.kura.linux.position; + +import java.util.HashMap; +import java.util.Map; + +public enum GNSSType { + + BEIDOU("Beidou"), + GALILEO("Galileo"), + GLONASS("Glonass"), + GPS("GPS"), + MIXED_GNSS_TYPE("MixedGNSSTypes"), + OTHER("Other"), + UNKNOWN("Unknown"); + + 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); + } + + public static GNSSType fromPrn(int prnId) { + if (prnId >= 1 && prnId <= 63) { + return valuesMap.get("GPS"); + } else if (prnId >= 64 && prnId <= 96) { + return valuesMap.get("Glonass"); + } else { + return valuesMap.get("Other"); + } + } + + public static GNSSType fromTypes(String type) { + GNSSType gnssType = GNSSType.UNKNOWN; + + if (type.equals("GP")) { + gnssType = GNSSType.GPS; + } else if (type.equals("BD") || type.equals("GB")) { + gnssType = GNSSType.BEIDOU; + } else if (type.equals("GA")) { + gnssType = GNSSType.GALILEO; + } else if (type.equals("GL")) { + gnssType = GNSSType.GLONASS; + } + + return gnssType; + } +} \ No newline at end of file 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..94da77af343 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 @@ -81,6 +81,10 @@ public synchronized String getTimeNmea() { return this.nmeaParser.getTimeNmea(); } + public synchronized GNSSType 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..f4112c74990 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,11 @@ import java.time.Duration; import java.time.LocalDateTime; import java.time.ZoneOffset; +import java.util.ArrayList; +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; @@ -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<>(GNSSType.UNKNOWN); private GPSdEndpoint gpsEndpoint; private PositionServiceOptions configuration; @@ -164,6 +170,11 @@ public PositionProviderType getType() { return PositionProviderType.GPSD; } + @Override + public GNSSType getGnssType() { + return this.gnssType.get(); + } + @Override public void handleATT(ATTObject att) { // Noting to do. @@ -181,7 +192,25 @@ public void handleDevices(DevicesObject devices) { @Override public void handleSKY(SKYObject sky) { - // Noting to do. + + List satellites = sky.getSatellites(); + Set prnList = new HashSet<>(); + + for (SATObject object : satellites) { + if (object.getUsed()) { + prnList.add(object.getPRN()); + } + } + + if (prnList.isEmpty()) { + this.gnssType.set(GNSSType.UNKNOWN); + } else if (prnList.size() == 1) { + this.gnssType.set(GNSSType.fromPrn(new ArrayList<>(prnList).get(0))); + } else { + this.gnssType.set(GNSSType.MIXED_GNSS_TYPE); + } + logger.info("\n\nTYPE: {}\n\n", this.gnssType.get().getValue()); + } @Override 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..751dc9b04d8 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 @@ -14,13 +14,18 @@ import static java.lang.Math.toRadians; +import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.eclipse.kura.position.NmeaPosition; import org.osgi.util.measurement.Measurement; import org.osgi.util.measurement.Unit; import org.osgi.util.position.Position; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Implements NMEA sentences parser functions. @@ -46,6 +51,8 @@ public class NMEAParser { private char validFix = 0; private char latitudeHemisphere = 0; private char longitudeHemisphere = 0; + private Set gnssTypeList = new HashSet<>(); + private GNSSType gnssType = GNSSType.UNKNOWN; /** * 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,24 @@ public boolean parseSentence(String sentence) throws ParseException { return this.validPosition; } + private static final Logger logger = LoggerFactory.getLogger(NMEAParser.class); + + private void parseGnssType(String token) { + + String id = token.substring(1, 3); + this.gnssTypeList.add(id); + + if (this.gnssTypeList.isEmpty()) { + this.gnssType = GNSSType.UNKNOWN; + } else if (this.gnssTypeList.size() == 1) { + this.gnssType = GNSSType.fromTypes(new ArrayList<>(this.gnssTypeList).get(0)); + } else { + this.gnssType = GNSSType.MIXED_GNSS_TYPE; + } + + logger.info("\n\nTYPE: {}\n\n", this.gnssType.getValue()); + } + 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 @@ -372,6 +400,10 @@ public char getLongitudeHemisphere() { return this.longitudeHemisphere; } + public GNSSType 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..6e587c21e7a 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 @@ -44,4 +44,6 @@ public void init(PositionServiceOptions configuration, Listener gpsDeviceListene public PositionProviderType getType(); + public GNSSType 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..d923e36c3ec 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 @@ -199,6 +199,11 @@ public LocalDateTime getDateTime() { } } + @Override + public String getGnssSystem() { + return this.currentProvider.getGnssType().getValue(); + } + @Override public void registerListener(String listenerId, PositionListener positionListener) { this.positionListeners.put(listenerId, positionListener); @@ -294,4 +299,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..0ab375127ea 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 @@ -227,6 +227,11 @@ public PositionProviderType getType() { return PositionProviderType.SERIAL; } + @Override + public GNSSType 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.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)", From c745a61ff37211ad9dc6893dfd88ccf43780cef0 Mon Sep 17 00:00:00 2001 From: SimoneFiorani Date: Mon, 30 Sep 2024 15:59:50 +0200 Subject: [PATCH 2/9] test: added tests Signed-off-by: SimoneFiorani --- .../linux/position/GpsdPositionProvider.java | 6 +-- .../linux/position/PositionServiceTest.java | 3 ++ .../position/UseGpsdPositionProviderTest.java | 38 +++++++++++++++++++ .../resources/gpsd-raw-json-device-2-2.txt | 2 +- 4 files changed, 45 insertions(+), 4 deletions(-) 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 f4112c74990..4c292e3bf9c 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 @@ -194,18 +194,18 @@ public void handleDevices(DevicesObject devices) { public void handleSKY(SKYObject sky) { List satellites = sky.getSatellites(); - Set prnList = new HashSet<>(); + Set prnList = new HashSet<>(); for (SATObject object : satellites) { if (object.getUsed()) { - prnList.add(object.getPRN()); + prnList.add(GNSSType.fromPrn(object.getPRN())); } } if (prnList.isEmpty()) { this.gnssType.set(GNSSType.UNKNOWN); } else if (prnList.size() == 1) { - this.gnssType.set(GNSSType.fromPrn(new ArrayList<>(prnList).get(0))); + this.gnssType.set(new ArrayList<>(prnList).get(0)); } else { this.gnssType.set(GNSSType.MIXED_GNSS_TYPE); } 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..6a669a874ba 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 @@ -520,6 +520,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 String gnssType = fixture.ps.getGnssSystem(); // from GGA assertEquals(1, nmeaPosition.getFixQuality()); @@ -550,6 +551,8 @@ public void testPositionDataFromGps() throws IOException, InterruptedException { assertEquals("$GNVTG,,,,,,,12.34,,,,*4a\n", lastSentence); + assertEquals("MixedGNSSTypes", 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..48951b1bd27 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 @@ -77,6 +77,7 @@ public void getPositionFromDevice2Stream() { whenNMEAStreamArriveFrom(DEVICE_2_1_JSON_STREAM); thenPositionIsNotNull(); + thenGnssTypeIs(GNSSType.MIXED_GNSS_TYPE); } @Test @@ -165,6 +166,39 @@ public void verifyPositionIsZeroFromDevice1Stream() { thenPositionIsZero(); } + @Test + public void getGnssTypeFromDevice1Stream() { + givenGpsdPositionProvider(); + givenProperties(defaultProperties()); + givenGpsdProviderIsStarted(); + + whenNMEAStreamArriveFrom(DEVICE1_JSON_STREAM); + + thenGnssTypeIs(GNSSType.GPS); + } + + @Test + public void getGnssTypeFromDevice2Stream() { + givenGpsdPositionProvider(); + givenProperties(defaultProperties()); + givenGpsdProviderIsStarted(); + + whenNMEAStreamArriveFrom(DEVICE_2_1_JSON_STREAM); + + thenGnssTypeIs(GNSSType.MIXED_GNSS_TYPE); + } + + @Test + public void getGnssTypeFromDevice2Stream2() { + givenGpsdPositionProvider(); + givenProperties(defaultProperties()); + givenGpsdProviderIsStarted(); + + whenNMEAStreamArriveFrom(BOLTGATE_10_12_JSON_STREAM_2); + + thenGnssTypeIs(GNSSType.MIXED_GNSS_TYPE); + } + private void givenGpsdPositionProvider() { this.gpsdPositionProvider = new GpsdPositionProvider(); } @@ -267,6 +301,10 @@ private void thenPositionIsLocked() { assertTrue(this.gpsdPositionProvider.isLocked()); } + private void thenGnssTypeIs(GNSSType type) { + assertEquals(type, 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} From 67fed394554bae3baa403f16174f3175606b5c1b Mon Sep 17 00:00:00 2001 From: SimoneFiorani Date: Mon, 30 Sep 2024 17:04:12 +0200 Subject: [PATCH 3/9] refactor: moved GNSSType enum to api bundle Signed-off-by: SimoneFiorani --- .../position/PositionServiceImpl.java | 5 +- .../org/eclipse/kura/position/GNSSType.java | 37 +++++++++++ .../kura/position/PositionService.java | 2 +- .../eclipse/kura/linux/position/GNSSType.java | 63 ------------------- .../kura/linux/position/GpsDevice.java | 1 + .../linux/position/GpsdPositionProvider.java | 13 +++- .../kura/linux/position/NMEAParser.java | 25 +++++++- .../kura/linux/position/PositionProvider.java | 1 + .../linux/position/PositionServiceImpl.java | 5 +- .../SerialDevicePositionProvider.java | 1 + .../linux/position/PositionServiceTest.java | 5 +- .../position/UseGpsdPositionProviderTest.java | 1 + 12 files changed, 87 insertions(+), 72 deletions(-) create mode 100644 kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/GNSSType.java delete mode 100644 kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GNSSType.java 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 383409e77cc..3c1759bfbf7 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 @@ -28,6 +28,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; @@ -242,7 +243,7 @@ public LocalDateTime getDateTime() { } @Override - public String getGnssSystem() { - return "Gps"; + public GNSSType getGnssType() { + return GNSSType.GPS; } } 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..4089f755776 --- /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 { + + BEIDOU("Beidou"), + GALILEO("Galileo"), + GLONASS("Glonass"), + GPS("Gps"), + MIXED_GNSS_TYPE("MixedGNSSTypes"), + OTHER("Other"), + UNKNOWN("Unknown"); + + 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); + } +} \ No newline at end of file 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 fd5ee2dcfeb..3d98eb14250 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 @@ -115,7 +115,7 @@ public interface PositionService { /** * Returns the GNSS System used to retrieve the position information. */ - public String getGnssSystem(); + public GNSSType getGnssType(); /** * Registers position listener diff --git a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GNSSType.java b/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GNSSType.java deleted file mode 100644 index 4d83b84356a..00000000000 --- a/kura/org.eclipse.kura.linux.position/src/main/java/org/eclipse/kura/linux/position/GNSSType.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.eclipse.kura.linux.position; - -import java.util.HashMap; -import java.util.Map; - -public enum GNSSType { - - BEIDOU("Beidou"), - GALILEO("Galileo"), - GLONASS("Glonass"), - GPS("GPS"), - MIXED_GNSS_TYPE("MixedGNSSTypes"), - OTHER("Other"), - UNKNOWN("Unknown"); - - 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); - } - - public static GNSSType fromPrn(int prnId) { - if (prnId >= 1 && prnId <= 63) { - return valuesMap.get("GPS"); - } else if (prnId >= 64 && prnId <= 96) { - return valuesMap.get("Glonass"); - } else { - return valuesMap.get("Other"); - } - } - - public static GNSSType fromTypes(String type) { - GNSSType gnssType = GNSSType.UNKNOWN; - - if (type.equals("GP")) { - gnssType = GNSSType.GPS; - } else if (type.equals("BD") || type.equals("GB")) { - gnssType = GNSSType.BEIDOU; - } else if (type.equals("GA")) { - gnssType = GNSSType.GALILEO; - } else if (type.equals("GL")) { - gnssType = GNSSType.GLONASS; - } - - return gnssType; - } -} \ No newline at end of file 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 94da77af343..30ee5f2ddf7 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 @@ -21,6 +21,7 @@ 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; 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 4c292e3bf9c..9bbceefdd1f 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 @@ -31,6 +31,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; @@ -198,7 +199,7 @@ public void handleSKY(SKYObject sky) { for (SATObject object : satellites) { if (object.getUsed()) { - prnList.add(GNSSType.fromPrn(object.getPRN())); + prnList.add(getGnssTypeFromPrn(object.getPRN())); } } @@ -291,6 +292,16 @@ 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); } + 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 751dc9b04d8..212d01b75f4 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 @@ -20,6 +20,7 @@ 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; @@ -112,7 +113,7 @@ private void parseGnssType(String token) { if (this.gnssTypeList.isEmpty()) { this.gnssType = GNSSType.UNKNOWN; } else if (this.gnssTypeList.size() == 1) { - this.gnssType = GNSSType.fromTypes(new ArrayList<>(this.gnssTypeList).get(0)); + this.gnssType = getGnssTypeFromSentenceId(new ArrayList<>(this.gnssTypeList).get(0)); } else { this.gnssType = GNSSType.MIXED_GNSS_TYPE; } @@ -120,6 +121,28 @@ private void parseGnssType(String token) { logger.info("\n\nTYPE: {}\n\n", this.gnssType.getValue()); } + 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; + + 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 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 6e587c21e7a..fe64154d6c2 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 @@ -16,6 +16,7 @@ import java.time.LocalDateTime; 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; 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 d923e36c3ec..6a654071d43 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 @@ -22,6 +22,7 @@ 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; @@ -200,8 +201,8 @@ public LocalDateTime getDateTime() { } @Override - public String getGnssSystem() { - return this.currentProvider.getGnssType().getValue(); + public GNSSType getGnssType() { + return this.currentProvider.getGnssType(); } @Override 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 0ab375127ea..a104eca099c 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 @@ -17,6 +17,7 @@ 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; 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 6a669a874ba..68b70288f2b 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 @@ -37,6 +37,7 @@ 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; @@ -520,7 +521,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 String gnssType = fixture.ps.getGnssSystem(); + final GNSSType gnssType = fixture.ps.getGnssType(); // from GGA assertEquals(1, nmeaPosition.getFixQuality()); @@ -551,7 +552,7 @@ public void testPositionDataFromGps() throws IOException, InterruptedException { assertEquals("$GNVTG,,,,,,,12.34,,,,*4a\n", lastSentence); - assertEquals("MixedGNSSTypes", gnssType); + assertEquals(GNSSType.MIXED_GNSS_TYPE, 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 48951b1bd27..a890c14e03e 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 @@ -26,6 +26,7 @@ import java.util.Map; 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; From 9733058abf1a02e03568e3909b0ac31c99ce2a63 Mon Sep 17 00:00:00 2001 From: SimoneFiorani Date: Tue, 1 Oct 2024 14:27:32 +0200 Subject: [PATCH 4/9] refactor: removed testing logger Signed-off-by: SimoneFiorani --- .../org/eclipse/kura/linux/position/GpsdPositionProvider.java | 1 - .../main/java/org/eclipse/kura/linux/position/NMEAParser.java | 2 -- 2 files changed, 3 deletions(-) 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 9bbceefdd1f..5d5864cfd46 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 @@ -210,7 +210,6 @@ public void handleSKY(SKYObject sky) { } else { this.gnssType.set(GNSSType.MIXED_GNSS_TYPE); } - logger.info("\n\nTYPE: {}\n\n", this.gnssType.get().getValue()); } 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 212d01b75f4..4cfd4ee997b 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 @@ -117,8 +117,6 @@ private void parseGnssType(String token) { } else { this.gnssType = GNSSType.MIXED_GNSS_TYPE; } - - logger.info("\n\nTYPE: {}\n\n", this.gnssType.getValue()); } private GNSSType getGnssTypeFromSentenceId(String type) { From 7740da4c792fa31dfebcec6385af4df4e7d1a2de Mon Sep 17 00:00:00 2001 From: SimoneFiorani Date: Tue, 1 Oct 2024 18:04:42 +0200 Subject: [PATCH 5/9] refactor: refactored gnsstype Signed-off-by: SimoneFiorani --- .../position/PositionServiceImpl.java | 7 ++-- .../org/eclipse/kura/position/GNSSType.java | 1 - .../kura/position/PositionService.java | 9 ++++-- .../kura/linux/position/GpsDevice.java | 3 +- .../linux/position/GpsdPositionProvider.java | 17 +++------- .../kura/linux/position/NMEAParser.java | 32 +++++++++---------- .../kura/linux/position/PositionProvider.java | 3 +- .../linux/position/PositionServiceImpl.java | 3 +- .../SerialDevicePositionProvider.java | 3 +- .../linux/position/PositionServiceTest.java | 10 ++++-- .../position/UseGpsdPositionProviderTest.java | 15 +++++---- 11 files changed, 57 insertions(+), 46 deletions(-) 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 3c1759bfbf7..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; @@ -243,7 +246,7 @@ public LocalDateTime getDateTime() { } @Override - public GNSSType getGnssType() { - return GNSSType.GPS; + public Set getGnssType() { + return new HashSet<>(Arrays.asList(GNSSType.GPS)); } } 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 index 4089f755776..d11707793d3 100644 --- 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 @@ -9,7 +9,6 @@ public enum GNSSType { GALILEO("Galileo"), GLONASS("Glonass"), GPS("Gps"), - MIXED_GNSS_TYPE("MixedGNSSTypes"), OTHER("Other"), UNKNOWN("Unknown"); 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 3d98eb14250..3726c7357ba 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; @@ -113,9 +114,13 @@ public interface PositionService { public String getLastSentence(); /** - * Returns the GNSS System used to retrieve the position information. + * Returns the GNSS System used to get the position information. Could be one or more system (eg: GPS + GLONASS). + * + * If empty, no recognized GNSS System Type is available. + * + * @since 2.8 */ - public GNSSType getGnssType(); + public Set getGnssType(); /** * Registers position listener 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 30ee5f2ddf7..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,6 +16,7 @@ import java.io.BufferedInputStream; import java.io.InputStream; +import java.util.Set; import org.eclipse.kura.comm.CommConnection; import org.eclipse.kura.comm.CommURI; @@ -82,7 +83,7 @@ public synchronized String getTimeNmea() { return this.nmeaParser.getTimeNmea(); } - public synchronized GNSSType getGnssType() { + public synchronized Set getGnssType() { return this.nmeaParser.getGnssType(); } 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 5d5864cfd46..78a5ac3fb9f 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,6 @@ import java.time.Duration; import java.time.LocalDateTime; import java.time.ZoneOffset; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.OptionalInt; @@ -55,7 +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<>(GNSSType.UNKNOWN); + private final AtomicReference> gnssType = new AtomicReference<>(new HashSet<>()); private GPSdEndpoint gpsEndpoint; private PositionServiceOptions configuration; @@ -172,7 +171,7 @@ public PositionProviderType getType() { } @Override - public GNSSType getGnssType() { + public Set getGnssType() { return this.gnssType.get(); } @@ -195,21 +194,15 @@ public void handleDevices(DevicesObject devices) { public void handleSKY(SKYObject sky) { List satellites = sky.getSatellites(); - Set prnList = new HashSet<>(); + Set newGnssTypeSet = new HashSet<>(); for (SATObject object : satellites) { if (object.getUsed()) { - prnList.add(getGnssTypeFromPrn(object.getPRN())); + newGnssTypeSet.add(getGnssTypeFromPrn(object.getPRN())); } } - if (prnList.isEmpty()) { - this.gnssType.set(GNSSType.UNKNOWN); - } else if (prnList.size() == 1) { - this.gnssType.set(new ArrayList<>(prnList).get(0)); - } else { - this.gnssType.set(GNSSType.MIXED_GNSS_TYPE); - } + this.gnssType.set(newGnssTypeSet); } 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 4cfd4ee997b..895448f8bb0 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 @@ -14,7 +14,6 @@ import static java.lang.Math.toRadians; -import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -25,8 +24,6 @@ import org.osgi.util.measurement.Measurement; import org.osgi.util.measurement.Unit; import org.osgi.util.position.Position; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Implements NMEA sentences parser functions. @@ -52,8 +49,10 @@ public class NMEAParser { private char validFix = 0; private char latitudeHemisphere = 0; private char longitudeHemisphere = 0; - private Set gnssTypeList = new HashSet<>(); - private GNSSType gnssType = GNSSType.UNKNOWN; + + 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 @@ -103,20 +102,22 @@ public boolean parseSentence(String sentence) throws ParseException { return this.validPosition; } - private static final Logger logger = LoggerFactory.getLogger(NMEAParser.class); - private void parseGnssType(String token) { + if (this.gnssTypeUpdateCounter > GNSSTYPE_RESET_COUNTER) { + this.gnssType.clear(); + this.gnssTypeUpdateCounter = 0; + } + String id = token.substring(1, 3); - this.gnssTypeList.add(id); - if (this.gnssTypeList.isEmpty()) { - this.gnssType = GNSSType.UNKNOWN; - } else if (this.gnssTypeList.size() == 1) { - this.gnssType = getGnssTypeFromSentenceId(new ArrayList<>(this.gnssTypeList).get(0)); - } else { - this.gnssType = GNSSType.MIXED_GNSS_TYPE; + GNSSType type = getGnssTypeFromSentenceId(id); + + if (!type.equals(GNSSType.UNKNOWN)) { + this.gnssType.add(type); } + + this.gnssTypeUpdateCounter++; } private GNSSType getGnssTypeFromSentenceId(String type) { @@ -310,7 +311,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); @@ -421,7 +421,7 @@ public char getLongitudeHemisphere() { return this.longitudeHemisphere; } - public GNSSType getGnssType() { + public Set getGnssType() { return this.gnssType; } 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 fe64154d6c2..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,6 +14,7 @@ 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; @@ -45,6 +46,6 @@ public void init(PositionServiceOptions configuration, Listener gpsDeviceListene public PositionProviderType getType(); - public GNSSType getGnssType(); + 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 6a654071d43..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,6 +17,7 @@ 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; @@ -201,7 +202,7 @@ public LocalDateTime getDateTime() { } @Override - public GNSSType getGnssType() { + public Set getGnssType() { return this.currentProvider.getGnssType(); } 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 a104eca099c..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,6 +14,7 @@ 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; @@ -229,7 +230,7 @@ public PositionProviderType getType() { } @Override - public GNSSType getGnssType() { + public Set getGnssType() { return this.gpsDevice.getGnssType(); } 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 68b70288f2b..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,8 +31,11 @@ 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; @@ -499,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"); @@ -510,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)); @@ -521,7 +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 GNSSType gnssType = fixture.ps.getGnssType(); + final Set gnssType = fixture.ps.getGnssType(); // from GGA assertEquals(1, nmeaPosition.getFixQuality()); @@ -552,7 +556,7 @@ public void testPositionDataFromGps() throws IOException, InterruptedException { assertEquals("$GNVTG,,,,,,,12.34,,,,*4a\n", lastSentence); - assertEquals(GNSSType.MIXED_GNSS_TYPE, gnssType); + 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 a890c14e03e..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,8 +22,11 @@ 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; @@ -78,7 +81,7 @@ public void getPositionFromDevice2Stream() { whenNMEAStreamArriveFrom(DEVICE_2_1_JSON_STREAM); thenPositionIsNotNull(); - thenGnssTypeIs(GNSSType.MIXED_GNSS_TYPE); + thenGnssTypeIs(new HashSet<>(Arrays.asList(GNSSType.GPS, GNSSType.GLONASS))); } @Test @@ -175,7 +178,7 @@ public void getGnssTypeFromDevice1Stream() { whenNMEAStreamArriveFrom(DEVICE1_JSON_STREAM); - thenGnssTypeIs(GNSSType.GPS); + thenGnssTypeIs(new HashSet<>(Arrays.asList(GNSSType.GPS))); } @Test @@ -186,7 +189,7 @@ public void getGnssTypeFromDevice2Stream() { whenNMEAStreamArriveFrom(DEVICE_2_1_JSON_STREAM); - thenGnssTypeIs(GNSSType.MIXED_GNSS_TYPE); + thenGnssTypeIs(new HashSet<>(Arrays.asList(GNSSType.GPS, GNSSType.GLONASS))); } @Test @@ -197,7 +200,7 @@ public void getGnssTypeFromDevice2Stream2() { whenNMEAStreamArriveFrom(BOLTGATE_10_12_JSON_STREAM_2); - thenGnssTypeIs(GNSSType.MIXED_GNSS_TYPE); + thenGnssTypeIs(new HashSet<>(Arrays.asList(GNSSType.GPS, GNSSType.GLONASS))); } private void givenGpsdPositionProvider() { @@ -302,8 +305,8 @@ private void thenPositionIsLocked() { assertTrue(this.gpsdPositionProvider.isLocked()); } - private void thenGnssTypeIs(GNSSType type) { - assertEquals(type, this.gpsdPositionProvider.getGnssType()); + private void thenGnssTypeIs(Set types) { + assertEquals(types, this.gpsdPositionProvider.getGnssType()); } private void gpsdPositionProviderStart() { From dd65ef5136548240c9f8203ffea4f1980abd7feb Mon Sep 17 00:00:00 2001 From: SimoneFiorani Date: Wed, 2 Oct 2024 12:23:38 +0200 Subject: [PATCH 6/9] refactor: updated with suggestions Signed-off-by: SimoneFiorani --- .../org/eclipse/kura/position/GNSSType.java | 2 ++ .../kura/position/PositionService.java | 2 +- .../linux/position/GpsdPositionProvider.java | 4 ++++ .../kura/linux/position/NMEAParser.java | 19 +++++++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) 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 index d11707793d3..f39fbea0f8e 100644 --- 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 @@ -9,7 +9,9 @@ public enum GNSSType { GALILEO("Galileo"), GLONASS("Glonass"), GPS("Gps"), + IRNSS("IRNSS"), OTHER("Other"), + QZSS("QZSS"), UNKNOWN("Unknown"); private String 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 3726c7357ba..cd7f932933f 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 @@ -114,7 +114,7 @@ public interface PositionService { public String getLastSentence(); /** - * Returns the GNSS System used to get the position information. Could be one or more system (eg: GPS + GLONASS). + * * 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. * 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 78a5ac3fb9f..9ed9d5672c9 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 @@ -284,6 +284,10 @@ 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; 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 895448f8bb0..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 @@ -120,6 +120,19 @@ private void parseGnssType(String token) { 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) { @@ -137,6 +150,12 @@ private GNSSType getGnssTypeFromSentenceId(String type) { case "GL": return GNSSType.GLONASS; + case "GI": + return GNSSType.IRNSS; + + case "GQ": + return GNSSType.QZSS; + default: return GNSSType.UNKNOWN; } From 5741896992b03a986360287b6df2a0042f4f6f3d Mon Sep 17 00:00:00 2001 From: SimoneFiorani Date: Wed, 2 Oct 2024 14:00:58 +0200 Subject: [PATCH 7/9] fix: fixed line length Signed-off-by: SimoneFiorani --- .../org/eclipse/kura/linux/position/GpsdPositionProvider.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 9ed9d5672c9..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 @@ -286,7 +286,8 @@ private Measurement toMetersPerSecondMeasurement(double value, double error) { /* * GNSS Type PRNs ranges retrieved from - * {@link https://github.com/taimos/GPSd4Java/blob/6c92bac30d98121bb212bcc7f2426c48ce592433/src/main/java/de/taimos/gpsd4java/types/SATObject.java#L44} + * {@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) { From c6113c93a70272db23c2968b7bf3df3f27f7bef6 Mon Sep 17 00:00:00 2001 From: sfiorani <109297780+sfiorani@users.noreply.github.com> Date: Wed, 2 Oct 2024 14:23:24 +0200 Subject: [PATCH 8/9] Update kura/org.eclipse.kura.api/src/main/java/org/eclipse/kura/position/PositionService.java Co-authored-by: Mattia Dal Ben --- .../main/java/org/eclipse/kura/position/PositionService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cd7f932933f..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 @@ -114,7 +114,7 @@ public interface PositionService { public String getLastSentence(); /** - * * Returns the GNSS System used to get the position information @reference GNSSType. Could be one or more system (eg: GPS + GLONASS). + * 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. * From 5b530c43e23e96ed25f32c38e04b6c219d45d5c7 Mon Sep 17 00:00:00 2001 From: sfiorani <109297780+sfiorani@users.noreply.github.com> Date: Wed, 2 Oct 2024 14:32:41 +0200 Subject: [PATCH 9/9] Update GNSSType.java --- .../main/java/org/eclipse/kura/position/GNSSType.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) 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 index f39fbea0f8e..301e0b4a94d 100644 --- 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 @@ -4,15 +4,14 @@ import java.util.Map; public enum GNSSType { - + UNKNOWN("Unknown"), + OTHER("Other"), BEIDOU("Beidou"), GALILEO("Galileo"), GLONASS("Glonass"), GPS("Gps"), IRNSS("IRNSS"), - OTHER("Other"), - QZSS("QZSS"), - UNKNOWN("Unknown"); + QZSS("QZSS"); private String value; @@ -35,4 +34,4 @@ public String getValue() { public static GNSSType fromValue(String value) { return valuesMap.get(value); } -} \ No newline at end of file +}