File: Checker.java

package info (click to toggle)
gpsprune 26.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,824 kB
  • sloc: java: 52,154; sh: 25; makefile: 21; python: 15
file content (131 lines) | stat: -rw-r--r-- 3,668 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package tim.prune.data;

import java.util.List;

/**
 * Class to provide checking functions
 */
public abstract class Checker
{
	/**
	 * Possible return values of double status
	 */
	public enum DoubleStatus {
		NOTHING, DOUBLED, DOUBLED_WAYPOINTS_TRACKPOINTS
	}

	/**
	 * Check if a given track is doubled, so that each point is given twice,
	 * once as waypoint and again as track point
	 * @param inPoints list of points
	 * @return enum value describing status
	 */
	public static DoubleStatus isDoubledTrack(List<DataPoint> inPoints)
	{
		// Check for empty track
		final int numPoints = (inPoints == null ? 0 : inPoints.size());
		if (numPoints < 2 || numPoints % 2 != 0) {
			return DoubleStatus.NOTHING;
		}
		// Loop through first half of track
		final int halfNum = numPoints / 2;
		boolean trackPointsAndWaypoints = true;
		for (int i=0; i<halfNum; i++)
		{
			DataPoint firstPoint = inPoints.get(i);
			DataPoint secondPoint = inPoints.get(i + halfNum);
			if (!firstPoint.getLatitude().equals(secondPoint.getLatitude())
				|| !firstPoint.getLongitude().equals(secondPoint.getLongitude()))
			{
				return DoubleStatus.NOTHING;
			}
			if (firstPoint.isWaypoint() == secondPoint.isWaypoint()) {
				trackPointsAndWaypoints = false;
			}
		}
		// Passed the test, so contents must all be doubled
		return trackPointsAndWaypoints ? DoubleStatus.DOUBLED_WAYPOINTS_TRACKPOINTS : DoubleStatus.DOUBLED;
	}

	/**
	 * Find the index of the next segment start after the given index
	 * @param inTrack track object
	 * @param inIndex current index
	 * @return index of next segment start
	 */
	public static int getNextSegmentStart(Track inTrack, int inIndex)
	{
		int i = inIndex + 1;
		DataPoint point = null;
		while ((point=inTrack.getPoint(i)) != null && (point.isWaypoint() || !point.getSegmentStart())) {
			i++;
		}
		return Math.min(i, inTrack.getNumPoints()-1);
	}

	/**
	 * Find the index of the previous segment start before the given index
	 * @param inTrack track object
	 * @param inIndex current index
	 * @return index of previous segment start
	 */
	public static int getPreviousSegmentStart(Track inTrack, int inIndex)
	{
		int i = inIndex - 1;
		DataPoint point = null;
		while ((point=inTrack.getPoint(i)) != null && (point.isWaypoint() || !point.getSegmentStart())) {
			i--;
		}
		// Have we gone past the beginning of the track?
		i = Math.max(i, 0);
		// count forwards past the waypoints if necessary
		while ((point=inTrack.getPoint(i)) != null && point.isWaypoint()) {
			i++;
		}
		return i;
	}

	/**
	 * Find the index of the last track point in the current segment
	 * @param inTrack track object
	 * @param inIndex current index
	 * @return index of next segment end
	 */
	public static int getNextSegmentEnd(Track inTrack, int inIndex)
	{
		// First, go to start of following segment, or the end of the track
		int i = getNextSegmentStart(inTrack, inIndex);
		// If it's the next segment, subtract one
		DataPoint point = inTrack.getPoint(i);
		if (point == null || point.getSegmentStart())
		{
			i--;
		}
		// Now we may be on a waypoint, so count back to get the last track point
		while ((point=inTrack.getPoint(i)) != null && point.isWaypoint()) {
			i--;
		}
		return Math.min(i, inTrack.getNumPoints()-1);
	}


	/**
	 * @param inTrack track object
	 * @return true if there is at least one waypoint with a timestamp
	 */
	public static boolean haveWaypointsGotTimestamps(Track inTrack)
	{
		if (inTrack != null)
		{
			for (int i=0; i<inTrack.getNumPoints(); i++)
			{
				DataPoint p = inTrack.getPoint(i);
				if (p != null && p.isWaypoint() && p.hasTimestamp())
				{
					return true;
				}
			}
		}
		return false;
	}
}