Merge branch 'master' into bug3173

This commit is contained in:
Axel Uhl committed 2015-07-24 00:04:18 +02:00
commit 817e5a0830
30 files changed
+83 -34

No files matched your search

@@ -3,10 +3,15 @@ package com.sap.sailing.server.gateway.impl;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.SocketException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@@ -42,12 +47,18 @@ public class WindStatusServlet extends SailingServerHttpServlet implements Igtim
private static final String PARAM_RELOAD_WIND_RECEIVER="reloadWindReceiver";
private final int NUMBER_OF_MESSAGES_TO_SHOW=20;
private final int NUMBER_OF_MESSAGES_PER_DEVICE_TO_SHOW=5;
private static final DecimalFormat decimalFormatter2Digits = new DecimalFormat("#.##");
private static final DecimalFormat decimalFormatter1Digit = new DecimalFormat("#.#");
private static final DecimalFormat latLngDecimalFormatter = new DecimalFormat("#.######");
private static final DateFormat dateTimeFormatter = DateFormat.getTimeInstance(DateFormat.LONG);
private static List<ExpeditionMessageInfo> lastExpeditionMessages;
private static Object lock = new Object();
private static int igtimiRawMessageCount;
private static List<IgtimiMessageInfo> lastIgtimiMessages;
private static Map<String, List<IgtimiMessageInfo>> lastIgtimiMessages;
private static IgtimiWindReceiver igtimiWindReceiver;
private static LiveDataConnection liveDataConnection;
@@ -81,7 +92,7 @@ public class WindStatusServlet extends SailingServerHttpServlet implements Igtim
}
}
isIgtimiListenerRegistered = registerIgtimiListener();
lastIgtimiMessages = new ArrayList<WindStatusServlet.IgtimiMessageInfo>();
lastIgtimiMessages = new HashMap<String, List<IgtimiMessageInfo>>();
igtimiRawMessageCount = 0;
}
}
@@ -102,19 +113,24 @@ public class WindStatusServlet extends SailingServerHttpServlet implements Igtim
out.println("<p>Reload wind connectors with parameter <a href=\"/sailingserver/windStatus?reloadWindReceiver=true\">reloadWindReceiver=true</a>. This will force a connection reset and a reloading of the wind receivers.</p>");
out.println("<h3>Igtimi Wind Status ("+igtimiRawMessageCount+" raw messages received)</h3>");
if (lastIgtimiMessages != null && !lastIgtimiMessages.isEmpty()) {
final List<IgtimiMessageInfo> copyOfLastIgtimiMessages;
synchronized (lastIgtimiMessages) {
copyOfLastIgtimiMessages = new ArrayList<>(WindStatusServlet.lastIgtimiMessages);
}
int counter = 0;
for (ListIterator<IgtimiMessageInfo> iterator = copyOfLastIgtimiMessages.listIterator(copyOfLastIgtimiMessages.size()); iterator.hasPrevious();) {
counter++;
IgtimiMessageInfo message = iterator.previous();
out.println(message);
out.println("<br/>");
if (counter >= NUMBER_OF_MESSAGES_TO_SHOW) {
break;
for(Entry<String, List<IgtimiMessageInfo>> deviceAndMessagesList: lastIgtimiMessages.entrySet()) {
final List<IgtimiMessageInfo> copyOfLastIgtimiMessages;
synchronized (deviceAndMessagesList.getValue()) {
copyOfLastIgtimiMessages = new ArrayList<>(deviceAndMessagesList.getValue());
}
out.println("Windbot: <b>" + deviceAndMessagesList.getKey() + "</b>");
out.println("<br/>");
int counter = 0;
for (ListIterator<IgtimiMessageInfo> iterator = copyOfLastIgtimiMessages.listIterator(copyOfLastIgtimiMessages.size()); iterator.hasPrevious();) {
counter++;
IgtimiMessageInfo message = iterator.previous();
out.println(message);
out.println("<br/>");
if (counter >= NUMBER_OF_MESSAGES_PER_DEVICE_TO_SHOW) {
break;
}
}
out.println("<br/>");
}
} else {
if (igtimiRawMessageCount == 0) {
@@ -218,21 +234,35 @@ public class WindStatusServlet extends SailingServerHttpServlet implements Igtim
private class IgtimiMessageInfo {
private Wind wind;
private String deviceSerialInfo;
public IgtimiMessageInfo(Wind wind, String deviceSerialInfo) {
public IgtimiMessageInfo(Wind wind) {
this.wind = wind;
this.deviceSerialInfo = deviceSerialInfo;
}
public String toString() {
return deviceSerialInfo + ":" + wind.toString();
String formatedInfo = "";
if(wind.getTimePoint() != null) {
formatedInfo += "Time: " + dateTimeFormatter.format(wind.getTimePoint().asDate());
}
if(wind.getPosition() != null) {
formatedInfo += ", Pos: " + latLngDecimalFormatter.format(wind.getPosition().getLatDeg()) + " " + latLngDecimalFormatter.format(wind.getPosition().getLngDeg());
}
formatedInfo += ", Wind: " + decimalFormatter2Digits.format(wind.getKnots()) +"kn";
if(wind.getFrom() != null) {
formatedInfo += " from "+ decimalFormatter1Digit.format(wind.getFrom().getDegrees());
}
return formatedInfo;
}
}
@Override
public void windDataReceived(Wind wind, String deviceSerialNumber) {
lastIgtimiMessages.add(new IgtimiMessageInfo(wind, deviceSerialNumber));
List<IgtimiMessageInfo> deviceList = lastIgtimiMessages.get(deviceSerialNumber);
if(deviceList == null) {
deviceList = new ArrayList<IgtimiMessageInfo>();
lastIgtimiMessages.put(deviceSerialNumber, deviceList);
}
deviceList.add(new IgtimiMessageInfo(wind));
}
@Override
Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 649 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 817 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 823 B

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed -->
<item android:drawable="@drawable/spinner_dark_pressed" android:state_pressed="true" />
<!-- default -->
<item android:drawable="@drawable/spinner_dark" />
</selector>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed -->
<item android:drawable="@drawable/spinner_light_pressed" android:state_pressed="true" />
<!-- default -->
<item android:drawable="@drawable/spinner_light" />
</selector>
@@ -205,6 +205,7 @@
android:id="@+id/time_offset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginBottom="@dimen/default_margin"
android:layout_marginTop="@dimen/default_margin"
android:scaleX="@integer/picker_scale"
@@ -228,7 +229,7 @@
android:id="@+id/dependent_leaderboard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?sap_gray_black_20"
android:background="?spinner_background"
android:dropDownWidth="wrap_content"
android:spinnerMode="dropdown"/>
@@ -237,7 +238,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/default_margin_half"
android:background="?sap_gray_black_20"
android:background="?spinner_background"
android:dropDownWidth="wrap_content"
android:spinnerMode="dropdown"
android:visibility="gone"
@@ -248,7 +249,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/default_margin_half"
android:background="?sap_gray_black_20"
android:background="?spinner_background"
android:dropDownWidth="wrap_content"
android:spinnerMode="dropdown"/>
</LinearLayout>
@@ -62,6 +62,7 @@
<attr name="photo_camera_48dp" format="reference"/>
<attr name="play_arrow_36dp" format="reference"/>
<attr name="search_24dp_invert" format="reference"/>
<attr name="spinner_background" format="reference"/>
<attr name="swipe_idle" format="reference"/>
<attr name="swipe_left" format="reference"/>
<attr name="swipe_right" format="reference"/>
@@ -77,6 +77,7 @@
<item name="photo_camera_48dp">@drawable/ic_photo_camera_white_48dp</item>
<item name="play_arrow_36dp">@drawable/ic_play_arrow_white_36dp</item>
<item name="search_24dp_invert">@drawable/ic_search_black_24dp</item>
<item name="spinner_background">@drawable/spinner_background_dark</item>
<item name="swipe_idle">@drawable/swipe_idle_dark</item>
<item name="swipe_left">@drawable/swipe_left_dark</item>
<item name="swipe_right">@drawable/swipe_right_dark</item>
@@ -80,6 +80,7 @@
<item name="photo_camera_48dp">@drawable/ic_photo_camera_black_48dp</item>
<item name="play_arrow_36dp">@drawable/ic_play_arrow_black_36dp</item>
<item name="search_24dp_invert">@drawable/ic_search_white_24dp</item>
<item name="spinner_background">@drawable/spinner_background_light</item>
<item name="swipe_idle">@drawable/swipe_idle_light</item>
<item name="swipe_left">@drawable/swipe_left_light</item>
<item name="swipe_right">@drawable/swipe_right_light</item>
@@ -189,8 +189,7 @@ public class ManagedRaceListAdapter extends ArrayAdapter<RaceListDataType> imple
}
time.setTextSize(textSize);
}
StartTimeFinder stf = new StartTimeFinder(new AndroidRaceLogResolver(), race.getRace().getRaceLog());
StartTimeFinderResult result = stf.analyze();
StartTimeFinderResult result = race.getRace().getState().getStartTimeFinderResult();
if (result != null && result.isDependentStartTime()) {
has_dependent_races.setVisibility(View.VISIBLE);
}
@@ -1,5 +1,7 @@
package com.sap.sailing.racecommittee.app.ui.fragments.panels;
import static com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinderResult.ResolutionFailed.NO_START_TIME_SET;
import java.text.SimpleDateFormat;
import android.content.BroadcastReceiver;
@@ -18,13 +20,11 @@ import android.widget.TextView;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.ViewHolder;
import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinderResult;
import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState;
import com.sap.sailing.domain.abstractlog.race.state.impl.BaseRaceStateChangedListener;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.data.AndroidRaceLogResolver;
import com.sap.sailing.racecommittee.app.data.DataManager;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.StartTimeFragment;
@@ -154,11 +154,10 @@ public class TimePanelFragment extends BasePanelFragment {
}
if (mLinkedRace == null) {
StartTimeFinder stf = new StartTimeFinder(new AndroidRaceLogResolver(), getRace().getRaceLog());
StartTimeFinderResult result = stf.analyze();
StartTimeFinderResult result = getRaceState().getStartTimeFinderResult();
if (result != null) {
mLinkedRace = result.isDependentStartTime();
if (mLinkedRace && mHeaderTime != null) {
if (mLinkedRace && mHeaderTime != null && result.getResolutionFailed() == NO_START_TIME_SET) {
SimpleRaceLogIdentifier identifier = Util.get(result.getRacesDependingOn(), 0);
ManagedRace race = DataManager.create(getActivity()).getDataStore().getRace(identifier);
mHeaderTime.setText(getString(R.string.minutes_after_long, result.getStartTimeDiff().asMinutes(), RaceHelper.getRaceName(race, " / ")));
@@ -25,7 +25,6 @@ import android.widget.TimePicker;
import com.sap.sailing.android.shared.util.ViewHolder;
import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinderResult;
import com.sap.sailing.domain.abstractlog.race.impl.SimpleRaceLogIdentifierImpl;
import com.sap.sailing.domain.abstractlog.race.state.RaceStateChangedListener;
@@ -37,7 +36,6 @@ import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.data.AndroidRaceLogResolver;
import com.sap.sailing.racecommittee.app.data.DataStore;
import com.sap.sailing.racecommittee.app.data.OnlineDataManager;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
@@ -233,8 +231,7 @@ public class StartTimeFragment extends BaseFragment
frame.setVisibility(View.GONE);
}
StartTimeFinder stf = new StartTimeFinder(new AndroidRaceLogResolver(), getRace().getRaceLog());
StartTimeFinderResult result = stf.analyze();
StartTimeFinderResult result = getRaceState().getStartTimeFinderResult();
if (result != null && result.isDependentStartTime()) {
mStartTimeOffset = result.getStartTimeDiff();
mRaceId = Util.get(result.getRacesDependingOn(), 0);