diff --git a/java/com.sap.sailing.declination/NOAAImporter (Proxy).launch b/java/com.sap.sailing.declination/NOAAImporter (Proxy).launch index 1a27965d61c..68b91652d08 100644 --- a/java/com.sap.sailing.declination/NOAAImporter (Proxy).launch +++ b/java/com.sap.sailing.declination/NOAAImporter (Proxy).launch @@ -7,7 +7,7 @@ - + diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Wind.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Wind.java index 3f4dab0f8b4..a45da5628ec 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Wind.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Wind.java @@ -10,7 +10,14 @@ import com.sap.sse.common.Timed; * * Note that sometimes a wind measurement is transmitted without its position. While this is useless * for wind field interpolation, it can still serve good uses when some wind direction is better than - * no wind direction at all. In this case, {@link #getPosition()} will return null. + * no wind direction at all. In this case, {@link #getPosition()} will return null.

+ * + * When processing wind in the scope of a {@link TrackedRace}, it should always use true, not magnetic, + * directions. However, during capturing wind, e.g., on a committee boat, sometimes it is easier for + * users to capture wind using a magnetic direction which needs to be corrected by the magnetic + * variation / declination in order to produce a true direction. It depends on the context in which + * objects of this type are produced and used whether this represents a true or magnetic wind direction. + * For conversion, use a {@link DeclinationService} instance. * * @author Axel Uhl (d043530) * diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index b32457da726..f307d9cc290 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -1323,9 +1323,9 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { } else if (eventClass.equals(RaceLogStartProcedureChangedEvent.class.getSimpleName())) { return loadRaceLogStartProcedureChangedEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogProtestStartTimeEvent.class.getSimpleName())) { - return loadRaceLogRaceLogProtestStartTimeEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); + return loadRaceLogProtestStartTimeEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogWindFixEvent.class.getSimpleName())) { - return loadRaceLogRaceLogWindFixEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); + return loadRaceLogWindFixEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogDeviceCompetitorMappingEvent.class.getSimpleName())) { return loadRaceLogDeviceCompetitorMappingEvent(createdAt, author, logicalTimePoint, id, passId, competitors, dbObject); } else if (eventClass.equals(RaceLogDeviceMarkMappingEvent.class.getSimpleName())) { @@ -1353,10 +1353,11 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { throw new IllegalStateException(String.format("Unknown RaceLogEvent type %s", eventClass)); } - private RaceLogEvent loadRaceLogRaceLogWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, + private RaceLogEvent loadRaceLogWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { Wind wind = loadWind((DBObject) dbObject.get(FieldNames.WIND.name())); - return raceLogEventFactory.createWindFixEvent(createdAt, author, logicalTimePoint, id, competitors, passId, wind); + Boolean isMagnetic = (Boolean) dbObject.get(FieldNames.IS_MAGNETIC.name()); + return raceLogEventFactory.createWindFixEvent(createdAt, author, logicalTimePoint, id, competitors, passId, wind, isMagnetic == null ? true : isMagnetic); } private RaceLogEvent loadRaceLogDeviceCompetitorMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, @@ -1450,7 +1451,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { return raceLogEventFactory.createAdditionalScoringInformationEvent(createdAt, author, logicalTimePoint, id, competitors, passId, informationType); } - private RaceLogEvent loadRaceLogRaceLogProtestStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, + private RaceLogEvent loadRaceLogProtestStartTimeEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { TimePoint protestStartTime = loadTimePoint(dbObject, FieldNames.RACE_LOG_PROTEST_START_TIME); return raceLogEventFactory.createProtestStartTimeEvent(createdAt, author, logicalTimePoint, id, competitors, passId, protestStartTime); diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java index fc4fd028e43..8c8b42512db 100755 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java @@ -61,7 +61,7 @@ public enum FieldNames { BOAT_CLASS_TYPICALLY_STARTS_UPWIND, // wind: - WIND_SOURCE_NAME, WIND_SOURCE_ID, WIND, + WIND_SOURCE_NAME, WIND_SOURCE_ID, WIND, IS_MAGNETIC, // SwissTiming configuration parameters: ST_CONFIG_NAME, ST_CONFIG_HOSTNAME, ST_CONFIG_PORT, diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index 2b7e479bcba..b2ea7921708 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -935,6 +935,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { storeRaceLogEventProperties(event, result); result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RaceLogWindFixEvent.class.getSimpleName()); result.put(FieldNames.WIND.name(), storeWind(event.getWindFix())); + result.put(FieldNames.IS_MAGNETIC.name(), event.isMagnetic()); return result; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java index 432f6690b41..dd6c9169caf 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventFactory.java @@ -97,10 +97,10 @@ public interface RaceLogEventFactory { RaceLogProtestStartTimeEvent createProtestStartTimeEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, TimePoint protestStartTime); - RaceLogWindFixEvent createWindFixEvent(TimePoint eventTime, AbstractLogEventAuthor author, int currentPassId, Wind wind); + RaceLogWindFixEvent createWindFixEvent(TimePoint eventTime, AbstractLogEventAuthor author, int currentPassId, Wind wind, boolean isMagnetic); RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, - Serializable id, List competitors, int passId, Wind wind); + Serializable id, List competitors, int passId, Wind wind, boolean isMagnetic); RaceLogDeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, DeviceIdentifier device, Competitor mappedTo, int passId, TimePoint from, TimePoint to); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventRestoreFactory.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventRestoreFactory.java index 381756e169c..1219911d501 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventRestoreFactory.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogEventRestoreFactory.java @@ -69,7 +69,7 @@ public interface RaceLogEventRestoreFactory extends RaceLogEventFactory { TimePoint logicalTimePoint, Serializable id, List competitors, int passId, TimePoint protestStartTime); RaceLogWindFixEvent createWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, - Serializable id, List competitors, Integer passId, Wind wind); + Serializable id, List competitors, Integer passId, Wind wind, boolean isMagnetic); RaceLogDeviceCompetitorMappingEvent createDeviceCompetitorMappingEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable pId, DeviceIdentifier device, Competitor mappedTo, int passId, TimePoint from, TimePoint to); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogWindFixEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogWindFixEvent.java index eb5a2584dc8..4850a60c1fc 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogWindFixEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogWindFixEvent.java @@ -12,4 +12,13 @@ public interface RaceLogWindFixEvent extends RaceLogEvent { * Returns the wind fix entered by the race committee */ Wind getWindFix(); + + /** + * Usually, wind readings are expected to specify a true north-based direction. However, in some + * cases capturing a wind direction happens based on a magnetic compass and is not immediately corrected + * for the magnetic variation / declination. Should this be the case for the wind fix provided by this + * event, this method returns true, and a {@link DeclinationService} should be used to infer + * the true north-based wind direction. + */ + boolean isMagnetic(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventFactoryImpl.java index 86646bee693..ff3b35d6a20 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventFactoryImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventFactoryImpl.java @@ -234,14 +234,14 @@ public class RaceLogEventFactoryImpl implements RaceLogEventFactory { } @Override - public RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Wind wind) { - return createWindFixEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, wind); + public RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int passId, Wind wind, boolean isMagnetic) { + return createWindFixEvent(logicalTimePoint, author, UUID.randomUUID(), new ArrayList(), passId, wind, isMagnetic); } @Override public RaceLogWindFixEvent createWindFixEvent(TimePoint logicalTimePoint, AbstractLogEventAuthor author, Serializable id, - List competitors, int passId, Wind wind) { - return new RaceLogWindFixEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, wind); + List competitors, int passId, Wind wind, boolean isMagnetic) { + return new RaceLogWindFixEventImpl(MillisecondsTimePoint.now(), author, logicalTimePoint, id, competitors, passId, wind, isMagnetic); } @Override diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventRestoreFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventRestoreFactoryImpl.java index 7b5f9405413..36588de8091 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventRestoreFactoryImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogEventRestoreFactoryImpl.java @@ -129,8 +129,8 @@ public class RaceLogEventRestoreFactoryImpl extends RaceLogEventFactoryImpl impl @Override public RaceLogWindFixEvent createWindFixEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, - Serializable id, List competitors, Integer passId, Wind wind) { - return new RaceLogWindFixEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, wind); + Serializable id, List competitors, Integer passId, Wind wind, boolean isMagnetic) { + return new RaceLogWindFixEventImpl(createdAt, author, logicalTimePoint, id, competitors, passId, wind, isMagnetic); } @Override diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogWindFixEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogWindFixEventImpl.java index 5d029727180..e12b27465a9 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogWindFixEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogWindFixEventImpl.java @@ -14,11 +14,13 @@ public class RaceLogWindFixEventImpl extends RaceLogEventImpl implements RaceLog private static final long serialVersionUID = 7879094280634905183L; private final Wind windFix; + private final boolean isMagnetic; public RaceLogWindFixEventImpl(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint pTimePoint, - Serializable pId, List pInvolvedBoats, int pPassId, Wind windFix) { + Serializable pId, List pInvolvedBoats, int pPassId, Wind windFix, boolean isMagnetic) { super(createdAt, author, pTimePoint, pId, pInvolvedBoats, pPassId); this.windFix = windFix; + this.isMagnetic = isMagnetic; } @Override @@ -30,6 +32,11 @@ public class RaceLogWindFixEventImpl extends RaceLogEventImpl implements RaceLog public Wind getWindFix() { return windFix; } + + @Override + public boolean isMagnetic() { + return isMagnetic; + } @Override public String getShortInfo() { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java index fd41968aa0b..38c0cfd5e67 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java @@ -177,8 +177,9 @@ public interface RaceState extends ReadonlyRaceState { /** * Enters a new wind fix for this race. + * @param isMagnetic TODO */ - void setWindFix(TimePoint now, Wind wind); + void setWindFix(TimePoint now, Wind wind, boolean isMagnetic); /** * Marks this race state with a new {@link RaceLogAdditionalScoringInformationEvent} or revokes diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java index 3af740f95bc..5ce1d637e05 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java @@ -200,8 +200,8 @@ public class RaceStateImpl extends ReadonlyRaceStateImpl implements RaceState { } @Override - public void setWindFix(TimePoint timePoint, Wind wind) { - raceLog.add(factory.createWindFixEvent(timePoint, author, raceLog.getCurrentPassId(), wind)); + public void setWindFix(TimePoint timePoint, Wind wind, boolean isMagnetic) { + raceLog.add(factory.createWindFixEvent(timePoint, author, raceLog.getCurrentPassId(), wind, isMagnetic)); } @Override diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java index b900b863654..2cf7269b27c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java @@ -30,16 +30,16 @@ import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.WindSource; import com.sap.sailing.domain.common.WindSourceType; import com.sap.sailing.domain.common.impl.WindSourceImpl; -import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.markpassingcalculation.MarkPassingUpdateListener; import com.sap.sailing.domain.tracking.DynamicTrackedRace; +import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util.Pair; import com.sap.sse.common.Util.Triple; /** - * TODO: this class could be a good place to leverage more information about a race containing in the {@link RaceLog}. - * This includes for example the {@link RaceLogRaceStatus} indicating the current race's start. + * Listens for changes on a {@link RaceLog} and forwards the relevant ones to a {@link TrackedRace}. Examples: start time changes; + * fixed mark passings changes; course design changes; wind fixes entered by the race committee.

*/ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor { @@ -227,6 +227,10 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor { @Override public void visit(RaceLogWindFixEvent event) { // add the wind fix to the race committee WindTrack + final Wind wind; + if (event.isMagnetic()) { + final DeclinationService declinationService; + } trackedRace.recordWind(event.getWindFix(), raceCommitteeWindSource); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 3a785160eaa..3f3db8538b0 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -205,7 +205,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl * Race start time as announced by the tracking infrastructure */ private TimePoint startTimeReceived; - + /** * The calculated race start time */ diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index 6beefe5bbee..8644fe893c8 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -503,7 +503,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogWindFixEvent() { Wind wind = createWindFix(); - RaceLogWindFixEvent event = RaceLogEventFactory.INSTANCE.createWindFixEvent(now, author, 0, wind); + RaceLogWindFixEvent event = RaceLogEventFactory.INSTANCE.createWindFixEvent(now, author, 0, wind, /* isMagnetic */ false); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); RaceLog loadedRaceLog = retrieveRaceLog(); loadedRaceLog.lockForRead(); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java index 54bc2fcd15d..a849ca177c8 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java @@ -412,7 +412,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends AbstractTestStorin @Test public void testStoreAndRetrieveRegattaWithRaceLogWindFixEvent() { Wind wind = createWindFix(); - RaceLogWindFixEvent event = RaceLogEventFactory.INSTANCE.createWindFixEvent(now, author, 0, wind); + RaceLogWindFixEvent event = RaceLogEventFactory.INSTANCE.createWindFixEvent(now, author, 0, wind, /* isMagnetic */ false); addAndStoreRaceLogEvent(regatta, raceColumnName, event); diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogWindFixEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogWindFixEventDeserializer.java index d4143d579e0..98848155cc9 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogWindFixEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogWindFixEventDeserializer.java @@ -27,11 +27,10 @@ public class RaceLogWindFixEventDeserializer extends BaseRaceLogEventDeserialize @Override protected RaceLogEvent deserialize(JSONObject object, Serializable id, TimePoint createdAt, AbstractLogEventAuthor author, TimePoint timePoint, int passId, List competitors) throws JsonDeserializationException { - JSONObject windJsonObject = Helpers.getNestedObjectSafe(object, RaceLogWindFixEventSerializer.FIELD_WIND); - - Wind wind = windDeserializer.deserialize(windJsonObject); - - return factory.createWindFixEvent(createdAt, author, timePoint, id, competitors, passId, wind); + final JSONObject windJsonObject = Helpers.getNestedObjectSafe(object, RaceLogWindFixEventSerializer.FIELD_WIND); + final Wind wind = windDeserializer.deserialize(windJsonObject); + final Boolean isMagnetic = (Boolean) object.get(RaceLogWindFixEventSerializer.FIELD_MAGNETIC); + return factory.createWindFixEvent(createdAt, author, timePoint, id, competitors, passId, wind, isMagnetic == null ? true : isMagnetic); } } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogWindFixEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogWindFixEventSerializer.java index f62d409fe43..8e04102f2f5 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogWindFixEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogWindFixEventSerializer.java @@ -12,6 +12,7 @@ public class RaceLogWindFixEventSerializer extends BaseRaceLogEventSerializer { public static final String VALUE_CLASS = RaceLogWindFixEvent.class.getSimpleName(); public static final String FIELD_WIND = "wind"; + public static final String FIELD_MAGNETIC = "magnetic"; JsonSerializer windSerializer; @@ -30,6 +31,7 @@ public class RaceLogWindFixEventSerializer extends BaseRaceLogEventSerializer { RaceLogWindFixEvent event = (RaceLogWindFixEvent) object; JSONObject result = super.serialize(event); result.put(FIELD_WIND, windSerializer.serialize(event.getWindFix())); + result.put(FIELD_MAGNETIC, Boolean.valueOf(event.isMagnetic())); return result; } diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java index bae598439ed..93d712b2bc2 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java @@ -200,7 +200,7 @@ public class RaceLogEventSerializerTest { @Test public void testWindFixSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = factory.createWindFixEvent(null, author, 0, null); + RaceLogEvent event = factory.createWindFixEvent(null, author, 0, null, /* isMagnetic */ false); serializer.serialize(event); verify(windFixEventSerializer).serialize(event); } diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java index 01c25352def..3b4763ee7a2 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogWindFixEventSerializerTest.java @@ -56,7 +56,7 @@ public class RaceLogWindFixEventSerializerTest { now = MillisecondsTimePoint.now(); - event = RaceLogEventFactory.INSTANCE.createWindFixEvent(now, author, 0, createWindFix()); + event = RaceLogEventFactory.INSTANCE.createWindFixEvent(now, author, 0, createWindFix(), /* isMagnetic */ false); } @Test diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/InitialLoadReplicationObjectIdentityTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/InitialLoadReplicationObjectIdentityTest.java index 0aff92a2f88..7adb6f42e4b 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/InitialLoadReplicationObjectIdentityTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/InitialLoadReplicationObjectIdentityTest.java @@ -151,7 +151,7 @@ public class InitialLoadReplicationObjectIdentityTest extends AbstractServerRepl final WindImpl masterWindFix = new WindImpl(new DegreePosition(12, 13), MillisecondsTimePoint.now(), new KnotSpeedWithBearingImpl(12.7, new DegreeBearingImpl(123))); masterR1RaceLog.add(RaceLogEventFactoryImpl.INSTANCE.createWindFixEvent(MillisecondsTimePoint.now(), new LogEventAuthorImpl("Me", 0), - /* passId */ 1, masterWindFix)); + /* passId */ 1, masterWindFix, /* isMagnetic */ false)); // assert that the wind fix shows up in the tracked race now because the tracked race has the DynamicTrackedRaceLogListener // propagating the wind fix race log event into the wind track for source RACECOMMITTEE WindTrack masterRCWindFixes = masterTrackedRace.getOrCreateWindTrack(new WindSourceImpl(WindSourceType.RACECOMMITTEE)); @@ -224,7 +224,7 @@ public class InitialLoadReplicationObjectIdentityTest extends AbstractServerRepl final WindImpl replicaWindFix = new WindImpl(new DegreePosition(14, 15), MillisecondsTimePoint.now(), new KnotSpeedWithBearingImpl(22.9, new DegreeBearingImpl(155))); replicaR1RaceLog.add(RaceLogEventFactoryImpl.INSTANCE.createWindFixEvent(MillisecondsTimePoint.now(), new LogEventAuthorImpl("Me", 0), - /* passId */ 1, replicaWindFix)); + /* passId */ 1, replicaWindFix, /* isMagnetic */ false)); // assert that the wind fix shows up in the tracked race now because the tracked race has the DynamicTrackedRaceLogListener // propagating the wind fix race log event into the wind track for source RACECOMMITTEE WindTrack replicaRCWindFixes = replicaTrackedRace.getOrCreateWindTrack(new WindSourceImpl(WindSourceType.RACECOMMITTEE)); diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java index bf2ec6db485..b395cbe05c8 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java @@ -259,7 +259,7 @@ public class MasterDataImportTest { Position p = new DegreePosition(3, 3); Wind wind = new WindImpl(p, logTimePoint2, new KnotSpeedWithBearingImpl(5, new DegreeBearingImpl(12))); RaceLogWindFixEvent windEvent = factory.createWindFixEvent(logTimePoint2, author, UUID.randomUUID(), - new ArrayList(), 2, wind); + new ArrayList(), 2, wind, /* isMagnetic */ false); raceColumn.getRaceLog(testFleet1).add(windEvent); storedLogUUIDs.add(logEvent.getId()); storedLogUUIDs.add(windEvent.getId()); @@ -2073,7 +2073,7 @@ public class MasterDataImportTest { Position p = new DegreePosition(3, 3); Wind wind = new WindImpl(p, logTimePoint2, new KnotSpeedWithBearingImpl(5, new DegreeBearingImpl(12))); RaceLogWindFixEvent windEvent = factory.createWindFixEvent(logTimePoint2, author, UUID.randomUUID(), - new ArrayList(), 2, wind); + new ArrayList(), 2, wind, /* isMagnetic */ false); raceColumnOnLeaderboard.getRaceLog(defaultFleet).add(windEvent); storedLogUUIDs.add(logEvent.getId()); storedLogUUIDs.add(windEvent.getId()); diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java index e9f8e91e88c..bf44848d496 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/WindByRaceLogTest.java @@ -133,8 +133,8 @@ public class WindByRaceLogTest { new KnotSpeedWithBearingImpl(15, new DegreeBearingImpl(234))); Wind wind2 = new WindImpl(new DegreePosition(49, 3), timeMinus2, new KnotSpeedWithBearingImpl(12, new DegreeBearingImpl(123))); - RaceLogWindFixEvent windEvent1 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus3, author, 0, wind1); - RaceLogWindFixEvent windEvent2 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus2, author, 0, wind2); + RaceLogWindFixEvent windEvent1 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus3, author, 0, wind1, /* isMagnetic */ false); + RaceLogWindFixEvent windEvent2 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus2, author, 0, wind2, /* isMagnetic */ false); raceLog.add(windEvent1); raceLog.add(windEvent2); @@ -163,7 +163,7 @@ public class WindByRaceLogTest { Wind wind1 = new WindImpl(new DegreePosition(50, 4), timeMinus3, new KnotSpeedWithBearingImpl(15, new DegreeBearingImpl(234))); - RaceLogWindFixEvent windEvent1 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus3, author, 0, wind1); + RaceLogWindFixEvent windEvent1 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus3, author, 0, wind1, /* isMagnetic */ false); raceLog.add(windEvent1); WindSource source = new WindSourceImpl(WindSourceType.RACECOMMITTEE); @@ -192,9 +192,9 @@ public class WindByRaceLogTest { new KnotSpeedWithBearingImpl(12, new DegreeBearingImpl(123))); Wind wind3 = new WindImpl(new DegreePosition(48, 1), timeMinus2, new KnotSpeedWithBearingImpl(18, new DegreeBearingImpl(270))); - RaceLogWindFixEvent windEvent1 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus3, author, 0, wind1); - RaceLogWindFixEvent windEvent2 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus2, author, 0, wind2); - RaceLogWindFixEvent windEvent3 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus1, author, 0, wind3); + RaceLogWindFixEvent windEvent1 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus3, author, 0, wind1, /* isMagnetic */ false); + RaceLogWindFixEvent windEvent2 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus2, author, 0, wind2, /* isMagnetic */ false); + RaceLogWindFixEvent windEvent3 = RaceLogEventFactory.INSTANCE.createWindFixEvent(timeMinus1, author, 0, wind3, /* isMagnetic */ false); raceLog.add(windEvent1); raceLog.add(windEvent2); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java index c0c3f280d70..d9550e0af23 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java @@ -302,7 +302,7 @@ public class RacingActivity extends SessionActivity implements RaceInfoListener, windValue.setText(String.format(getString(R.string.wind_info), windFix.getKnots(), windFix.getBearing().reverse().toString())); } if (mSelectedRace != null) { - mSelectedRace.getState().setWindFix(MillisecondsTimePoint.now(), windFix); + mSelectedRace.getState().setWindFix(MillisecondsTimePoint.now(), windFix, /* isMagnetic */ true); } mWind = windFix; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/WindFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/WindFragment.java index d793fe73178..86ffb57b3d0 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/WindFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/WindFragment.java @@ -410,7 +410,7 @@ public class WindFragment extends BaseFragment */ private void onSendClick() { Wind wind = getResultingWindFix(); - getRaceState().setWindFix(MillisecondsTimePoint.now(), wind); + getRaceState().setWindFix(MillisecondsTimePoint.now(), wind, /* isMagnetic */ true); saveEntriesInPreferences(wind); switch (getArguments().getInt(START_MODE, 0)) { case 1: