Merge branch 'master' into bug3173
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
|
||||
|
||||
|
After Width: | Height: | Size: 441 B |
|
After Width: | Height: | Size: 445 B |
|
After Width: | Height: | Size: 429 B |
|
After Width: | Height: | Size: 441 B |
|
After Width: | Height: | Size: 362 B |
|
After Width: | Height: | Size: 379 B |
|
After Width: | Height: | Size: 359 B |
|
After Width: | Height: | Size: 378 B |
|
After Width: | Height: | Size: 520 B |
|
After Width: | Height: | Size: 524 B |
|
After Width: | Height: | Size: 504 B |
|
After Width: | Height: | Size: 516 B |
|
After Width: | Height: | Size: 641 B |
|
After Width: | Height: | Size: 661 B |
|
After Width: | Height: | Size: 649 B |
|
After Width: | Height: | Size: 653 B |
|
After Width: | Height: | Size: 811 B |
|
After Width: | Height: | Size: 817 B |
|
After Width: | Height: | Size: 807 B |
|
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);
|
||||
|
||||