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
|
/*
* Copyright © 2010 Keith Packard <keithp@keithp.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
package altosui;
import java.lang.*;
import java.text.*;
import altosui.AltosParse;
public class AltosGPS {
public class AltosGPSTime {
int year;
int month;
int day;
int hour;
int minute;
int second;
public AltosGPSTime(String date, String time) throws ParseException {
String[] ymd = date.split("-");
if (ymd.length != 3)
throw new ParseException("error parsing GPS date " + date + " got " + ymd.length, 0);
year = AltosParse.parse_int(ymd[0]);
month = AltosParse.parse_int(ymd[1]);
day = AltosParse.parse_int(ymd[2]);
String[] hms = time.split(":");
if (hms.length != 3)
throw new ParseException("Error parsing GPS time " + time + " got " + hms.length, 0);
hour = AltosParse.parse_int(hms[0]);
minute = AltosParse.parse_int(hms[1]);
second = AltosParse.parse_int(hms[2]);
}
public AltosGPSTime() {
year = month = day = 0;
hour = minute = second = 0;
}
}
public class AltosGPSSat {
int svid;
int c_n0;
}
int nsat;
boolean gps_locked;
boolean gps_connected;
AltosGPSTime gps_time;
double lat; /* degrees (+N -S) */
double lon; /* degrees (+E -W) */
int alt; /* m */
int gps_extended; /* has extra data */
double ground_speed; /* m/s */
int course; /* degrees */
double climb_rate; /* m/s */
double hdop; /* unitless? */
int h_error; /* m */
int v_error; /* m */
AltosGPSSat[] cc_gps_sat; /* tracking data */
public AltosGPS(String[] words, int i) throws ParseException {
AltosParse.word(words[i++], "GPS");
nsat = AltosParse.parse_int(words[i++]);
AltosParse.word(words[i++], "sat");
gps_connected = false;
gps_locked = false;
lat = lon = 0;
alt = 0;
if ((words[i]).equals("unlocked")) {
gps_connected = true;
gps_time = new AltosGPSTime();
i++;
} else if (words.length >= 40) {
gps_locked = true;
gps_connected = true;
gps_time = new AltosGPSTime(words[i], words[i+1]); i += 2;
lat = AltosParse.parse_coord(words[i++]);
lon = AltosParse.parse_coord(words[i++]);
alt = AltosParse.parse_int(AltosParse.strip_suffix(words[i++], "m"));
ground_speed = AltosParse.parse_double(AltosParse.strip_suffix(words[i++], "m/s(H)"));
course = AltosParse.parse_int(AltosParse.strip_suffix(words[i++], "°"));
climb_rate = AltosParse.parse_double(AltosParse.strip_suffix(words[i++], "m/s(V)"));
hdop = AltosParse.parse_double(AltosParse.strip_suffix(words[i++], "(hdop)"));
h_error = AltosParse.parse_int(AltosParse.strip_suffix(words[i++], "(herr)"));
v_error = AltosParse.parse_int(AltosParse.strip_suffix(words[i++], "(verr)"));
} else {
gps_time = new AltosGPSTime();
}
AltosParse.word(words[i++], "SAT");
int tracking_channels = 0;
if (words[i].equals("not-connected"))
tracking_channels = 0;
else
tracking_channels = AltosParse.parse_int(words[i]);
i++;
cc_gps_sat = new AltosGPS.AltosGPSSat[tracking_channels];
for (int chan = 0; chan < tracking_channels; chan++) {
cc_gps_sat[chan] = new AltosGPS.AltosGPSSat();
cc_gps_sat[chan].svid = AltosParse.parse_int(words[i++]);
cc_gps_sat[chan].c_n0 = AltosParse.parse_int(words[i++]);
}
}
}
|