java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/CourseChangeBasedTrackApproximation.java
... ...
@@ -247,24 +247,7 @@ public class CourseChangeBasedTrackApproximation implements Serializable, GPSTra
247 247
final GPSFixMoving result;
248 248
final SpeedWithBearing nextSpeed = next.isEstimatedSpeedCached() ? next.getCachedEstimatedSpeed() : track.getEstimatedSpeed(next.getTimePoint());
249 249
if (logFixes) {
250
- final boolean validityCached = next.isValidityCached();
251
- final boolean validity;
252
- if (validityCached) {
253
- validity = next.isValidCached();
254
- } else {
255
- track.lockForRead();
256
- try {
257
- validity = track.isValid(next);
258
- } finally {
259
- track.unlockAfterRead();
260
- }
261
- }
262
- // CSV logging: approxId, fixIndex, fixTimeMillis, validityCached, speedCached, COG, SOG
263
- System.out.println(System.identityHashCode(this) + "," + next.getTimePoint().asMillis() + ","
264
- + next.isValidityCached() + "," + next.isEstimatedSpeedCached() + ","
265
- + (nextSpeed == null ? "null" : nextSpeed.getBearing().getDegrees()) + ","
266
- + (nextSpeed == null ? "null" : nextSpeed.getKnots()) + ","
267
- + validityCached + "," + validity);
250
+ logFix(next, nextSpeed);
268 251
}
269 252
if (nextSpeed != null) {
270 253
numberOfFixesAdded++;
... ...
@@ -322,6 +305,27 @@ public class CourseChangeBasedTrackApproximation implements Serializable, GPSTra
322 305
return result;
323 306
}
324 307
308
+ private void logFix(GPSFixMoving next, final SpeedWithBearing nextSpeed) {
309
+ final boolean validityCached = next.isValidityCached();
310
+ final boolean validity;
311
+ if (validityCached) {
312
+ validity = next.isValidCached();
313
+ } else {
314
+ track.lockForRead();
315
+ try {
316
+ validity = track.isValid(next);
317
+ } finally {
318
+ track.unlockAfterRead();
319
+ }
320
+ }
321
+ // CSV logging: approxId, fixIndex, fixTimeMillis, validityCached, speedCached, COG, SOG
322
+ System.out.println(System.identityHashCode(this) + "," + next.getTimePoint().asMillis() + ","
323
+ + next.isValidityCached() + "," + next.isEstimatedSpeedCached() + ","
324
+ + (nextSpeed == null ? "null" : nextSpeed.getBearing().getDegrees()) + ","
325
+ + (nextSpeed == null ? "null" : nextSpeed.getKnots()) + ","
326
+ + validityCached + "," + validity);
327
+ }
328
+
325 329
/**
326 330
* Tries to extract a maneuver candidate from the current {@link #window}. See {@link #getManeuverCandidate()}.
327 331
* Basically, the maximum course change in the window has to be equal to or exceed the maneuver threshold. If
java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html
... ...
@@ -5,6 +5,14 @@
5 5
<div id="mainContent">
6 6
<h4 class="articleHeadline" id="sailingAnalyticsHeadline">What's New - Sailing Analytics</h4>
7 7
<div class="innerContent">
8
+ <h5 class="articleSubheadline">March 2026</h5>
9
+ <ul class="bulletList">
10
+ <li>Position fixes are considered for maneuver analysis now only after enough later fixes
11
+ (usually ten seconds) have been received to ensure that the older fixes don't change
12
+ their dampened COG/SOG values based on the newer fixes. This sacrifices short
13
+ maneuver calculation delays for better performance due to fewer re-calculations
14
+ and reliable results with no difference between live and replay analysis.</li>
15
+ </ul>
8 16
<h5 class="articleSubheadline">December 2025</h5>
9 17
<ul class="bulletList">
10 18
<li>Added boat class Fareast 28R.</li>