X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=gps-tracker.c;h=09ffc9fafb2cf20676842cbcccc3dd05ca78ca92;hb=9a11e77fe5e31462255c0cb8c2ecc6c2b73147f7;hp=7d7761d2c55edf48d6b86bf32598047ed32cc6e3;hpb=e35d2c2c815a31bddfe91336bae75dd0ed092bf9;p=gps-tracker diff --git a/gps-tracker.c b/gps-tracker.c index 7d7761d..09ffc9f 100644 --- a/gps-tracker.c +++ b/gps-tracker.c @@ -1,22 +1,85 @@ #include #include +#include #include #include #include #include -static GtkWidget *window = NULL; +typedef struct { + HildonProgram *program; + HildonWindow *window; + + GtkWidget * main_vbox, *btn_hbox; + GtkWidget *status_label; + GtkButton *start_stop_button, *save_button; + gboolean tracking_is_on; +} AppData; + +static gchar * interface_file_chooser (AppData * appdata, GtkFileChooserAction action) +{ + GtkWidget *dialog; + gchar *filename = NULL; + gchar save_fname[256]; + time_t t; + struct tm *tmp; + + t = time(NULL); + tmp = localtime(&t); + strftime(save_fname, sizeof(save_fname), "gps-tracker-%F-%H-%M.gpx", tmp); + dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (appdata->window), action); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (dialog), save_fname); + g_snprintf(save_fname, sizeof(save_fname), "%s" G_DIR_SEPARATOR_S "MyDocs", g_get_home_dir()); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), save_fname); + gtk_widget_show_all (GTK_WIDGET (dialog)); + + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); + } + + gtk_widget_destroy(dialog); + return filename; +} + +static void cb_start_stop (GtkWidget * w, AppData * data) +{ + data->tracking_is_on = !data->tracking_is_on; + if(data->tracking_is_on) { + hildon_banner_show_information(GTK_WIDGET(data->window), NULL, "Tracking started"); + gtk_button_set_label (data->start_stop_button, "Stop"); + } + else { + gtk_button_set_label (data->start_stop_button, "Start"); + hildon_banner_show_information(GTK_WIDGET(data->window), NULL, "Tracking stopped"); + } +} + +static void cb_file_save (GtkWidget * w, AppData * data) +{ + gchar *filename = NULL; + filename = interface_file_chooser (data, GTK_FILE_CHOOSER_ACTION_SAVE); + + if (filename) { + //FILE * f = fopen (filename, "w"); + //fprintf (f, "This file was generated by Hildon File Chooser example."); + //fclose (f); + g_print ("File saved as %s\n", filename); + hildon_banner_show_information(GTK_WIDGET(data->window), NULL, filename); + } + g_free(filename); +} static void on_gps_device_changed (LocationGPSDevice *device, gpointer data) { - GtkLabel *info = (GtkLabel*)data; + AppData *app_data = data; + GtkLabel *info = (GtkLabel*)app_data->status_label; GString *msg; if (!device) return; - msg = g_string_new(""); + msg = g_string_sized_new (512); if (device->fix) { if (device->fix->fields & LOCATION_GPS_DEVICE_TIME_SET) { g_print ("time = %f\n", device->fix->time); @@ -39,12 +102,12 @@ on_gps_device_changed (LocationGPSDevice *device, gpointer data) if (device->fix->fields & LOCATION_GPS_DEVICE_SPEED_SET) { g_print ("speed = %f\n", device->fix->speed); - g_string_append_printf (msg, "speed = %f\n", device->fix->speed); + g_string_append_printf (msg, "speed = %f, ", device->fix->speed); } if (device->fix->fields & LOCATION_GPS_DEVICE_TRACK_SET) { g_print ("track = %f\n", device->fix->track); - g_string_append_printf (msg, "track = %f\n", device->fix->track); + g_string_append_printf (msg, "track = %f, ", device->fix->track); } if (device->fix->fields & LOCATION_GPS_DEVICE_CLIMB_SET) { @@ -65,9 +128,11 @@ on_gps_device_changed (LocationGPSDevice *device, gpointer data) g_print ("Satellites in view: %d\n", device->satellites_in_view); g_print ("Satellites in use: %d\n", device->satellites_in_use); + g_string_append_printf (msg, "Satellites = % 2d/% 2d\n", device->satellites_in_use, device->satellites_in_view); g_print ("GPS status: %d\n", device->status); + g_string_append_printf (msg, "GPS status: %d\n", device->status); - hildon_gtk_window_set_progress_indicator(GTK_WINDOW(window), device->status == LOCATION_GPS_DEVICE_STATUS_NO_FIX); + hildon_gtk_window_set_progress_indicator(GTK_WINDOW(app_data->window), device->status == LOCATION_GPS_DEVICE_STATUS_NO_FIX); if (device->cell_info) { @@ -103,23 +168,21 @@ on_gps_start (LocationGPSDevice *device, gpointer data) int main (int argc, char **argv) { - HildonProgram *program = NULL; GtkWidget *picker_button = NULL; - GtkVBox *vbox; - GtkWidget *status_label; - GtkButton *start_button; + AppData * data = g_new0 (AppData, 1); hildon_gtk_init (&argc, &argv); LocationGPSDControl *control; LocationGPSDevice *device; - program = hildon_program_get_instance (); + data->program = hildon_program_get_instance (); g_set_application_name("GPS tracker"); - window = hildon_stackable_window_new (); - hildon_program_add_window (program, HILDON_WINDOW (window)); + data->window = HILDON_WINDOW(hildon_stackable_window_new ()); + hildon_program_add_window (data->program, HILDON_WINDOW (data->window)); - vbox = (void*)gtk_vbox_new(FALSE, 0); + data->main_vbox = (void*)gtk_vbox_new(FALSE, 0); + data->btn_hbox = (void*)gtk_hbox_new(TRUE, 0); /* Create a picker button */ picker_button = hildon_date_button_new (HILDON_SIZE_AUTO, @@ -128,20 +191,26 @@ int main (int argc, char **argv) /* Set a title to the button*/ hildon_button_set_title (HILDON_BUTTON (picker_button), "Pick a date"); - start_button = GTK_BUTTON (hildon_gtk_button_new (HILDON_SIZE_THUMB_HEIGHT)); - gtk_button_set_label (start_button, "Start"); - gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(start_button), FALSE, FALSE, 8); - gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(picker_button), FALSE, FALSE, 0); - status_label = gtk_label_new("Hier kommt der Status hin\nUnd hier ist die 2. Zeile"); - gtk_box_pack_start_defaults(GTK_BOX(vbox), status_label); + data->start_stop_button = GTK_BUTTON (hildon_gtk_button_new (HILDON_SIZE_THUMB_HEIGHT | HILDON_SIZE_HALFSCREEN_WIDTH)); + data->save_button = GTK_BUTTON (hildon_gtk_button_new (HILDON_SIZE_THUMB_HEIGHT | HILDON_SIZE_HALFSCREEN_WIDTH)); + gtk_button_set_label (data->start_stop_button, "Start"); + gtk_button_set_label (data->save_button, "Save"); + gtk_box_pack_start(GTK_BOX(data->btn_hbox), GTK_WIDGET(data->start_stop_button), FALSE, FALSE, 8); + gtk_box_pack_start(GTK_BOX(data->btn_hbox), GTK_WIDGET(data->save_button), FALSE, FALSE, 8); + gtk_box_pack_start(GTK_BOX(data->main_vbox), GTK_WIDGET(data->btn_hbox), FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(data->main_vbox), GTK_WIDGET(picker_button), FALSE, FALSE, 0); + data->status_label = gtk_label_new("Hier kommt der Status hin\nUnd hier ist die 2. Zeile"); + gtk_box_pack_start_defaults(GTK_BOX(data->main_vbox), data->status_label); /* Add vbox to main window */ - gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET(vbox)); + gtk_container_add (GTK_CONTAINER (data->window), GTK_WIDGET(data->main_vbox)); - g_signal_connect (G_OBJECT (window), "destroy", + g_signal_connect (G_OBJECT (data->save_button), "clicked", G_CALLBACK (cb_file_save), data); + g_signal_connect (G_OBJECT (data->start_stop_button), "clicked", G_CALLBACK (cb_start_stop), data); + g_signal_connect (G_OBJECT (data->window), "destroy", G_CALLBACK (gtk_main_quit), NULL); control = location_gpsd_control_get_default (); - hildon_banner_show_information(GTK_WIDGET(window), NULL, "Hi there!"); + //hildon_banner_show_information(GTK_WIDGET(data->window), NULL, "Hi there!"); location_gpsd_control_start (control); /* @@ -160,17 +229,18 @@ int main (int argc, char **argv) g_signal_connect (control, "error", G_CALLBACK (on_gps_error), NULL); g_signal_connect (control, "gpsd-running", G_CALLBACK (on_gps_start), NULL); g_signal_connect (control, "gpsd-stopped", G_CALLBACK (on_gps_stop), NULL); - g_signal_connect (device, "changed", G_CALLBACK (on_gps_device_changed), status_label); + g_signal_connect (device, "changed", G_CALLBACK (on_gps_device_changed), data); - gtk_widget_show_all (GTK_WIDGET (window)); + gtk_widget_show_all (GTK_WIDGET (data->window)); - hildon_gtk_window_set_progress_indicator(GTK_WINDOW(window), 1); + hildon_gtk_window_set_progress_indicator(GTK_WINDOW(data->window), 1); gtk_main (); location_gpsd_control_stop (control); g_object_unref (device); g_object_unref (control); + g_free(data); return 0; }