added a few NMEA utilities

This commit is contained in:
Axel Uhl
2013-01-03 17:25:40 +01:00
parent 8164f03170
commit 8e758deea5
6 changed files with 190 additions and 11 deletions
@@ -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
@@ -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();
}
@@ -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);
}
@@ -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();
}
}
@@ -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;
}
}