mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-03 10:53:49 +00:00
Merge branch 'master' into spectator
This commit is contained in:
commit
884a655c4c
5 files changed
+71
-159
No files matched your search
+6
@@ -454,4 +454,10 @@ public class MockedTrackedRace implements DynamicTrackedRace {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Distance getDistanceTraveled(Competitor competitor, TimePoint timePoint) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -278,5 +278,7 @@ public interface TrackedRace {
|
||||
boolean raceIsKnownToStartUpwind();
|
||||
|
||||
void addListener(RaceChangeListener listener);
|
||||
|
||||
Distance getDistanceTraveled(Competitor competitor, TimePoint timePoint);
|
||||
|
||||
}
|
||||
+16
@@ -257,6 +257,22 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
|
||||
return trackedLegs.values();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Distance getDistanceTraveled(Competitor competitor, TimePoint timePoint) {
|
||||
NavigableSet<MarkPassing> markPassings = getMarkPassings(competitor);
|
||||
if (markPassings.isEmpty()) {
|
||||
return null;
|
||||
} else {
|
||||
TimePoint end = timePoint;
|
||||
if (markPassings.last().getWaypoint() == getRace().getCourse().getLastWaypoint() &&
|
||||
timePoint.compareTo(markPassings.last().getTimePoint()) > 0) {
|
||||
// competitor has finished race; use time point of crossing the finish line
|
||||
end = markPassings.last().getTimePoint();
|
||||
}
|
||||
return getTrack(competitor).getDistanceTraveled(markPassings.first().getTimePoint(), end);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public GPSFixTrack<Competitor, GPSFixMoving> getTrack(Competitor competitor) {
|
||||
return tracks.get(competitor);
|
||||
|
||||
+3
-2
@@ -253,13 +253,14 @@ implements CompetitorSelectionChangeListener, RaceSelectionChangeListener, TimeL
|
||||
|
||||
private void doLoadData() {
|
||||
final List<CompetitorDTO> competitorsToLoad = new ArrayList<CompetitorDTO>();
|
||||
// Assumption: for those competitors shown in chart we already have all data that's needed (TODO: what to do in live mode?)
|
||||
// Therefore, we only need to load race data for those to be shown but not yet in the chart. Find them:
|
||||
for (CompetitorDTO competitor : competitorSelectionProvider.getAllCompetitors()) {
|
||||
if (isCompetitorVisible(competitor) && !seriesByCompetitor.keySet().contains(competitor)) {
|
||||
competitorsToLoad.add(competitor);
|
||||
}
|
||||
}
|
||||
final CompetitorsAndTimePointsDTO competitorsAndTimePointsToLoad = new CompetitorsAndTimePointsDTO(
|
||||
getStepsToLoad());
|
||||
final CompetitorsAndTimePointsDTO competitorsAndTimePointsToLoad = new CompetitorsAndTimePointsDTO(getStepsToLoad());
|
||||
competitorsAndTimePointsToLoad.setStartTime(getCompetitorsAndTimePointsDTO().getStartTime());
|
||||
competitorsAndTimePointsToLoad.setTimePointOfNewestEvent(getCompetitorsAndTimePointsDTO()
|
||||
.getTimePointOfNewestEvent());
|
||||
|
||||
+44
-157
@@ -1307,6 +1307,36 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private Double getCompetitorRaceDataEntry(DetailType dataType, TrackedRace trackedRace, Competitor competitor,
|
||||
TimePoint timePoint) throws NoWindException {
|
||||
Double result = null;
|
||||
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(competitor, timePoint);
|
||||
if (trackedLeg != null) {
|
||||
switch (dataType) {
|
||||
case CURRENT_SPEED_OVER_GROUND_IN_KNOTS:
|
||||
SpeedWithBearing speedOverGround = trackedLeg.getSpeedOverGround(timePoint);
|
||||
result = (speedOverGround == null) ? null : speedOverGround.getKnots();
|
||||
break;
|
||||
case VELOCITY_MADE_GOOD_IN_KNOTS:
|
||||
Speed velocityMadeGood = trackedLeg.getVelocityMadeGood(timePoint);
|
||||
result = (velocityMadeGood == null) ? null : velocityMadeGood.getKnots();
|
||||
break;
|
||||
case DISTANCE_TRAVELED:
|
||||
Distance distanceTraveled = trackedRace.getDistanceTraveled(competitor, timePoint);
|
||||
result = distanceTraveled == null ? null : distanceTraveled.getMeters();
|
||||
break;
|
||||
case GAP_TO_LEADER_IN_SECONDS:
|
||||
result = trackedLeg.getGapToLeaderInSeconds(timePoint);
|
||||
break;
|
||||
case WINDWARD_DISTANCE_TO_OVERALL_LEADER:
|
||||
Distance distanceToLeader = trackedLeg.getWindwardDistanceToOverallLeader(timePoint);
|
||||
result = (distanceToLeader == null) ? null : distanceToLeader.getMeters();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompetitorInRaceDTO getCompetitorRaceData(RaceIdentifier race,
|
||||
@@ -1318,165 +1348,22 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
for (CompetitorDTO cDTO : competitorAndTimePointsDTO.getCompetitors()) {
|
||||
selectedCompetitors.add(getCompetitorById(trackedRace.getRace().getCompetitors(), cDTO.id));
|
||||
}
|
||||
|
||||
switch (dataType) {
|
||||
case CURRENT_SPEED_OVER_GROUND_IN_KNOTS:
|
||||
for (int c = 0; c < selectedCompetitors.size(); c++) {
|
||||
Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length];
|
||||
for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) {
|
||||
MillisecondsTimePoint time = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getTimePoints()[i]);
|
||||
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
|
||||
if (trackedLeg != null) {
|
||||
SpeedWithBearing speedOverGround = trackedLeg.getSpeedOverGround(time);
|
||||
entries[i] = (speedOverGround == null) ? null : speedOverGround.getKnots();
|
||||
}
|
||||
}
|
||||
CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c];
|
||||
competitorData.setRaceData(competitor, entries);
|
||||
entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length];
|
||||
for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitor).length; i++) {
|
||||
MillisecondsTimePoint time = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getMarkPassings(competitor)[i].getB());
|
||||
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
|
||||
if (trackedLeg != null) {
|
||||
SpeedWithBearing speedOverGround = trackedLeg.getSpeedOverGround(time);
|
||||
entries[i] = (speedOverGround == null) ? null : speedOverGround.getKnots();
|
||||
}
|
||||
}
|
||||
competitorData.setMarkPassingData(competitor, entries);
|
||||
for (CompetitorDTO competitorDTO : competitorAndTimePointsDTO.getCompetitors()) {
|
||||
Competitor competitor = getCompetitorById(trackedRace.getRace().getCompetitors(), competitorDTO.id);
|
||||
Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length];
|
||||
for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) {
|
||||
MillisecondsTimePoint time = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getTimePoints()[i]);
|
||||
entries[i] = getCompetitorRaceDataEntry(dataType, trackedRace, competitor, time);
|
||||
}
|
||||
break;
|
||||
case VELOCITY_MADE_GOOD_IN_KNOTS:
|
||||
for (int c = 0; c < selectedCompetitors.size(); c++) {
|
||||
Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length];
|
||||
for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) {
|
||||
MillisecondsTimePoint time = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getTimePoints()[i]);
|
||||
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
|
||||
if (trackedLeg != null) {
|
||||
Speed velocityMadeGood = trackedLeg.getVelocityMadeGood(time);
|
||||
entries[i] = (velocityMadeGood == null) ? null : velocityMadeGood.getKnots();
|
||||
}
|
||||
}
|
||||
competitorData.setRaceData(competitorAndTimePointsDTO.getCompetitors()[c], entries);
|
||||
CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c];
|
||||
entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length];
|
||||
for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitor).length; i++) {
|
||||
MillisecondsTimePoint time = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getMarkPassings(competitor)[i].getB());
|
||||
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
|
||||
if (trackedLeg != null) {
|
||||
Speed velocityMadeGood = trackedLeg.getVelocityMadeGood(time);
|
||||
entries[i] = (velocityMadeGood == null) ? null : velocityMadeGood.getKnots();
|
||||
}
|
||||
}
|
||||
competitorData.setMarkPassingData(competitor, entries);
|
||||
competitorData.setRaceData(competitorDTO, entries);
|
||||
entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitorDTO).length];
|
||||
for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitorDTO).length; i++) {
|
||||
MillisecondsTimePoint time = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getMarkPassings(competitorDTO)[i].getB());
|
||||
entries[i] = getCompetitorRaceDataEntry(dataType, trackedRace, competitor, time);
|
||||
}
|
||||
break;
|
||||
case DISTANCE_TRAVELED:
|
||||
for (int c = 0; c < selectedCompetitors.size(); c++) {
|
||||
Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length];
|
||||
double distanceOfPreviousLegs = 0;
|
||||
double lastTraveledDistance = 0;
|
||||
for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) {
|
||||
MillisecondsTimePoint time = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getTimePoints()[i]);
|
||||
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
|
||||
if (trackedLeg != null) {
|
||||
Distance distanceTraveled = trackedLeg.getDistanceTraveled(time);
|
||||
if (distanceTraveled != null) {
|
||||
double d = distanceTraveled.getMeters();
|
||||
if (d < lastTraveledDistance) {
|
||||
distanceOfPreviousLegs += lastTraveledDistance;
|
||||
}
|
||||
lastTraveledDistance = d;
|
||||
entries[i] = d + distanceOfPreviousLegs;
|
||||
}
|
||||
}
|
||||
}
|
||||
competitorData.setRaceData(competitorAndTimePointsDTO.getCompetitors()[c], entries);
|
||||
CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c];
|
||||
entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length];
|
||||
for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitor).length; i++) {
|
||||
MillisecondsTimePoint time = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getMarkPassings(competitor)[i].getB());
|
||||
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
|
||||
if (trackedLeg != null) {
|
||||
Distance distanceTraveled = trackedLeg.getDistanceTraveled(time);
|
||||
if (distanceTraveled != null) {
|
||||
double d = distanceTraveled.getMeters();
|
||||
if (d < lastTraveledDistance) {
|
||||
distanceOfPreviousLegs += lastTraveledDistance;
|
||||
}
|
||||
lastTraveledDistance = d;
|
||||
entries[i] = d + distanceOfPreviousLegs;
|
||||
}
|
||||
}
|
||||
}
|
||||
competitorData.setMarkPassingData(competitor, entries);
|
||||
}
|
||||
break;
|
||||
case GAP_TO_LEADER_IN_SECONDS:
|
||||
for (int c = 0; c < selectedCompetitors.size(); c++) {
|
||||
Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length];
|
||||
for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) {
|
||||
MillisecondsTimePoint time = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getTimePoints()[i]);
|
||||
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
|
||||
if (trackedLeg != null) {
|
||||
entries[i] = trackedLeg.getGapToLeaderInSeconds(time);
|
||||
}
|
||||
}
|
||||
competitorData.setRaceData(competitorAndTimePointsDTO.getCompetitors()[c], entries);
|
||||
CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c];
|
||||
entries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length];
|
||||
for (int i = 0; i < competitorAndTimePointsDTO.getMarkPassings(competitor).length; i++) {
|
||||
MillisecondsTimePoint time = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getMarkPassings(competitor)[i].getB());
|
||||
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
|
||||
if (trackedLeg != null) {
|
||||
entries[i] = trackedLeg.getGapToLeaderInSeconds(time);
|
||||
}
|
||||
}
|
||||
competitorData.setMarkPassingData(competitor, entries);
|
||||
}
|
||||
break;
|
||||
case WINDWARD_DISTANCE_TO_OVERALL_LEADER:
|
||||
for (int c = 0; c < selectedCompetitors.size(); c++) {
|
||||
CompetitorDTO competitor = competitorAndTimePointsDTO.getCompetitors()[c];
|
||||
Double[] entries = new Double[competitorAndTimePointsDTO.getTimePoints().length];
|
||||
Double[] markEntries = new Double[competitorAndTimePointsDTO.getMarkPassings(competitor).length];
|
||||
MillisecondsTimePoint markTime = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getMarkPassings(competitor)[0].getB());
|
||||
int markEntryCounter = 0;
|
||||
TrackedLegOfCompetitor trackedLegforMark = trackedRace.getTrackedLeg(selectedCompetitors.get(c),
|
||||
markTime);
|
||||
for (int i = 0; i < competitorAndTimePointsDTO.getTimePoints().length; i++) {
|
||||
MillisecondsTimePoint time = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getTimePoints()[i]);
|
||||
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitors.get(c), time);
|
||||
if (trackedLeg != null) {
|
||||
Distance distanceToLeader = trackedLeg.getWindwardDistanceToOverallLeader(time);
|
||||
entries[i] = (distanceToLeader == null) ? null : distanceToLeader.getMeters();
|
||||
}
|
||||
if (trackedLegforMark != null && markTime.asMillis() > time.asMillis()
|
||||
&& markEntryCounter < competitorAndTimePointsDTO.getMarkPassings(competitor).length) {
|
||||
Distance distanceToLeader = trackedLegforMark.getWindwardDistanceToOverallLeader(markTime);
|
||||
markEntries[markEntryCounter] = (distanceToLeader == null) ? null : distanceToLeader
|
||||
.getMeters();
|
||||
markEntryCounter++;
|
||||
if (markEntryCounter < competitorAndTimePointsDTO.getMarkPassings(competitor).length) {
|
||||
markTime = new MillisecondsTimePoint(
|
||||
competitorAndTimePointsDTO.getMarkPassings(competitor)[markEntryCounter].getB());
|
||||
trackedLegforMark = trackedRace.getTrackedLeg(selectedCompetitors.get(c), markTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
competitorData.setRaceData(competitor, entries);
|
||||
competitorData.setMarkPassingData(competitor, markEntries);
|
||||
}
|
||||
break;
|
||||
competitorData.setMarkPassingData(competitorDTO, entries);
|
||||
}
|
||||
}
|
||||
return competitorData;
|
||||
|
||||
Reference in new issue
Block a user