Diff of /trunk/src/goto.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 248 by harbaum, Tue Jan 19 20:26:37 2010 UTC revision 249 by harbaum, Thu Jan 21 21:18:33 2010 UTC
# Line 39  Line 39 
39  #define SAT_HEIGHT 60  #define SAT_HEIGHT 60
40    
41  #ifdef ESPEAK  #ifdef ESPEAK
42    #include <espeak/speak_lib.h>
43    
44    #define ESPEAK_TIMEOUT (15000)   // every 15 seconds
45    
46    char *espeak_make_string(float dist, gboolean imperial) {
47      char *retval = NULL;
48    
49      if(!imperial) {
50        /* distance is in kilometers */
51        if(dist < 2.0/1000.0)
52          retval = g_strdup(_("1 meter"));
53        else if(dist < 1.0)
54          retval = g_strdup_printf(_("%u meters"), (int)(dist*1000));
55        else if(dist < 2.0)
56          retval = g_strdup(_("1 kilometer"));
57        else
58          retval = g_strdup_printf(_("%u kilometers"), (int)dist);
59      } else {
60    
61        /* 1 mil = 1760 yd = 5280 ft ... */
62        if(dist < (2.0/5280.0))
63          retval = g_strdup(_("1 foot"));
64        else if(dist < (1.0/1760.0))
65          retval = g_strdup_printf(_("%u feet"), (int)(dist*5280));
66        else if(dist < (2.0/1760.0))
67          retval = g_strdup(_("1 yard"));
68        else if(dist < 1.0)
69          retval = g_strdup_printf(_("%u yard"), (int)(dist*1760));
70        else if(dist < 2.0)
71          retval = g_strdup(_("1 mile"));
72        else
73          retval = g_strdup_printf(_("%u miles"), (int)dist);
74      }
75      return retval;
76    }
77    
78    static gboolean espeak_do(gpointer data) {
79      cache_context_t *context = (cache_context_t*)data;
80    
81      pos_t *pos = gps_get_pos(context->appdata);
82      if(pos && !isnan(pos->lat) && !isnan(pos->lon) &&
83         !isnan(context->gotoc.pos.lat) && !isnan(context->gotoc.pos.lon)) {
84    
85        /* build distance */
86        float dist =
87          gpx_pos_get_distance(*pos, context->gotoc.pos,
88                               context->appdata->imperial);
89    
90        char *talk = espeak_make_string(dist, context->appdata->imperial);
91    
92        unsigned int unique_identifier=0;
93        espeak_Synth(talk, strlen(talk)+1, 0, 0, 0, espeakCHARS_AUTO,
94                     &unique_identifier, NULL);
95    
96        g_free(talk);
97      }
98    
99      return TRUE;  // speak again
100    }
101    
102    static void espeak_enable(cache_context_t *context, gboolean enable) {
103      if(enable) {
104        g_assert(!context->gotoc.espeak_handler);
105    
106        context->gotoc.espeak_handler =
107          gtk_timeout_add(ESPEAK_TIMEOUT, espeak_do, context);
108    
109        espeak_do(context);
110    
111      } else {
112        if(context->gotoc.espeak_handler) {
113          gtk_timeout_remove(context->gotoc.espeak_handler);
114          context->gotoc.espeak_handler = 0;
115        }
116      }
117    }
118  #endif  #endif
119    
120  static float rad2deg(float rad) {  static float rad2deg(float rad) {
# Line 387  gint goto_destroy_event(GtkWidget *widge Line 462  gint goto_destroy_event(GtkWidget *widge
462    
463    printf("destroying goto view\n");    printf("destroying goto view\n");
464    
465    #ifdef ESPEAK
466      espeak_enable(context, FALSE);
467    #endif
468    
469    /* stop timer */    /* stop timer */
470    if(context->gotoc.handler_id)    if(context->gotoc.handler_id)
471      gtk_timeout_remove(context->gotoc.handler_id);      gtk_timeout_remove(context->gotoc.handler_id);
# Line 483  static void pos_modified(GtkWidget *widg Line 562  static void pos_modified(GtkWidget *widg
562    
563  #ifdef ESPEAK  #ifdef ESPEAK
564  static void espeak_clicked(GtkWidget *widget, gpointer data) {  static void espeak_clicked(GtkWidget *widget, gpointer data) {
565    appdata_t *appdata = (appdata_t*)data;    cache_context_t *context = (cache_context_t*)data;
566    
567    GtkWidget *icon = gtk_button_get_image(GTK_BUTTON(widget));    GtkWidget *icon = gtk_button_get_image(GTK_BUTTON(widget));
568    gtk_widget_destroy(icon);    gtk_widget_destroy(icon);
569    appdata->espeak.enabled = !appdata->espeak.enabled;    context->appdata->espeak.enabled = !context->appdata->espeak.enabled;
570    gtk_button_set_image(GTK_BUTTON(widget), icon_get_widget(ICON_MISC,    gtk_button_set_image(GTK_BUTTON(widget), icon_get_widget(ICON_MISC,
571                         appdata->espeak.enabled?6:7));                         context->appdata->espeak.enabled?6:7));
572    
573      espeak_enable(context, context->appdata->espeak.enabled);
574  }  }
575  #endif  #endif
576    
# Line 586  GtkWidget *goto_cache(cache_context_t *c Line 667  GtkWidget *goto_cache(cache_context_t *c
667    gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_MISC,    gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_MISC,
668                         context->appdata->espeak.enabled?6:7));                         context->appdata->espeak.enabled?6:7));
669    gtk_signal_connect (GTK_OBJECT(button), "clicked",    gtk_signal_connect (GTK_OBJECT(button), "clicked",
670                        GTK_SIGNAL_FUNC(espeak_clicked), context->appdata);                        GTK_SIGNAL_FUNC(espeak_clicked), context);
671    if(context->appdata->espeak.sample_rate < 0)    if(context->appdata->espeak.sample_rate < 0)
672      gtk_widget_set_sensitive(button, FALSE);      gtk_widget_set_sensitive(button, FALSE);
673      else
674        if(context->appdata->espeak.enabled)
675          espeak_enable(context, TRUE);
676    
677    gtk_box_pack_start(GTK_BOX(ivbox), button, 1,0,0);    gtk_box_pack_start(GTK_BOX(ivbox), button, 1,0,0);
678    gtk_box_pack_start(GTK_BOX(ihbox), ivbox, 1,0,0);    gtk_box_pack_start(GTK_BOX(ihbox), ivbox, 1,0,0);

Legend:
Removed from v.248  
changed lines
  Added in v.249