mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-04 19:33:52 +00:00
Merge branch 'master' into test
This commit is contained in:
commit
c078c3b6a0
9 files changed
+71
-16
No files matched your search
@@ -1,9 +1,9 @@
|
||||
Axel
|
||||
====
|
||||
|
||||
- Axel liefert stabiles (zumindest im Bezug auf druckbetankte Daten) start und finish basierend auf MarkPassings + threshold (30)
|
||||
- sort mark passing using Collections.sort and don't use a TreeSet
|
||||
|
||||
- when a race for an event arrives with a different boat class, open up a new Event
|
||||
- Distribute wind data to their respective races
|
||||
|
||||
- Pass final production instance URL information to BeTomorrow for wind integration
|
||||
|
||||
|
||||
+14
-2
@@ -380,16 +380,28 @@ public class DomainFactoryImpl implements DomainFactory {
|
||||
synchronized (raceCache) {
|
||||
RaceDefinition result = raceCache.get(race);
|
||||
if (result == null) {
|
||||
BoatClass boatClass = null;
|
||||
final List<Competitor> competitors = new ArrayList<Competitor>();
|
||||
Map<BoatClass, Integer> countsPerBoatClass = new HashMap<BoatClass, Integer>();
|
||||
BoatClass dominantBoatClass = null;
|
||||
int numberOfCompetitorsInDominantBoatClass = 0;
|
||||
for (RaceCompetitor rc : race.getRaceCompetitorList()) {
|
||||
com.tractrac.clientmodule.Competitor competitor = rc.getCompetitor();
|
||||
BoatClass boatClass = getBoatClass(competitor.getCompetitorClass());
|
||||
Integer boatClassCount = countsPerBoatClass.get(boatClass);
|
||||
if (boatClassCount == null) {
|
||||
boatClassCount = 0;
|
||||
}
|
||||
countsPerBoatClass.put(boatClass, boatClassCount++);
|
||||
if (boatClassCount > numberOfCompetitorsInDominantBoatClass) {
|
||||
numberOfCompetitorsInDominantBoatClass = boatClassCount;
|
||||
dominantBoatClass = boatClass;
|
||||
}
|
||||
if (boatClass == null) {
|
||||
boatClass = getBoatClass(competitor.getCompetitorClass());
|
||||
}
|
||||
competitors.add(getCompetitor(rc.getCompetitor()));
|
||||
}
|
||||
result = new RaceDefinitionImpl(race.getName(), course, boatClass, competitors);
|
||||
result = new RaceDefinitionImpl(race.getName(), course, dominantBoatClass, competitors);
|
||||
synchronized (raceCache) {
|
||||
raceCache.put(race, result);
|
||||
raceCache.notifyAll();
|
||||
|
||||
+1
-1
@@ -65,7 +65,7 @@ public class RaceStartedAndFinishedReceiver extends AbstractReceiverWithQueue<Ra
|
||||
DynamicTrackedRace race = trackedEvent.getTrackedRace(raceDefinition);
|
||||
MillisecondsTimePoint start = new MillisecondsTimePoint(event.getB().getStartTime());
|
||||
if (race.getStart() == null || !race.getStart().equals(start)) {
|
||||
race.setStart(start);
|
||||
race.setStartTimeReceived(start);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+6
-1
@@ -26,7 +26,12 @@ public interface DynamicTrackedRace extends TrackedRace {
|
||||
*/
|
||||
void updateMarkPassings(Competitor competitor, Iterable<MarkPassing> markPassings);
|
||||
|
||||
void setStart(TimePoint start);
|
||||
/**
|
||||
* Sets the start time as received from the tracking infrastructure. This isn't necessarily
|
||||
* what {@link #getStart()} will deliver which assumes that the time announced here may be
|
||||
* significantly off.
|
||||
*/
|
||||
void setStartTimeReceived(TimePoint start);
|
||||
|
||||
void setMillisecondsOverWhichToAverageSpeed(long millisecondsOverWhichToAverageSpeed);
|
||||
|
||||
|
||||
@@ -28,8 +28,18 @@ import com.sap.sailing.domain.base.Waypoint;
|
||||
*
|
||||
*/
|
||||
public interface TrackedRace {
|
||||
final long MAX_TIME_BETWEEN_START_AND_FIRST_MARK_PASSING_IN_MILLISECONDS = 30000;
|
||||
|
||||
RaceDefinition getRace();
|
||||
|
||||
/**
|
||||
* Computes the estimated start time for this race. When there are no {@link MarkPassing}s for the first mark, the
|
||||
* start time received from the tracking infrastructure is used. This is also used if there are mark passings for
|
||||
* the first mark and the start time is less than
|
||||
* {@link #MAX_TIME_BETWEEN_START_AND_FIRST_MARK_PASSING_IN_MILLISECONDS} before the first mark passing for the
|
||||
* first mark. Otherwise, the first mark passing for the first mark minus
|
||||
* {@link #MAX_TIME_BETWEEN_START_AND_FIRST_MARK_PASSING_IN_MILLISECONDS} is returned as the race start time.
|
||||
*/
|
||||
TimePoint getStart();
|
||||
|
||||
Iterable<TrackedLeg> getTrackedLegs();
|
||||
|
||||
+3
-3
@@ -52,7 +52,7 @@ public class DynamicTrackedRaceImpl extends TrackedRaceImpl implements
|
||||
track.addGPSFix(fix); // the track notifies this tracked race which in turn notifies its listeners
|
||||
if (getStart() == null || getStart().compareTo(fix.getTimePoint())>0) {
|
||||
// infer race start time from fix; earliest fix received defines start if earlier than assumed start so far
|
||||
setStart(fix.getTimePoint());
|
||||
setStartTimeReceived(fix.getTimePoint());
|
||||
}
|
||||
updated(fix.getTimePoint());
|
||||
}
|
||||
@@ -196,8 +196,8 @@ public class DynamicTrackedRaceImpl extends TrackedRaceImpl implements
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStart(TimePoint start) {
|
||||
super.setStart(start);
|
||||
public void setStartTimeReceived(TimePoint start) {
|
||||
super.setStartTimeReceived(start);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+6
-2
@@ -59,8 +59,12 @@ public class RaceRankComparator implements Comparator<Competitor> {
|
||||
result = o1MarkPassings.last().getTimePoint().compareTo(o2MarkPassings.last().getTimePoint());
|
||||
} else {
|
||||
TrackedLegOfCompetitor o2Leg = trackedRace.getCurrentLeg(o2, timePoint);
|
||||
result = new WindwardToGoComparator(trackedRace.getTrackedLeg(o1Leg.getLeg()), timePoint).compare(
|
||||
o1Leg, o2Leg);
|
||||
if (o2Leg == null) {
|
||||
result = 1; // o1Leg != null, so o1 has started leg already, o2 hasn't
|
||||
} else {
|
||||
result = new WindwardToGoComparator(trackedRace.getTrackedLeg(o1Leg.getLeg()), timePoint)
|
||||
.compare(o1Leg, o2Leg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+28
-4
@@ -3,6 +3,7 @@ package com.sap.sailing.domain.tracking.impl;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -45,7 +46,11 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
|
||||
*/
|
||||
private TimePoint startOfTracking;
|
||||
|
||||
private TimePoint start;
|
||||
/**
|
||||
* Race start time as announced by the tracking infrastructure
|
||||
*/
|
||||
private TimePoint startTimeReceived;
|
||||
|
||||
private TimePoint timePointOfNewestEvent;
|
||||
private TimePoint timePointOfLastEvent;
|
||||
private long updateCount;
|
||||
@@ -142,11 +147,30 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
|
||||
|
||||
@Override
|
||||
public TimePoint getStart() {
|
||||
return start;
|
||||
TimePoint result;
|
||||
Iterator<MarkPassing> markPassingsFirstMarkIter = getMarkPassingsInOrder(getRace().getCourse().getWaypoints().iterator().next()).iterator();
|
||||
if (markPassingsFirstMarkIter.hasNext()) {
|
||||
MarkPassing firstMarkPassingFirstMark = markPassingsFirstMarkIter.next();
|
||||
TimePoint timeOfFirstMarkPassingFirstMark = firstMarkPassingFirstMark.getTimePoint();
|
||||
if (startTimeReceived != null) {
|
||||
long startTimeReceived2timeOfFirstMarkPassingFirstMark = timeOfFirstMarkPassingFirstMark.asMillis() -
|
||||
startTimeReceived.asMillis();
|
||||
if (startTimeReceived2timeOfFirstMarkPassingFirstMark > MAX_TIME_BETWEEN_START_AND_FIRST_MARK_PASSING_IN_MILLISECONDS) {
|
||||
result = new MillisecondsTimePoint(timeOfFirstMarkPassingFirstMark.asMillis() - MAX_TIME_BETWEEN_START_AND_FIRST_MARK_PASSING_IN_MILLISECONDS);
|
||||
} else {
|
||||
result = startTimeReceived;
|
||||
}
|
||||
} else {
|
||||
result = timeOfFirstMarkPassingFirstMark;
|
||||
}
|
||||
} else {
|
||||
result = startTimeReceived;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
protected void setStart(TimePoint start) {
|
||||
this.start = start;
|
||||
protected void setStartTimeReceived(TimePoint start) {
|
||||
this.startTimeReceived = start;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -214,7 +214,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStart(TimePoint start) {
|
||||
public void setStartTimeReceived(TimePoint start) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user