b6dc1ff3bc71e411dfc1e60b9fb3f622fef5dc5d
java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/RacingProcedureType.java
| ... | ... | @@ -17,6 +17,7 @@ public enum RacingProcedureType { |
| 17 | 17 | BASIC("Basic Countdown Start"), |
| 18 | 18 | LEAGUE("League Start"), |
| 19 | 19 | RRS26_3MIN("Fix Line Start with 3min Sequence (RRS26/3)"), |
| 20 | + SWC_5MIN("Sailing World Cup Start with 5min Sequence (2025 and onwards)"), |
|
| 20 | 21 | SWC_4MIN("Sailing World Cup Start with 4min Sequence (Kites, Surfers)"); |
| 21 | 22 | |
| 22 | 23 | private String displayName; |
java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/test/RacingProceduresWithStartModeFlagTest.java
| ... | ... | @@ -29,7 +29,7 @@ public class RacingProceduresWithStartModeFlagTest { |
| 29 | 29 | for (final RacingProcedureType type : RacingProcedureType.values()) { |
| 30 | 30 | if (type != RacingProcedureType.UNKNOWN) { |
| 31 | 31 | final ReadonlyRacingProcedure racingProcedure = racingProcedureFactory.createRacingProcedure(type, raceLog, /* raceLogResolver */ null); |
| 32 | - assertEquals(RacingProcedureType.RRS26.equals(type) || RacingProcedureType.RRS26_3MIN.equals(type) || RacingProcedureType.SWC.equals(type) || RacingProcedureType.SWC_4MIN.equals(type), |
|
| 32 | + assertEquals(RacingProcedureType.RRS26.equals(type) || RacingProcedureType.RRS26_3MIN.equals(type) || RacingProcedureType.SWC.equals(type) || RacingProcedureType.SWC_4MIN.equals(type) || RacingProcedureType.SWC_5MIN.equals(type), |
|
| 33 | 33 | racingProcedure instanceof ConfigurableStartModeFlagRacingProcedure, |
| 34 | 34 | "Racing procedure type "+type.name()+" was "+((racingProcedure instanceof ConfigurableStartModeFlagRacingProcedure) ? "" : "not ")+ |
| 35 | 35 | "considered one with configurable start mode flag but should have"); |
java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/ReadonlyRacingProcedureFactory.java
| ... | ... | @@ -12,6 +12,7 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic.impl. |
| 12 | 12 | import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.impl.ESSRacingProcedureImpl; |
| 13 | 13 | import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl.GateStartRacingProcedureImpl; |
| 14 | 14 | import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.league.impl.LeagueRacingProcedureImpl; |
| 15 | +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.impl.MediumSWCRacingProcedureImpl; |
|
| 15 | 16 | import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.impl.RRS26RacingProcedureImpl; |
| 16 | 17 | import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.impl.RRS26ThreeMinutesRacingProcedureImpl; |
| 17 | 18 | import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.impl.SWCRacingProcedureImpl; |
| ... | ... | @@ -56,6 +57,8 @@ public class ReadonlyRacingProcedureFactory implements RacingProcedureFactory { |
| 56 | 57 | return new SWCRacingProcedureImpl(raceLog, author, loadedConfiguration.getSWCStartConfiguration(), raceLogResolver); |
| 57 | 58 | case SWC_4MIN: |
| 58 | 59 | return new ShortSWCRacingProcedureImpl(raceLog, author, loadedConfiguration.getSWCStartConfiguration(), raceLogResolver); |
| 60 | + case SWC_5MIN: |
|
| 61 | + return new MediumSWCRacingProcedureImpl(raceLog, author, loadedConfiguration.getSWCStartConfiguration(), raceLogResolver); |
|
| 59 | 62 | case BASIC: |
| 60 | 63 | return new BasicRacingProcedureImpl(raceLog, author, loadedConfiguration.getBasicConfiguration(), raceLogResolver); |
| 61 | 64 | case LEAGUE: |
java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/line/impl/MediumSWCRacingProcedureImpl.java
| ... | ... | @@ -0,0 +1,71 @@ |
| 1 | +package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.impl; |
|
| 2 | + |
|
| 3 | +import java.util.Arrays; |
|
| 4 | +import java.util.Collections; |
|
| 5 | + |
|
| 6 | +import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; |
|
| 7 | +import com.sap.sailing.domain.abstractlog.race.RaceLog; |
|
| 8 | +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver; |
|
| 9 | +import com.sap.sailing.domain.abstractlog.race.state.RaceStateEvent; |
|
| 10 | +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEventImpl; |
|
| 11 | +import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEvents; |
|
| 12 | +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState; |
|
| 13 | +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.SWCRacingProcedure; |
|
| 14 | +import com.sap.sailing.domain.base.configuration.procedures.SWCStartConfiguration; |
|
| 15 | +import com.sap.sailing.domain.common.racelog.FlagPole; |
|
| 16 | +import com.sap.sailing.domain.common.racelog.Flags; |
|
| 17 | +import com.sap.sailing.domain.common.racelog.RacingProcedureType; |
|
| 18 | +import com.sap.sse.common.Duration; |
|
| 19 | +import com.sap.sse.common.TimePoint; |
|
| 20 | + |
|
| 21 | +public class MediumSWCRacingProcedureImpl extends SWCRacingProcedureImpl implements SWCRacingProcedure { |
|
| 22 | + |
|
| 23 | + private final static Duration CLASS_AND_STARTMODE_UP_INTERVAL_5MIN = Duration.ONE_MINUTE.times(5); // 5 minutes before start |
|
| 24 | + |
|
| 25 | + public MediumSWCRacingProcedureImpl(RaceLog raceLog, AbstractLogEventAuthor author, |
|
| 26 | + SWCStartConfiguration configuration, RaceLogResolver raceLogResolver) { |
|
| 27 | + super(raceLog, author, configuration, raceLogResolver); |
|
| 28 | + } |
|
| 29 | + |
|
| 30 | + @Override |
|
| 31 | + protected Duration getStartPhaseStartModeUpInterval() { |
|
| 32 | + return CLASS_AND_STARTMODE_UP_INTERVAL_5MIN; |
|
| 33 | + } |
|
| 34 | + |
|
| 35 | + @Override |
|
| 36 | + public RacingProcedureType getType() { |
|
| 37 | + return RacingProcedureType.SWC_5MIN; |
|
| 38 | + } |
|
| 39 | + |
|
| 40 | + @Override |
|
| 41 | + public Iterable<RaceStateEvent> createStartStateEvents(TimePoint startTime) { |
|
| 42 | + return Arrays.<RaceStateEvent>asList( |
|
| 43 | + new RaceStateEventImpl(startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_5MIN), RaceStateEvents.SWC_CLASS_AND_STARTMODE_UP), |
|
| 44 | + new RaceStateEventImpl(startTime.minus(FOUR_MINUTES_FLAG_UP_INTERVAL), RaceStateEvents.SWC_FOUR_UP), |
|
| 45 | + new RaceStateEventImpl(startTime.minus(THREE_MINUTES_FLAG_UP_INTERVAL), RaceStateEvents.SWC_THREE_UP), |
|
| 46 | + new RaceStateEventImpl(startTime.minus(TWO_MINUTES_FLAG_UP_INTERVAL), RaceStateEvents.SWC_TWO_UP), |
|
| 47 | + new RaceStateEventImpl(startTime.minus(ONE_MINUTE_FLAG_UP_INTERVAL), RaceStateEvents.SWC_ONE_UP), |
|
| 48 | + new RaceStateEventImpl(startTime, RaceStateEvents.START), |
|
| 49 | + new RaceStateEventImpl(startTime, RaceStateEvents.SWC_GREEN_UP), |
|
| 50 | + new RaceStateEventImpl(startTime.plus(CLASS_AND_STARTMODE_DOWN_INTERVAL), RaceStateEvents.SWC_CLASS_AND_STARTMODE_DOWN)); |
|
| 51 | + } |
|
| 52 | + |
|
| 53 | + @Override |
|
| 54 | + public FlagPoleState getActiveFlags(TimePoint startTime, TimePoint now) { |
|
| 55 | + if (now.before(startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_5MIN))) { |
|
| 56 | + return new FlagPoleState( |
|
| 57 | + Collections.singletonList(new FlagPole(cachedStartmodeFlag, false)), |
|
| 58 | + null, |
|
| 59 | + Collections.singletonList(new FlagPole(cachedStartmodeFlag, true)), |
|
| 60 | + startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_5MIN)); |
|
| 61 | + } else if (now.before(startTime.minus(THREE_MINUTES_FLAG_UP_INTERVAL))) { |
|
| 62 | + return new FlagPoleState( |
|
| 63 | + Arrays.asList(new FlagPole(cachedStartmodeFlag, true), new FlagPole(Flags.SWC_FOUR, false)), |
|
| 64 | + startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_5MIN), |
|
| 65 | + Arrays.asList(new FlagPole(cachedStartmodeFlag, true), new FlagPole(Flags.SWC_FOUR, true)), |
|
| 66 | + startTime.minus(FOUR_MINUTES_FLAG_UP_INTERVAL)); |
|
| 67 | + } else { |
|
| 68 | + return super.getActiveFlags(startTime, now); |
|
| 69 | + } |
|
| 70 | + } |
|
| 71 | +} |
java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/line/impl/ShortSWCRacingProcedureImpl.java
| ... | ... | @@ -20,7 +20,7 @@ import com.sap.sse.common.TimePoint; |
| 20 | 20 | |
| 21 | 21 | public class ShortSWCRacingProcedureImpl extends SWCRacingProcedureImpl implements SWCRacingProcedure { |
| 22 | 22 | |
| 23 | - private final static Duration CLASS_AND_STARTMODE_UP_INTERVAL_4MIN = Duration.ONE_MINUTE.times(4); // 6 minutes before start |
|
| 23 | + private final static Duration CLASS_AND_STARTMODE_UP_INTERVAL_4MIN = Duration.ONE_MINUTE.times(4); // 4 minutes before start |
|
| 24 | 24 | |
| 25 | 25 | public ShortSWCRacingProcedureImpl(RaceLog raceLog, AbstractLogEventAuthor author, |
| 26 | 26 | SWCStartConfiguration configuration, RaceLogResolver raceLogResolver) { |
| ... | ... | @@ -57,12 +57,12 @@ public class ShortSWCRacingProcedureImpl extends SWCRacingProcedureImpl implemen |
| 57 | 57 | null, |
| 58 | 58 | Collections.singletonList(new FlagPole(cachedStartmodeFlag, true)), |
| 59 | 59 | startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_4MIN)); |
| 60 | - } else if (now.before(startTime.minus(THREE_MINUTES_FLAG_UP_INTERVAL))) { |
|
| 61 | - return new FlagPoleState( |
|
| 62 | - Arrays.asList(new FlagPole(cachedStartmodeFlag, true), new FlagPole(Flags.SWC_THREE, false)), |
|
| 63 | - startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_4MIN), |
|
| 64 | - Arrays.asList(new FlagPole(cachedStartmodeFlag, true), new FlagPole(Flags.SWC_THREE, true)), |
|
| 65 | - startTime.minus(THREE_MINUTES_FLAG_UP_INTERVAL)); |
|
| 60 | + } else if (now.before(startTime.minus(THREE_MINUTES_FLAG_UP_INTERVAL))) { |
|
| 61 | + return new FlagPoleState( |
|
| 62 | + Arrays.asList(new FlagPole(cachedStartmodeFlag, true), new FlagPole(Flags.SWC_THREE, false)), |
|
| 63 | + startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_4MIN), |
|
| 64 | + Arrays.asList(new FlagPole(cachedStartmodeFlag, true), new FlagPole(Flags.SWC_THREE, true)), |
|
| 65 | + startTime.minus(THREE_MINUTES_FLAG_UP_INTERVAL)); |
|
| 66 | 66 | } else { |
| 67 | 67 | return super.getActiveFlags(startTime, now); |
| 68 | 68 | } |
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/regattaoverview/client/RaceDetailPanel.java
| ... | ... | @@ -212,6 +212,7 @@ public class RaceDetailPanel extends SimplePanel { |
| 212 | 212 | case RRS26_3MIN: |
| 213 | 213 | case SWC: |
| 214 | 214 | case SWC_4MIN: |
| 215 | + case SWC_5MIN: |
|
| 215 | 216 | LineStartInfoDTO rrsInfo = (LineStartInfoDTO) data.raceInfo.startProcedureDTO; |
| 216 | 217 | if (rrsInfo != null) { |
| 217 | 218 | if (rrsInfo.startModeFlag != null) { |
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
| ... | ... | @@ -1167,6 +1167,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet |
| 1167 | 1167 | case RRS26_3MIN: |
| 1168 | 1168 | case SWC: |
| 1169 | 1169 | case SWC_4MIN: |
| 1170 | + case SWC_5MIN: |
|
| 1170 | 1171 | ConfigurableStartModeFlagRacingProcedure linestart = state.getTypedReadonlyRacingProcedure(); |
| 1171 | 1172 | info = new LineStartInfoDTO(linestart.getStartModeFlag()); |
| 1172 | 1173 | case UNKNOWN: |
mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java
| ... | ... | @@ -261,6 +261,7 @@ public class AppPreferences { |
| 261 | 261 | return key(R.string.preference_racing_procedure_rrs26_hasxray_key); |
| 262 | 262 | case SWC: |
| 263 | 263 | case SWC_4MIN: |
| 264 | + case SWC_5MIN: |
|
| 264 | 265 | return key(R.string.preference_racing_procedure_swc_hasxray_key); |
| 265 | 266 | case GateStart: |
| 266 | 267 | return key(R.string.preference_racing_procedure_gatestart_hasxray_key); |
| ... | ... | @@ -287,6 +288,7 @@ public class AppPreferences { |
| 287 | 288 | return key(R.string.preference_racing_procedure_rrs26_resultentryenabled_key); |
| 288 | 289 | case SWC: |
| 289 | 290 | case SWC_4MIN: |
| 291 | + case SWC_5MIN: |
|
| 290 | 292 | return key(R.string.preference_racing_procedure_swc_resultentryenabled_key); |
| 291 | 293 | case GateStart: |
| 292 | 294 | return key(R.string.preference_racing_procedure_gatestart_resultentryenabled_key); |