mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-01 18:03:59 +00:00
added (untested) support for converting RPD messages into domain objects
This commit is contained in:
1 parent
0c4926c7ae
commit
6fa43efb50
3 files changed
+85
-5
No files matched your search
+9
@@ -1,10 +1,13 @@
|
||||
package com.sap.sailing.domain.swisstimingadapter;
|
||||
|
||||
import com.sap.sailing.domain.base.Buoy;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.Event;
|
||||
import com.sap.sailing.domain.base.Nationality;
|
||||
import com.sap.sailing.domain.base.RaceDefinition;
|
||||
import com.sap.sailing.domain.base.TimePoint;
|
||||
import com.sap.sailing.domain.swisstimingadapter.impl.DomainFactoryImpl;
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
|
||||
public interface DomainFactory {
|
||||
final static DomainFactory INSTANCE = new DomainFactoryImpl();
|
||||
@@ -16,4 +19,10 @@ public interface DomainFactory {
|
||||
Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor);
|
||||
|
||||
RaceDefinition createRaceDefinition(Event event, Race race, StartList startList, Course course);
|
||||
|
||||
Buoy getOrCreateBuoy(String trackerID);
|
||||
|
||||
GPSFixMoving createGPSFix(TimePoint timePointOfTransmission, Fix fix);
|
||||
|
||||
Competitor getCompetitorByBoatID(String sailNumber);
|
||||
}
|
||||
+38
-2
@@ -7,6 +7,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sap.sailing.domain.base.Boat;
|
||||
import com.sap.sailing.domain.base.Buoy;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.ControlPoint;
|
||||
import com.sap.sailing.domain.base.Event;
|
||||
@@ -14,12 +15,14 @@ import com.sap.sailing.domain.base.Nationality;
|
||||
import com.sap.sailing.domain.base.Person;
|
||||
import com.sap.sailing.domain.base.RaceDefinition;
|
||||
import com.sap.sailing.domain.base.Team;
|
||||
import com.sap.sailing.domain.base.TimePoint;
|
||||
import com.sap.sailing.domain.base.Waypoint;
|
||||
import com.sap.sailing.domain.base.impl.BoatImpl;
|
||||
import com.sap.sailing.domain.base.impl.BuoyImpl;
|
||||
import com.sap.sailing.domain.base.impl.CourseImpl;
|
||||
import com.sap.sailing.domain.base.impl.EventImpl;
|
||||
import com.sap.sailing.domain.base.impl.GateImpl;
|
||||
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.base.impl.NationalityImpl;
|
||||
import com.sap.sailing.domain.base.impl.PersonImpl;
|
||||
import com.sap.sailing.domain.base.impl.RaceDefinitionImpl;
|
||||
@@ -27,20 +30,26 @@ import com.sap.sailing.domain.base.impl.TeamImpl;
|
||||
import com.sap.sailing.domain.base.impl.WaypointImpl;
|
||||
import com.sap.sailing.domain.swisstimingadapter.Course;
|
||||
import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
|
||||
import com.sap.sailing.domain.swisstimingadapter.Fix;
|
||||
import com.sap.sailing.domain.swisstimingadapter.Mark;
|
||||
import com.sap.sailing.domain.swisstimingadapter.MessageType;
|
||||
import com.sap.sailing.domain.swisstimingadapter.Race;
|
||||
import com.sap.sailing.domain.swisstimingadapter.StartList;
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl;
|
||||
import com.sap.sailing.util.Util;
|
||||
|
||||
public class DomainFactoryImpl implements DomainFactory {
|
||||
private final Map<String, Event> raceIDToEventCache;
|
||||
private final Map<String, Competitor> boatIDToCompetitorCache;
|
||||
private final Map<String, Buoy> buoyCache;
|
||||
private final Map<Iterable<String>, ControlPoint> controlPointCache;
|
||||
private final Map<String, Nationality> nationalityCache;
|
||||
|
||||
public DomainFactoryImpl() {
|
||||
raceIDToEventCache = new HashMap<String, Event>();
|
||||
boatIDToCompetitorCache = new HashMap<String, Competitor>();
|
||||
buoyCache = new HashMap<String, Buoy>();
|
||||
controlPointCache = new HashMap<Iterable<String>, ControlPoint>();
|
||||
nationalityCache = new HashMap<String, Nationality>();
|
||||
}
|
||||
@@ -55,6 +64,11 @@ public class DomainFactoryImpl implements DomainFactory {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Competitor getCompetitorByBoatID(String boatID) {
|
||||
return boatIDToCompetitorCache.get(boatID);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Competitor getOrCreateCompetitor(com.sap.sailing.domain.swisstimingadapter.Competitor competitor) {
|
||||
Competitor result = boatIDToCompetitorCache.get(competitor.getBoatID());
|
||||
@@ -118,13 +132,13 @@ public class DomainFactoryImpl implements DomainFactory {
|
||||
if (result == null) {
|
||||
switch (Util.size(devices)) {
|
||||
case 1:
|
||||
result = new BuoyImpl(devices.iterator().next());
|
||||
result = getOrCreateBuoy(devices.iterator().next());
|
||||
break;
|
||||
case 2:
|
||||
Iterator<String> buoyNameIter = devices.iterator();
|
||||
String left = buoyNameIter.next();
|
||||
String right = buoyNameIter.next();
|
||||
result = new GateImpl(new BuoyImpl(left), new BuoyImpl(right), left+"/"+right);
|
||||
result = new GateImpl(getOrCreateBuoy(left), getOrCreateBuoy(right), left+"/"+right);
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Don't know how to handle control points with number of devices neither 1 nor 2. Was "+Util.size(devices));
|
||||
@@ -132,4 +146,26 @@ public class DomainFactoryImpl implements DomainFactory {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* the ID which is probably also used as the "device name" and the "sail number" in case of an
|
||||
* {@link MessageType#RPD RPD} message
|
||||
*/
|
||||
@Override
|
||||
public Buoy getOrCreateBuoy(String id) {
|
||||
Buoy result = buoyCache.get(id);
|
||||
if (result == null) {
|
||||
result = new BuoyImpl(id);
|
||||
buoyCache.put(id, result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GPSFixMoving createGPSFix(TimePoint timePointOfTransmission, Fix fix) {
|
||||
GPSFixMoving result = new GPSFixMovingImpl(fix.getPosition(), new MillisecondsTimePoint(
|
||||
timePointOfTransmission.asMillis() + fix.getAgeOfDataInMilliseconds()), fix.getSpeed());
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+38
-3
@@ -8,7 +8,10 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.sap.sailing.domain.base.Buoy;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.Distance;
|
||||
import com.sap.sailing.domain.base.Event;
|
||||
import com.sap.sailing.domain.base.RaceDefinition;
|
||||
@@ -25,8 +28,11 @@ import com.sap.sailing.domain.swisstimingadapter.StartList;
|
||||
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
|
||||
import com.sap.sailing.domain.swisstimingadapter.SwissTimingRaceTracker;
|
||||
import com.sap.sailing.domain.tracking.DynamicRaceDefinitionSet;
|
||||
import com.sap.sailing.domain.tracking.DynamicTrack;
|
||||
import com.sap.sailing.domain.tracking.DynamicTrackedEvent;
|
||||
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
|
||||
import com.sap.sailing.domain.tracking.GPSFix;
|
||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sailing.domain.tracking.RaceHandle;
|
||||
import com.sap.sailing.domain.tracking.RaceTracker;
|
||||
@@ -36,6 +42,8 @@ import com.sap.sailing.domain.tracking.WindTrack;
|
||||
import com.sap.sailing.util.Util.Triple;
|
||||
|
||||
public class SwissTimingRaceTrackerImpl implements SwissTimingRaceTracker, SailMasterListener {
|
||||
private static final Logger logger = Logger.getLogger(SwissTimingRaceTrackerImpl.class.getName());
|
||||
|
||||
private final SailMasterConnector connector;
|
||||
private final String raceID;
|
||||
private final RaceSpecificMessageLoader messageLoader;
|
||||
@@ -129,8 +137,35 @@ public class SwissTimingRaceTrackerImpl implements SwissTimingRaceTracker, SailM
|
||||
public void receivedRacePositionData(String raceID, RaceStatus status, TimePoint timePoint, TimePoint startTime,
|
||||
Long millisecondsSinceRaceStart, Integer nextMarkIndexForLeader, Distance distanceToNextMarkForLeader,
|
||||
Collection<Fix> fixes) {
|
||||
// TODO implement receivedRacePositionData; extract race start time, add GPSFixMoving objects to tracked race
|
||||
|
||||
assert this.raceID.equals(raceID);
|
||||
if (this.raceID.equals(raceID)) {
|
||||
if (startTime != null) {
|
||||
trackedRace.setStartTimeReceived(startTime);
|
||||
}
|
||||
for (Fix fix : fixes) {
|
||||
GPSFixMoving gpsFix = domainFactory.createGPSFix(timePoint, fix);
|
||||
switch (fix.getTrackerType()) {
|
||||
case BUOY:
|
||||
case COMMITTEE:
|
||||
case JURY:
|
||||
case TIMINGSCORING:
|
||||
case UNIDENTIFIED:
|
||||
String trackerID = fix.getBoatID();
|
||||
Buoy buoy = domainFactory.getOrCreateBuoy(trackerID);
|
||||
DynamicTrack<Buoy, GPSFix> buoyTrack = trackedRace.getOrCreateTrack(buoy);
|
||||
buoyTrack.addGPSFix(gpsFix);
|
||||
break;
|
||||
case COMPETITOR:
|
||||
Competitor competitor = domainFactory.getCompetitorByBoatID(fix.getBoatID());
|
||||
DynamicTrack<Competitor, GPSFixMoving> competitorTrack = trackedRace.getTrack(competitor);
|
||||
competitorTrack.addGPSFix(gpsFix);
|
||||
break;
|
||||
default:
|
||||
logger.info("Unknoen tracker type "+fix.getTrackerType());
|
||||
}
|
||||
}
|
||||
// TODO implement receivedRacePositionData; extract race start time, add GPSFixMoving objects to tracked race
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -154,7 +189,7 @@ public class SwissTimingRaceTrackerImpl implements SwissTimingRaceTracker, SailM
|
||||
}
|
||||
|
||||
private void createRaceDefinition(String raceID) {
|
||||
assert this.raceID == raceID;
|
||||
assert this.raceID.equals(raceID);
|
||||
assert startList != null;
|
||||
assert course != null;
|
||||
// now we can create the RaceDefinition and most other things
|
||||
|
||||
Reference in new issue
Block a user