Merge branch 'prefs_interface' into altosdroid
[fw/altos] / altosui / AltosKML.java
1 /*
2  * Copyright © 2010 Keith Packard <keithp@keithp.com>
3  *
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.
7  *
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.
12  *
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.
16  */
17
18 package altosui;
19
20 import java.io.*;
21 import org.altusmetrum.AltosLib.*;
22
23 public class AltosKML implements AltosWriter {
24
25         File                    name;
26         PrintStream             out;
27         int                     state = -1;
28         AltosRecord             prev = null;
29
30         static final String[] kml_state_colors = {
31                 "FF000000",
32                 "FF000000",
33                 "FF000000",
34                 "FF0000FF",
35                 "FF4080FF",
36                 "FF00FFFF",
37                 "FFFF0000",
38                 "FF00FF00",
39                 "FF000000",
40                 "FFFFFFFF"
41         };
42
43         static final String kml_header_start =
44                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
45                 "<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n" +
46                 "<Document>\n" +
47                 "  <name>AO Flight#%d S/N: %03d</name>\n" +
48                 "  <description>\n";
49         static final String kml_header_end =
50                 "  </description>\n" +
51                 "  <open>0</open>\n";
52
53         static final String kml_style_start =
54                 "  <Style id=\"ao-flightstate-%s\">\n" +
55                 "    <LineStyle><color>%s</color><width>4</width></LineStyle>\n" +
56                 "    <BalloonStyle>\n" +
57                 "      <text>\n";
58
59         static final String kml_style_end =
60                 "      </text>\n" +
61                 "    </BalloonStyle>\n" +
62                 "  </Style>\n";
63
64         static final String kml_placemark_start =
65                 "  <Placemark>\n" +
66                 "    <name>%s</name>\n" +
67                 "    <styleUrl>#ao-flightstate-%s</styleUrl>\n" +
68                 "    <LineString>\n" +
69                 "      <tessellate>1</tessellate>\n" +
70                 "      <altitudeMode>absolute</altitudeMode>\n" +
71                 "      <coordinates>\n";
72
73         static final String kml_coord_fmt =
74         "        %.7f,%.7f,%.7f <!-- alt %12.7f time %12.7f sats %d -->\n";
75
76         static final String kml_placemark_end =
77                 "      </coordinates>\n" +
78                 "    </LineString>\n" +
79                 "  </Placemark>\n";
80
81         static final String kml_footer =
82                 "</Document>\n" +
83                 "</kml>\n";
84
85         void start (AltosRecord record) {
86                 out.printf(kml_header_start, record.flight, record.serial);
87                 out.printf("Date:   %04d-%02d-%02d\n",
88                            record.gps.year, record.gps.month, record.gps.day);
89                 out.printf("Time:     %2d:%02d:%02d\n",
90                            record.gps.hour, record.gps.minute, record.gps.second);
91                 out.printf("%s", kml_header_end);
92         }
93
94         boolean started = false;
95
96         void state_start(AltosRecord record) {
97                 String  state_name = Altos.state_name(record.state);
98                 out.printf(kml_style_start, state_name, kml_state_colors[record.state]);
99                 out.printf("\tState: %s\n", state_name);
100                 out.printf("%s", kml_style_end);
101                 out.printf(kml_placemark_start, state_name, state_name);
102         }
103
104         void state_end(AltosRecord record) {
105                 out.printf("%s", kml_placemark_end);
106         }
107
108         void coord(AltosRecord record) {
109                 AltosGPS        gps = record.gps;
110                 out.printf(kml_coord_fmt,
111                            gps.lon, gps.lat,
112                            record.filtered_altitude(), (double) gps.alt,
113                            record.time, gps.nsat);
114         }
115
116         void end() {
117                 out.printf("%s", kml_footer);
118         }
119
120         public void close() {
121                 if (prev != null) {
122                         state_end(prev);
123                         end();
124                         prev = null;
125                 }
126         }
127
128         public void write(AltosRecord record) {
129                 AltosGPS        gps = record.gps;
130
131                 if (gps == null)
132                         return;
133
134                 if ((record.seen & (AltosRecord.seen_flight)) == 0)
135                         return;
136                 if ((record.seen & (AltosRecord.seen_gps_lat)) == 0)
137                         return;
138                 if ((record.seen & (AltosRecord.seen_gps_lon)) == 0)
139                         return;
140                 if (!started) {
141                         start(record);
142                         started = true;
143                 }
144                 if (prev != null &&
145                     prev.gps.second == record.gps.second &&
146                     prev.gps.minute == record.gps.minute &&
147                     prev.gps.hour == record.gps.hour)
148                         return;
149                 if (record.state != state) {
150                         state = record.state;
151                         if (prev != null) {
152                                 coord(record);
153                                 state_end(prev);
154                         }
155                         state_start(record);
156                 }
157                 coord(record);
158                 prev = record;
159         }
160
161         public void write(AltosRecordIterable iterable) {
162                 for (AltosRecord record : iterable)
163                         write(record);
164         }
165
166         public AltosKML(File in_name) throws FileNotFoundException {
167                 name = in_name;
168                 out = new PrintStream(name);
169         }
170
171         public AltosKML(String in_string) throws FileNotFoundException {
172                 this(new File(in_string));
173         }
174 }