added statistics to liverace view

This commit is contained in:
Kai Boernert committed 2017-06-20 15:29:47 +02:00
1 parent b9895c529e
commit 40d1ba137c
7 files changed
+236 -40

No files matched your search

@@ -6,6 +6,7 @@ import java.util.Comparator;
import java.util.Date;
import java.util.Map;
import com.google.gwt.core.shared.GWT;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.dto.AbstractLeaderboardDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
@@ -44,46 +45,49 @@ public class IdleUpNextNode extends FiresPlaceNode {
firePlaceChangeAndStartTimer();
if (raceTimesInfoProvider == null) {
raceTimesInfoProvider = new RaceTimesInfoProvider(cf.getSailingService(), AutoplayHelper.asyncActionsExecutor,
cf.getErrorReporter(), new ArrayList<RegattaAndRaceIdentifier>(), 10000l);
raceTimesInfoProvider.reset();
StrippedLeaderboardDTO selectedLeaderboard = AutoplayHelper.getSelectedLeaderboard(
cf.getAutoPlayCtx().getEvent(), cf.getAutoPlayCtx().getContextDefinition().getLeaderboardName());
for (RaceColumnDTO race : selectedLeaderboard.getRaceList()) {
for (FleetDTO fleet : race.getFleets()) {
RegattaAndRaceIdentifier raceIdentifier = race.getRaceIdentifier(fleet);
if (raceIdentifier != null && !raceTimesInfoProvider.containsRaceIdentifier(raceIdentifier)) {
raceTimesInfoProvider.addRaceIdentifier(raceIdentifier, false);
}
}
}
raceTimesInfoProvider.forceTimesInfosUpdate();
raceTimesInfoProvider.addRaceTimesInfoProviderListener(new RaceTimesInfoProviderListener() {
@Override
public void raceTimesInfosReceived(Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfo,
long clientTimeWhenRequestWasSent, Date serverTimeDuringRequest,
long clientTimeWhenResponseWasReceived) {
ArrayList<Pair<RegattaAndRaceIdentifier, Date>> raceToStartOfRace = new ArrayList<Pair<RegattaAndRaceIdentifier, Date>>();
checkForRaceStarts(selectedLeaderboard, serverTimeDuringRequest, raceTimesInfoProvider,
raceToStartOfRace);
Collections.sort(raceToStartOfRace, new Comparator<Pair<RegattaAndRaceIdentifier, Date>>() {
@Override
public int compare(Pair<RegattaAndRaceIdentifier, Date> o1,
Pair<RegattaAndRaceIdentifier, Date> o2) {
return Long.compare(o1.getB().getTime(), o2.getB().getTime());
}
});
place.setUpData(raceToStartOfRace);
}
});
createRaceTimeInfoProvider();
}
}
private void createRaceTimeInfoProvider() {
raceTimesInfoProvider = new RaceTimesInfoProvider(cf.getSailingService(), AutoplayHelper.asyncActionsExecutor,
cf.getErrorReporter(), new ArrayList<RegattaAndRaceIdentifier>(), 10000l);
raceTimesInfoProvider.reset();
StrippedLeaderboardDTO selectedLeaderboard = AutoplayHelper.getSelectedLeaderboard(
cf.getAutoPlayCtx().getEvent(), cf.getAutoPlayCtx().getContextDefinition().getLeaderboardName());
for (RaceColumnDTO race : selectedLeaderboard.getRaceList()) {
for (FleetDTO fleet : race.getFleets()) {
RegattaAndRaceIdentifier raceIdentifier = race.getRaceIdentifier(fleet);
if (raceIdentifier != null && !raceTimesInfoProvider.containsRaceIdentifier(raceIdentifier)) {
raceTimesInfoProvider.addRaceIdentifier(raceIdentifier, false);
}
}
}
raceTimesInfoProvider.forceTimesInfosUpdate();
raceTimesInfoProvider.addRaceTimesInfoProviderListener(new RaceTimesInfoProviderListener() {
@Override
public void raceTimesInfosReceived(Map<RegattaAndRaceIdentifier, RaceTimesInfoDTO> raceTimesInfo,
long clientTimeWhenRequestWasSent, Date serverTimeDuringRequest,
long clientTimeWhenResponseWasReceived) {
ArrayList<Pair<RegattaAndRaceIdentifier, Date>> raceToStartOfRace = new ArrayList<Pair<RegattaAndRaceIdentifier, Date>>();
checkForRaceStarts(selectedLeaderboard, serverTimeDuringRequest, raceTimesInfoProvider,
raceToStartOfRace);
Collections.sort(raceToStartOfRace, new Comparator<Pair<RegattaAndRaceIdentifier, Date>>() {
@Override
public int compare(Pair<RegattaAndRaceIdentifier, Date> o1,
Pair<RegattaAndRaceIdentifier, Date> o2) {
return Long.compare(o1.getB().getTime(), o2.getB().getTime());
}
});
place.setUpData(raceToStartOfRace);
}
});
};
/**
@@ -107,6 +111,7 @@ public class IdleUpNextNode extends FiresPlaceNode {
for (RaceColumnDTO race : currentLeaderboard.getRaceList()) {
for (FleetDTO fleet : race.getFleets()) {
RegattaAndRaceIdentifier raceIdentifier = race.getRaceIdentifier(fleet);
GWT.log("Checking starts " + raceIdentifier);
if (raceIdentifier != null) {
RaceTimesInfoDTO raceTimes = raceTimesInfos.get(raceIdentifier);
if (raceTimes != null && raceTimes.startOfTracking != null && raceTimes.getStartOfRace() != null
@@ -1,5 +1,7 @@
package com.sap.sailing.gwt.autoplay.client.nodes;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.gwt.autoplay.client.app.AutoPlayClientFactory;
import com.sap.sailing.gwt.autoplay.client.events.AutoPlayHeaderEvent;
@@ -7,17 +9,31 @@ import com.sap.sailing.gwt.autoplay.client.nodes.base.FiresPlaceNode;
import com.sap.sailing.gwt.autoplay.client.places.screens.liveraceloop.racemapwithleaderboard.LiveRaceWithRacemapAndLeaderBoardPlace;
import com.sap.sailing.gwt.autoplay.client.utils.AutoplayHelper;
import com.sap.sailing.gwt.autoplay.client.utils.AutoplayHelper.RVWrapper;
import com.sap.sailing.gwt.home.communication.event.sixtyinch.GetSixtyInchStatisticAction;
import com.sap.sailing.gwt.home.communication.event.sixtyinch.GetSixtyInchStatisticDTO;
import com.sap.sailing.gwt.ui.client.StringMessages;
public class LiveRaceWithRacemapNode extends FiresPlaceNode {
private final AutoPlayClientFactory cf;
protected LiveRaceWithRacemapAndLeaderBoardPlace place;
private Timer updateTimer;
public LiveRaceWithRacemapNode(AutoPlayClientFactory cf) {
super(LiveRaceWithRacemapNode.class.getName());
this.cf = cf;
}
@Override
public void onStop() {
super.onStop();
if(updateTimer != null){
updateTimer.cancel();
}
}
public void onStart() {
place = new LiveRaceWithRacemapAndLeaderBoardPlace();
AutoplayHelper.create(cf.getSailingService(), cf.getErrorReporter(),
cf.getAutoPlayCtx().getContextDefinition().getLeaderboardName(), cf.getAutoPlayCtx().getContextDefinition().getEventId(),
cf.getAutoPlayCtx().getEvent(), cf.getEventBus(), cf.getDispatch(), cf.getAutoPlayCtx().getLiveRace(),
@@ -34,7 +50,6 @@ public class LiveRaceWithRacemapNode extends FiresPlaceNode {
@Override
public void onSuccess(RVWrapper result) {
LiveRaceWithRacemapAndLeaderBoardPlace place = new LiveRaceWithRacemapAndLeaderBoardPlace();
place.setRaceMap(result.raceboardPerspective, result.csel);
setPlaceToGo(place);
firePlaceChangeAndStartTimer();
@@ -42,5 +57,30 @@ public class LiveRaceWithRacemapNode extends FiresPlaceNode {
cf.getAutoPlayCtx().getLiveRace().getRaceName()));
}
});
updateTimer = new Timer(){
@Override
public void run() {
cf.getDispatch().execute(new GetSixtyInchStatisticAction(cf.getAutoPlayCtx().getLiveRace().getRaceName(), cf.getAutoPlayCtx().getLiveRace().getRegattaName()),
new AsyncCallback<GetSixtyInchStatisticDTO>() {
@Override
public void onFailure(Throwable caught) {
GWT.log("error getting data! " + caught.getMessage());
caught.printStackTrace();
}
@Override
public void onSuccess(GetSixtyInchStatisticDTO result) {
place.setStatistic(result);
}
});
}
};
updateTimer.scheduleRepeating(2000);
};
}
@@ -2,6 +2,7 @@ package com.sap.sailing.gwt.autoplay.client.places.screens.liveraceloop.racemapw
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceTokenizer;
import com.sap.sailing.gwt.home.communication.event.sixtyinch.GetSixtyInchStatisticDTO;
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap;
@@ -21,11 +22,16 @@ public class LiveRaceWithRacemapAndLeaderBoardPlace extends Place {
private RaceMap raceMap;
private Throwable error;
private CompetitorSelectionModel raceMapSelectionProvider;
private GetSixtyInchStatisticDTO statistic;
public void setRaceMap(RaceMap result, CompetitorSelectionModel csel) {
this.raceMap = result;
this.raceMapSelectionProvider = csel;
}
public GetSixtyInchStatisticDTO getStatistic() {
return statistic;
}
public RaceMap getRaceMap() {
return raceMap;
@@ -43,4 +49,8 @@ public class LiveRaceWithRacemapAndLeaderBoardPlace extends Place {
return raceMapSelectionProvider;
}
public void setStatistic(GetSixtyInchStatisticDTO result) {
statistic = result;
}
}
@@ -1,22 +1,28 @@
package com.sap.sailing.gwt.autoplay.client.places.screens.liveraceloop.racemapwithleaderboard;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.LeaderboardRowDTO;
import com.sap.sailing.gwt.autoplay.client.app.AutoPlayClientFactory;
import com.sap.sailing.gwt.autoplay.client.app.AutoPlayPresenterConfigured;
import com.sap.sailing.gwt.autoplay.client.shared.SixtyInchLeaderBoard;
import com.sap.sailing.gwt.autoplay.client.utils.AutoplayHelper;
import com.sap.sailing.gwt.settings.client.leaderboard.LeaderboardSettings;
import com.sap.sailing.gwt.settings.client.leaderboard.LeaderboardSettings.RaceColumnSelectionStrategies;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardEntryPoint;
import com.sap.sailing.gwt.ui.shared.WindDTO;
import com.sap.sailing.gwt.ui.shared.WindTrackInfoDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.player.Timer.PlayModes;
@@ -32,10 +38,12 @@ public class LiveRaceWithRacemapAndLeaderBoardPresenterImpl
private int selected = -1;
ArrayList<CompetitorDTO> compList = new ArrayList<>();
private com.sap.sse.gwt.client.player.Timer timer;
private AutoPlayClientFactory cf;
public LiveRaceWithRacemapAndLeaderBoardPresenterImpl(LiveRaceWithRacemapAndLeaderBoardPlace place,
AutoPlayClientFactory clientFactory, LiveRaceWithRacemapAndLeaderBoardView LifeRaceWithRacemapViewImpl) {
super(place, clientFactory);
this.cf = clientFactory;
this.view = LifeRaceWithRacemapViewImpl;
selectionTimer = new Timer() {
@Override
@@ -82,6 +90,37 @@ public class LiveRaceWithRacemapAndLeaderBoardPresenterImpl
selected = 0;
}
selectionTimer.schedule(SWITCH_COMPETITOR_DELAY);
updateStatistics();
}
private void updateStatistics() {
String windSpeed = null;
if (getPlace().getRaceMap().getLastCombinedWindTrackInfoDTO() != null) {
for (WindSource windSource : getPlace().getRaceMap()
.getLastCombinedWindTrackInfoDTO().windTrackInfoByWindSource.keySet()) {
WindTrackInfoDTO windTrackInfoDTO = getPlace().getRaceMap()
.getLastCombinedWindTrackInfoDTO().windTrackInfoByWindSource.get(windSource);
switch (windSource.getType()) {
case COMBINED:
if (!windTrackInfoDTO.windFixes.isEmpty()) {
WindDTO windDTO = windTrackInfoDTO.windFixes.get(0);
double speedInKnots = windDTO.dampenedTrueWindSpeedInKnots;
NumberFormat numberFormat = NumberFormat.getFormat("0.0");
windSpeed = numberFormat.format(speedInKnots) + " " + StringMessages.INSTANCE.knotsUnit();
}
break;
default:
}
}
}
List<LeaderboardRowDTO> sortedCompetitors = leaderboardPanel.getLeaderboardTable().getVisibleItems();
if (sortedCompetitors.size() > 0) {
view.setStatistic(windSpeed,getPlace().getStatistic().getDistance(), AutoplayHelper.durationOfCurrentLiveRaceRunning());
}
}
private void onSelect(CompetitorDTO marked) {
@@ -1,6 +1,7 @@
package com.sap.sailing.gwt.autoplay.client.places.screens.liveraceloop.racemapwithleaderboard;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.autoplay.client.shared.SixtyInchLeaderBoard;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap;
@@ -19,4 +20,6 @@ public interface LiveRaceWithRacemapAndLeaderBoardView {
void scrollLeaderBoardToTop();
void onStop();
void setStatistic(String windSpeed, Distance distance, long timeSinceStart);
}
@@ -1,6 +1,7 @@
package com.sap.sailing.gwt.autoplay.client.places.screens.liveraceloop.racemapwithleaderboard;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Timer;
@@ -8,8 +9,10 @@ import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.autoplay.client.shared.SixtyInchLeaderBoard;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMap;
import com.sap.sse.gwt.client.panels.ResizableFlowPanel;
@@ -21,6 +24,21 @@ public class LiveRaceWithRacemapAndLeaderBoardViewImpl extends ResizeComposite i
@UiField
ResizableFlowPanel leaderBoardHolder;
@UiField
Label statisticValue1;
@UiField
Label statisticProperty1;
@UiField
Label statisticValue2;
@UiField
Label statisticProperty2;
@UiField
Label statisticValue3;
@UiField
Label statisticProperty3;
private NumberFormat compactFormat = NumberFormat.getFormat("#.0");
private RaceMap rawRaceMap;
@@ -75,5 +93,28 @@ public class LiveRaceWithRacemapAndLeaderBoardViewImpl extends ResizeComposite i
}
}.schedule(50);
}
@Override
public void setStatistic(String windinfo, Distance distance, long duration) {
statisticProperty1.setText(StringMessages.INSTANCE.windSpeed());
if(windinfo == null || windinfo.isEmpty()){
statisticValue1.setText(StringMessages.INSTANCE.noDataFound());
}else{
statisticValue1.setText(windinfo);
}
statisticProperty2.setText(StringMessages.INSTANCE.distance());
if(distance == null){
statisticValue2
.setText(StringMessages.INSTANCE.noDataFound());
}else{
statisticValue2
.setText(compactFormat.format(distance.getSeaMiles()) + " " + StringMessages.INSTANCE.seaMiles());
}
statisticProperty3.setText(StringMessages.INSTANCE.durationPlain());
statisticValue3.setText(compactFormat.format(duration/1000f/60f) + " " + StringMessages.INSTANCE.minutes());
}
}
@@ -17,7 +17,8 @@
position: absolute;
display: inline-block;
right: 0px;
height: 100%;
top: 0px;
bottom: 80px;
width: 65%;
}
@@ -45,6 +46,48 @@
font-size: 20px;
text-align: center;
}
.statistics {
position: absolute;
background-color: black;
width: 65%;
right: 0px;
bottom: 0px;
height: 80px;
font-size: 1rem;
display: flex;
-webkit-align-items: center;
-moz-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-justify-content: space-around;
-ms-flex-pack: distribute;
justify-content: space-around;
background: #333;
border-top: .3125em solid #f0ab00;
padding: .9375em 0;
}
.info-overlay__item {
text-align: center;
color: #fff;
-webkit-box-flex: 1;
-webkit-flex: 1 0 auto;
-moz-box-flex: 1;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
border-right: 1px solid #999;
}
.info-overlay__item__value {
font-size: 1.5em;
}
.info-overlay__item__property {
font-size: 1em;
font-weight: 700;
text-transform: uppercase;
}
</ui:style>
<rf:ResizableFlowPanel styleName="{res.style.slideBackground}">
<rf:ResizableFlowPanel ui:field="leaderBoardHolder"
@@ -52,5 +95,20 @@
<rf:ResizableFlowPanel ui:field="racemap"
styleName="{style.right}">
</rf:ResizableFlowPanel>
<rf:ResizableFlowPanel styleName="{style.statistics}"
ui:field="statistics">
<rf:ResizableFlowPanel styleName="{style.info-overlay__item}">
<g:Label ui:field="statisticValue1" styleName="{style.info-overlay__item__value}">10.3 kts</g:Label>
<g:Label ui:field="statisticProperty1" styleName="{style.info-overlay__item__property}">Wind</g:Label>
</rf:ResizableFlowPanel>
<rf:ResizableFlowPanel styleName="{style.info-overlay__item}">
<g:Label ui:field="statisticValue2" styleName="{style.info-overlay__item__value}">10.3 kts</g:Label>
<g:Label ui:field="statisticProperty2" styleName="{style.info-overlay__item__property}">Wind</g:Label>
</rf:ResizableFlowPanel>
<rf:ResizableFlowPanel styleName="{style.info-overlay__item}">
<g:Label ui:field="statisticValue3" styleName="{style.info-overlay__item__value}">10.3 kts</g:Label>
<g:Label ui:field="statisticProperty3" styleName="{style.info-overlay__item__property}">Wind</g:Label>
</rf:ResizableFlowPanel>
</rf:ResizableFlowPanel>
</rf:ResizableFlowPanel>
</ui:UiBinder>