Merge branch 'bug6197' into hyperspace

This commit is contained in:
Axel Uhl committed 2025-12-14 23:22:20 +00:00
commit b6dc1ff3bc
8 files changed
+87 -8

No files matched your search

@@ -17,6 +17,7 @@ public enum RacingProcedureType {
BASIC("Basic Countdown Start"),
LEAGUE("League Start"),
RRS26_3MIN("Fix Line Start with 3min Sequence (RRS26/3)"),
SWC_5MIN("Sailing World Cup Start with 5min Sequence (2025 and onwards)"),
SWC_4MIN("Sailing World Cup Start with 4min Sequence (Kites, Surfers)");
private String displayName;
@@ -29,7 +29,7 @@ public class RacingProceduresWithStartModeFlagTest {
for (final RacingProcedureType type : RacingProcedureType.values()) {
if (type != RacingProcedureType.UNKNOWN) {
final ReadonlyRacingProcedure racingProcedure = racingProcedureFactory.createRacingProcedure(type, raceLog, /* raceLogResolver */ null);
assertEquals(RacingProcedureType.RRS26.equals(type) || RacingProcedureType.RRS26_3MIN.equals(type) || RacingProcedureType.SWC.equals(type) || RacingProcedureType.SWC_4MIN.equals(type),
assertEquals(RacingProcedureType.RRS26.equals(type) || RacingProcedureType.RRS26_3MIN.equals(type) || RacingProcedureType.SWC.equals(type) || RacingProcedureType.SWC_4MIN.equals(type) || RacingProcedureType.SWC_5MIN.equals(type),
racingProcedure instanceof ConfigurableStartModeFlagRacingProcedure,
"Racing procedure type "+type.name()+" was "+((racingProcedure instanceof ConfigurableStartModeFlagRacingProcedure) ? "" : "not ")+
"considered one with configurable start mode flag but should have");
@@ -12,6 +12,7 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.basic.impl.
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.impl.ESSRacingProcedureImpl;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.impl.GateStartRacingProcedureImpl;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.league.impl.LeagueRacingProcedureImpl;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.impl.MediumSWCRacingProcedureImpl;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.impl.RRS26RacingProcedureImpl;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.impl.RRS26ThreeMinutesRacingProcedureImpl;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.impl.SWCRacingProcedureImpl;
@@ -56,6 +57,8 @@ public class ReadonlyRacingProcedureFactory implements RacingProcedureFactory {
return new SWCRacingProcedureImpl(raceLog, author, loadedConfiguration.getSWCStartConfiguration(), raceLogResolver);
case SWC_4MIN:
return new ShortSWCRacingProcedureImpl(raceLog, author, loadedConfiguration.getSWCStartConfiguration(), raceLogResolver);
case SWC_5MIN:
return new MediumSWCRacingProcedureImpl(raceLog, author, loadedConfiguration.getSWCStartConfiguration(), raceLogResolver);
case BASIC:
return new BasicRacingProcedureImpl(raceLog, author, loadedConfiguration.getBasicConfiguration(), raceLogResolver);
case LEAGUE:
@@ -0,0 +1,71 @@
package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.impl;
import java.util.Arrays;
import java.util.Collections;
import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver;
import com.sap.sailing.domain.abstractlog.race.state.RaceStateEvent;
import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEventImpl;
import com.sap.sailing.domain.abstractlog.race.state.impl.RaceStateEvents;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.FlagPoleState;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.SWCRacingProcedure;
import com.sap.sailing.domain.base.configuration.procedures.SWCStartConfiguration;
import com.sap.sailing.domain.common.racelog.FlagPole;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
public class MediumSWCRacingProcedureImpl extends SWCRacingProcedureImpl implements SWCRacingProcedure {
private final static Duration CLASS_AND_STARTMODE_UP_INTERVAL_5MIN = Duration.ONE_MINUTE.times(5); // 5 minutes before start
public MediumSWCRacingProcedureImpl(RaceLog raceLog, AbstractLogEventAuthor author,
SWCStartConfiguration configuration, RaceLogResolver raceLogResolver) {
super(raceLog, author, configuration, raceLogResolver);
}
@Override
protected Duration getStartPhaseStartModeUpInterval() {
return CLASS_AND_STARTMODE_UP_INTERVAL_5MIN;
}
@Override
public RacingProcedureType getType() {
return RacingProcedureType.SWC_5MIN;
}
@Override
public Iterable<RaceStateEvent> createStartStateEvents(TimePoint startTime) {
return Arrays.<RaceStateEvent>asList(
new RaceStateEventImpl(startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_5MIN), RaceStateEvents.SWC_CLASS_AND_STARTMODE_UP),
new RaceStateEventImpl(startTime.minus(FOUR_MINUTES_FLAG_UP_INTERVAL), RaceStateEvents.SWC_FOUR_UP),
new RaceStateEventImpl(startTime.minus(THREE_MINUTES_FLAG_UP_INTERVAL), RaceStateEvents.SWC_THREE_UP),
new RaceStateEventImpl(startTime.minus(TWO_MINUTES_FLAG_UP_INTERVAL), RaceStateEvents.SWC_TWO_UP),
new RaceStateEventImpl(startTime.minus(ONE_MINUTE_FLAG_UP_INTERVAL), RaceStateEvents.SWC_ONE_UP),
new RaceStateEventImpl(startTime, RaceStateEvents.START),
new RaceStateEventImpl(startTime, RaceStateEvents.SWC_GREEN_UP),
new RaceStateEventImpl(startTime.plus(CLASS_AND_STARTMODE_DOWN_INTERVAL), RaceStateEvents.SWC_CLASS_AND_STARTMODE_DOWN));
}
@Override
public FlagPoleState getActiveFlags(TimePoint startTime, TimePoint now) {
if (now.before(startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_5MIN))) {
return new FlagPoleState(
Collections.singletonList(new FlagPole(cachedStartmodeFlag, false)),
null,
Collections.singletonList(new FlagPole(cachedStartmodeFlag, true)),
startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_5MIN));
} else if (now.before(startTime.minus(THREE_MINUTES_FLAG_UP_INTERVAL))) {
return new FlagPoleState(
Arrays.asList(new FlagPole(cachedStartmodeFlag, true), new FlagPole(Flags.SWC_FOUR, false)),
startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_5MIN),
Arrays.asList(new FlagPole(cachedStartmodeFlag, true), new FlagPole(Flags.SWC_FOUR, true)),
startTime.minus(FOUR_MINUTES_FLAG_UP_INTERVAL));
} else {
return super.getActiveFlags(startTime, now);
}
}
}
@@ -20,7 +20,7 @@ import com.sap.sse.common.TimePoint;
public class ShortSWCRacingProcedureImpl extends SWCRacingProcedureImpl implements SWCRacingProcedure {
private final static Duration CLASS_AND_STARTMODE_UP_INTERVAL_4MIN = Duration.ONE_MINUTE.times(4); // 6 minutes before start
private final static Duration CLASS_AND_STARTMODE_UP_INTERVAL_4MIN = Duration.ONE_MINUTE.times(4); // 4 minutes before start
public ShortSWCRacingProcedureImpl(RaceLog raceLog, AbstractLogEventAuthor author,
SWCStartConfiguration configuration, RaceLogResolver raceLogResolver) {
@@ -57,12 +57,12 @@ public class ShortSWCRacingProcedureImpl extends SWCRacingProcedureImpl implemen
null,
Collections.singletonList(new FlagPole(cachedStartmodeFlag, true)),
startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_4MIN));
} else if (now.before(startTime.minus(THREE_MINUTES_FLAG_UP_INTERVAL))) {
return new FlagPoleState(
Arrays.asList(new FlagPole(cachedStartmodeFlag, true), new FlagPole(Flags.SWC_THREE, false)),
startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_4MIN),
Arrays.asList(new FlagPole(cachedStartmodeFlag, true), new FlagPole(Flags.SWC_THREE, true)),
startTime.minus(THREE_MINUTES_FLAG_UP_INTERVAL));
} else if (now.before(startTime.minus(THREE_MINUTES_FLAG_UP_INTERVAL))) {
return new FlagPoleState(
Arrays.asList(new FlagPole(cachedStartmodeFlag, true), new FlagPole(Flags.SWC_THREE, false)),
startTime.minus(CLASS_AND_STARTMODE_UP_INTERVAL_4MIN),
Arrays.asList(new FlagPole(cachedStartmodeFlag, true), new FlagPole(Flags.SWC_THREE, true)),
startTime.minus(THREE_MINUTES_FLAG_UP_INTERVAL));
} else {
return super.getActiveFlags(startTime, now);
}
@@ -212,6 +212,7 @@ public class RaceDetailPanel extends SimplePanel {
case RRS26_3MIN:
case SWC:
case SWC_4MIN:
case SWC_5MIN:
LineStartInfoDTO rrsInfo = (LineStartInfoDTO) data.raceInfo.startProcedureDTO;
if (rrsInfo != null) {
if (rrsInfo.startModeFlag != null) {
@@ -1167,6 +1167,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
case RRS26_3MIN:
case SWC:
case SWC_4MIN:
case SWC_5MIN:
ConfigurableStartModeFlagRacingProcedure linestart = state.getTypedReadonlyRacingProcedure();
info = new LineStartInfoDTO(linestart.getStartModeFlag());
case UNKNOWN:
@@ -261,6 +261,7 @@ public class AppPreferences {
return key(R.string.preference_racing_procedure_rrs26_hasxray_key);
case SWC:
case SWC_4MIN:
case SWC_5MIN:
return key(R.string.preference_racing_procedure_swc_hasxray_key);
case GateStart:
return key(R.string.preference_racing_procedure_gatestart_hasxray_key);
@@ -287,6 +288,7 @@ public class AppPreferences {
return key(R.string.preference_racing_procedure_rrs26_resultentryenabled_key);
case SWC:
case SWC_4MIN:
case SWC_5MIN:
return key(R.string.preference_racing_procedure_swc_resultentryenabled_key);
case GateStart:
return key(R.string.preference_racing_procedure_gatestart_resultentryenabled_key);