X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao-tools%2Faltosui%2FAltosGPS.java;fp=ao-tools%2Faltosui%2FAltosGPS.java;h=d242ad57e4c5c03a3355d1059c7dc247254639c6;hp=0000000000000000000000000000000000000000;hb=65079f84ea64220fa928c3ad96652fed159bf74b;hpb=02f2be90879b682b6e648cf2debc83223d127b9d diff --git a/ao-tools/altosui/AltosGPS.java b/ao-tools/altosui/AltosGPS.java new file mode 100644 index 00000000..d242ad57 --- /dev/null +++ b/ao-tools/altosui/AltosGPS.java @@ -0,0 +1,118 @@ +/* + * Copyright © 2010 Keith Packard + * + * 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 = AltosParse.parse_int(words[i++]); + cc_gps_sat = new AltosGPS.AltosGPSSat[tracking_channels]; + for (int chan = 0; chan < tracking_channels; chan++) { + cc_gps_sat[chan].svid = AltosParse.parse_int(words[i++]); + cc_gps_sat[chan].c_n0 = AltosParse.parse_int(words[i++]); + } + } +}