mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-21 21:25:38 +00:00
added a few NMEA utilities
This commit is contained in:
@@ -7,10 +7,13 @@ Bundle-Vendor: SAP
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
|
||||
Bundle-ClassPath: .,
|
||||
lib/marineapi.jar
|
||||
Export-Package: net.sf.marineapi.nmea.event,
|
||||
Export-Package: com.sap.sailing.nmeaconnector,
|
||||
net.sf.marineapi.nmea.event,
|
||||
net.sf.marineapi.nmea.io,
|
||||
net.sf.marineapi.nmea.parser,
|
||||
net.sf.marineapi.nmea.sentence,
|
||||
net.sf.marineapi.nmea.util,
|
||||
net.sf.marineapi.provider,
|
||||
net.sf.marineapi.provider.event
|
||||
Require-Bundle: com.sap.sailing.domain,
|
||||
com.sap.sailing.domain.common
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package com.sap.sailing.nmeaconnector;
|
||||
|
||||
import com.sap.sailing.nmeaconnector.impl.NmeaFactoryImpl;
|
||||
|
||||
public interface NmeaFactory {
|
||||
static NmeaFactory INSTANCE = new NmeaFactoryImpl();
|
||||
|
||||
NmeaUtil getUtil();
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
package com.sap.sailing.nmeaconnector;
|
||||
|
||||
import net.sf.marineapi.nmea.sentence.MWVSentence;
|
||||
import net.sf.marineapi.nmea.util.Units;
|
||||
|
||||
import com.sap.sailing.domain.base.SpeedWithBearing;
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.Speed;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.tracking.Wind;
|
||||
|
||||
public interface NmeaUtil {
|
||||
Wind getWind(TimePoint timePoint, Position position, MWVSentence mwvSentence);
|
||||
|
||||
Speed getSpeed(double magnitude, Units unit);
|
||||
|
||||
SpeedWithBearing getSpeedWithBearing(double speedMagnitude, Units speedUnit, double bearingInDegrees);
|
||||
|
||||
/**
|
||||
* Replaces all occurrences of <code>sequenceToFind</code> by <code>replaceWith</code>, as {@link String#replace(CharSequence, CharSequence)},
|
||||
* but assuming that <code>nmeaSentence</code> has a trailing NMEA checksum, adjusts the checksum accordingly. This will turn a valid
|
||||
* checksum into a valid checksum again, and an invalid checksum into an invalid checksum.
|
||||
*/
|
||||
String replace(String nmeaSentence, String sequenceToFind, String replaceWith);
|
||||
}
|
||||
Executable
+13
@@ -0,0 +1,13 @@
|
||||
package com.sap.sailing.nmeaconnector.impl;
|
||||
|
||||
import com.sap.sailing.nmeaconnector.NmeaFactory;
|
||||
import com.sap.sailing.nmeaconnector.NmeaUtil;
|
||||
|
||||
public class NmeaFactoryImpl implements NmeaFactory {
|
||||
|
||||
@Override
|
||||
public NmeaUtil getUtil() {
|
||||
return new NmeaUtilImpl();
|
||||
}
|
||||
|
||||
}
|
||||
Executable
+81
@@ -0,0 +1,81 @@
|
||||
package com.sap.sailing.nmeaconnector.impl;
|
||||
|
||||
import net.sf.marineapi.nmea.sentence.MWVSentence;
|
||||
import net.sf.marineapi.nmea.util.Units;
|
||||
|
||||
import com.sap.sailing.domain.base.SpeedWithBearing;
|
||||
import com.sap.sailing.domain.base.impl.KilometersPerHourSpeedWithBearingImpl;
|
||||
import com.sap.sailing.domain.base.impl.KnotSpeedImpl;
|
||||
import com.sap.sailing.domain.base.impl.KnotSpeedWithBearingImpl;
|
||||
import com.sap.sailing.domain.common.Bearing;
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.Speed;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
|
||||
import com.sap.sailing.domain.common.impl.KilometersPerHourSpeedImpl;
|
||||
import com.sap.sailing.domain.tracking.Wind;
|
||||
import com.sap.sailing.domain.tracking.impl.WindImpl;
|
||||
import com.sap.sailing.nmeaconnector.NmeaUtil;
|
||||
|
||||
public class NmeaUtilImpl implements NmeaUtil {
|
||||
|
||||
@Override
|
||||
public Wind getWind(TimePoint timePoint, Position position, MWVSentence mwvSentence) {
|
||||
return new WindImpl(position, timePoint, new KnotSpeedWithBearingImpl(mwvSentence.getSpeed(),
|
||||
new DegreeBearingImpl(mwvSentence.getAngle())));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Speed getSpeed(double magnitude, Units unit) {
|
||||
switch (unit) {
|
||||
case KMH:
|
||||
return new KilometersPerHourSpeedImpl(magnitude);
|
||||
case KNOT:
|
||||
return new KnotSpeedImpl(magnitude);
|
||||
case METER:
|
||||
return new KilometersPerHourSpeedImpl(magnitude * 3.6);
|
||||
default:
|
||||
throw new IllegalArgumentException("Unit "+unit+" not understood for a speed");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public SpeedWithBearing getSpeedWithBearing(double speedMagnitude, Units speedUnit, double bearingInDegrees) {
|
||||
Bearing bearing = new DegreeBearingImpl(bearingInDegrees);
|
||||
switch (speedUnit) {
|
||||
case KMH:
|
||||
return new KilometersPerHourSpeedWithBearingImpl(speedMagnitude, bearing);
|
||||
case KNOT:
|
||||
return new KnotSpeedWithBearingImpl(speedMagnitude, bearing);
|
||||
case METER:
|
||||
return new KilometersPerHourSpeedWithBearingImpl(speedMagnitude * 3.6, bearing);
|
||||
default:
|
||||
throw new IllegalArgumentException("Unit "+speedUnit+" not understood for a speed");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String replace(String nmeaSentence, String sequenceToFind, String replaceWith) {
|
||||
final String result;
|
||||
final String resultWithOldChecksum = nmeaSentence.replace(sequenceToFind, replaceWith);
|
||||
if (resultWithOldChecksum.matches(".*\\*[0-9a-fA-F][0-9a-fA-F]$")) {
|
||||
// found checksum
|
||||
int checksum = Integer.valueOf(resultWithOldChecksum.substring(resultWithOldChecksum.length()-2), 16);
|
||||
for (char oldChar : sequenceToFind.toCharArray()) {
|
||||
checksum ^= (byte) oldChar;
|
||||
}
|
||||
for (char newChar : replaceWith.toCharArray()) {
|
||||
checksum ^= (byte) newChar;
|
||||
}
|
||||
String newHexChecksum = Integer.toHexString(checksum).toUpperCase();
|
||||
if (newHexChecksum.length() == 1) {
|
||||
newHexChecksum = "0" + newHexChecksum;
|
||||
}
|
||||
result = resultWithOldChecksum.substring(0, resultWithOldChecksum.length()-2)+newHexChecksum;
|
||||
} else {
|
||||
result = resultWithOldChecksum;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user