X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=gps-tracker.c;h=8b8736a9c2ffcd7051012b7a48412beb86b47c2d;hb=HEAD;hp=90f08b7fc98643105a669c8966c22abd33295fe4;hpb=dc47b72ec1f4c93b703cfbe3120c0e4ddb206426;p=gps-tracker diff --git a/gps-tracker.c b/gps-tracker.c index 90f08b7..8b8736a 100644 --- a/gps-tracker.c +++ b/gps-tracker.c @@ -21,9 +21,11 @@ typedef struct { GtkWidget *speed_val_label, *track_val_label, *climb_val_label; //GtkWidget *wp_label; GtkButton *wp_set_btn; - GString *wp_marker_str; - gboolean tracking_is_on; + GString *wp_marker_str, *waypoint_block_str; + gboolean tracking_is_on, has_fix; FILE *outf_p; + guint points_recorded_in_current_segment; + LocationGPSDeviceStatus last_device_status; gchar *working_dir; gchar *intermediate_gpx_data_filename; } AppData; @@ -52,24 +54,31 @@ static gchar * interface_file_chooser (AppData * appdata, GtkFileChooserAction a return filename; } -static void write_gpx_header(FILE *fp) +static void write_gpx_header(AppData *app_data) { + FILE *fp = app_data->outf_p; g_return_if_fail(fp); g_fprintf(fp, "\n" "\n" - "\n\n" + "\n" + "gps-tracker\n" + "This is a track recorded by 'GPS Træcker' on Maemo\n" + "\n" ); } -static void write_gpx_footer(FILE *fp) +static void write_gpx_footer(AppData *app_data) { + FILE *fp = app_data->outf_p; g_return_if_fail(fp); - g_fprintf(fp, "\n\n\n"); + g_fprintf(fp, "\n\n"); + g_fprintf(fp, app_data->waypoint_block_str->str); + g_fprintf(fp, "\n"); } static void cb_wp_set_btn (GtkWidget * w, AppData * data) @@ -92,15 +101,19 @@ static void cb_start_stop (GtkWidget * w, AppData * data) data->tracking_is_on = !data->tracking_is_on; if(data->tracking_is_on) { /* START pressed */ data->outf_p = fopen(data->intermediate_gpx_data_filename, "w"); - write_gpx_header(data->outf_p); + data->points_recorded_in_current_segment = 0; + data->last_device_status = LOCATION_GPS_DEVICE_STATUS_NO_FIX; + write_gpx_header(data); //hildon_banner_show_information(GTK_WIDGET(data->window), NULL, "Tracking started"); gtk_button_set_label (data->start_stop_button, "Stop"); gtk_widget_set_sensitive(GTK_WIDGET(data->save_button), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(data->wp_set_btn), TRUE); } else { /* STOP pressed */ + data->points_recorded_in_current_segment = 0; + data->last_device_status = LOCATION_GPS_DEVICE_STATUS_NO_FIX; if(data->outf_p) { - write_gpx_footer(data->outf_p); + write_gpx_footer(data); fclose(data->outf_p); data->outf_p = NULL; } @@ -110,6 +123,7 @@ static void cb_start_stop (GtkWidget * w, AppData * data) gtk_widget_set_sensitive(GTK_WIDGET(data->wp_set_btn), FALSE); } g_string_truncate(data->wp_marker_str, 0); + g_string_truncate(data->waypoint_block_str, 0); } static void cb_file_save (GtkWidget * w, AppData * data) @@ -122,6 +136,7 @@ static void cb_file_save (GtkWidget * w, AppData * data) g_rename(data->intermediate_gpx_data_filename, filename); //g_print ("File saved as %s\n", filename); hildon_banner_show_information(GTK_WIDGET(data->window), NULL, filename); + gtk_widget_set_sensitive(GTK_WIDGET(data->save_button), FALSE); } else { hildon_banner_show_information(GTK_WIDGET(data->window), NULL, "Temp file not found"); @@ -130,7 +145,7 @@ static void cb_file_save (GtkWidget * w, AppData * data) g_free(filename); } -#define SPAN_PREFIX "" +#define SPAN_PREFIX "" #define SPAN_POST "" #define LABEL_FMT(s) SPAN_PREFIX s SPAN_POST #define CHANGE_LABEL(w,fmt,val) change_label_text(w, SPAN_PREFIX fmt SPAN_POST, val) @@ -154,22 +169,44 @@ static void on_gps_device_changed (LocationGPSDevice *device, gpointer data) if (!device) return; - if (device->fix && device->status) { + /* if there is no fix, or we are recording (fp != NULL), but the fix is so + * bad that it is a 2D fix only, with no time set then do not + * record any longer */ + if ((device->status == LOCATION_GPS_DEVICE_STATUS_NO_FIX) || + (device->fix && fp && + (! device->fix->fields & LOCATION_GPS_DEVICE_TIME_SET) && + (device->fix->mode == LOCATION_GPS_DEVICE_MODE_2D))) { + app_data->has_fix = FALSE; + //hildon_banner_show_information(GTK_WIDGET(app_data->window), NULL, "WARNING: Lost fix"); + app_data->last_device_status = LOCATION_GPS_DEVICE_STATUS_NO_FIX; + } + else if (device->fix) { + //g_print("mode=%d stat=%d\n", device->fix->mode, device->status); if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET) { + app_data->has_fix = TRUE; /* fix found again */ //g_print ("lat = %f, long = %f\n", device->fix->latitude, device->fix->longitude); CHANGE_LABEL(app_data->lat_val_label, "% 9.6f", device->fix->latitude); CHANGE_LABEL(app_data->lon_val_label, "% 9.6f", device->fix->longitude); if(fp) { + if(app_data->last_device_status != device->status) { + if(app_data->points_recorded_in_current_segment) + g_fprintf(fp, "\n\n\n"); + app_data->last_device_status = device->status; + } g_fprintf(fp, "\n\n", - g_ascii_formatd(sbuf1, sizeof(sbuf1), "%f", device->fix->latitude), - g_ascii_formatd(sbuf2, sizeof(sbuf2), "%f", device->fix->longitude)); + g_ascii_formatd(sbuf1, sizeof(sbuf1), "%f", device->fix->latitude), + g_ascii_formatd(sbuf2, sizeof(sbuf2), "%f", device->fix->longitude)); if(app_data->wp_marker_str->len) { g_fprintf(fp, "%s\n", app_data->wp_marker_str->str); hildon_banner_show_information(GTK_WIDGET(app_data->window), NULL, app_data->wp_marker_str->str); + g_string_append_printf(app_data->waypoint_block_str, "%s\n", + sbuf1, sbuf2, app_data->wp_marker_str->str); g_string_truncate(app_data->wp_marker_str, 0); } } + app_data->points_recorded_in_current_segment++; + if (device->fix->fields & LOCATION_GPS_DEVICE_TIME_SET) { //g_print ("time = %f\n", device->fix->time); if(fp) { @@ -192,11 +229,13 @@ static void on_gps_device_changed (LocationGPSDevice *device, gpointer data) if (device->fix->fields & LOCATION_GPS_DEVICE_ALTITUDE_SET) { //g_print ("alt = %f\n", device->fix->altitude); - CHANGE_LABEL(app_data->alt_val_label, "% 5.0f", device->fix->altitude); + CHANGE_LABEL(app_data->alt_val_label, "% 5.0fm", device->fix->altitude); if(fp) g_fprintf(fp, "%s\n", g_ascii_formatd(sbuf1, sizeof(sbuf1), "%.1f", device->fix->altitude)); } + else + CHANGE_LABEL(app_data->alt_val_label, " ?", NULL); if (device->fix->fields & LOCATION_GPS_DEVICE_SPEED_SET) { //g_print ("speed = %f\n", device->fix->speed); @@ -204,6 +243,8 @@ static void on_gps_device_changed (LocationGPSDevice *device, gpointer data) if(fp) g_fprintf(fp, "%s\n", g_ascii_formatd(sbuf1, sizeof(sbuf1), "%.1f", device->fix->speed)); } + else + CHANGE_LABEL(app_data->speed_val_label, " ?", NULL); if (device->fix->fields & LOCATION_GPS_DEVICE_TRACK_SET) { //g_print ("track = %f\n", device->fix->track); @@ -211,11 +252,15 @@ static void on_gps_device_changed (LocationGPSDevice *device, gpointer data) if(fp) g_fprintf(fp, "%s\n", g_ascii_formatd(sbuf1, sizeof(sbuf1), "%.1f", device->fix->track)); } + else + CHANGE_LABEL(app_data->track_val_label, " ?", NULL); if (device->fix->fields & LOCATION_GPS_DEVICE_CLIMB_SET) { //g_print ("climb = %f\n", device->fix->climb); - CHANGE_LABEL(app_data->climb_val_label, "%+4.0f°", device->fix->climb); + CHANGE_LABEL(app_data->climb_val_label, "%+6.2fm/s", device->fix->climb); } + else + CHANGE_LABEL(app_data->climb_val_label, " ?", NULL); //g_print ("Accuracy values:\n"); //g_print ("\tept = %e, eph = %e, epv = %e, epd = %e, " @@ -234,15 +279,16 @@ static void on_gps_device_changed (LocationGPSDevice *device, gpointer data) } } } + else { + app_data->has_fix = FALSE; + app_data->last_device_status = LOCATION_GPS_DEVICE_STATUS_NO_FIX; + } //g_print ("Satellites in view: %d\n", device->satellites_in_view); //g_print ("Satellites in use: %d\n", device->satellites_in_use); CHANGE_LABEL2(app_data->sat_val_label, "%3d/%2d", device->satellites_in_use, device->satellites_in_view); //g_print ("GPS status: %d\n", device->status); - hildon_gtk_window_set_progress_indicator(GTK_WINDOW(app_data->window), device->status == LOCATION_GPS_DEVICE_STATUS_NO_FIX); - - //if (device->cell_info) { // if (device->cell_info->flags & LOCATION_CELL_INFO_GSM_CELL_INFO_SET) // g_print ("Mobile Coutry Code GSM: %d\n", device->cell_info->gsm_cell_info.mcc); @@ -251,8 +297,19 @@ static void on_gps_device_changed (LocationGPSDevice *device, gpointer data) // g_print ("Mobile Coutry Code WCDMA: %d\n", device->cell_info->wcdma_cell_info.mcc); //} - if(device->status != LOCATION_GPS_DEVICE_STATUS_NO_FIX) + if(app_data->has_fix) { + hildon_gtk_window_set_progress_indicator(GTK_WINDOW(app_data->window), 0); gtk_widget_set_sensitive(GTK_WIDGET(app_data->start_stop_button), TRUE); + } + else { + hildon_gtk_window_set_progress_indicator(GTK_WINDOW(app_data->window), 1); + CHANGE_LABEL(app_data->lat_val_label, " ?", NULL); + CHANGE_LABEL(app_data->lon_val_label, " ?", NULL); + CHANGE_LABEL(app_data->alt_val_label, " ?", NULL); + CHANGE_LABEL(app_data->speed_val_label, " ?", NULL); + CHANGE_LABEL(app_data->track_val_label, " ?", NULL); + CHANGE_LABEL(app_data->climb_val_label, " ?", NULL); + } } static void @@ -297,6 +354,7 @@ int main (int argc, char **argv) hildon_program_add_window (data->program, HILDON_WINDOW (data->window)); data->wp_marker_str = g_string_sized_new(64); + data->waypoint_block_str = g_string_sized_new(32<<10); data->main_vbox = (gpointer)gtk_vbox_new(FALSE, 0); data->loc_hbox = (gpointer)gtk_hbox_new(FALSE, 0); data->loc_gps_data_table = (gpointer)gtk_table_new(4, 2, FALSE); @@ -316,9 +374,9 @@ int main (int argc, char **argv) gtk_table_attach_defaults(data->loc_gps_data_table, lon_label, 0, 1, 1, 2); gtk_table_attach_defaults(data->loc_gps_data_table, alt_label, 0, 1, 2, 3); gtk_table_attach_defaults(data->loc_gps_data_table, sat_label, 0, 1, 3, 4); - data->lat_val_label = gtk_label_new(" ?"); - data->lon_val_label = gtk_label_new(" ?"); - data->alt_val_label = gtk_label_new(" ?"); + data->lat_val_label = gtk_label_new(NULL); + data->lon_val_label = gtk_label_new(NULL); + data->alt_val_label = gtk_label_new(NULL); data->sat_val_label = gtk_label_new(" 0/ 0"); gtk_misc_set_alignment (GTK_MISC (data->lat_val_label), 0, 0.5); gtk_misc_set_alignment (GTK_MISC (data->lon_val_label), 0, 0.5); @@ -342,7 +400,7 @@ int main (int argc, char **argv) { GtkWidget *alignment_track = gtk_alignment_new (0.5, 0.5, 1, 1); GtkWidget *speed_label = gtk_label_new("Speed:"); - GtkWidget *track_label = gtk_label_new("Heading:"); + GtkWidget *track_label = gtk_label_new("Orientation:"); GtkWidget *climb_label = gtk_label_new("Climb:"); gtk_alignment_set_padding(GTK_ALIGNMENT(alignment_track), 0,0,0,0); gtk_misc_set_alignment (GTK_MISC (speed_label), 1, 0.5); @@ -351,9 +409,10 @@ int main (int argc, char **argv) gtk_table_attach_defaults(data->loc_track_data_table, speed_label, 0, 1, 0, 1); gtk_table_attach_defaults(data->loc_track_data_table, track_label, 0, 1, 1, 2); gtk_table_attach_defaults(data->loc_track_data_table, climb_label, 0, 1, 2, 3); - data->speed_val_label = gtk_label_new(" ?"); - data->track_val_label = gtk_label_new(" ?"); - data->climb_val_label = gtk_label_new(" ?"); + data->speed_val_label = gtk_label_new(NULL); + CHANGE_LABEL(data->speed_val_label, "% 5.1fkm/h", 0.); + data->track_val_label = gtk_label_new(NULL); + data->climb_val_label = gtk_label_new(NULL); gtk_misc_set_alignment (GTK_MISC (data->speed_val_label), 0, 0.5); gtk_misc_set_alignment (GTK_MISC (data->track_val_label), 0, 0.5); gtk_misc_set_alignment (GTK_MISC (data->climb_val_label), 0, 0.5); @@ -436,6 +495,7 @@ int main (int argc, char **argv) g_free(data->working_dir); g_free(data->intermediate_gpx_data_filename); g_string_free(data->wp_marker_str, TRUE); + g_string_free(data->waypoint_block_str, TRUE); g_free(data); g_object_unref (device); g_object_unref (control);