2 * Copyright © 2010 Keith Packard <keithp@keithp.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 2 of the License.
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
18 package org.altusmetrum.AltosLib;
22 public class AltosGPS {
24 public final static int MISSING = AltosRecord.MISSING;
27 public boolean locked;
28 public boolean connected;
29 public double lat; /* degrees (+N -S) */
30 public double lon; /* degrees (+E -W) */
31 public int alt; /* m */
39 public double ground_speed; /* m/s */
40 public int course; /* degrees */
41 public double climb_rate; /* m/s */
42 public double hdop; /* unitless */
43 public double vdop; /* unitless */
44 public int h_error; /* m */
45 public int v_error; /* m */
47 public AltosGPSSat[] cc_gps_sat; /* tracking data */
49 public void ParseGPSDate(String date) throws ParseException {
50 String[] ymd = date.split("-");
52 throw new ParseException("error parsing GPS date " + date + " got " + ymd.length, 0);
53 year = AltosParse.parse_int(ymd[0]);
54 month = AltosParse.parse_int(ymd[1]);
55 day = AltosParse.parse_int(ymd[2]);
58 public void ParseGPSTime(String time) throws ParseException {
59 String[] hms = time.split(":");
61 throw new ParseException("Error parsing GPS time " + time + " got " + hms.length, 0);
62 hour = AltosParse.parse_int(hms[0]);
63 minute = AltosParse.parse_int(hms[1]);
64 second = AltosParse.parse_int(hms[2]);
67 public void ClearGPSTime() {
68 year = month = day = 0;
69 hour = minute = second = 0;
72 public AltosGPS(AltosTelemetryMap map) throws ParseException {
73 String state = map.get_string(AltosTelemetry.AO_TELEM_GPS_STATE,
74 AltosTelemetry.AO_TELEM_GPS_STATE_ERROR);
76 nsat = map.get_int(AltosTelemetry.AO_TELEM_GPS_NUM_SAT, 0);
77 if (state.equals(AltosTelemetry.AO_TELEM_GPS_STATE_LOCKED)) {
80 lat = map.get_double(AltosTelemetry.AO_TELEM_GPS_LATITUDE, MISSING, 1.0e-7);
81 lon = map.get_double(AltosTelemetry.AO_TELEM_GPS_LONGITUDE, MISSING, 1.0e-7);
82 alt = map.get_int(AltosTelemetry.AO_TELEM_GPS_ALTITUDE, MISSING);
83 year = map.get_int(AltosTelemetry.AO_TELEM_GPS_YEAR, MISSING);
86 month = map.get_int(AltosTelemetry.AO_TELEM_GPS_MONTH, MISSING);
87 day = map.get_int(AltosTelemetry.AO_TELEM_GPS_DAY, MISSING);
89 hour = map.get_int(AltosTelemetry.AO_TELEM_GPS_HOUR, 0);
90 minute = map.get_int(AltosTelemetry.AO_TELEM_GPS_MINUTE, 0);
91 second = map.get_int(AltosTelemetry.AO_TELEM_GPS_SECOND, 0);
93 ground_speed = map.get_double(AltosTelemetry.AO_TELEM_GPS_HORIZONTAL_SPEED,
94 AltosRecord.MISSING, 1/100.0);
95 course = map.get_int(AltosTelemetry.AO_TELEM_GPS_COURSE,
97 hdop = map.get_double(AltosTelemetry.AO_TELEM_GPS_HDOP, MISSING, 1.0);
98 vdop = map.get_double(AltosTelemetry.AO_TELEM_GPS_VDOP, MISSING, 1.0);
99 h_error = map.get_int(AltosTelemetry.AO_TELEM_GPS_HERROR, MISSING);
100 v_error = map.get_int(AltosTelemetry.AO_TELEM_GPS_VERROR, MISSING);
101 } else if (state.equals(AltosTelemetry.AO_TELEM_GPS_STATE_UNLOCKED)) {
110 public AltosGPS(String[] words, int i, int version) throws ParseException {
111 AltosParse.word(words[i++], "GPS");
112 nsat = AltosParse.parse_int(words[i++]);
113 AltosParse.word(words[i++], "sat");
120 if ((words[i]).equals("unlocked")) {
123 } else if ((words[i]).equals("not-connected")) {
125 } else if (words.length >= 40) {
130 ParseGPSDate(words[i++]);
132 year = month = day = 0;
133 ParseGPSTime(words[i++]);
134 lat = AltosParse.parse_coord(words[i++]);
135 lon = AltosParse.parse_coord(words[i++]);
136 alt = AltosParse.parse_int(words[i++]);
137 if (version > 1 || (i < words.length && !words[i].equals("SAT"))) {
138 ground_speed = AltosParse.parse_double(AltosParse.strip_suffix(words[i++], "m/s(H)"));
139 course = AltosParse.parse_int(words[i++]);
140 climb_rate = AltosParse.parse_double(AltosParse.strip_suffix(words[i++], "m/s(V)"));
141 hdop = AltosParse.parse_double(AltosParse.strip_suffix(words[i++], "(hdop)"));
142 h_error = AltosParse.parse_int(words[i++]);
143 v_error = AltosParse.parse_int(words[i++]);
148 if (i < words.length) {
149 AltosParse.word(words[i++], "SAT");
150 int tracking_channels = 0;
151 if (words[i].equals("not-connected"))
152 tracking_channels = 0;
154 tracking_channels = AltosParse.parse_int(words[i]);
156 cc_gps_sat = new AltosGPSSat[tracking_channels];
157 for (int chan = 0; chan < tracking_channels; chan++) {
158 cc_gps_sat[chan] = new AltosGPSSat();
159 cc_gps_sat[chan].svid = AltosParse.parse_int(words[i++]);
160 /* Older versions included SiRF status bits */
163 cc_gps_sat[chan].c_n0 = AltosParse.parse_int(words[i++]);
166 cc_gps_sat = new AltosGPSSat[0];
169 public void set_latitude(int in_lat) {
170 lat = in_lat / 10.0e7;
173 public void set_longitude(int in_lon) {
174 lon = in_lon / 10.0e7;
177 public void set_time(int in_hour, int in_minute, int in_second) {
183 public void set_date(int in_year, int in_month, int in_day) {
190 public void set_flags(int in_flags) {
195 public void set_altitude(int in_altitude) {
199 public void add_sat(int svid, int c_n0) {
200 if (cc_gps_sat == null) {
201 cc_gps_sat = new AltosGPSSat[1];
203 AltosGPSSat[] new_gps_sat = new AltosGPSSat[cc_gps_sat.length + 1];
204 for (int i = 0; i < cc_gps_sat.length; i++)
205 new_gps_sat[i] = cc_gps_sat[i];
206 cc_gps_sat = new_gps_sat;
208 AltosGPSSat sat = new AltosGPSSat();
211 cc_gps_sat[cc_gps_sat.length - 1] = sat;
219 public AltosGPS(AltosGPS old) {
222 connected = old.connected;
223 lat = old.lat; /* degrees (+N -S) */
224 lon = old.lon; /* degrees (+E -W) */
225 alt = old.alt; /* m */
233 ground_speed = old.ground_speed; /* m/s */
234 course = old.course; /* degrees */
235 climb_rate = old.climb_rate; /* m/s */
236 hdop = old.hdop; /* unitless? */
237 h_error = old.h_error; /* m */
238 v_error = old.v_error; /* m */
240 if (old.cc_gps_sat != null) {
241 cc_gps_sat = new AltosGPSSat[old.cc_gps_sat.length];
242 for (int i = 0; i < old.cc_gps_sat.length; i++) {
243 cc_gps_sat[i] = new AltosGPSSat();
244 cc_gps_sat[i].svid = old.cc_gps_sat[i].svid;
245 cc_gps_sat[i].c_n0 = old.cc_gps_sat[i].c_n0;