]> err.no Git - mapper/blob - src/gps-panels.c
Fix GPS settings dialog so it works.
[mapper] / src / gps-panels.c
1 /*
2  * This file is part of mapper
3  *
4  * Copyright (C) 2007 Kaj-Michael Lang
5  * Copyright (C) 2006-2007 John Costigan.
6  *
7  * POI and GPS-Info code originally written by Cezary Jackiewicz.
8  *
9  * Default map data provided by http://www.openstreetmap.org/
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License along
22  * with this program; if not, write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24  */
25
26 #include <config.h>
27
28 #include <unistd.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <strings.h>
32 #include <stddef.h>
33 #include <math.h>
34 #include <errno.h>
35 #include <sys/wait.h>
36 #include <glib/gstdio.h>
37 #include <gtk/gtk.h>
38 #include <libintl.h>
39 #include <locale.h>
40
41 #include "utils.h"
42 #include "gps.h"
43 #include "settings.h"
44 #include "mapper-types.h"
45 #include "ui-common.h"
46 #include "latlon.h"
47 #include "route.h"
48
49 #include "gps-panels.h"
50 #include "gtkgps.h"
51 #include "gtkcompass.h"
52
53 static GtkWidget *text_lat;
54 static GtkWidget *text_lon;
55 static GtkWidget *text_speed;
56 static GtkWidget *text_alt;
57 static GtkWidget *text_dop;
58 static GtkWidget *text_time;
59
60 static void gps_clear_text_fields(void);
61
62 GtkWidget *
63 gps_info_panel(void)
64 {
65 GtkWidget *vbox;
66
67 vbox = gtk_vbox_new(FALSE, 0);
68
69 text_time = gtk_label_new(NULL);
70 gtk_widget_set_size_request(GTK_WIDGET(text_time), -1, 30);
71 gtk_box_pack_start(GTK_BOX(vbox), text_time, FALSE, TRUE, 0);
72
73 text_lat = gtk_label_new(NULL);
74 gtk_widget_set_size_request(GTK_WIDGET(text_lat), -1, 30);
75 gtk_box_pack_start(GTK_BOX(vbox), text_lat, FALSE, TRUE, 0);
76
77 text_lon = gtk_label_new(NULL);
78 gtk_widget_set_size_request(GTK_WIDGET(text_lon), -1, 30);
79 gtk_box_pack_start(GTK_BOX(vbox), text_lon, FALSE, TRUE, 0);
80
81 text_speed = gtk_label_new(NULL);
82 gtk_widget_set_size_request(GTK_WIDGET(text_speed), -1, 30);
83 gtk_box_pack_start(GTK_BOX(vbox), text_speed, FALSE, TRUE, 0);
84
85 text_alt = gtk_label_new(NULL);
86 gtk_widget_set_size_request(GTK_WIDGET(text_alt), -1, 30);
87 gtk_box_pack_start(GTK_BOX(vbox), text_alt, FALSE, TRUE, 0);
88
89 text_dop = gtk_label_new(NULL);
90 gtk_widget_set_size_request(GTK_WIDGET(text_dop), -1, 30);
91 gtk_box_pack_start(GTK_BOX(vbox), text_dop, FALSE, TRUE, 0);
92
93 _gps_signal=gtk_gps_new(GTK_GPS_MODE_SKY, &_gps->data);
94 gtk_widget_set_size_request(_gps_signal, -1, 100);
95 gtk_box_pack_start(GTK_BOX(vbox), _gps_signal, TRUE, TRUE, 0);
96
97 _gps_compass = gtk_compass_new(&_gps->data);
98 gtk_widget_set_size_request(_gps_compass, -1, 100);
99 gtk_box_pack_start(GTK_BOX(vbox), _gps_compass, TRUE, TRUE, 0);
100
101 gps_clear_text_fields();
102
103 return vbox;
104 }
105
106 void
107 gps_display_data_speed(GtkWidget *widget, gfloat s)
108 {
109 gchar buffer[32];
110 gfloat speed = s * UNITS_CONVERT[_units];
111
112 switch (_units) {
113         case UNITS_MI:
114                 g_snprintf(buffer, 32, "%.1f mph", speed);
115         break;
116         case UNITS_NM:
117                 g_snprintf(buffer, 32, "%.1f kn", speed);
118         break;
119         default:
120                 g_snprintf(buffer, 32, "%.1f km/h", speed);
121         break;
122         }
123
124 gtk_label_set_label(GTK_LABEL(widget), buffer);
125 }
126
127 static void
128 gps_clear_text_fields(void)
129 {
130 gtk_label_set_label(GTK_LABEL(text_lat), " --- ");
131 gtk_label_set_label(GTK_LABEL(text_lon), " --- ");
132 gtk_label_set_label(GTK_LABEL(text_speed), " --- ");
133 gtk_label_set_label(GTK_LABEL(text_alt), " --- ");
134 gtk_label_set_label(GTK_LABEL(text_dop), " --- ");
135 }
136
137 void 
138 gps_display_data(GpsData *gps)
139 {
140 gchar buffer[32];
141
142 /* local time */
143 strftime(buffer, 15, "%X", localtime(&gps->time));
144 gtk_label_set_label(GTK_LABEL(text_time), buffer);
145
146 if (gps->fix==FIX_NOFIX) {
147         /* no fix no fun */
148         gps_clear_text_fields();
149         return;
150 }
151
152 /* latitude */
153 lat_format(_degformat, gps->lat, buffer);
154 gtk_label_set_label(GTK_LABEL(text_lat), buffer);
155
156 /* longitude */
157 lon_format(_degformat, gps->lon, buffer);
158 gtk_label_set_label(GTK_LABEL(text_lon), buffer);
159
160 /* speed */
161 gps_display_data_speed(text_speed, gps->speed);
162
163 /* altitude */
164 switch (_units) {
165 case UNITS_MI:
166 case UNITS_NM:
167         g_snprintf(buffer, 32, "Alt: %.1f ft", gps->altitude * 3.2808399f);
168         break;
169 default:
170         g_snprintf(buffer, 32, "Alt: %.1f m", gps->altitude);
171 }
172 gtk_label_set_label(GTK_LABEL(text_alt), buffer);
173
174 /* DOP */
175 g_snprintf(buffer, 32, "%.1f/%.1f/%.1f", gps->hdop, gps->vdop, gps->pdop);
176 gtk_label_set_label(GTK_LABEL(text_dop), buffer);
177 }
178
179 void 
180 gps_show_info(GpsData *gps)
181 {
182 if (_gps_info && _enable_gps)
183         gtk_widget_show_all(GTK_WIDGET(_gps_widget));
184 else {
185         gtk_widget_hide_all(GTK_WIDGET(_gps_widget));
186 }
187 }
188
189 gboolean
190 gps_display_details(GpsData *gps)
191 {
192 gchar buffer[32];
193
194 if (gps->fix==FIX_NOFIX) {
195         /* no fix no fun */
196         gtk_label_set_label(GTK_LABEL(_sdi_lat), " --- ");
197         gtk_label_set_label(GTK_LABEL(_sdi_lon), " --- ");
198         gtk_label_set_label(GTK_LABEL(_sdi_spd), " --- ");
199         gtk_label_set_label(GTK_LABEL(_sdi_alt), " --- ");
200         gtk_label_set_label(GTK_LABEL(_sdi_hea), " --- ");
201         gtk_label_set_label(GTK_LABEL(_sdi_tim), " --:--:-- ");
202 } else {
203         /* latitude */
204         lat_format(_degformat, gps->lat, buffer);
205         gtk_label_set_label(GTK_LABEL(_sdi_lat), buffer);
206
207         /* longitude */
208         lon_format(_degformat, gps->lon, buffer);
209         gtk_label_set_label(GTK_LABEL(_sdi_lon), buffer);
210
211         /* speed */
212         gps_display_data_speed(_sdi_spd, gps->speed);
213
214         /* altitude */
215         switch (_units) {
216         case UNITS_MI:
217         case UNITS_NM:
218                 g_snprintf(buffer, 32, "%.1f ft", gps->altitude * 3.2808399f);
219         break;
220         default:
221                 g_snprintf(buffer, 32, "%.1f m", gps->altitude);
222         break;
223         }
224         gtk_label_set_label(GTK_LABEL(_sdi_alt), buffer);
225
226         /* heading */
227         g_snprintf(buffer, 32, "%0.0f° (%0.0f)", gps->heading, fabs(gps->heading-gps->lheading));
228         gtk_label_set_label(GTK_LABEL(_sdi_hea), buffer);
229
230         /* local time */
231         strftime(buffer, 15, "%X", localtime(&gps->time));
232         gtk_label_set_label(GTK_LABEL(_sdi_tim), buffer);
233 }
234
235 /* Sat in view */
236 g_snprintf(buffer, 32, "%d", gps->satinview);
237 gtk_label_set_label(GTK_LABEL(_sdi_vie), buffer);
238
239 /* Sat in use */
240 g_snprintf(buffer, 32, "%d", gps->satinuse);
241 gtk_label_set_label(GTK_LABEL(_sdi_use), buffer);
242
243 /* fix */
244 switch (gps->fix) {
245 case 2:
246 case 3:
247         g_snprintf(buffer, 32, "%dD fix", gps->fix);
248 break;
249 default:
250         g_snprintf(buffer, 32, "nofix");
251 break;
252 }
253 gtk_label_set_label(GTK_LABEL(_sdi_fix), buffer);
254
255 if (gps->fix ==FIX_NOFIX)
256         g_snprintf(buffer, 32, "none");
257 else {
258         switch (gps->fixquality) {
259         case 1:
260                 g_strlcat(buffer,_("SPS"),32);
261         break;
262         case 2:
263                 g_strlcat(buffer,_("DGPS"),32);
264         break;
265         case 3:
266                 g_strlcat(buffer,_("PPS"),32);
267         break;
268         case 4:
269                 g_strlcat(buffer,_("Real Time Kinematic"),32);
270         break;
271         case 5:
272                 g_strlcat(buffer,_("Float RTK"),32);
273         break;
274         case 6:
275                 g_strlcat(buffer,_("Estimated"),32);
276         break;
277         case 7:
278                 g_strlcat(buffer,_("Manual"),32);
279         break;
280         case 8:
281                 g_strlcat(buffer,_("Simulation"),32);
282         break;
283         default:
284                 g_strlcat(buffer,_("none"),32);
285         break;
286         }
287 }
288 gtk_label_set_label(GTK_LABEL(_sdi_fqu), buffer);
289
290 /* max speed */
291 gps_display_data_speed(_sdi_msp, gps->maxspeed);
292
293 return TRUE;
294 }