Merge branch 'gwt' of ssh://git.wdf.sap.corp:29418/SAPSail/sapsailingcapture into gwt

This commit is contained in:
Daniel Brinkmann committed 2011-07-15 17:04:35 +02:00
commit 3706d462cd
3 files changed
+19 -37

No files matched your search

+11 -31
View File
@@ -1,55 +1,35 @@
Axel Axel
==== ====
- Make threshold for track smoothening configurable
- Implement refined version of isValid in GPSFixMovingTrack taking into account the
speed as contained by each individual fix
- consider an array-based implementation of TrackImpl, sorted ascending by time point; inserting - consider an array-based implementation of TrackImpl, sorted ascending by time point; inserting
with a not-maximal time point requires some shifting but should be the rare exception in all our with a not-maximal time point requires some shifting but should be the rare exception in all our
use cases. use cases.
- Need to adjust PartialNavigableSetView to work on any ordered sequential structure - Need to adjust PartialNavigableSetView to work on any ordered sequential structure
- Need synchronization while looping over a course's legs because the course may be updated - Make threshold for track smoothening configurable. Currently, we have millisecondsOverWhichToAverage.
as the loop executes: This is also used as response to getMillisecondsOverWhichToAverageSpeed. Probably, we should at least
additionally have a common way to eliminate impossible or highly unlikely fixes. This could rather be
a configurable speed threshold. Once the outliers have been eliminated, smoothening in terms of
weighted averaging around the time point requested should happen, based on an acceleration model
that eventually could be specific to the boat class. The acceleration model would tell us how to,
e.g., based on splines, interpolate and smoothen what remains from the fixes.
Exception in thread "com.sap.sailing.domain.test.CourseUpdateTest$1" java.util.ConcurrentModificationException - Implement refined version of isValid in GPSFixMovingTrack taking into account the
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372) speed as contained by each individual fix
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at java.util.Collections$UnmodifiableCollection$1.next(Collections.java:1010)
at com.sap.sailing.domain.tracking.impl.TrackedRaceImpl.<init>(TrackedRaceImpl.java:109)
at com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl.<init>(DynamicTrackedRaceImpl.java:39)
at com.sap.sailing.domain.tractracadapter.impl.DomainFactoryImpl.trackRace(DomainFactoryImpl.java:470)
at com.sap.sailing.domain.tractracadapter.impl.RaceCourseReceiver.createTrackedRace(RaceCourseReceiver.java:114)
at com.sap.sailing.domain.tractracadapter.impl.RaceCourseReceiver.handleEvent(RaceCourseReceiver.java:104)
at com.sap.sailing.domain.test.CourseUpdateTest$1.handleEvent(CourseUpdateTest.java:80)
at com.sap.sailing.domain.tractracadapter.impl.AbstractReceiverWithQueue.run(AbstractReceiverWithQueue.java:50)
at java.lang.Thread.run(Thread.java:619)
- Finish a first draft version of a GWT admin UI - Finish a first draft version of a GWT admin UI
* "top" display, with time slider * "top" display, with time slider
* leaderboard page (scrollable!)
* configure one or more leaderboards from a selection of races, adjustable delay per leaderboard * configure one or more leaderboards from a selection of races, adjustable delay per leaderboard
* each leaderboard has its own URL * each leaderboard has its own URL
* wind display * wind display
* edit mode for disqualifications / net / total point adjustments
* store net / total points separately in Mongo, making them overridable in editable copy of leaderboard * store net / total points separately in Mongo, making them overridable in editable copy of leaderboard
* time slider, adjustable delay per leaderboard
* consider a per-user preferences page where leaderboard columns can be personalized at runtime * consider a per-user preferences page where leaderboard columns can be personalized at runtime
* mark position entry capability, supporting "lost mark tracker" use case * mark position entry capability, supporting "lost mark tracker" use case
- New GWT-based leaderboard draft
* generally based on existing leaderboard
* scrollable!
* edit mode for disqualifications / net / total point adjustments
* Google Map integration
* time slider, adjustable delay per leaderboard
- smoothen GPSTracks; if a particular fix seems really off, producing a speed that is beyond
what the boat class could possibly do, ignore the fix because it is obviously a mis-read.
- Distribute wind data to their respective races; capture expedition wind not by race/event anymore because - Distribute wind data to their respective races; capture expedition wind not by race/event anymore because
wind is already recorded by time and position; when seeking wind information, look for information wind is already recorded by time and position; when seeking wind information, look for information
closest in time/space; consider throwing NoWindException if certain thresholds are crossed closest in time/space; consider throwing NoWindException if certain thresholds are crossed
@@ -59,7 +59,7 @@ public class CourseImpl extends NamedImpl implements Course {
} }
@Override @Override
public void addWaypoint(int zeroBasedPosition, Waypoint waypointToAdd) { public synchronized void addWaypoint(int zeroBasedPosition, Waypoint waypointToAdd) {
waypoints.add(zeroBasedPosition, waypointToAdd); waypoints.add(zeroBasedPosition, waypointToAdd);
int legStartWaypointIndex; int legStartWaypointIndex;
if (zeroBasedPosition == waypoints.size()-1) { // added to end if (zeroBasedPosition == waypoints.size()-1) { // added to end
@@ -72,7 +72,7 @@ public class CourseImpl extends NamedImpl implements Course {
} }
@Override @Override
public void removeWaypoint(int zeroBasedPosition) { public synchronized void removeWaypoint(int zeroBasedPosition) {
if (zeroBasedPosition >= 0) { if (zeroBasedPosition >= 0) {
boolean isLast = zeroBasedPosition == waypoints.size()-1; boolean isLast = zeroBasedPosition == waypoints.size()-1;
Waypoint removedWaypoint = waypoints.remove(zeroBasedPosition); Waypoint removedWaypoint = waypoints.remove(zeroBasedPosition);
@@ -147,7 +147,7 @@ public class CourseImpl extends NamedImpl implements Course {
} }
@Override @Override
public Waypoint getWaypointForControlPoint(ControlPoint controlPoint, int start) { public synchronized Waypoint getWaypointForControlPoint(ControlPoint controlPoint, int start) {
if (start > legs.size()) { if (start > legs.size()) {
throw new IllegalArgumentException("Starting to search beyond end of course: "+start+" vs. "+(legs.size()+1)); throw new IllegalArgumentException("Starting to search beyond end of course: "+start+" vs. "+(legs.size()+1));
} }
@@ -106,8 +106,11 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
} }
} }
trackedLegs = new LinkedHashMap<Leg, TrackedLeg>(); trackedLegs = new LinkedHashMap<Leg, TrackedLeg>();
for (Leg leg : race.getCourse().getLegs()) { synchronized (race.getCourse()) {
trackedLegs.put(leg, createTrackedLeg(leg)); for (Leg leg : race.getCourse().getLegs()) {
trackedLegs.put(leg, createTrackedLeg(leg));
}
getRace().getCourse().addCourseListener(this);
} }
markPassingsForCompetitor = new HashMap<Competitor, NavigableSet<MarkPassing>>(); markPassingsForCompetitor = new HashMap<Competitor, NavigableSet<MarkPassing>>();
tracks = new HashMap<Competitor, GPSFixTrack<Competitor, GPSFixMoving>>(); tracks = new HashMap<Competitor, GPSFixTrack<Competitor, GPSFixMoving>>();
@@ -125,7 +128,6 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
} }
currentWindSource = WindSource.EXPEDITION; currentWindSource = WindSource.EXPEDITION;
competitorRankings = new HashMap<TimePoint, List<Competitor>>(); competitorRankings = new HashMap<TimePoint, List<Competitor>>();
getRace().getCourse().addCourseListener(this);
} }
/** /**