Merge remote-tracking branch 'origin/master'

This commit is contained in:
Fredrik Teschke committed 2014-05-19 00:05:10 +02:00
commit d982116d3d
21 files changed
+1600 -144

No files matched your search

@@ -28,7 +28,7 @@ public class NaturalComparator implements Comparator<String> {
public int compare(String a, String b) {
if (!caseSensitive){
a = a.toLowerCase();
b = a.toLowerCase();
b = b.toLowerCase();
}
int result = 0;
int aIndex = 0;
@@ -69,7 +69,9 @@ public class LockUtil {
/**
* Counts the "virtual" locks. A "virtual" lock is obtained if and only if at the time of calling
* {@link #lockForRead(NamedReentrantReadWriteLock)} or {@link #lockForWrite(NamedReentrantReadWriteLock)} the
* respective lock has a positive {@link #propagationCounts propagation count} for the current thread.
* respective lock has a positive {@link #propagationCounts propagation count} for the current thread. Entries
* always have a positive integer value. {@link #decrement(Lock, Map)} removes entries whose integer count would
* go to 0.
*/
private static final Map<Thread, Map<Lock, Integer>> virtualLockCounts = new ConcurrentWeakHashMap<Thread, Map<Lock, Integer>>();
@@ -141,10 +143,7 @@ public class LockUtil {
}
public static void unlockAfterWrite(NamedReentrantReadWriteLock lock) {
Map<Lock, Integer> currentThreadPropagationCounts = getCurrentThreadsPropagationCounts();
synchronized (currentThreadPropagationCounts) {
unlockVirtuallyOrActually(lock, lock.writeLock());
}
unlockVirtuallyOrActually(lock, lock.writeLock());
final TimePoint timePointWriteLockWasObtained;
timePointWriteLockWasObtained = lastTimeWriteLockWasObtained.get(lock);
if (timePointWriteLockWasObtained == null) {
@@ -165,10 +165,18 @@ public class NamedReentrantReadWriteLock extends ReentrantReadWriteLock implemen
return readLockWrapper;
}
/**
* Contains the threads currently holding a read lock. Each thread is contained as many times as it
* successfully acquired the read lock re-entrantly.
*/
public List<Thread> getReaders() {
return new ArrayList<Thread>(readers);
}
/**
* @return <code>null</code> if the write lock is not currently held by any thread; the thread holding the write
* lock otherwise.
*/
public Thread getWriter() {
return getOwner();
}
@@ -328,50 +328,58 @@ public class SwissTimingRaceTrackerImpl extends AbstractRaceTrackerImpl implemen
assert this.raceID.equals(raceID);
if (isTrackedRaceStillReachable()) {
Competitor competitor = getCompetitorByBoatIDAndRaceIDOrBoatClass(boatID, raceID, boatClass);
// the list of mark indices and time stamps is partial and usually only shows the last mark passing;
// we need to use this to *update* the competitor's mark passings list, not *replace* it
TreeMap<Integer, MarkPassing> markPassingsByMarkIndex = new TreeMap<Integer, MarkPassing>();
// now fill with the already existing mark passings for the competitor identified by boatID...
NavigableSet<MarkPassing> markPassings = trackedRace.getMarkPassings(competitor);
trackedRace.lockForRead(markPassings);
try {
for (MarkPassing markPassing : markPassings) {
markPassingsByMarkIndex.put(
trackedRace.getRace().getCourse().getIndexOfWaypoint(markPassing.getWaypoint()),
markPassing);
if (competitor == null) {
logger.info("Received timing data for boat ID " + boatID + " in race " + raceID
+ " but couldn't find a competitor with that boat ID in this race. Ignoring.");
} else {
// the list of mark indices and time stamps is partial and usually only shows the last mark passing;
// we need to use this to *update* the competitor's mark passings list, not *replace* it
TreeMap<Integer, MarkPassing> markPassingsByMarkIndex = new TreeMap<Integer, MarkPassing>();
// now fill with the already existing mark passings for the competitor identified by boatID...
NavigableSet<MarkPassing> markPassings = trackedRace.getMarkPassings(competitor);
trackedRace.lockForRead(markPassings);
try {
for (MarkPassing markPassing : markPassings) {
markPassingsByMarkIndex.put(
trackedRace.getRace().getCourse().getIndexOfWaypoint(markPassing.getWaypoint()),
markPassing);
}
} finally {
trackedRace.unlockAfterRead(markPassings);
}
} finally {
trackedRace.unlockAfterRead(markPassings);
}
// ...and then overwrite those for which we received "new evidence"
for (Triple<Integer, Integer, Long> markIndexRankAndTimeSinceStartInMilliseconds : markIndicesRanksAndTimesSinceStartInMilliseconds) {
Waypoint waypoint = Util.get(trackedRace.getRace().getCourse().getWaypoints(),
markIndexRankAndTimeSinceStartInMilliseconds.getA());
// If the rank and time information is empty, we interpret this by clearing the mark rounding if any (see
// also bug 1911):
if (markIndexRankAndTimeSinceStartInMilliseconds.getC() == null) {
markPassingsByMarkIndex.remove(markIndexRankAndTimeSinceStartInMilliseconds.getA());
} else {
// update mark passing only if we have a start time; guessed start times don't make sense and
// for the start line would lead subsequent calls to getStartOfRace() return that guessed start time
// which then cannot be identified as "guessed" anymore...
if (trackedRace.getStartOfRace() != null) {
final TimePoint startTime = trackedRace.getStartOfRace();
MillisecondsTimePoint timePoint = new MillisecondsTimePoint(startTime.asMillis()
+ markIndexRankAndTimeSinceStartInMilliseconds.getC());
MarkPassing markPassing = domainFactory.createMarkPassing(timePoint, waypoint,
getCompetitorByBoatIDAndRaceIDOrBoatClass(boatID, raceID, boatClass));
markPassingsByMarkIndex.put(markIndexRankAndTimeSinceStartInMilliseconds.getA(), markPassing);
// ...and then overwrite those for which we received "new evidence"
for (Triple<Integer, Integer, Long> markIndexRankAndTimeSinceStartInMilliseconds : markIndicesRanksAndTimesSinceStartInMilliseconds) {
Waypoint waypoint = Util.get(trackedRace.getRace().getCourse().getWaypoints(),
markIndexRankAndTimeSinceStartInMilliseconds.getA());
// If the rank and time information is empty, we interpret this by clearing the mark rounding if any
// (see
// also bug 1911):
if (markIndexRankAndTimeSinceStartInMilliseconds.getC() == null) {
markPassingsByMarkIndex.remove(markIndexRankAndTimeSinceStartInMilliseconds.getA());
} else {
//
logger.warning("Received mark passing with time relative to start of race "
+ trackedRace.getRace().getName() + " before having received a race start time."
+ " Queueing message for re-application when a start time has been received.");
tmdMessageQueue.enqueue(raceID, boatID, markIndicesRanksAndTimesSinceStartInMilliseconds);
// update mark passing only if we have a start time; guessed start times don't make sense and
// for the start line would lead subsequent calls to getStartOfRace() return that guessed start
// time
// which then cannot be identified as "guessed" anymore...
if (trackedRace.getStartOfRace() != null) {
final TimePoint startTime = trackedRace.getStartOfRace();
MillisecondsTimePoint timePoint = new MillisecondsTimePoint(startTime.asMillis()
+ markIndexRankAndTimeSinceStartInMilliseconds.getC());
MarkPassing markPassing = domainFactory.createMarkPassing(timePoint, waypoint,
getCompetitorByBoatIDAndRaceIDOrBoatClass(boatID, raceID, boatClass));
markPassingsByMarkIndex.put(markIndexRankAndTimeSinceStartInMilliseconds.getA(),
markPassing);
} else {
//
logger.warning("Received mark passing with time relative to start of race "
+ trackedRace.getRace().getName() + " before having received a race start time."
+ " Queueing message for re-application when a start time has been received.");
tmdMessageQueue.enqueue(raceID, boatID, markIndicesRanksAndTimesSinceStartInMilliseconds);
}
}
}
trackedRace.updateMarkPassings(competitor, markPassingsByMarkIndex.values());
}
trackedRace.updateMarkPassings(competitor, markPassingsByMarkIndex.values());
} else {
if (!loggedIgnore) {
logger.info("Ignoring timing data " + markIndicesRanksAndTimesSinceStartInMilliseconds + " for SwissTiming race " + raceID
@@ -103,37 +103,49 @@ public class TMDMessageQueue {
TMDMessageContents messageContents = i.next();
Competitor competitor = raceTracker.getCompetitorByBoatIDAndRaceIDOrBoatClass(messageContents.getBoatID(),
messageContents.getRaceID(), raceTracker.getBoatClass());
NavigableSet<MarkPassing> oldMarkPassings = trackedRace.getMarkPassings(competitor);
TreeMap<Integer, MarkPassing> cleansedMarkPassingsForCompetitor = cleansedMarkPassings.get(competitor);
if (cleansedMarkPassingsForCompetitor == null) {
cleansedMarkPassingsForCompetitor = new TreeMap<>();
cleansedMarkPassings.put(competitor, cleansedMarkPassingsForCompetitor);
Course course = trackedRace.getRace().getCourse();
course.lockForRead();
try {
trackedRace.lockForRead(oldMarkPassings);
if (competitor == null) {
logger.info("Received timing data for boat ID " + messageContents.getBoatID() + " in race " + messageContents.getRaceID()
+ " but couldn't find a competitor with that boat ID in this race. Ignoring.");
} else {
NavigableSet<MarkPassing> oldMarkPassings = trackedRace.getMarkPassings(competitor);
TreeMap<Integer, MarkPassing> cleansedMarkPassingsForCompetitor = cleansedMarkPassings.get(competitor);
if (cleansedMarkPassingsForCompetitor == null) {
cleansedMarkPassingsForCompetitor = new TreeMap<>();
cleansedMarkPassings.put(competitor, cleansedMarkPassingsForCompetitor);
Course course = trackedRace.getRace().getCourse();
course.lockForRead();
try {
for (MarkPassing oldMarkPassing : oldMarkPassings) {
int waypointIndex = course.getIndexOfWaypoint(oldMarkPassing.getWaypoint());
cleansedMarkPassingsForCompetitor.put(waypointIndex, oldMarkPassing);
trackedRace.lockForRead(oldMarkPassings);
try {
for (MarkPassing oldMarkPassing : oldMarkPassings) {
int waypointIndex = course.getIndexOfWaypoint(oldMarkPassing.getWaypoint());
cleansedMarkPassingsForCompetitor.put(waypointIndex, oldMarkPassing);
}
} finally {
trackedRace.unlockAfterRead(oldMarkPassings);
}
} finally {
trackedRace.unlockAfterRead(oldMarkPassings);
course.unlockAfterRead();
}
} finally {
course.unlockAfterRead();
}
}
// remove those mark passings for which the TMD message has mark passing times; their time points would just have been guessed.
// This will avoid that the start time inference
// rules consider them and let them take precedence over the start time received
for (Triple<Integer, Integer, Long> markIndexRankAndTimeSinceStartInMilliseconds : messageContents.getMarkIndicesRanksAndTimesSinceStartInMilliseconds()) {
if (cleansedMarkPassingsForCompetitor.containsKey(markIndexRankAndTimeSinceStartInMilliseconds.getA())) {
logger.info("Removing mark passing for mark #"+markIndexRankAndTimeSinceStartInMilliseconds.getA()+
" for competitor "+competitor.getName()+" because its time point "+
cleansedMarkPassingsForCompetitor.get(markIndexRankAndTimeSinceStartInMilliseconds.getA()).getTimePoint()+
" was guessed; will replace momentarily...");
cleansedMarkPassingsForCompetitor.remove(markIndexRankAndTimeSinceStartInMilliseconds.getA());
// remove those mark passings for which the TMD message has mark passing times; their time points would
// just have been guessed.
// This will avoid that the start time inference
// rules consider them and let them take precedence over the start time received
for (Triple<Integer, Integer, Long> markIndexRankAndTimeSinceStartInMilliseconds : messageContents
.getMarkIndicesRanksAndTimesSinceStartInMilliseconds()) {
if (cleansedMarkPassingsForCompetitor.containsKey(markIndexRankAndTimeSinceStartInMilliseconds
.getA())) {
logger.info("Removing mark passing for mark #"
+ markIndexRankAndTimeSinceStartInMilliseconds.getA()
+ " for competitor "
+ competitor.getName()
+ " because its time point "
+ cleansedMarkPassingsForCompetitor.get(
markIndexRankAndTimeSinceStartInMilliseconds.getA()).getTimePoint()
+ " was guessed; will replace momentarily...");
cleansedMarkPassingsForCompetitor.remove(markIndexRankAndTimeSinceStartInMilliseconds.getA());
}
}
}
}
@@ -0,0 +1,582 @@
stored-uri:datafiles/event_20140429_ESSQingdao-Race_29.mtb
StartReplay:1
// Input from params_static:
// Input from event_parameters:
CompMarkerUUID:1
CodanIsSponsor:0
DefaultTailLength:60
APzoomChangeTime:2500
disableAutoProduce:0
autoProduce:0
APstartLineShowOfLeg:0.25
APsideOfStartLine:0.30
APstartSwitch:0.8
APwholeLegBehindMarks:0.15
APmarkSwitch:0.13
APmarkZoomBehindMarks:0.10
APmarkZoomInFrontOfMarks:0.20
PopupMarkerUUID:2
ManualUrl:http://www.tractrac.com/files/userguide_sailing.pdf
//live-uri:tcp://192.168.1.203:4400
//stored-uri:tcp://192.168.1.203:4401
Marker1UUID:1
Marker1Type:RGBMarkerFactory
Marker1Directional:1
Marker1Image:markers/boat_FF0000_big.png
Marker1Length:5
Marker1MinPixelSize:30
Startlocation:120.38632089843748,36.049596263422494
MaxDiffTime:1200
MaxMetersPerSecond:20
PrecisionMeters:20
ShortAvgTime:180
LongAvgTime:900
TimeZone:8
CompMarkerTimeout:60
FramesPerSecond:8
replayspeedup:5
MatchRaceClock:0
MatchRaceClockNo:3
MatchRaceClockSpacing:300
Minimap:1
MinimapUseLayers:2
Minimapgeorect:120.36068115234377,36.06814954054894,120.41175086669921,36.03604889362103
MinimapMarkerUUID:2
Marker4UUID:2
Marker4Type:RGBmarkerFactory
Marker4Directional:1
Marker4Image:markers/boat_FF0000_small.png
MetersPerPixel:18
MetersPerPixelMax:30
MetersPerPixelMin:0.2
isMatchRace:0
DefaultDistanceUnits:meters
weatherEnabled:0
DefaultSpeedUnits:KmH
showRaceClock:1
BackGroundImage:graphics/background.jpg
DisableRotation:0
ControlPointMarkerRadius:13
disableselection:0
disableleaderline:0
DisableChangeRace:0
PopUpRow1Name:
PopUpRow1Type:Name
PopUpRow2Name:Knots
PopUpRow2Type:BoatSpeed
PopUpRow3Name:Ranking
PopUpRow3Type:RowNumber
PopUpRow4Name:Sail
PopUpRow4Type:Ini
PopUpRow5Name:After
PopUpRow5Type:BoatAfter
ResultColumn1Name:#
ResultColumn1Size:20
ResultColumn1Type:RowNumber
ResultColumn2Name:sail
ResultColumn2Size:45
ResultColumn2Type:Ini
ResultColumn3Name:name
ResultColumn3Size:110
ResultColumn3Type:Name
ResultColumn4Name:after
ResultColumn4Size:45
ResultColumn4Type:BoatAfter
ResultColumn5Name:kts
ResultColumn5Size:40
ResultColumn5Type:BoatSpeed
DisableLeaderboard:0
DisableAnalysis:0
TableFontSize:11
compInitialsFontSize:11
AutoRotate:0
MassStart:0
SegmentFile:segments.php
StartType:Mass
ReCalcDirAndSpeed:0
RaceHandicapSystem:NONE
TeamCompetitionType:NONE
LiveDelaySecs: 8
//-------- AUTO GENERATED PARAMETERS START ----------------
EventID:8b85f120-ada6-0131-e74f-60a44ce903c3
EventName:ESS Qingdao 2014
EventDB:event_20140429_ESSQingdao
EventStartTime:2014-04-28 16:01:00
EventEndTime:2014-05-04 15:00:00
EventType:a1b74ca0-fdd8-11dc-8811-005056c00008
RaceID:f6ec0720-b56d-0131-1f9f-10b11c4ed8fd
RaceName:Race 29
RaceStartTime:2014-05-04 07:47:59
RaceEndTime:
RaceTrackingStartTime:2014-05-04 07:43:59
RaceTrackingEndTime:2014-05-04 08:00:13
RaceDefaultRouteUUID:f6e91fa0-b56d-0131-1f9e-10b11c4ed8fd
RaceHandicapSystem:NONE
Image1UUID:64a7b348-83db-11e2-88c0-10bf48d758ce
Image1Type:Logo
Image1Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SUI.gif
Image1Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SUI.gif
Image2UUID:64c3a8fa-83db-11e2-88c0-10bf48d758ce
Image2Type:Logo
Image2Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NZL.gif
Image2Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NZL.gif
Image3UUID:651130a2-83db-11e2-88c0-10bf48d758ce
Image3Type:Logo
Image3Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/KOR.gif
Image3Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/KOR.gif
Image4UUID:653c1ab0-83db-11e2-88c0-10bf48d758ce
Image4Type:Logo
Image4Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUT.gif
Image4Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUT.gif
Image5UUID:65637da8-83db-11e2-88c0-10bf48d758ce
Image5Type:Logo
Image5Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/DEN.gif
Image5Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/DEN.gif
Image6UUID:65875138-83db-11e2-88c0-10bf48d758ce
Image6Type:Logo
Image6Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/OMN.gif
Image6Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/OMN.gif
Class1UUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Class1Name:Extreme40
Team1UUID:649f1dbe-83db-11e2-88c0-10bf48d758ce
Team1Name:TeamA
Team2UUID:64bf0854-83db-11e2-88c0-10bf48d758ce
Team2Name:TeamB
Team3UUID:64dd7988-83db-11e2-88c0-10bf48d758ce
Team3Name:TeamC
Team3Comp1UUID:64da7c24-83db-11e2-88c0-10bf48d758ce
Team4UUID:64ffc402-83db-11e2-88c0-10bf48d758ce
Team4Name:TeamD
Team5UUID:65351d82-83db-11e2-88c0-10bf48d758ce
Team5Name:TeamE
Team6UUID:655ed82a-83db-11e2-88c0-10bf48d758ce
Team6Name:TeamF
Team6Comp1UUID:655bd56c-83db-11e2-88c0-10bf48d758ce
Team7UUID:65829fa8-83db-11e2-88c0-10bf48d758ce
Team7Name:TeamG
Team8UUID:e4459a20-83db-11e2-88c0-10bf48d758ce
Team8Name:TeamH
Team8Comp1UUID:e442a414-83db-11e2-88c0-10bf48d758ce
Team9UUID:a73aabc0-d6d6-0130-8be2-60a44ce903c3
Team9Name:TeamI
Team9Comp1UUID:93085e80-7ad9-0131-e5b3-60a44ce903c3
Team10UUID:bbf81f60-d6d6-0130-8be3-60a44ce903c3
Team10Name:TeamJ
Team10Comp1UUID:f097f4f0-7ad9-0131-e5b4-60a44ce903c3
Team11UUID:65659280-eda3-0130-c5c0-10b11c4ed8fd
Team11Name:TeamK
Team12UUID:9ee14560-77af-0131-e5af-60a44ce903c3
Team12Name:TeamL
Team13UUID:b9677300-7ad7-0131-e5b0-60a44ce903c3
Team13Name:TeamM
Team13Comp1UUID:84e68b70-7ada-0131-e5b7-60a44ce903c3
Team14UUID:c9689a00-7ad7-0131-e5b1-60a44ce903c3
Team14Name:TeamN
Team15UUID:d5712f30-7ad7-0131-e5b2-60a44ce903c3
Team15Name:TeamO
Comp1UUID:64da7c24-83db-11e2-88c0-10bf48d758ce
Comp1Name:Realteam by Realstone
Comp1NameShort:Realstone
Comp1Color:000000
Comp1Nationality:AFG
Comp1Description:
Comp1Handicap:1.0000000000
Comp1HandicapDistance:0.00000
Comp1StartTime:2014-05-04 07:47:59
Comp1PictureUUID:64a7b348-83db-11e2-88c0-10bf48d758ce
Comp1ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp1RouteUUID:f6e91fa0-b56d-0131-1f9e-10b11c4ed8fd
Comp2UUID:655bd56c-83db-11e2-88c0-10bf48d758ce
Comp2Name:SAP Extreme Sailing Team
Comp2NameShort:SAP
Comp2Color:FFFFFF
Comp2Nationality:DEN
Comp2Description:
Comp2Handicap:1.0000000000
Comp2HandicapDistance:0.00000
Comp2StartTime:2014-05-04 07:47:59
Comp2PictureUUID:65637da8-83db-11e2-88c0-10bf48d758ce
Comp2ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp2RouteUUID:f6e91fa0-b56d-0131-1f9e-10b11c4ed8fd
Comp3UUID:e442a414-83db-11e2-88c0-10bf48d758ce
Comp3Name:Invite
Comp3NameShort:Invite
Comp3Color:FFFF00
Comp3Nationality:SIN
Comp3Description:
Comp3Handicap:1.0000000000
Comp3HandicapDistance:0.00000
Comp3StartTime:2014-05-04 07:47:59
Comp3ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp3RouteUUID:f6e91fa0-b56d-0131-1f9e-10b11c4ed8fd
Comp4UUID:93085e80-7ad9-0131-e5b3-60a44ce903c3
Comp4Name:Emirates Team New Zealand
Comp4NameShort:Emirates NZ
Comp4Color:CC9900
Comp4Nationality:NZL
Comp4Description:
Comp4Handicap:1.0000000000
Comp4HandicapDistance:0.00000
Comp4StartTime:2014-05-04 07:47:59
Comp4PictureUUID:64c3a8fa-83db-11e2-88c0-10bf48d758ce
Comp4ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp4RouteUUID:f6e91fa0-b56d-0131-1f9e-10b11c4ed8fd
Comp5UUID:f097f4f0-7ad9-0131-e5b4-60a44ce903c3
Comp5Name:Gazprom Team Russia
Comp5NameShort:Team Russia
Comp5Color:999900
Comp5Nationality:RUS
Comp5Description:
Comp5Handicap:1.0000000000
Comp5HandicapDistance:0.00000
Comp5StartTime:2014-05-04 07:47:59
Comp5ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp5RouteUUID:f6e91fa0-b56d-0131-1f9e-10b11c4ed8fd
Comp6UUID:84e68b70-7ada-0131-e5b7-60a44ce903c3
Comp6Name:Oman Air
Comp6NameShort:Oman Air
Comp6Color:CCFF99
Comp6Nationality:OMA
Comp6Description:
Comp6Handicap:1.0000000000
Comp6HandicapDistance:0.00000
Comp6StartTime:2014-05-04 07:47:59
Comp6PictureUUID:65875138-83db-11e2-88c0-10bf48d758ce
Comp6ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp6RouteUUID:f6e91fa0-b56d-0131-1f9e-10b11c4ed8fd
ControlPoint1UUID:1100ea60-7adb-0131-e5b8-60a44ce903c3
ControlPoint1Name:Red-Green
ControlPoint1HasTwoPoints:1
ControlPoint1ShortName:RG
ControlPoint1DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Red###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=Red###BREAKLINE###P1.UUID=5427c7d2-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Green###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Green###BREAKLINE###P2.UUID=785c3e44-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint1Mark1Lon:120.383118
ControlPoint1Mark1Lat:36.055012
ControlPoint1Mark2Lon:120.379540
ControlPoint1Mark2Lat:36.057548
ControlPoint2UUID:1286f15e-83be-11e2-88c0-10bf48d758ce
ControlPoint2Name:Blue
ControlPoint2HasTwoPoints:0
ControlPoint2ShortName:Bl
ControlPoint2DataSheet:Name=Blue###BREAKLINE###Type=Buoy###BREAKLINE###Color=Blue###BREAKLINE###Shape=Conical
ControlPoint2Mark1Lon:120.380615
ControlPoint2Mark1Lat:36.057808
ControlPoint3UUID:1a94c6a0-7adc-0131-e5f4-60a44ce903c3
ControlPoint3Name:Black Conical-Blue
ControlPoint3HasTwoPoints:1
ControlPoint3ShortName:BB
ControlPoint3DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Conical###BREAKLINE###P1.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Blue###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Blue###BREAKLINE###P2.UUID=1286f15e-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint3Mark1Lon:120.381707
ControlPoint3Mark1Lat:36.054402
ControlPoint3Mark2Lon:120.380615
ControlPoint3Mark2Lat:36.057808
ControlPoint4UUID:2dc7d9d0-7b84-0131-b9c3-10b11c4ed8fd
ControlPoint4Name:Black Cylinder - Black Conical
ControlPoint4HasTwoPoints:1
ControlPoint4ShortName:BB
ControlPoint4DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Cylinder###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Cylinder###BREAKLINE###P1.UUID=b153dfd6-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Pattern=Checkered###BREAKLINE###P2.Name=Black Conical###BREAKLINE###P2.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce
ControlPoint4Mark1Lon:120.384185
ControlPoint4Mark1Lat:36.054085
ControlPoint4Mark2Lon:120.381707
ControlPoint4Mark2Lat:36.054402
ControlPoint5UUID:2e37b410-7adc-0131-e5fe-60a44ce903c3
ControlPoint5Name:Black Conical-Yellow
ControlPoint5HasTwoPoints:1
ControlPoint5ShortName:BY
ControlPoint5DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Conical###BREAKLINE###P1.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Yellow###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Yellow###BREAKLINE###P2.UUID=3fdd2402-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint5Mark1Lon:120.381707
ControlPoint5Mark1Lat:36.054402
ControlPoint5Mark2Lon:120.383560
ControlPoint5Mark2Lat:36.056408
ControlPoint6UUID:3240586c-83c0-11e2-88c0-10bf48d758ce
ControlPoint6Name:Finish Pole
ControlPoint6HasTwoPoints:0
ControlPoint6ShortName:F
ControlPoint6DataSheet:Color=Black###BREAKLINE###Type=Landmark###BREAKLINE###Name=Finish Pole
ControlPoint6Mark1Lon:120.382858
ControlPoint6Mark1Lat:36.052662
ControlPoint7UUID:37cb36e0-7adb-0131-e5c2-60a44ce903c3
ControlPoint7Name:Red-Blue
ControlPoint7HasTwoPoints:1
ControlPoint7ShortName:RB
ControlPoint7DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Red###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=Red###BREAKLINE###P1.UUID=5427c7d2-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Blue###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Blue###BREAKLINE###P2.UUID=1286f15e-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint7Mark1Lon:120.383118
ControlPoint7Mark1Lat:36.055012
ControlPoint7Mark2Lon:120.380615
ControlPoint7Mark2Lat:36.057808
ControlPoint8UUID:3e6c1c94-83bf-11e2-88c0-10bf48d758ce
ControlPoint8Name:Race Committee
ControlPoint8HasTwoPoints:0
ControlPoint8ShortName:RC
ControlPoint8DataSheet:Type=StartBoat###BREAKLINE###Name=Race Committee
ControlPoint8Mark1Lon:120.383445
ControlPoint8Mark1Lat:36.055175
ControlPoint9UUID:3fdd2402-83be-11e2-88c0-10bf48d758ce
ControlPoint9Name:Yellow
ControlPoint9HasTwoPoints:0
ControlPoint9ShortName:Y
ControlPoint9DataSheet:Type=Buoy###BREAKLINE###Color=Yellow###BREAKLINE###Shape=Conical###BREAKLINE###Name=Yellow
ControlPoint9Mark1Lon:120.383560
ControlPoint9Mark1Lat:36.056408
ControlPoint10UUID:4c304720-7adc-0131-e608-60a44ce903c3
ControlPoint10Name:Black Conical-Red
ControlPoint10HasTwoPoints:1
ControlPoint10ShortName:BR
ControlPoint10DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Conical###BREAKLINE###P1.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Red###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Red###BREAKLINE###P2.UUID=5427c7d2-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint10Mark1Lon:120.381707
ControlPoint10Mark1Lat:36.054402
ControlPoint10Mark2Lon:120.383118
ControlPoint10Mark2Lat:36.055012
ControlPoint11UUID:4e0c2a90-7adb-0131-e5cc-60a44ce903c3
ControlPoint11Name:Red-Yellow
ControlPoint11HasTwoPoints:1
ControlPoint11ShortName:RY
ControlPoint11DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Red###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=Red###BREAKLINE###P1.UUID=5427c7d2-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Yellow###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Yellow###BREAKLINE###P2.UUID=3fdd2402-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint11Mark1Lon:120.383118
ControlPoint11Mark1Lat:36.055012
ControlPoint11Mark2Lon:120.383560
ControlPoint11Mark2Lat:36.056408
ControlPoint12UUID:5427c7d2-83be-11e2-88c0-10bf48d758ce
ControlPoint12Name:Red
ControlPoint12HasTwoPoints:0
ControlPoint12ShortName:R
ControlPoint12DataSheet:Type=Buoy###BREAKLINE###Color=Red###BREAKLINE###Shape=Conical###BREAKLINE###Name=Red
ControlPoint12Mark1Lon:120.383118
ControlPoint12Mark1Lat:36.055012
ControlPoint13UUID:584cfe30-b328-0131-5246-10b11c4ed8fd
ControlPoint13Name:R2-Green
ControlPoint13HasTwoPoints:0
ControlPoint13ShortName:G
ControlPoint13DataSheet:Name=Green
ControlPoint13Mark1Lon:120.386972
ControlPoint13Mark1Lat:36.046795
ControlPoint14UUID:621831d0-7adc-0131-e612-60a44ce903c3
ControlPoint14Name:Black Conical-Green
ControlPoint14HasTwoPoints:1
ControlPoint14ShortName:BG
ControlPoint14DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Conical###BREAKLINE###P1.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Green###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Green###BREAKLINE###P2.UUID=785c3e44-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint14Mark1Lon:120.381707
ControlPoint14Mark1Lat:36.054402
ControlPoint14Mark2Lon:120.379540
ControlPoint14Mark2Lat:36.057548
ControlPoint15UUID:77b9e620-7adb-0131-e5d6-60a44ce903c3
ControlPoint15Name:Green-Blue
ControlPoint15HasTwoPoints:1
ControlPoint15ShortName:GB
ControlPoint15DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Green###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=Green###BREAKLINE###P1.UUID=785c3e44-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Blue###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Blue###BREAKLINE###P2.UUID=1286f15e-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint15Mark1Lon:120.379540
ControlPoint15Mark1Lat:36.057548
ControlPoint15Mark2Lon:120.380615
ControlPoint15Mark2Lat:36.057808
ControlPoint16UUID:785c3e44-83be-11e2-88c0-10bf48d758ce
ControlPoint16Name:Green
ControlPoint16HasTwoPoints:0
ControlPoint16ShortName:G
ControlPoint16DataSheet:Type=Buoy###BREAKLINE###Color=Green###BREAKLINE###Shape=Conical###BREAKLINE###Name=Green
ControlPoint16Mark1Lon:120.379540
ControlPoint16Mark1Lat:36.057548
ControlPoint17UUID:7d9d1730-b3e8-0131-1d10-10b11c4ed8fd
ControlPoint17Name:Race Committee - Finish Pole
ControlPoint17HasTwoPoints:1
ControlPoint17ShortName:RF
ControlPoint17DataSheet:P1.Type=StartBoat###BREAKLINE###P1.Name=Race Committee###BREAKLINE###P1.UUID=3e6c1c94-83bf-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Type=Landmark###BREAKLINE###P2.Name=Finish Pole###BREAKLINE###P2.UUID=3240586c-83c0-11e2-88c0-10bf48d758ce
ControlPoint17Mark1Lon:120.383445
ControlPoint17Mark1Lat:36.055175
ControlPoint17Mark2Lon:120.382858
ControlPoint17Mark2Lat:36.052662
ControlPoint18UUID:7e1b7a80-7d0b-0131-a109-10b11c4ed8fd
ControlPoint18Name:Black Gate
ControlPoint18HasTwoPoints:1
ControlPoint18ShortName:S
ControlPoint18DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Cylinder###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Cylinder###BREAKLINE###P1.UUID=b153dfd6-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Pattern=Checkered###BREAKLINE###P2.Name=Black Conical###BREAKLINE###P2.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint18Mark1Lon:103.855782
ControlPoint18Mark1Lat:1.282103
ControlPoint18Mark2Lon:103.857560
ControlPoint18Mark2Lat:1.286382
ControlPoint19UUID:88ef6d40-7adc-0131-e61c-60a44ce903c3
ControlPoint19Name:Finish Pole-Cylinder
ControlPoint19HasTwoPoints:1
ControlPoint19ShortName:F
ControlPoint19DataSheet:P1.Color=Black###BREAKLINE###P1.Type=Landmark###BREAKLINE###P1.Name=Finish Pole###BREAKLINE###P1.UUID=3240586c-83c0-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Shape=Cylinder###BREAKLINE###P2.Pattern=Checkered###BREAKLINE###P2.Name=Black Cylinder###BREAKLINE###P2.UUID=b153dfd6-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint19Mark1Lon:120.382858
ControlPoint19Mark1Lat:36.052662
ControlPoint19Mark2Lon:120.384185
ControlPoint19Mark2Lat:36.054085
ControlPoint20UUID:8f9a4ee0-7adb-0131-e5e0-60a44ce903c3
ControlPoint20Name:Green-Yellow
ControlPoint20HasTwoPoints:1
ControlPoint20ShortName:GY
ControlPoint20DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Green###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=Green###BREAKLINE###P1.UUID=785c3e44-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Yellow###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Yellow###BREAKLINE###P2.UUID=3fdd2402-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint20Mark1Lon:120.379540
ControlPoint20Mark1Lat:36.057548
ControlPoint20Mark2Lon:120.383560
ControlPoint20Mark2Lat:36.056408
ControlPoint21UUID:a0f71190-7adb-0131-e5ea-60a44ce903c3
ControlPoint21Name:Blue-Yellow
ControlPoint21HasTwoPoints:1
ControlPoint21ShortName:BY
ControlPoint21DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Blue###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=Blue###BREAKLINE###P1.UUID=1286f15e-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Yellow###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Yellow###BREAKLINE###P2.UUID=3fdd2402-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint21Mark1Lon:120.380615
ControlPoint21Mark1Lat:36.057808
ControlPoint21Mark2Lon:120.383560
ControlPoint21Mark2Lat:36.056408
ControlPoint22UUID:a68c6350-7adc-0131-e626-60a44ce903c3
ControlPoint22Name:RC-Black Conical
ControlPoint22HasTwoPoints:1
ControlPoint22ShortName:S
ControlPoint22DataSheet:P1.Type=StartBoat###BREAKLINE###P1.Name=Race Committee###BREAKLINE###P1.UUID=3e6c1c94-83bf-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Pattern=Checkered###BREAKLINE###P2.Name=Black Conical###BREAKLINE###P2.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint22Mark1Lon:120.383445
ControlPoint22Mark1Lat:36.055175
ControlPoint22Mark2Lon:120.381707
ControlPoint22Mark2Lat:36.054402
ControlPoint23UUID:b153dfd6-83be-11e2-88c0-10bf48d758ce
ControlPoint23Name:Black Cylinder
ControlPoint23HasTwoPoints:0
ControlPoint23ShortName:B
ControlPoint23DataSheet:Type=Buoy###BREAKLINE###Color=Black###BREAKLINE###Shape=Cylinder###BREAKLINE###Pattern=Checkered###BREAKLINE###Name=Black Cylinder
ControlPoint23Mark1Lon:120.384185
ControlPoint23Mark1Lat:36.054085
ControlPoint24UUID:b62e0bf0-7adc-0131-e630-60a44ce903c3
ControlPoint24Name:RC-Black Cylinder
ControlPoint24HasTwoPoints:1
ControlPoint24ShortName:S
ControlPoint24DataSheet:P1.Type=StartBoat###BREAKLINE###P1.Name=Race Committee###BREAKLINE###P1.UUID=3e6c1c94-83bf-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Shape=Cylinder###BREAKLINE###P2.Pattern=Checkered###BREAKLINE###P2.Name=Black Cylinder###BREAKLINE###P2.UUID=b153dfd6-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint24Mark1Lon:120.383445
ControlPoint24Mark1Lat:36.055175
ControlPoint24Mark2Lon:120.384185
ControlPoint24Mark2Lat:36.054085
ControlPoint25UUID:bd1fc330-7c10-0131-9c24-10b11c4ed8fd
ControlPoint25Name:Black Cylinder-Yellow
ControlPoint25HasTwoPoints:1
ControlPoint25ShortName:S
ControlPoint25DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Cylinder###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Cylinder###BREAKLINE###P1.UUID=b153dfd6-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Yellow###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Yellow###BREAKLINE###P2.UUID=3fdd2402-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint25Mark1Lon:120.384185
ControlPoint25Mark1Lat:36.054085
ControlPoint25Mark2Lon:120.383560
ControlPoint25Mark2Lat:36.056408
ControlPoint26UUID:bf6777e6-83bd-11e2-88c0-10bf48d758ce
ControlPoint26Name:White S
ControlPoint26HasTwoPoints:0
ControlPoint26ShortName:W
ControlPoint26DataSheet:Type=Buoy###BREAKLINE###Color=White###BREAKLINE###Shape=Conical###BREAKLINE###Name=White S
ControlPoint26Mark1Lon:120.382568
ControlPoint26Mark1Lat:36.054268
ControlPoint27UUID:cd3c1dc0-7c11-0131-9c2e-10b11c4ed8fd
ControlPoint27Name:Finish Pole-Conical
ControlPoint27HasTwoPoints:1
ControlPoint27ShortName:S
ControlPoint27DataSheet:P1.Color=Black###BREAKLINE###P1.Type=Landmark###BREAKLINE###P1.Name=Finish Pole###BREAKLINE###P1.UUID=3240586c-83c0-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Pattern=Checkered###BREAKLINE###P2.Name=Black Conical###BREAKLINE###P2.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint27Mark1Lon:120.382858
ControlPoint27Mark1Lat:36.052662
ControlPoint27Mark2Lon:120.381707
ControlPoint27Mark2Lat:36.054402
ControlPoint28UUID:d39a0d00-7adc-0131-e63a-60a44ce903c3
ControlPoint28Name:White Gate
ControlPoint28HasTwoPoints:1
ControlPoint28ShortName:W
ControlPoint28DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=White###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=White S###BREAKLINE###P1.UUID=bf6777e6-83bd-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=White###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=White P###BREAKLINE###P2.UUID=e9ec42f8-83bd-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint28Mark1Lon:120.382568
ControlPoint28Mark1Lat:36.054268
ControlPoint28Mark2Lon:120.381890
ControlPoint28Mark2Lat:36.053973
ControlPoint29UUID:d78695ea-83be-11e2-88c0-10bf48d758ce
ControlPoint29Name:Black Conical
ControlPoint29HasTwoPoints:0
ControlPoint29ShortName:B
ControlPoint29DataSheet:Type=Buoy###BREAKLINE###Color=Black###BREAKLINE###Shape=Conical###BREAKLINE###Pattern=Checkered###BREAKLINE###Name=Black Conical
ControlPoint29Mark1Lon:120.381707
ControlPoint29Mark1Lat:36.054402
ControlPoint30UUID:e9ec42f8-83bd-11e2-88c0-10bf48d758ce
ControlPoint30Name:White P
ControlPoint30HasTwoPoints:0
ControlPoint30ShortName:W
ControlPoint30DataSheet:Type=Buoy###BREAKLINE###Color=White###BREAKLINE###Shape=Conical###BREAKLINE###Name=White P
ControlPoint30Mark1Lon:120.381890
ControlPoint30Mark1Lat:36.053973
ControlPoint31UUID:eff23330-7b84-0131-b9d2-10b11c4ed8fd
ControlPoint31Name:RC-Red
ControlPoint31HasTwoPoints:1
ControlPoint31ShortName:S
ControlPoint31DataSheet:P1.Type=StartBoat###BREAKLINE###P1.Name=Race Committee###BREAKLINE###P1.UUID=3e6c1c94-83bf-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Red###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Red###BREAKLINE###P2.UUID=5427c7d2-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint31Mark1Lon:120.383445
ControlPoint31Mark1Lat:36.055175
ControlPoint31Mark2Lon:120.383118
ControlPoint31Mark2Lat:36.055012
SegmentFile:segments.php
Route1UUID:f6e91fa0-b56d-0131-1f9e-10b11c4ed8fd
Route1Description:Race 29
Route1Length:0
Route1DataSheet:Seq.1=Line###BREAKLINE###Seq.2=Starboard###BREAKLINE###Seq.3=Gate###BREAKLINE###Seq.4=Starboard###BREAKLINE###Seq.5=Line###BREAKLINE###
Route1ControlPoint1UUID:a68c6350-7adc-0131-e626-60a44ce903c3
Route1ControlPoint2UUID:1286f15e-83be-11e2-88c0-10bf48d758ce
Route1ControlPoint3UUID:d39a0d00-7adc-0131-e63a-60a44ce903c3
Route1ControlPoint4UUID:1286f15e-83be-11e2-88c0-10bf48d758ce
Route1ControlPoint5UUID:88ef6d40-7adc-0131-e61c-60a44ce903c3
//-------- AUTO GENERATED PARAMETERS END ------------------
@@ -0,0 +1,653 @@
stored-uri:datafiles/event_20140429_ESSQingdao-Race_4.mtb
StartReplay:1
// Input from params_static:
// Input from event_parameters:
CompMarkerUUID:1
CodanIsSponsor:0
DefaultTailLength:60
APzoomChangeTime:2500
disableAutoProduce:0
autoProduce:0
APstartLineShowOfLeg:0.25
APsideOfStartLine:0.30
APstartSwitch:0.8
APwholeLegBehindMarks:0.15
APmarkSwitch:0.13
APmarkZoomBehindMarks:0.10
APmarkZoomInFrontOfMarks:0.20
PopupMarkerUUID:2
ManualUrl:http://www.tractrac.com/files/userguide_sailing.pdf
//live-uri:tcp://192.168.1.203:4400
//stored-uri:tcp://192.168.1.203:4401
Marker1UUID:1
Marker1Type:RGBMarkerFactory
Marker1Directional:1
Marker1Image:markers/boat_FF0000_big.png
Marker1Length:5
Marker1MinPixelSize:30
Startlocation:120.38632089843748,36.049596263422494
MaxDiffTime:1200
MaxMetersPerSecond:20
PrecisionMeters:20
ShortAvgTime:180
LongAvgTime:900
TimeZone:
CompMarkerTimeout:60
FramesPerSecond:8
replayspeedup:5
MatchRaceClock:0
MatchRaceClockNo:3
MatchRaceClockSpacing:300
Minimap:1
MinimapUseLayers:2
Minimapgeorect:120.36068115234377,36.06814954054894,120.41175086669921,36.03604889362103
MinimapMarkerUUID:2
Marker4UUID:2
Marker4Type:RGBmarkerFactory
Marker4Directional:1
Marker4Image:markers/boat_FF0000_small.png
MetersPerPixel:18
MetersPerPixelMax:30
MetersPerPixelMin:0.2
isMatchRace:0
DefaultDistanceUnits:meters
weatherEnabled:0
DefaultSpeedUnits:KmH
showRaceClock:1
BackGroundImage:graphics/background.jpg
DisableRotation:0
ControlPointMarkerRadius:13
disableselection:0
disableleaderline:0
DisableChangeRace:0
PopUpRow1Name:
PopUpRow1Type:Name
PopUpRow2Name:Knots
PopUpRow2Type:BoatSpeed
PopUpRow3Name:Ranking
PopUpRow3Type:RowNumber
PopUpRow4Name:Sail
PopUpRow4Type:Ini
PopUpRow5Name:After
PopUpRow5Type:BoatAfter
ResultColumn1Name:#
ResultColumn1Size:20
ResultColumn1Type:RowNumber
ResultColumn2Name:sail
ResultColumn2Size:45
ResultColumn2Type:Ini
ResultColumn3Name:name
ResultColumn3Size:110
ResultColumn3Type:Name
ResultColumn4Name:after
ResultColumn4Size:45
ResultColumn4Type:BoatAfter
ResultColumn5Name:kts
ResultColumn5Size:40
ResultColumn5Type:BoatSpeed
DisableLeaderboard:0
DisableAnalysis:0
TableFontSize:11
compInitialsFontSize:11
AutoRotate:0
MassStart:0
SegmentFile:segments.php
StartType:Mass
ReCalcDirAndSpeed:0
RaceHandicapSystem:NONE
TeamCompetitionType:NONE
LiveDelaySecs: 4
//-------- AUTO GENERATED PARAMETERS START ----------------
EventID:8b85f120-ada6-0131-e74f-60a44ce903c3
EventName:ESS Qingdao 2014
EventDB:event_20140429_ESSQingdao
EventStartTime:2014-04-28 16:01:00
EventEndTime:2014-05-04 15:00:00
EventType:a1b74ca0-fdd8-11dc-8811-005056c00008
RaceID:05f3fbf0-b310-0131-50e4-10b11c4ed8fd
RaceName:Race 4
RaceStartTime:2014-05-01 06:59:59
RaceEndTime:
RaceTrackingStartTime:2014-05-01 06:56:20
RaceTrackingEndTime:2014-05-01 07:19:39
RaceDefaultRouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
RaceHandicapSystem:NONE
Image1UUID:64a7b348-83db-11e2-88c0-10bf48d758ce
Image1Type:Logo
Image1Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SUI.gif
Image1Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SUI.gif
Image2UUID:64c3a8fa-83db-11e2-88c0-10bf48d758ce
Image2Type:Logo
Image2Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NZL.gif
Image2Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NZL.gif
Image3UUID:651130a2-83db-11e2-88c0-10bf48d758ce
Image3Type:Logo
Image3Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/KOR.gif
Image3Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/KOR.gif
Image4UUID:653c1ab0-83db-11e2-88c0-10bf48d758ce
Image4Type:Logo
Image4Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUT.gif
Image4Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUT.gif
Image5UUID:65637da8-83db-11e2-88c0-10bf48d758ce
Image5Type:Logo
Image5Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/DEN.gif
Image5Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/DEN.gif
Image6UUID:65875138-83db-11e2-88c0-10bf48d758ce
Image6Type:Logo
Image6Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/OMN.gif
Image6Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/OMN.gif
Class1UUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Class1Name:Extreme40
Team1UUID:649f1dbe-83db-11e2-88c0-10bf48d758ce
Team1Name:TeamA
Team1Comp1UUID:648bd4f2-83db-11e2-88c0-10bf48d758ce
Team2UUID:64bf0854-83db-11e2-88c0-10bf48d758ce
Team2Name:TeamB
Team2Comp1UUID:64bbff7e-83db-11e2-88c0-10bf48d758ce
Team3UUID:64dd7988-83db-11e2-88c0-10bf48d758ce
Team3Name:TeamC
Team3Comp1UUID:64da7c24-83db-11e2-88c0-10bf48d758ce
Team4UUID:64ffc402-83db-11e2-88c0-10bf48d758ce
Team4Name:TeamD
Team5UUID:65351d82-83db-11e2-88c0-10bf48d758ce
Team5Name:TeamE
Team5Comp1UUID:65322500-83db-11e2-88c0-10bf48d758ce
Team6UUID:655ed82a-83db-11e2-88c0-10bf48d758ce
Team6Name:TeamF
Team6Comp1UUID:655bd56c-83db-11e2-88c0-10bf48d758ce
Team7UUID:65829fa8-83db-11e2-88c0-10bf48d758ce
Team7Name:TeamG
Team7Comp1UUID:657fa5a0-83db-11e2-88c0-10bf48d758ce
Team8UUID:e4459a20-83db-11e2-88c0-10bf48d758ce
Team8Name:TeamH
Team8Comp1UUID:e442a414-83db-11e2-88c0-10bf48d758ce
Team9UUID:a73aabc0-d6d6-0130-8be2-60a44ce903c3
Team9Name:TeamI
Team9Comp1UUID:93085e80-7ad9-0131-e5b3-60a44ce903c3
Team10UUID:bbf81f60-d6d6-0130-8be3-60a44ce903c3
Team10Name:TeamJ
Team10Comp1UUID:f097f4f0-7ad9-0131-e5b4-60a44ce903c3
Team11UUID:65659280-eda3-0130-c5c0-10b11c4ed8fd
Team11Name:TeamK
Team11Comp1UUID:19dc3eb0-7ada-0131-e5b5-60a44ce903c3
Team12UUID:9ee14560-77af-0131-e5af-60a44ce903c3
Team12Name:TeamL
Team12Comp1UUID:5e15e7c0-7ada-0131-e5b6-60a44ce903c3
Team13UUID:b9677300-7ad7-0131-e5b0-60a44ce903c3
Team13Name:TeamM
Team13Comp1UUID:84e68b70-7ada-0131-e5b7-60a44ce903c3
Team14UUID:c9689a00-7ad7-0131-e5b1-60a44ce903c3
Team14Name:TeamN
Team15UUID:d5712f30-7ad7-0131-e5b2-60a44ce903c3
Team15Name:TeamO
Comp1UUID:648bd4f2-83db-11e2-88c0-10bf48d758ce
Comp1Name:Alinghi
Comp1NameShort:Alinghi
Comp1Color:00FF00
Comp1Nationality:SUI
Comp1Description:
Comp1Handicap:1.0000000000
Comp1HandicapDistance:0.00000
Comp1StartTime:2014-05-01 06:59:59
Comp1PictureUUID:64a7b348-83db-11e2-88c0-10bf48d758ce
Comp1ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp1RouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
Comp2UUID:64bbff7e-83db-11e2-88c0-10bf48d758ce
Comp2Name:GAC Pindar
Comp2NameShort:GAC Pindar
Comp2Color:000080
Comp2Nationality:AUS
Comp2Description:
Comp2Handicap:1.0000000000
Comp2HandicapDistance:0.00000
Comp2StartTime:2014-05-01 06:59:59
Comp2PictureUUID:64c3a8fa-83db-11e2-88c0-10bf48d758ce
Comp2ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp2RouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
Comp3UUID:64da7c24-83db-11e2-88c0-10bf48d758ce
Comp3Name:Realteam by Realstone
Comp3NameShort:Realstone
Comp3Color:000000
Comp3Nationality:AFG
Comp3Description:
Comp3Handicap:1.0000000000
Comp3HandicapDistance:0.00000
Comp3StartTime:2014-05-01 06:59:59
Comp3PictureUUID:64a7b348-83db-11e2-88c0-10bf48d758ce
Comp3ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp3RouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
Comp4UUID:65322500-83db-11e2-88c0-10bf48d758ce
Comp4Name:Red Bull Sailing Team
Comp4NameShort:Red Bull
Comp4Color:008080
Comp4Nationality:AUT
Comp4Description:
Comp4Handicap:1.0000000000
Comp4HandicapDistance:0.00000
Comp4StartTime:2014-05-01 06:59:59
Comp4PictureUUID:653c1ab0-83db-11e2-88c0-10bf48d758ce
Comp4ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp4RouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
Comp5UUID:655bd56c-83db-11e2-88c0-10bf48d758ce
Comp5Name:SAP Extreme Sailing Team
Comp5NameShort:SAP
Comp5Color:FFFFFF
Comp5Nationality:DEN
Comp5Description:
Comp5Handicap:1.0000000000
Comp5HandicapDistance:0.00000
Comp5StartTime:2014-05-01 06:59:59
Comp5PictureUUID:65637da8-83db-11e2-88c0-10bf48d758ce
Comp5ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp5RouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
Comp6UUID:657fa5a0-83db-11e2-88c0-10bf48d758ce
Comp6Name:The Wave, Muscat
Comp6NameShort:The Wave
Comp6Color:800080
Comp6Nationality:OMA
Comp6Description:
Comp6Handicap:1.0000000000
Comp6HandicapDistance:0.00000
Comp6StartTime:2014-05-01 06:59:59
Comp6PictureUUID:65875138-83db-11e2-88c0-10bf48d758ce
Comp6ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp6RouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
Comp7UUID:e442a414-83db-11e2-88c0-10bf48d758ce
Comp7Name:Invite
Comp7NameShort:Invite
Comp7Color:FFFF00
Comp7Nationality:SIN
Comp7Description:
Comp7Handicap:1.0000000000
Comp7HandicapDistance:0.00000
Comp7StartTime:2014-05-01 06:59:59
Comp7ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp7RouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
Comp8UUID:93085e80-7ad9-0131-e5b3-60a44ce903c3
Comp8Name:Emirates Team New Zealand
Comp8NameShort:Emirates NZ
Comp8Color:CC9900
Comp8Nationality:NZL
Comp8Description:
Comp8Handicap:1.0000000000
Comp8HandicapDistance:0.00000
Comp8StartTime:2014-05-01 06:59:59
Comp8PictureUUID:64c3a8fa-83db-11e2-88c0-10bf48d758ce
Comp8ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp8RouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
Comp9UUID:f097f4f0-7ad9-0131-e5b4-60a44ce903c3
Comp9Name:Gazprom Team Russia
Comp9NameShort:Team Russia
Comp9Color:999900
Comp9Nationality:RUS
Comp9Description:
Comp9Handicap:1.0000000000
Comp9HandicapDistance:0.00000
Comp9StartTime:2014-05-01 06:59:59
Comp9ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp9RouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
Comp10UUID:19dc3eb0-7ada-0131-e5b5-60a44ce903c3
Comp10Name:Groupama sailing team
Comp10NameShort:Groupama
Comp10Color:33CC00
Comp10Nationality:AFG
Comp10Description:
Comp10Handicap:1.0000000000
Comp10HandicapDistance:0.00000
Comp10StartTime:2014-05-01 06:59:59
Comp10ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp10RouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
Comp11UUID:5e15e7c0-7ada-0131-e5b6-60a44ce903c3
Comp11Name:J.P. Morgan BAR
Comp11NameShort:J.P. Morgan
Comp11Color:CCFF00
Comp11Nationality:GBR
Comp11Description:
Comp11Handicap:1.0000000000
Comp11HandicapDistance:0.00000
Comp11StartTime:2014-05-01 06:59:59
Comp11ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp11RouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
Comp12UUID:84e68b70-7ada-0131-e5b7-60a44ce903c3
Comp12Name:Oman Air
Comp12NameShort:Oman Air
Comp12Color:CCFF99
Comp12Nationality:OMA
Comp12Description:
Comp12Handicap:1.0000000000
Comp12HandicapDistance:0.00000
Comp12StartTime:2014-05-01 06:59:59
Comp12PictureUUID:65875138-83db-11e2-88c0-10bf48d758ce
Comp12ClassUUID:648ee25a-83db-11e2-88c0-10bf48d758ce
Comp12RouteUUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
ControlPoint1UUID:1100ea60-7adb-0131-e5b8-60a44ce903c3
ControlPoint1Name:Red-Green
ControlPoint1HasTwoPoints:1
ControlPoint1ShortName:RG
ControlPoint1DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Red###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=Red###BREAKLINE###P1.UUID=5427c7d2-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Green###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Green###BREAKLINE###P2.UUID=785c3e44-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint1Mark1Lon:120.386452
ControlPoint1Mark1Lat:36.046283
ControlPoint1Mark2Lon:120.386955
ControlPoint1Mark2Lat:36.046803
ControlPoint2UUID:1286f15e-83be-11e2-88c0-10bf48d758ce
ControlPoint2Name:Blue
ControlPoint2HasTwoPoints:0
ControlPoint2ShortName:Bl
ControlPoint2DataSheet:Name=Blue
ControlPoint2Mark1Lon:120.380233
ControlPoint2Mark1Lat:36.049133
ControlPoint3UUID:1a94c6a0-7adc-0131-e5f4-60a44ce903c3
ControlPoint3Name:Black Conical-Blue
ControlPoint3HasTwoPoints:1
ControlPoint3ShortName:BB
ControlPoint3DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Conical###BREAKLINE###P1.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Blue###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Blue###BREAKLINE###P2.UUID=1286f15e-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint3Mark1Lon:120.380500
ControlPoint3Mark1Lat:36.049228
ControlPoint3Mark2Lon:120.380233
ControlPoint3Mark2Lat:36.049133
ControlPoint4UUID:2dc7d9d0-7b84-0131-b9c3-10b11c4ed8fd
ControlPoint4Name:Black Cylinder - Black Conical
ControlPoint4HasTwoPoints:1
ControlPoint4ShortName:BB
ControlPoint4DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Cylinder###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Cylinder###BREAKLINE###P1.UUID=b153dfd6-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Pattern=Checkered###BREAKLINE###P2.Name=Black Conical###BREAKLINE###P2.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce
ControlPoint4Mark1Lon:120.380302
ControlPoint4Mark1Lat:36.048843
ControlPoint4Mark2Lon:120.380500
ControlPoint4Mark2Lat:36.049228
ControlPoint5UUID:2e37b410-7adc-0131-e5fe-60a44ce903c3
ControlPoint5Name:Black Conical-Yellow
ControlPoint5HasTwoPoints:1
ControlPoint5ShortName:BY
ControlPoint5DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Conical###BREAKLINE###P1.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Yellow###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Yellow###BREAKLINE###P2.UUID=3fdd2402-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint5Mark1Lon:120.380500
ControlPoint5Mark1Lat:36.049228
ControlPoint5Mark2Lon:120.386192
ControlPoint5Mark2Lat:36.046997
ControlPoint6UUID:3240586c-83c0-11e2-88c0-10bf48d758ce
ControlPoint6Name:Finish Pole
ControlPoint6HasTwoPoints:0
ControlPoint6ShortName:F
ControlPoint6DataSheet:Color=Black###BREAKLINE###Type=Landmark###BREAKLINE###Name=Finish Pole
ControlPoint6Mark1Lon:58.304032
ControlPoint6Mark1Lat:23.615582
ControlPoint7UUID:37cb36e0-7adb-0131-e5c2-60a44ce903c3
ControlPoint7Name:Red-Blue
ControlPoint7HasTwoPoints:1
ControlPoint7ShortName:RB
ControlPoint7DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Red###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=Red###BREAKLINE###P1.UUID=5427c7d2-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Blue###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Blue###BREAKLINE###P2.UUID=1286f15e-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint7Mark1Lon:120.386452
ControlPoint7Mark1Lat:36.046283
ControlPoint7Mark2Lon:120.380233
ControlPoint7Mark2Lat:36.049133
ControlPoint8UUID:3e6c1c94-83bf-11e2-88c0-10bf48d758ce
ControlPoint8Name:Race Committee
ControlPoint8HasTwoPoints:0
ControlPoint8ShortName:RC
ControlPoint8DataSheet:Type=StartBoat###BREAKLINE###Name=Race Committee
ControlPoint8Mark1Lon:120.380227
ControlPoint8Mark1Lat:36.047118
ControlPoint9UUID:3fdd2402-83be-11e2-88c0-10bf48d758ce
ControlPoint9Name:Yellow
ControlPoint9HasTwoPoints:0
ControlPoint9ShortName:Y
ControlPoint9DataSheet:Type=Buoy###BREAKLINE###Color=Yellow###BREAKLINE###Shape=Conical###BREAKLINE###Name=Yellow
ControlPoint9Mark1Lon:120.386192
ControlPoint9Mark1Lat:36.046997
ControlPoint10UUID:4c304720-7adc-0131-e608-60a44ce903c3
ControlPoint10Name:Black Conical-Red
ControlPoint10HasTwoPoints:1
ControlPoint10ShortName:BR
ControlPoint10DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Conical###BREAKLINE###P1.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Red###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Red###BREAKLINE###P2.UUID=5427c7d2-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint10Mark1Lon:120.380500
ControlPoint10Mark1Lat:36.049228
ControlPoint10Mark2Lon:120.386452
ControlPoint10Mark2Lat:36.046283
ControlPoint11UUID:4e0c2a90-7adb-0131-e5cc-60a44ce903c3
ControlPoint11Name:Red-Yellow
ControlPoint11HasTwoPoints:1
ControlPoint11ShortName:RY
ControlPoint11DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Red###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=Red###BREAKLINE###P1.UUID=5427c7d2-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Yellow###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Yellow###BREAKLINE###P2.UUID=3fdd2402-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint11Mark1Lon:120.386452
ControlPoint11Mark1Lat:36.046283
ControlPoint11Mark2Lon:120.386192
ControlPoint11Mark2Lat:36.046997
ControlPoint12UUID:5427c7d2-83be-11e2-88c0-10bf48d758ce
ControlPoint12Name:Red
ControlPoint12HasTwoPoints:0
ControlPoint12ShortName:R
ControlPoint12DataSheet:Type=Buoy###BREAKLINE###Color=Red###BREAKLINE###Shape=Conical###BREAKLINE###Name=Red
ControlPoint12Mark1Lon:120.386452
ControlPoint12Mark1Lat:36.046283
ControlPoint13UUID:584cfe30-b328-0131-5246-10b11c4ed8fd
ControlPoint13Name:R2-Green
ControlPoint13HasTwoPoints:0
ControlPoint13ShortName:G
ControlPoint13Mark1Lon:120.386972
ControlPoint13Mark1Lat:36.046795
ControlPoint14UUID:621831d0-7adc-0131-e612-60a44ce903c3
ControlPoint14Name:Black Conical-Green
ControlPoint14HasTwoPoints:1
ControlPoint14ShortName:BG
ControlPoint14DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Conical###BREAKLINE###P1.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Green###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Green###BREAKLINE###P2.UUID=785c3e44-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint14Mark1Lon:120.380500
ControlPoint14Mark1Lat:36.049228
ControlPoint14Mark2Lon:120.386955
ControlPoint14Mark2Lat:36.046803
ControlPoint15UUID:77b9e620-7adb-0131-e5d6-60a44ce903c3
ControlPoint15Name:Green-Blue
ControlPoint15HasTwoPoints:1
ControlPoint15ShortName:GB
ControlPoint15DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Green###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=Green###BREAKLINE###P1.UUID=785c3e44-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Blue###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Blue###BREAKLINE###P2.UUID=1286f15e-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint15Mark1Lon:120.386955
ControlPoint15Mark1Lat:36.046803
ControlPoint15Mark2Lon:120.380233
ControlPoint15Mark2Lat:36.049133
ControlPoint16UUID:785c3e44-83be-11e2-88c0-10bf48d758ce
ControlPoint16Name:Green
ControlPoint16HasTwoPoints:0
ControlPoint16ShortName:G
ControlPoint16DataSheet:Type=Buoy###BREAKLINE###Color=Green###BREAKLINE###Shape=Conical###BREAKLINE###Name=Green
ControlPoint16Mark1Lon:120.386955
ControlPoint16Mark1Lat:36.046803
ControlPoint17UUID:7e1b7a80-7d0b-0131-a109-10b11c4ed8fd
ControlPoint17Name:Black Gate
ControlPoint17HasTwoPoints:1
ControlPoint17ShortName:S
ControlPoint17DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Cylinder###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Cylinder###BREAKLINE###P1.UUID=b153dfd6-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Pattern=Checkered###BREAKLINE###P2.Name=Black Conical###BREAKLINE###P2.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint17Mark1Lon:103.855782
ControlPoint17Mark1Lat:1.282103
ControlPoint17Mark2Lon:103.857560
ControlPoint17Mark2Lat:1.286382
ControlPoint18UUID:88ef6d40-7adc-0131-e61c-60a44ce903c3
ControlPoint18Name:Finish Pole-Cylinder
ControlPoint18HasTwoPoints:1
ControlPoint18ShortName:F
ControlPoint18DataSheet:P1.Color=Black###BREAKLINE###P1.Type=Landmark###BREAKLINE###P1.Name=Finish Pole###BREAKLINE###P1.UUID=3240586c-83c0-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Shape=Cylinder###BREAKLINE###P2.Pattern=Checkered###BREAKLINE###P2.Name=Black Cylinder###BREAKLINE###P2.UUID=b153dfd6-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint18Mark1Lon:58.304032
ControlPoint18Mark1Lat:23.615582
ControlPoint18Mark2Lon:120.380302
ControlPoint18Mark2Lat:36.048843
ControlPoint19UUID:8f9a4ee0-7adb-0131-e5e0-60a44ce903c3
ControlPoint19Name:Green-Yellow
ControlPoint19HasTwoPoints:1
ControlPoint19ShortName:GY
ControlPoint19DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Green###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=Green###BREAKLINE###P1.UUID=785c3e44-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Yellow###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Yellow###BREAKLINE###P2.UUID=3fdd2402-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint19Mark1Lon:120.386955
ControlPoint19Mark1Lat:36.046803
ControlPoint19Mark2Lon:120.386192
ControlPoint19Mark2Lat:36.046997
ControlPoint20UUID:a0f71190-7adb-0131-e5ea-60a44ce903c3
ControlPoint20Name:Blue-Yellow
ControlPoint20HasTwoPoints:1
ControlPoint20ShortName:BY
ControlPoint20DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Blue###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=Blue###BREAKLINE###P1.UUID=1286f15e-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Yellow###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Yellow###BREAKLINE###P2.UUID=3fdd2402-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint20Mark1Lon:120.380233
ControlPoint20Mark1Lat:36.049133
ControlPoint20Mark2Lon:120.386192
ControlPoint20Mark2Lat:36.046997
ControlPoint21UUID:a68c6350-7adc-0131-e626-60a44ce903c3
ControlPoint21Name:RC-Black Conical
ControlPoint21HasTwoPoints:1
ControlPoint21ShortName:F
ControlPoint21DataSheet:P1.Type=StartBoat###BREAKLINE###P1.Name=Race Committee###BREAKLINE###P1.UUID=3e6c1c94-83bf-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Pattern=Checkered###BREAKLINE###P2.Name=Black Conical###BREAKLINE###P2.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint21Mark1Lon:120.380227
ControlPoint21Mark1Lat:36.047118
ControlPoint21Mark2Lon:120.380500
ControlPoint21Mark2Lat:36.049228
ControlPoint22UUID:b153dfd6-83be-11e2-88c0-10bf48d758ce
ControlPoint22Name:Black Cylinder
ControlPoint22HasTwoPoints:0
ControlPoint22ShortName:B
ControlPoint22DataSheet:Type=Buoy###BREAKLINE###Color=Black###BREAKLINE###Shape=Cylinder###BREAKLINE###Pattern=Checkered###BREAKLINE###Name=Black Cylinder
ControlPoint22Mark1Lon:120.380302
ControlPoint22Mark1Lat:36.048843
ControlPoint23UUID:b62e0bf0-7adc-0131-e630-60a44ce903c3
ControlPoint23Name:RC-Black Cylinder
ControlPoint23HasTwoPoints:1
ControlPoint23ShortName:S
ControlPoint23DataSheet:P1.Type=StartBoat###BREAKLINE###P1.Name=Race Committee###BREAKLINE###P1.UUID=3e6c1c94-83bf-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Shape=Cylinder###BREAKLINE###P2.Pattern=Checkered###BREAKLINE###P2.Name=Black Cylinder###BREAKLINE###P2.UUID=b153dfd6-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint23Mark1Lon:120.380227
ControlPoint23Mark1Lat:36.047118
ControlPoint23Mark2Lon:120.380302
ControlPoint23Mark2Lat:36.048843
ControlPoint24UUID:bd1fc330-7c10-0131-9c24-10b11c4ed8fd
ControlPoint24Name:Black Cylinder-Yellow
ControlPoint24HasTwoPoints:1
ControlPoint24ShortName:S
ControlPoint24DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=Black###BREAKLINE###P1.Shape=Cylinder###BREAKLINE###P1.Pattern=Checkered###BREAKLINE###P1.Name=Black Cylinder###BREAKLINE###P1.UUID=b153dfd6-83be-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Yellow###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Yellow###BREAKLINE###P2.UUID=3fdd2402-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint24Mark1Lon:120.380302
ControlPoint24Mark1Lat:36.048843
ControlPoint24Mark2Lon:120.386192
ControlPoint24Mark2Lat:36.046997
ControlPoint25UUID:bf6777e6-83bd-11e2-88c0-10bf48d758ce
ControlPoint25Name:White S
ControlPoint25HasTwoPoints:0
ControlPoint25ShortName:W
ControlPoint25DataSheet:Type=Buoy###BREAKLINE###Color=White###BREAKLINE###Shape=Conical###BREAKLINE###Name=White S
ControlPoint25Mark1Lon:120.381432
ControlPoint25Mark1Lat:36.047478
ControlPoint26UUID:cd3c1dc0-7c11-0131-9c2e-10b11c4ed8fd
ControlPoint26Name:Finish Pole-Conical
ControlPoint26HasTwoPoints:1
ControlPoint26ShortName:S
ControlPoint26DataSheet:P1.Color=Black###BREAKLINE###P1.Type=Landmark###BREAKLINE###P1.Name=Finish Pole###BREAKLINE###P1.UUID=3240586c-83c0-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Black###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Pattern=Checkered###BREAKLINE###P2.Name=Black Conical###BREAKLINE###P2.UUID=d78695ea-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint26Mark1Lon:58.304032
ControlPoint26Mark1Lat:23.615582
ControlPoint26Mark2Lon:120.380500
ControlPoint26Mark2Lat:36.049228
ControlPoint27UUID:d39a0d00-7adc-0131-e63a-60a44ce903c3
ControlPoint27Name:White Gate
ControlPoint27HasTwoPoints:1
ControlPoint27ShortName:W
ControlPoint27DataSheet:P1.Type=Buoy###BREAKLINE###P1.Color=White###BREAKLINE###P1.Shape=Conical###BREAKLINE###P1.Name=White S###BREAKLINE###P1.UUID=bf6777e6-83bd-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=White###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=White P###BREAKLINE###P2.UUID=e9ec42f8-83bd-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint27Mark1Lon:120.381432
ControlPoint27Mark1Lat:36.047478
ControlPoint27Mark2Lon:120.381187
ControlPoint27Mark2Lat:36.048325
ControlPoint28UUID:d78695ea-83be-11e2-88c0-10bf48d758ce
ControlPoint28Name:Black Conical
ControlPoint28HasTwoPoints:0
ControlPoint28ShortName:B
ControlPoint28DataSheet:Type=Buoy###BREAKLINE###Color=Black###BREAKLINE###Shape=Conical###BREAKLINE###Pattern=Checkered###BREAKLINE###Name=Black Conical
ControlPoint28Mark1Lon:120.380500
ControlPoint28Mark1Lat:36.049228
ControlPoint29UUID:e9ec42f8-83bd-11e2-88c0-10bf48d758ce
ControlPoint29Name:White P
ControlPoint29HasTwoPoints:0
ControlPoint29ShortName:W
ControlPoint29DataSheet:Type=Buoy###BREAKLINE###Color=White###BREAKLINE###Shape=Conical###BREAKLINE###Name=White P
ControlPoint29Mark1Lon:120.381187
ControlPoint29Mark1Lat:36.048325
ControlPoint30UUID:eff23330-7b84-0131-b9d2-10b11c4ed8fd
ControlPoint30Name:RC-Red
ControlPoint30HasTwoPoints:1
ControlPoint30ShortName:S
ControlPoint30DataSheet:P1.Type=StartBoat###BREAKLINE###P1.Name=Race Committee###BREAKLINE###P1.UUID=3e6c1c94-83bf-11e2-88c0-10bf48d758ce###BREAKLINE###P2.Type=Buoy###BREAKLINE###P2.Color=Red###BREAKLINE###P2.Shape=Conical###BREAKLINE###P2.Name=Red###BREAKLINE###P2.UUID=5427c7d2-83be-11e2-88c0-10bf48d758ce###BREAKLINE###
ControlPoint30Mark1Lon:120.380227
ControlPoint30Mark1Lat:36.047118
ControlPoint30Mark2Lon:120.386452
ControlPoint30Mark2Lat:36.046283
SegmentFile:segments.php
Route1UUID:05ee3850-b310-0131-50e3-10b11c4ed8fd
Route1Description:Race 4
Route1Length:0
Route1DataSheet:Seq.1=Line###BREAKLINE###Seq.2=Starboard###BREAKLINE###Seq.3=Gate###BREAKLINE###Seq.4=Starboard###BREAKLINE###Seq.5=Line###BREAKLINE###
Route1ControlPoint1UUID:b62e0bf0-7adc-0131-e630-60a44ce903c3
Route1ControlPoint2UUID:785c3e44-83be-11e2-88c0-10bf48d758ce
Route1ControlPoint3UUID:d39a0d00-7adc-0131-e63a-60a44ce903c3
Route1ControlPoint4UUID:3fdd2402-83be-11e2-88c0-10bf48d758ce
Route1ControlPoint5UUID:a68c6350-7adc-0131-e626-60a44ce903c3
//-------- AUTO GENERATED PARAMETERS END ------------------
@@ -24,10 +24,18 @@ public class NaturalComparatorTest {
}
@Test
public void testCaseInsesitive(){
public void testCaseInsensitive(){
assertEquals(0, caseInsensitive.compare("E", "e"));
}
@Test
public void testCaseInsensitiveIsDifferent(){
assertEquals(-1, caseInsensitive.compare("E", "F"));
assertEquals(-1, caseInsensitive.compare("E", "f"));
assertEquals(1, caseInsensitive.compare("F", "E"));
assertEquals(1, caseInsensitive.compare("f", "E"));
}
@Test
public void testEmpty() {
assertTrue(comparator.compare("", "a") < 0);
@@ -38,20 +38,20 @@ public abstract class AbstractManeuverDetectionTestCase extends OnlineTracTracBa
* The type of maneuver that should have happened to the given time point.
* @param maneuverTimePoint
* The time point the maneuver type should have happened.
* @param tolerance
* @param toleranceInMillis
* The tolerance of time, the maneuver should have happened in milliseconds.
*/
protected void assertManeuver(List<Maneuver> maneuverList, ManeuverType maneuverType,
TimePoint maneuverTimePoint, int tolerance) {
TimePoint maneuverTimePoint, int toleranceInMillis) {
for (Maneuver maneuver : maneuverList) {
assertNotNull(maneuver.getTimePoint());
if (maneuver.getType() == maneuverType
&& Math.abs(maneuver.getTimePoint().asMillis() - maneuverTimePoint.asMillis()) <= tolerance) {
&& Math.abs(maneuver.getTimePoint().asMillis() - maneuverTimePoint.asMillis()) <= toleranceInMillis) {
maneuversInvalid.remove(maneuver);
return;
}
}
fail("Didn't find maneuver type " + maneuverType + " in " + tolerance + "ms around " + maneuverTimePoint);
fail("Didn't find maneuver type " + maneuverType + " in " + toleranceInMillis + "ms around " + maneuverTimePoint);
}
/**
@@ -48,13 +48,17 @@ public class LockTraceTest {
NamedReentrantReadWriteLock lock = new NamedReentrantReadWriteLock("testReentrantReadLocking-Lock", /* fair */ true);
LockUtil.lockForRead(lock);
assertTrue(lock.getReaders().contains(Thread.currentThread()));
assertEquals(1, lock.getReaders().size());
LockUtil.lockForRead(lock);
assertTrue(lock.getReaders().contains(Thread.currentThread()));
assertEquals(2, lock.getReaders().size());
LockUtil.unlockAfterRead(lock);
assertTrue(lock.getReaders().contains(Thread.currentThread()));
assertEquals(1, lock.getReaders().size());
LockUtil.unlockAfterRead(lock);
assertFalse(lock.getReaders().contains(Thread.currentThread()));
assertEquals(0, lock.getReadHoldCount());
assertEquals(0, lock.getReaders().size());
}
@Test
@@ -0,0 +1,80 @@
package com.sap.sailing.domain.test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.ManeuverType;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.tracking.Maneuver;
import com.sap.sailing.domain.tracking.impl.WindImpl;
import com.sap.sailing.domain.tractracadapter.ReceiverType;
public class ManeuverAnalysisQingdao2014Test extends AbstractManeuverDetectionTestCase {
public ManeuverAnalysisQingdao2014Test() throws MalformedURLException, URISyntaxException {
super();
}
@Override
protected String getExpectedEventName() {
return "ESS Qingdao 2014";
}
@Before
public void setUp() throws URISyntaxException, IOException, InterruptedException, ParseException {
super.setUp();
URI storedUri = new URI("file:///"+new File("resources/event_20140429_ESSQingdao-Race_4.mtb").getCanonicalPath().replace('\\', '/'));
super.setUp(
new URL("file:///" + new File("resources/event_20140429_ESSQingdao-Race_4.txt").getCanonicalPath()),
/* liveUri */null, /* storedUri */storedUri, new ReceiverType[] { ReceiverType.MARKPASSINGS,
ReceiverType.MARKPOSITIONS, ReceiverType.RACECOURSE, ReceiverType.RAWPOSITIONS });
getTrackedRace().recordWind(
new WindImpl(/* position */null, new MillisecondsTimePoint(dateFormat.parse("05/01/2014-09:02:00")),
new KnotSpeedWithBearingImpl(10, new DegreeBearingImpl(269))),
new WindSourceImpl(WindSourceType.WEB));
}
/**
* Tests the Race 4 for competitor "Alinghi" at a time where the maneuver detection test is likely to compute
* a penalty although between the jibe and the tack there is a mark passing
*/
@Test
public void testManeuversForAlinghiCriticalDetection() throws ParseException, NoWindException {
Competitor competitor = getCompetitorByName("Alinghi");
assertNotNull(competitor);
Date fromDate = dateFormat.parse("05/01/2014-09:07:00");
Date toDate = dateFormat.parse("05/01/2014-09:10:00");
assertNotNull(fromDate);
assertNotNull(toDate);
List<Maneuver> maneuvers = getTrackedRace().getManeuvers(competitor, new MillisecondsTimePoint(fromDate),
new MillisecondsTimePoint(toDate), /* waitForLatest */ true);
maneuversInvalid = new ArrayList<Maneuver>(maneuvers);
assertManeuver(maneuvers, ManeuverType.JIBE, new MillisecondsTimePoint(dateFormat.parse("05/01/2014-09:08:15")), 5000);
assertManeuver(maneuvers, ManeuverType.TACK, new MillisecondsTimePoint(dateFormat.parse("05/01/2014-09:08:51")), 5000);
for (Maneuver maneuver : maneuvers) {
// make sure there is no penalty detected in the time frame considered
assertNotSame("Found an unexpected penalty "+maneuver, ManeuverType.PENALTY_CIRCLE, maneuver.getType());
}
}
}
@@ -1302,9 +1302,12 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
entryDTO.totalPoints = entry.getTotalPoints();
entryDTO.reasonForMaxPoints = entry.getMaxPointsReason();
entryDTO.discarded = entry.isDiscarded();
final GPSFixTrack<Competitor, GPSFixMoving> track = trackedRace == null ? null : trackedRace.getTrack(competitor);
if (trackedRace != null) {
Date timePointOfLastPositionFixAtOrBeforeQueryTimePoint = getTimePointOfLastFixAtOrBefore(competitor, trackedRace, timePoint);
entryDTO.averageSamplingInterval = trackedRace.getTrack(competitor).getAverageIntervalBetweenFixes();
if (track != null) {
entryDTO.averageSamplingInterval = track.getAverageIntervalBetweenFixes();
}
if (timePointOfLastPositionFixAtOrBeforeQueryTimePoint != null) {
long timeDifferenceInMs = timePoint.asMillis() - timePointOfLastPositionFixAtOrBeforeQueryTimePoint.getTime();
entryDTO.timeSinceLastPositionFixInSeconds = timeDifferenceInMs == 0 ? 0.0 : timeDifferenceInMs / 1000.0;
@@ -1341,12 +1344,11 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
competitor, startOfRace);
entryDTO.distanceToStartLineAtStartOfRaceInMeters = distanceToStartLineAtStartOfRace == null ? null
: distanceToStartLineAtStartOfRace.getMeters();
Speed speedAtStartTime = trackedRace.getTrack(competitor)
.getEstimatedSpeed(startOfRace);
Speed speedAtStartTime = track == null ? null : track.getEstimatedSpeed(startOfRace);
entryDTO.speedOverGroundAtStartOfRaceInKnots = speedAtStartTime == null ? null
: speedAtStartTime.getKnots();
TimePoint competitorStartTime = firstMarkPassing.getTimePoint();
Speed competitorSpeedWhenPassingStart = trackedRace.getTrack(competitor)
Speed competitorSpeedWhenPassingStart = track == null ? null : track
.getEstimatedSpeed(competitorStartTime);
entryDTO.speedOverGroundAtPassingStartWaypointInKnots = competitorSpeedWhenPassingStart == null ? null
: competitorSpeedWhenPassingStart.getKnots();
@@ -21,13 +21,24 @@ public abstract class HighPointFirstGetsFixedScore extends HighPoint {
private final double scoreForRaceWinner;
private final double minimumScoreFromRank;
public HighPointFirstGetsFixedScore(double scoreForRaceWinner) {
this(scoreForRaceWinner, /* minimumScoreFromRank */ 1.0);
}
protected HighPointFirstGetsFixedScore(double scoreForRaceWinner, double minimumScoreFromRank) {
this.scoreForRaceWinner = scoreForRaceWinner;
this.minimumScoreFromRank = minimumScoreFromRank;
}
protected double getScoreForRaceWinner() {
return scoreForRaceWinner;
}
private double getMinimumScoreFromRank() {
return minimumScoreFromRank;
}
@Override
public Double getScoreForRank(RaceColumn raceColumn, Competitor competitor, int rank, Callable<Integer> numberOfCompetitorsInRaceFetcher, NumberOfCompetitorsInLeaderboardFetcher numberOfCompetitorsInLeaderboardFetcher) {
@@ -36,7 +47,7 @@ public abstract class HighPointFirstGetsFixedScore extends HighPoint {
if (effectiveRank == 0) {
result = null;
} else {
result = Math.max(1.0, (double) (getScoreForRaceWinner() - effectiveRank + 1));
result = Math.max(getMinimumScoreFromRank(), (double) (getScoreForRaceWinner() - effectiveRank + 1));
}
return result;
}
@@ -3,10 +3,10 @@ package com.sap.sailing.domain.leaderboard.impl;
import com.sap.sailing.domain.common.ScoringSchemeType;
public class HighPointWinnerGetsFive extends HighPointFirstGetsFixedScore {
private static final long serialVersionUID = 1367473387431601943L;
private static final long serialVersionUID = 1367473387431601943L;
public HighPointWinnerGetsFive() {
super(/* scoreForRaceWinner */ 5);
public HighPointWinnerGetsFive() {
super(/* scoreForRaceWinner */ 5, /* minimumScoreFromRank */ 0.0);
}
@Override
@@ -398,7 +398,8 @@ public interface TrackedRace extends Serializable {
/**
* Uses a {@link DouglasPeucker Douglas-Peucker} algorithm to approximate this track's fixes starting at time
* <code>from</code> until time point <code>to</code> such that the maximum distance between the track's fixes and
* the approximation is at most <code>maxDistance</code>.
* the approximation is at most <code>maxDistance</code>. The approximation's fixes are original fixes from
* the competitor's {@link GPSFixTrack track}.
*/
List<GPSFixMoving> approximate(Competitor competitor, Distance maxDistance, TimePoint from, TimePoint to);
@@ -5,6 +5,7 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.ConcurrentModificationException;
import java.util.Date;
@@ -1927,11 +1928,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
}
if (extendedTo != null) {
try {
List<Maneuver> extendedResultForCache = detectManeuvers(
competitor,
approximate(competitor,
getRace().getBoatClass().getMaximumDistanceForCourseApproximation(), extendedFrom,
extendedTo));
List<Maneuver> extendedResultForCache = detectManeuvers(competitor, extendedFrom, extendedTo, /* ignoreMarkPassings */ false);
result = new Triple<TimePoint, TimePoint, List<Maneuver>>(extendedFrom, extendedTo,
extendedResultForCache);
} catch (NoWindException ex) {
@@ -1951,11 +1948,28 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
+ (System.currentTimeMillis() - startedAt) + "ms");
return result;
}
/**
* @param ignoreMarkPassings
* When <code>true</code>, no {@link ManeuverType#MARK_PASSING} maneuvers will be identified, and the
* fact that a mark passing would split up what else may be a penalty circle is ignored. This is helpful
* for recursive calls, e.g., after identifying a tack and a jibe around a mark passing and trying to
* identify for the time before and after the mark passing which maneuvers exist on which side of the
* passing.
* @return a valid but possibly empty list
* @see #detectManeuvers(Competitor, List, boolean, TimePoint, TimePoint)
*/
private List<Maneuver> detectManeuvers(Competitor competitor, TimePoint from, TimePoint to, boolean ignoreMarkPassings) throws NoWindException {
return detectManeuvers(
competitor, approximate(competitor, getRace().getBoatClass().getMaximumDistanceForCourseApproximation(),
from, to), ignoreMarkPassings, from, to);
}
/**
* Tries to detect maneuvers on the <code>competitor</code>'s track based on a number of approximating fixes. The
* fixes contain bearing information, but this is not the bearing leading to the next approximation fix but the
* bearing the boat had at the time of the approximating fix which is taken from the original track.<p>
* bearing the boat had at the time of the approximating fix which is taken from the original track.
* <p>
*
* The time period assumed for a maneuver duration is taken from the
* {@link BoatClass#getApproximateManeuverDurationInMilliseconds() boat class}. If no maneuver is detected, an empty
@@ -1966,10 +1980,28 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
* timely distance than {@link #getApproximateManeuverDurationInMilliseconds()} (including single course changes
* that have no surrounding other course changes to group) are grouped into one {@link Maneuver}.
*
* @param ignoreMarkPassings
* When <code>true</code>, no {@link ManeuverType#MARK_PASSING} maneuvers will be identified, and the
* fact that a mark passing would split up what else may be a penalty circle is ignored. This is helpful
* for recursive calls, e.g., after identifying a tack and a jibe around a mark passing and trying to
* identify for the time before and after the mark passing which maneuvers exist on which side of the
* passing.
* @param earliestManeuverStart
* maneuver start will not be before this time point; if a maneuver is found whose time point is at or
* after this time point, no matter how close it is, its start regarding speed and course into the
* maneuver and the leg before the maneuver is not taken from an earlier time point, even if half the
* maneuver duration before the maneuver time point were before this time point.
* @param latestManeuverEnd
* maneuver end will not be after this time point; if a maneuver is found whose time point is at or
* before this time point, no matter how close it is, its end regarding speed and course out of the
* maneuver and the leg after the maneuver is not taken from a later time point, even if half the
* maneuver duration after the maneuver time point were after this time point.
*
* @return an empty list if no maneuver is detected for <code>competitor</code> between <code>from</code> and
* <code>to</code>, or else the list of maneuvers detected.
*/
private List<Maneuver> detectManeuvers(Competitor competitor, List<GPSFixMoving> approximatingFixesToAnalyze)
private List<Maneuver> detectManeuvers(Competitor competitor, List<GPSFixMoving> approximatingFixesToAnalyze,
boolean ignoreMarkPassings, TimePoint earliestManeuverStart, TimePoint latestManeuverEnd)
throws NoWindException {
List<Maneuver> result = new ArrayList<Maneuver>();
if (approximatingFixesToAnalyze.size() > 2) {
@@ -1998,7 +2030,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
// start new list
List<Maneuver> maneuvers = groupChangesInSameDirectionIntoManeuvers(competitor,
speedWithBearingOnApproximationAtBeginningOfUnidirectionalCourseChanges,
courseChangeSequenceInSameDirection);
courseChangeSequenceInSameDirection, ignoreMarkPassings, earliestManeuverStart, latestManeuverEnd);
result.addAll(maneuvers);
courseChangeSequenceInSameDirection.clear();
speedWithBearingOnApproximationAtBeginningOfUnidirectionalCourseChanges = speedWithBearingOnApproximationFromPreviousToCurrent;
@@ -2011,7 +2043,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
if (!courseChangeSequenceInSameDirection.isEmpty()) {
result.addAll(groupChangesInSameDirectionIntoManeuvers(competitor,
speedWithBearingOnApproximationAtBeginningOfUnidirectionalCourseChanges,
courseChangeSequenceInSameDirection));
courseChangeSequenceInSameDirection, ignoreMarkPassings, earliestManeuverStart, latestManeuverEnd));
}
}
return result;
@@ -2062,18 +2094,34 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
* direction which may, e.g., represent a penalty circle or a mark rounding maneuver. As the maneuver's time point,
* the average time point of the course changes that went into the maneuver construction is used.
* <p>
*
* @param speedWithBearingOnApproximationAtBeginning
* the speed/bearing before the first approximating fix passed in
* <code>courseChangeSequenceInSameDirection</code>
* @param courseChangeSequenceInSameDirection
* all expected to have equal {@link CourseChange#to()} values
* @param ignoreMarkPassings
* When <code>true</code>, no {@link ManeuverType#MARK_PASSING} maneuvers will be identified, and the
* fact that a mark passing would split up what else may be a penalty circle is ignored. This is helpful
* for recursive calls, e.g., after identifying a tack and a jibe around a mark passing and trying to
* identify for the time before and after the mark passing which maneuvers exist on which side of the
* passing.
* @param earliestManeuverStart
* maneuver start will not be before this time point; if a maneuver is found whose time point is at or
* after this time point, no matter how close it is, its start regarding speed and course into the
* maneuver and the leg before the maneuver is not taken from an earlier time point, even if half the
* maneuver duration before the maneuver time point were before this time point.
* @param latestManeuverEnd
* maneuver end will not be after this time point; if a maneuver is found whose time point is at or
* before this time point, no matter how close it is, its end regarding speed and course out of the
* maneuver and the leg after the maneuver is not taken from a later time point, even if half the
* maneuver duration after the maneuver time point were after this time point.
*
* @return a non-<code>null</code> list
*/
private List<Maneuver> groupChangesInSameDirectionIntoManeuvers(Competitor competitor,
SpeedWithBearing speedWithBearingOnApproximationAtBeginning,
List<Pair<GPSFixMoving, CourseChange>> courseChangeSequenceInSameDirection) throws NoWindException {
List<Pair<GPSFixMoving, CourseChange>> courseChangeSequenceInSameDirection, boolean ignoreMarkPassings,
TimePoint earliestManeuverStart, TimePoint latestManeuverEnd) throws NoWindException {
List<Maneuver> result = new ArrayList<Maneuver>();
List<Pair<GPSFixMoving, CourseChange>> group = new ArrayList<Pair<GPSFixMoving, CourseChange>>();
if (!courseChangeSequenceInSameDirection.isEmpty()) {
@@ -2104,7 +2152,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
// if next is more then approximate maneuver duration later or further apart than two hull lengths,
// turn the current group into a maneuver and add to result
Util.addAll(createManeuverFromGroupOfCourseChanges(competitor, beforeGroupOnApproximation,
group, afterCurrentCourseChange, totalCourseChangeInDegrees, totalMilliseconds), result);
group, afterCurrentCourseChange, totalCourseChangeInDegrees, totalMilliseconds, earliestManeuverStart, latestManeuverEnd), result);
group.clear();
totalCourseChangeInDegrees = 0.0;
totalMilliseconds = 0l;
@@ -2120,7 +2168,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
} while (iter.hasNext());
if (!group.isEmpty()) {
Util.addAll(createManeuverFromGroupOfCourseChanges(competitor, beforeGroupOnApproximation, group,
afterCurrentCourseChange, totalCourseChangeInDegrees, totalMilliseconds), result);
afterCurrentCourseChange, totalCourseChangeInDegrees, totalMilliseconds, earliestManeuverStart, latestManeuverEnd), result);
}
}
return result;
@@ -2129,19 +2177,15 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
private Iterable<Maneuver> createManeuverFromGroupOfCourseChanges(Competitor competitor,
SpeedWithBearing speedWithBearingOnApproximationAtBeginning, List<Pair<GPSFixMoving, CourseChange>> group,
SpeedWithBearing speedWithBearingOnApproximationAtEnd, double totalCourseChangeInDegrees,
long totalMilliseconds) throws NoWindException {
long totalMilliseconds, TimePoint earliestManeuverStart, TimePoint latestManeuverEnd) throws NoWindException {
List<Maneuver> result = new ArrayList<>();
MillisecondsTimePoint timePointBeforeManeuver = new MillisecondsTimePoint(group.get(0).getA().getTimePoint()
.asMillis()
- getApproximateManeuverDurationInMilliseconds() / 2);
MillisecondsTimePoint timePointAfterManeuver = new MillisecondsTimePoint(group.get(group.size() - 1).getA()
.getTimePoint().asMillis()
+ getApproximateManeuverDurationInMilliseconds() / 2);
TimePoint maneuverTimePoint = computeManeuverTimepoint(competitor, timePointBeforeManeuver,
timePointAfterManeuver);
TimePoint timePointBeforeManeuver = Collections.max(Arrays.asList(new MillisecondsTimePoint(group.get(0).getA().getTimePoint()
.asMillis() - getApproximateManeuverDurationInMilliseconds() / 2), earliestManeuverStart));
TimePoint timePointAfterManeuver = Collections.min(Arrays.asList(new MillisecondsTimePoint(group.get(group.size() - 1).getA()
.getTimePoint().asMillis() + getApproximateManeuverDurationInMilliseconds() / 2), latestManeuverEnd));
TimePoint maneuverTimePoint = computeManeuverTimepoint(competitor, timePointBeforeManeuver, timePointAfterManeuver);
final GPSFixTrack<Competitor, GPSFixMoving> competitorTrack = getTrack(competitor);
Position maneuverPosition = competitorTrack
.getEstimatedPosition(maneuverTimePoint, /* extrapolate */false);
Position maneuverPosition = competitorTrack.getEstimatedPosition(maneuverTimePoint, /* extrapolate */false);
Tack tackAfterManeuver = getTack(maneuverPosition, timePointAfterManeuver,
speedWithBearingOnApproximationAtEnd.getBearing());
ManeuverType maneuverType;
@@ -2154,18 +2198,23 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
final NauticalSide courseChangedTo = totalCourseChangeInDegrees < 0 ? NauticalSide.PORT : NauticalSide.STARBOARD;
// check for mask passing first; a tacking / jibe-setting mark rounding thus takes precedence over being
// detected as a penalty circle
final TimePoint markPassingTimePoint;
if (legBeforeManeuver != legAfterManeuver
// a maneuver at the start line is not to be considered a MARK_PASSING maneuver; show a tack as a tack
&& legAfterManeuver != null
&& legAfterManeuver.getLeg().getFrom() != getRace().getCourse().getFirstWaypoint()) {
maneuverType = ManeuverType.MARK_PASSING;
waypointPassed = legAfterManeuver.getLeg().getFrom();
MarkPassing markPassing = getMarkPassing(competitor, waypointPassed);
markPassingTimePoint = markPassing != null ? markPassing.getTimePoint() : maneuverTimePoint;
Position markPassingPosition = markPassing != null ? competitorTrack.getEstimatedPosition(markPassingTimePoint, /* extrapolate */false) : maneuverPosition;
sideToWhichWaypointWasPassed = courseChangedTo;
// produce an additional mark passing maneuver; continue to analyze to catch jibe sets and kiwi drops
result.add(new MarkPassingManeuverImpl(maneuverType, tackAfterManeuver, maneuverPosition,
maneuverTimePoint, speedWithBearingOnApproximationAtBeginning,
result.add(new MarkPassingManeuverImpl(ManeuverType.MARK_PASSING, tackAfterManeuver, markPassingPosition,
markPassingTimePoint, speedWithBearingOnApproximationAtBeginning,
speedWithBearingOnApproximationAtEnd, totalCourseChangeInDegrees, maneuverLoss, waypointPassed,
sideToWhichWaypointWasPassed));
} else {
markPassingTimePoint = null;
}
final Wind wind = getWind(maneuverPosition, maneuverTimePoint);
final SpeedWithBearing estimatedSpeedBeforeManeuver = competitorTrack.getEstimatedSpeed(timePointBeforeManeuver);
@@ -2178,36 +2227,51 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
courseAfterManeuver, wind.getBearing());
boolean tacked = bearingChangeAnalyzer.didPass(courseBeforeManeuver, totalCourseChangeInDegrees,
courseAfterManeuver, wind.getFrom());
if (tacked && jibed) {
maneuverType = ManeuverType.PENALTY_CIRCLE;
if (legBeforeManeuver != null) {
maneuverLoss = legBeforeManeuver.getManeuverLoss(timePointBeforeManeuver, maneuverTimePoint,
timePointAfterManeuver);
}
} else if (tacked) {
maneuverType = ManeuverType.TACK;
if (legBeforeManeuver != null) {
maneuverLoss = legBeforeManeuver.getManeuverLoss(timePointBeforeManeuver, maneuverTimePoint,
timePointAfterManeuver);
}
} else if (jibed) {
maneuverType = ManeuverType.JIBE;
if (legBeforeManeuver != null) {
maneuverLoss = legBeforeManeuver.getManeuverLoss(timePointBeforeManeuver, maneuverTimePoint,
timePointAfterManeuver);
}
if (markPassingTimePoint != null && (tacked || jibed)) {
// In case of a mark passing we need to split the maneuver analysis into the phase before and after
// the mark passing. First of all, this is important to identify the correct maneuver time point for
// each tack and jibe, second it is essential to call a penalty which is only the case if the tack and
// the jibe are on the same side of the mark passing; otherwise this may have been a jibe set or a
// kiwi drop.
// Therefore, we recursively detect the maneuvers for the segment before and the segment after the
// mark passing and add the results to our result.
result.addAll(detectManeuvers(competitor, timePointBeforeManeuver, markPassingTimePoint.minus(1), /* ignoreMarkPassings */ true));
result.addAll(detectManeuvers(competitor, markPassingTimePoint.plus(1), timePointAfterManeuver, /* ignoreMarkPassings */ true));
} else {
// heading up or bearing away
Bearing windBearing = wind.getBearing();
Bearing toWindBeforeManeuver = windBearing.getDifferenceTo(speedWithBearingOnApproximationAtBeginning.getBearing());
Bearing toWindAfterManeuver = windBearing.getDifferenceTo(speedWithBearingOnApproximationAtEnd.getBearing());
maneuverType = Math.abs(toWindBeforeManeuver.getDegrees()) < Math.abs(toWindAfterManeuver.getDegrees()) ? ManeuverType.HEAD_UP
: ManeuverType.BEAR_AWAY;
// Either there was no mark passing, or the mark passing was not accompanied by a tack or a jibe
if (tacked && jibed && markPassingTimePoint == null) {
maneuverType = ManeuverType.PENALTY_CIRCLE;
if (legBeforeManeuver != null) {
maneuverLoss = legBeforeManeuver.getManeuverLoss(timePointBeforeManeuver, maneuverTimePoint,
timePointAfterManeuver);
}
} else if (tacked) {
maneuverType = ManeuverType.TACK;
if (legBeforeManeuver != null) {
maneuverLoss = legBeforeManeuver.getManeuverLoss(timePointBeforeManeuver, maneuverTimePoint,
timePointAfterManeuver);
}
} else if (jibed) {
maneuverType = ManeuverType.JIBE;
if (legBeforeManeuver != null) {
maneuverLoss = legBeforeManeuver.getManeuverLoss(timePointBeforeManeuver, maneuverTimePoint,
timePointAfterManeuver);
}
} else {
// heading up or bearing away
Bearing windBearing = wind.getBearing();
Bearing toWindBeforeManeuver = windBearing
.getDifferenceTo(speedWithBearingOnApproximationAtBeginning.getBearing());
Bearing toWindAfterManeuver = windBearing.getDifferenceTo(speedWithBearingOnApproximationAtEnd
.getBearing());
maneuverType = Math.abs(toWindBeforeManeuver.getDegrees()) < Math.abs(toWindAfterManeuver
.getDegrees()) ? ManeuverType.HEAD_UP : ManeuverType.BEAR_AWAY;
}
final Maneuver maneuver = new ManeuverImpl(maneuverType, tackAfterManeuver, maneuverPosition,
maneuverTimePoint, speedWithBearingOnApproximationAtBeginning,
speedWithBearingOnApproximationAtEnd, totalCourseChangeInDegrees, maneuverLoss);
result.add(maneuver);
}
final Maneuver maneuver = new ManeuverImpl(maneuverType, tackAfterManeuver, maneuverPosition,
maneuverTimePoint, speedWithBearingOnApproximationAtBeginning,
speedWithBearingOnApproximationAtEnd, totalCourseChangeInDegrees, maneuverLoss);
result.add(maneuver);
}
return result;
}
@@ -2216,8 +2280,8 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
* Computes the maneuver time point as the time point along between maneuver start and end where the competitor's
* track has greatest change in course.
*/
private TimePoint computeManeuverTimepoint(Competitor competitor, MillisecondsTimePoint timePointBeforeManeuver,
MillisecondsTimePoint timePointAfterManeuver) {
private TimePoint computeManeuverTimepoint(Competitor competitor, TimePoint timePointBeforeManeuver,
TimePoint timePointAfterManeuver) {
TimePoint result = timePointBeforeManeuver;
GPSFixTrack<Competitor, GPSFixMoving> track = getTrack(competitor);
GPSFixMoving lastFix = null;
@@ -76,7 +76,7 @@ public class MasterDataResource extends AbstractSailingServerResource {
final TopLevelMasterData masterData = new TopLevelMasterData(groupsToExport,
getService().getAllEvents(), getService().getPersistentRegattasForRaceIDs(), getService()
.getAllMediaTracks(), exportWind);
.getAllMediaTracks(), exportWind);
ResponseBuilder resp;
if (compress) {
@@ -38,6 +38,19 @@
<h2 class="articleSubheadline">May 2014</h2>
<ul class="bulletList">
<li>Analysis of tacks and jibes around mark passings has now been improved. Before,
a jibe followed by a tack that turns in the same direction (e.g., to port) so far
was always called a penalty maneuver. Now, if a mark passing separates such a tack
from such a jibe, no penalty is called anymore, and the two maneuvers are identified
correctly.
</li>
<li>Another note on maneuver analysis: we received questions regarding the maneuvers
involved in clearing an OCS. The SAP Sailing Analytics treat a clearing of
an OCS, going back behind the start line and crossing it again, as if the competitor
started again. In particular this means that all maneuvers prior to this new start
do not count for the metrics; neither does the distance sailed between the first (OCS)
start and the clear start.
</li>
<li>A hint regarding the "distance to start line" metrics: please keep in mind that currently this
measurement is calculated as the distance of the GPS tracker from the line. Unless the tracker
is mounted near the bow (or at the bow sprit, if any), the distance calculated this way will
+12 -1
View File
@@ -167,6 +167,17 @@ Assume you want to forward UDP packets from machine A (port 2014) to machine B (
Now also UDP packets get transmitted through.
### Set limits for a Linux server
Especially our EC2 CentOS Linux installations use `/etc/security/limits.conf` and `/etc/security/limits.d/*` to specify upper bounds for the number of processes / threads and file handles that a user may use. On EC2, in particular the `/etc/security/limits.d/90-nproc.conf` file set a small limit for the soft limit for the number of processes:
<pre>
* soft nproc 1024
</pre>
Changing this to a greater value, such as 65536, helps, e.g., to avoid the following message:
<pre>
su: cannot set user id: Resource temporarily unavailable
</pre>
### Set limits (ulimit) for a running process
<pre>
@@ -220,4 +231,4 @@ When installing a new version of server code that contains changes related to GW
<pre>
-Dorg.eclipse.jetty.LEVEL=OFF -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
</pre>
</pre>