diff options
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | debug.c | 19 | ||||
-rw-r--r-- | debug.h | 4 | ||||
-rw-r--r-- | graphics.c | 6 | ||||
-rw-r--r-- | navigation.c | 10 | ||||
-rw-r--r-- | navit.c | 6 | ||||
-rw-r--r-- | navit.h | 2 | ||||
-rw-r--r-- | navit.xml | 14 | ||||
-rw-r--r-- | plugin_def.h | 2 | ||||
-rw-r--r-- | profile.c | 15 | ||||
-rw-r--r-- | route.c | 96 | ||||
-rw-r--r-- | route.h | 5 | ||||
-rw-r--r-- | speech.c | 36 | ||||
-rw-r--r-- | speech.h | 20 | ||||
-rw-r--r-- | speech/cmdline/speech_cmdline.c | 42 | ||||
-rw-r--r-- | speech/speech_dispatcher/speech_speech_dispatcher.c | 58 | ||||
-rw-r--r-- | track.c | 10 | ||||
-rw-r--r-- | xmlconfig.c | 40 |
18 files changed, 290 insertions, 97 deletions
diff --git a/Makefile.am b/Makefile.am index 9225c3e4..f6eb1369 100644 --- a/Makefile.am +++ b/Makefile.am @@ -15,7 +15,7 @@ navit_SOURCES = attr.c callback.c compass.c coord.c country.c cursor.c data_wind profile.c route.c search.c speech.c transform.c track.c \ util.c vehicle.c xmlconfig.c attr.h attr_def.h callback.h color.h compass.h coord.h country.h \ cursor.h data.h data_window.h data_window_int.h debug.h destination.h draw_info.h \ - file.h graphics.h gtkext.h gui.h item.h item_def.h log.h layer.h layout.h map-share.h map.h\ + file.h graphics.h gtkext.h gui.h item.h item_def.h log.h layer.h layout.h main.h map-share.h map.h\ map_data.h mapset.h maptype.h menu.h navigation.h navit.h \ param.h phrase.h plugin.h point.h plugin_def.h projection.h popup.h route.h profile.h search.h speech.h statusbar.h \ transform.h track.h util.h vehicle.h xmlconfig.h @@ -62,9 +62,8 @@ debug_level_get(const char *name) } void -debug_print(int level, const char *module, const char *function, const char *fmt, ...) +debug_vprintf(int level, const char *module, const char *function, int prefix, const char *fmt, va_list ap) { - va_list ap; int module_len=strlen(module); int function_len=strlen(function); char buffer[module_len+function_len+3]; @@ -75,9 +74,19 @@ debug_print(int level, const char *module, const char *function, const char *fmt if (debug_level_get(module) >= level || debug_level_get(buffer) >= level) { strcpy(buffer+module_len+function_len+1, ":"); - printf("%s",buffer); - va_start(ap, fmt); + if (prefix) + printf("%s",buffer); vprintf(fmt, ap); - va_end(ap); } } + +void +debug_printf(int level, const char *module, const char *function, int prefix, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + debug_vprintf(level, module, function, prefix, fmt, ap); + va_end(ap); +} + + @@ -1,9 +1,9 @@ int debug_level; -#define dbg(level,fmt...) if (debug_level >= level) debug_print(level,MODULE,__PRETTY_FUNCTION__,fmt) +#define dbg(level,fmt...) if (debug_level >= level) debug_printf(level,MODULE,__PRETTY_FUNCTION__,1,fmt) /* prototypes */ void debug_init(void); void debug_level_set(const char *name, int level); int debug_level_get(const char *name); -void debug_print(int level, const char *module, const char *function, const char *fmt, ...); +void debug_printf(int level, const char *module, const char *function, int prefix, const char *fmt, ...); /* end of prototypes */ @@ -213,11 +213,9 @@ xdisplay_free_list(gpointer key, gpointer value, gpointer user_data) h=value; l=h; while (l) { -#if 1 struct displayitem *di=l->data; if (! di->displayed && di->item.type < type_line) - dbg(0,"warning: item '%s' not displayed\n", item_to_name(di->item.type)); -#endif + dbg(1,"warning: item '%s' not displayed\n", item_to_name(di->item.type)); g_free(l->data); l=g_list_next(l); } @@ -535,7 +533,7 @@ graphics_draw(struct graphics *gra, struct displaylist *displaylist, GList *maps #endif xdisplay_free(displaylist->dl); - dbg(0,"order=%d\n", order); + dbg(1,"order=%d\n", order); #if 0 diff --git a/navigation.c b/navigation.c index b3fbcf28..3f45df9e 100644 --- a/navigation.c +++ b/navigation.c @@ -156,7 +156,7 @@ calculate_dest_distance(struct navigation *this_) itm->dest_time=time; itm=itm->prev; } - printf("len %d time %d\n", len, time); + dbg(1,"len %d time %d\n", len, time); } static int @@ -304,6 +304,7 @@ navigation_update(struct navigation *this_, struct route *route) struct navigation_itm *itm; struct route_info *pos,*dst; struct street_data *sd; + int *speedlist; int len,end_flag=0; void *p; @@ -312,6 +313,7 @@ navigation_update(struct navigation *this_, struct route *route) dst=route_get_dst(route); if (! pos || ! dst) return; + speedlist=route_get_speedlist(route); this_->first=this_->last=NULL; len=route_info_length(pos, dst, 0); if (len == -1) { @@ -321,7 +323,7 @@ navigation_update(struct navigation *this_, struct route *route) sd=route_info_street(pos); itm=navigation_itm_new(this_, &sd->item, route_info_point(pos, -1)); itm->length=len; - itm->time=route_time(&sd->item, len); + itm->time=route_time(speedlist, &sd->item, len); rph=route_path_open(route); while((s=route_path_get_segment(rph))) { itm=navigation_itm_new(this_, route_path_segment_get_item(s),route_path_segment_get_start(s)); @@ -330,11 +332,11 @@ navigation_update(struct navigation *this_, struct route *route) } if (end_flag) { len=route_info_length(NULL, dst, 0); - printf("end %d\n", len); + dbg(1, "end %d\n", len); sd=route_info_street(dst); itm=navigation_itm_new(this_, &sd->item, route_info_point(pos, 2)); itm->length=len; - itm->time=route_time(&sd->item, len); + itm->time=route_time(speedlist, &sd->item, len); } itm=navigation_itm_new(this_, NULL, NULL); route_path_close(rph); @@ -519,6 +519,12 @@ navit_navigation_add(struct navit *this_, struct navigation *navigation) this_->navigation=navigation; } +void +navit_set_speech(struct navit *this_, struct speech *speech) +{ + this_->speech=speech; +} + struct gui * navit_get_gui(struct navit *this_) @@ -15,6 +15,7 @@ struct navigation; struct navit; struct point; struct route; +struct speech; struct tracking; struct transformation; struct vehicle; @@ -43,6 +44,7 @@ void navit_vehicle_add(struct navit *this_, struct vehicle *v, struct color *c, void navit_tracking_add(struct navit *this_, struct tracking *tracking); void navit_route_add(struct navit *this_, struct route *route); void navit_navigation_add(struct navit *this_, struct navigation *navigation); +void navit_set_speech(struct navit *this_, struct speech *speech); struct gui *navit_get_gui(struct navit *this_); struct transformation *navit_get_trans(struct navit *this_); struct route *navit_get_route(struct navit *this_); @@ -10,7 +10,19 @@ <tracking> </tracking> <route> - <speed type="water_poly" value="80" /> + <speed type="street_0,street_1_city" value="10" /> + <speed type="street_2_city" value="30" /> + <speed type="street_3_city" value="40" /> + <speed type="street_4_city" value="50" /> + <speed type="highway_city" value="80" /> + <speed type="street_1_land" value="60" /> + <speed type="street_2_land" value="65" /> + <speed type="street_3_land" value="70" /> + <speed type="street_4_land" value="80" /> + <speed type="street_n_lanes" value="120" /> + <speed type="highway_land" value="120" /> + <speed type="ramp" value="40" /> + <speed type="ferry" value="40" /> </route> <navigation> <announce type="water_poly" value="10" units="s" /> diff --git a/plugin_def.h b/plugin_def.h index d125ca5b..075709ba 100644 --- a/plugin_def.h +++ b/plugin_def.h @@ -6,5 +6,5 @@ PLUGIN_TYPE(graphics, (struct graphics_methods *meth)) PLUGIN_TYPE(gui, (struct navit *nav, struct gui_methods *meth, int w, int h)) PLUGIN_TYPE(map, (struct map_methods *meth, char *data, char **charset, enum projection *pro)) PLUGIN_TYPE(osd, (struct osd_methods *meth)) -PLUGIN_TYPE(speech, (struct speech_methods *meth)) +PLUGIN_TYPE(speech, (char *data, struct speech_methods *meth)) PLUGIN_TYPE(vehicle, (struct vehicle_methods *meth)) @@ -3,6 +3,7 @@ #include <stdlib.h> #include <sys/time.h> #include "profile.h" +#include "debug.h" void profile_timer(int level, const char *module, const char *function, const char *fmt, ...) @@ -11,7 +12,9 @@ profile_timer(int level, const char *module, const char *function, const char *f static struct timeval last[3]; struct timeval curr; int msec,usec; + char buffer[strlen(module)+20]; + va_start(ap, fmt); if (level < 0) level=0; if (level > 2) @@ -20,15 +23,14 @@ profile_timer(int level, const char *module, const char *function, const char *f gettimeofday(&curr, NULL); msec=(curr.tv_usec-last[level].tv_usec)/1000+ (curr.tv_sec-last[level].tv_sec)*1000; - printf("%s:%s ", module, function); - va_start(ap, fmt); - vprintf(fmt, ap); - va_end(ap); + + sprintf(buffer, "profile:%s", module); + debug_vprintf(1, buffer, function, fmt, ap); if (msec >= 100) - printf(" %d msec\n", msec); + debug_printf(1, buffer, function, 0, " %d msec\n", msec); else { usec=(curr.tv_usec-last[level].tv_usec)+(curr.tv_sec-last[level].tv_sec)*1000*1000; - printf(" %d.%d msec\n", usec/1000, usec%1000); + debug_printf(1, buffer, function, 0, " %d.%d msec\n", usec/1000, usec%1000); } gettimeofday(&last[level], NULL); } else { @@ -36,4 +38,5 @@ profile_timer(int level, const char *module, const char *function, const char *f for (level = 0 ; level < 3 ; level++) last[level]=curr; } + va_end(ap); } @@ -20,6 +20,10 @@ #include "transform.h" #include "fib.h" +#define route_item_first type_street_0 +#define route_item_last type_ferry + +#if 0 static int speed_list[]={ 10, /* street_0 */ 10, /* street_1_city */ @@ -36,6 +40,7 @@ static int speed_list[]={ 40, /* ramp */ 30, /* ferry */ }; +#endif int debug_route=0; @@ -105,7 +110,7 @@ struct route { struct route_graph *graph; struct route_path *path2; - + int speedlist[route_item_last-route_item_first+1]; }; struct route_graph { @@ -118,7 +123,7 @@ struct route_graph { static struct route_info * route_find_nearest_street(struct mapset *ms, struct coord *c); static struct route_graph_point *route_graph_get_point(struct route_graph *this, struct coord *c); static void route_graph_update(struct route *this); -static struct route_path *route_path_new(struct route_graph *this, struct route_info *pos, struct route_info *dst); +static struct route_path *route_path_new(struct route_graph *this, struct route_info *pos, struct route_info *dst, int *speedlist); static void route_process_street_graph(struct route_graph *this, struct item *item); static void route_graph_destroy(struct route_graph *this); static void route_path_update(struct route *this); @@ -175,6 +180,24 @@ route_get_dst(struct route *this) return this->dst; } +int * +route_get_speedlist(struct route *this) +{ + return this->speedlist; +} + +int +route_set_speed(struct route *this, enum item_type type, int value) +{ + int idx=type-route_item_first; + if (idx > route_item_last-route_item_first || idx < 0) { + dbg(0,"street idx(%d) out of range [0,%d]", idx, route_item_last-route_item_first); + return 0; + } + this->speedlist[idx]=value; + return 1; +} + int route_contains(struct route *this, struct item *item) { @@ -187,10 +210,10 @@ static void route_path_update(struct route *this) { route_path_destroy(this->path2); - if (! this->graph || !(this->path2=route_path_new(this->graph, this->pos, this->dst))) { + if (! this->graph || !(this->path2=route_path_new(this->graph, this->pos, this->dst, this->speedlist))) { profile(0,NULL); route_graph_update(this); - this->path2=route_path_new(this->graph, this->pos, this->dst); + this->path2=route_path_new(this->graph, this->pos, this->dst, this->speedlist); profile(1,"route_path_new"); profile(0,"end"); } @@ -503,26 +526,26 @@ route_graph_destroy(struct route_graph *this) } int -route_time(struct item *item, int len) +route_time(int *speedlist, struct item *item, int len) { - int idx=(item->type-type_street_0); - if (idx >= sizeof(speed_list)/sizeof(int) || idx < 0) { - dbg(0,"street idx(%d) out of range [0,%d[", sizeof(speed_list)/sizeof(int)); + int idx=(item->type-route_item_first); + if (idx > route_item_last-route_item_first || idx < 0) { + dbg(0,"street idx(%d) out of range [0,%d]", idx, route_item_last-route_item_first); return len*36; } - return len*36/speed_list[idx]; + return len*36/speedlist[idx]; } static int -route_value(struct item *item, int len) +route_value(int *speedlist, struct item *item, int len) { int ret; if (len < 0) { printf("len=%d\n", len); } g_assert(len >= 0); - ret=route_time(item, len); + ret=route_time(speedlist, item, len); dbg(1, "route_value(0x%x, %d)=%d\n", item->type, len, ret); return ret; } @@ -586,7 +609,7 @@ route_info_length(struct route_info *pos, struct route_info *dst, int dir) } static void -route_graph_flood(struct route_graph *this, struct route_info *dst) +route_graph_flood(struct route_graph *this, struct route_info *dst, int *speedlist) { struct route_graph_point *p_min,*end=NULL; struct route_graph_segment *s; @@ -600,14 +623,14 @@ route_graph_flood(struct route_graph *this, struct route_info *dst) if (! (sd->limit & 2)) { end=route_graph_get_point(this, &sd->c[0]); g_assert(end != 0); - end->value=route_value(&sd->item, route_value(&sd->item, route_info_length(NULL, dst, -1))); + end->value=route_value(speedlist, &sd->item, route_info_length(NULL, dst, -1)); end->el=fh_insert(heap, end); } if (! (sd->limit & 1)) { end=route_graph_get_point(this, &sd->c[sd->count-1]); g_assert(end != 0); - end->value=route_value(&sd->item, route_value(&sd->item, route_info_length(NULL, dst, 1))); + end->value=route_value(speedlist, &sd->item, route_info_length(NULL, dst, 1)); end->el=fh_insert(heap, end); } @@ -622,7 +645,7 @@ route_graph_flood(struct route_graph *this, struct route_info *dst) p_min->el=NULL; s=p_min->start; while (s) { - val=route_value(&s->item, s->len); + val=route_value(speedlist, &s->item, s->len); #if 0 val+=val*2*street_route_contained(s->str->segid); #endif @@ -651,7 +674,7 @@ route_graph_flood(struct route_graph *this, struct route_info *dst) } s=p_min->end; while (s) { - val=route_value(&s->item, s->len); + val=route_value(speedlist, &s->item, s->len); new=min+val; if (debug_route) printf("end %d len %d vs %d (0x%x,0x%x)\n",new,val,s->start->value,s->start->c.x, s->start->c.y); @@ -681,12 +704,15 @@ route_graph_flood(struct route_graph *this, struct route_info *dst) } static struct route_path * -route_path_new(struct route_graph *this, struct route_info *pos, struct route_info *dst) +route_path_new(struct route_graph *this, struct route_info *pos, struct route_info *dst, int *speedlist) { struct route_graph_point *start1=NULL,*start2=NULL,*start; struct route_graph_segment *s=NULL; int len=0,segs=0; - int ilen,hr,min,sec,time=0,seg_time,seg_len; + int ilen,seg_time,seg_len; +#if 0 + int time=0,hr,min,sec +#endif unsigned int val1=0xffffffff,val2=0xffffffff; struct street_data *sd=pos->street; struct route_path *ret; @@ -695,15 +721,15 @@ route_path_new(struct route_graph *this, struct route_info *pos, struct route_in start1=route_graph_get_point(this, &sd->c[0]); if (! start1) return NULL; - val1=start1->value+route_value(&sd->item, route_info_length(pos, NULL, -1)); - dbg(0,"start1: %d(route)+%d=%d\n", start1->value, val1-start1->value, val1); + val1=start1->value+route_value(speedlist, &sd->item, route_info_length(pos, NULL, -1)); + dbg(1,"start1: %d(route)+%d=%d\n", start1->value, val1-start1->value, val1); } if (! (sd->limit & 2)) { start2=route_graph_get_point(this, &sd->c[sd->count-1]); if (! start2) return NULL; - val2=start2->value+route_value(&sd->item, route_info_length(pos, NULL, 1)); - dbg(0,"start2: %d(route)+%d=%d\n", start2->value, val2-start2->value, val2); + val2=start2->value+route_value(speedlist, &sd->item, route_info_length(pos, NULL, 1)); + dbg(1,"start2: %d(route)+%d=%d\n", start2->value, val2-start2->value, val2); } if (start1 && (val1 < val2)) { start=start1; @@ -719,16 +745,18 @@ route_path_new(struct route_graph *this, struct route_info *pos, struct route_in } ret=g_new0(struct route_path, 1); ret->path_hash=item_hash_new(); - dbg(0,"dir=%d\n", pos->dir); + dbg(1,"dir=%d\n", pos->dir); while ((s=start->seg)) { segs++; #if 0 printf("start->value=%d 0x%x,0x%x\n", start->value, start->c.x, start->c.y); #endif seg_len=s->len; +#if 0 seg_time=route_time(&s->item, seg_len); - len+=seg_len; time+=seg_time; +#endif + len+=seg_len; if (s->start == start) { route_path_add_item(ret, &s->item, &s->start->c, &s->end->c, seg_len, seg_time); start=s->end; @@ -738,8 +766,8 @@ route_path_new(struct route_graph *this, struct route_info *pos, struct route_in } } sd=dst->street; - dbg(0,"start->value=%d 0x%x,0x%x\n", start->value, start->c.x, start->c.y); - dbg(0,"dst sd->limit=%d sd->c[0]=0x%x,0x%x sd->c[sd->count-1]=0x%x,0x%x\n", sd->limit, sd->c[0].x,sd->c[0].y, sd->c[sd->count-1].x, sd->c[sd->count-1].y); + dbg(1,"start->value=%d 0x%x,0x%x\n", start->value, start->c.x, start->c.y); + dbg(1,"dst sd->limit=%d sd->c[0]=0x%x,0x%x sd->c[sd->count-1]=0x%x,0x%x\n", sd->limit, sd->c[0].x,sd->c[0].y, sd->c[sd->count-1].x, sd->c[sd->count-1].y); if (start->c.x == sd->c[0].x && start->c.y == sd->c[0].y) dst->dir=-1; else if (start->c.x == sd->c[sd->count-1].x && start->c.y == sd->c[sd->count-1].y) @@ -750,23 +778,29 @@ route_path_new(struct route_graph *this, struct route_info *pos, struct route_in return NULL; } ilen=route_info_length(pos, NULL, 0); +#if 0 time+=route_time(&pos->street->item, ilen); +#endif len+=ilen; ilen=route_info_length(NULL, dst, 0); +#if 0 time+=route_time(&dst->street->item, ilen); +#endif len+=ilen; - dbg(0, "%d segments\n", segs); - dbg(0, "len %5.3f\n", len/1000.0); + dbg(1, "%d segments\n", segs); +#if 0 + dbg(1, "len %5.3f\n", len/1000.0); time/=10; sec=time; min=time/60; time-=min*60; hr=min/60; min-=hr*60; - dbg(0, "time %02d:%02d:%02d (%d sec)\n", hr, min, time, sec); - dbg(0, "speed %f km/h\n", len/sec*3.6); + dbg(1, "time %02d:%02d:%02d (%d sec)\n", hr, min, time, sec); + dbg(1, "speed %f km/h\n", len/sec*3.6); +#endif return ret; } @@ -806,7 +840,7 @@ route_graph_update(struct route *this) profile(1,"graph_free"); this->graph=route_graph_build(this->ms, &this->pos->c, &this->dst->c); profile(1,"route_graph_build"); - route_graph_flood(this->graph, this->dst); + route_graph_flood(this->graph, this->dst, this->speedlist); profile(1,"route_graph_flood"); this->version++; } @@ -9,6 +9,7 @@ struct route_crossings { }; /* prototypes */ +enum item_type; struct coord; struct displaylist; struct item; @@ -27,6 +28,8 @@ void route_set_mapset(struct route *this, struct mapset *ms); struct mapset *route_get_mapset(struct route *this); struct route_info *route_get_pos(struct route *this); struct route_info *route_get_dst(struct route *this); +int *route_get_speedlist(struct route *this); +int route_set_speed(struct route *this, enum item_type type, int value); int route_contains(struct route *this, struct item *item); void route_set_position(struct route *this, struct coord *pos); void route_set_position_from_tracking(struct route *this, struct tracking *tracking); @@ -40,7 +43,7 @@ struct item *route_path_segment_get_item(struct route_path_segment *s); int route_path_segment_get_length(struct route_path_segment *s); int route_path_segment_get_time(struct route_path_segment *s); void route_path_close(struct route_path_handle *h); -int route_time(struct item *item, int len); +int route_time(int *speedlist, struct item *item, int len); int route_info_length(struct route_info *pos, struct route_info *dst, int dir); struct street_data *street_get_data(struct item *item); struct street_data *street_data_dup(struct street_data *orig); @@ -1 +1,37 @@ +#include <glib.h> +#include "debug.h" #include "speech.h" +#include "plugin.h" + +struct speech { + struct speech_priv *priv; + struct speech_methods meth; +}; + +struct speech * +speech_new(const char *type, const char *data) +{ + struct speech *this_; + struct speech_priv *(*speech_new)(const char *data, struct speech_methods *meth); + + speech_new=plugin_get_speech_type(type); + dbg(1,"new=%p\n", speech_new); + if (! speech_new) { + return NULL; + } + this_=g_new0(struct speech, 1); + this_->priv=speech_new(data, &this_->meth); + dbg(1,"priv=%p\n", this_->priv); + if (! this_->priv) { + g_free(this_); + return NULL; + } + dbg(1,"return %p\n", this_); + return this_; +} + +int +speech_say(struct speech *this_, const char *text) +{ + return (this_->meth.say)(this_->priv, text); +} @@ -1,7 +1,13 @@ -#if 0 -struct speech; -struct speech *speech_new(void); -int speech_say(struct speech *this, char *text); -int speech_sayf(struct speech *this, char *format, ...); -int speech_destroy(struct speech *this); -#endif +struct speech_priv; + +struct speech_methods { + void (*destroy)(struct speech_priv *this_); + int (*say)(struct speech_priv *this_, const char *text); +}; + +/* prototypes */ +struct speech * speech_new(const char *type, const char *data); +int speech_say(struct speech *this_, const char *text); +int speech_sayf(struct speech *this_, const char *format, ...); +void speech_destroy(struct speech *this_); +/* end of prototypes */ diff --git a/speech/cmdline/speech_cmdline.c b/speech/cmdline/speech_cmdline.c index 32be387d..6fb43008 100644 --- a/speech/cmdline/speech_cmdline.c +++ b/speech/cmdline/speech_cmdline.c @@ -1,6 +1,48 @@ +#include <stdlib.h> +#include <glib.h> #include "plugin.h" +#include "speech.h" + +struct speech_priv { + char *cmdline; +}; + +static int +speechd_say(struct speech_priv *this, const char *text) +{ + char *cmdline; + + cmdline=g_strdup_printf(this->cmdline, text); + return system(cmdline); +} + +static void +speechd_destroy(struct speech_priv *this) { + g_free(this->cmdline); + g_free(this); +} + +static struct speech_methods speechd_meth = { + speechd_destroy, + speechd_say, +}; + +static struct speech_priv * +speechd_new(char *data, struct speech_methods *meth) { + struct speech_priv *this; + if (! data) + return NULL; + this=g_new(struct speech_priv,1); + if (this) { + this->cmdline=g_strdup(data); + *meth=speechd_meth; + } + return this; +} + void plugin_init(void) { + plugin_register_speech_type("cmdline", speechd_new); } diff --git a/speech/speech_dispatcher/speech_speech_dispatcher.c b/speech/speech_dispatcher/speech_speech_dispatcher.c index 4c4ebed6..87f5032f 100644 --- a/speech/speech_dispatcher/speech_speech_dispatcher.c +++ b/speech/speech_dispatcher/speech_speech_dispatcher.c @@ -1,6 +1,6 @@ /* speechd simple client program - * CVS revision: $Id: speech_speech_dispatcher.c,v 1.2 2007-07-08 16:42:16 martin-s Exp $ + * CVS revision: $Id: speech_speech_dispatcher.c,v 1.3 2007-07-08 20:41:35 martin-s Exp $ * Author: Tomas Cerha <cerha@brailcom.cz> */ #include <sys/types.h> @@ -17,28 +17,12 @@ #include "plugin.h" #include "speech.h" -struct speech { +struct speech_priv { SPDConnection *conn; }; -struct speech * -speech_new(void) { - struct speech *this; - SPDConnection *conn; - - conn = spd_open("navit","main",NULL,SPD_MODE_SINGLE); - if (! conn) - return NULL; - this=g_new(struct speech,1); - if (this) { - this->conn=conn; - spd_set_punctuation(conn, SPD_PUNCT_NONE); - } - return this; -} - static int -speech_say(struct speech *this, char *text) { +speechd_say(struct speech_priv *this, const char *text) { int err; err = spd_sayf(this->conn, SPD_MESSAGE, text); @@ -47,21 +31,37 @@ speech_say(struct speech *this, char *text) { return 0; } -static int -speech_sayf(struct speech *this, char *format, ...) { - char buffer[8192]; - va_list ap; - va_start(ap,format); - vsnprintf(buffer, 8192, format, ap); - return speech_say(this, buffer); -} - static void -speech_destroy(struct speech *this) { +speechd_destroy(struct speech_priv *this) { spd_close(this->conn); g_free(this); } + +static struct speech_methods speechd_meth = { + speechd_destroy, + speechd_say, +}; + +static struct speech_priv * +speechd_new(char *data, struct speech_methods *meth) { + struct speech_priv *this; + SPDConnection *conn; + + conn = spd_open("navit","main",NULL,SPD_MODE_SINGLE); + if (! conn) + return NULL; + this=g_new(struct speech_priv,1); + if (this) { + this->conn=conn; + *meth=speechd_meth; + spd_set_punctuation(conn, SPD_PUNCT_NONE); + } + return this; +} + + void plugin_init(void) { + plugin_register_speech_type("speech_dispatcher", speechd_new); } @@ -107,7 +107,7 @@ tracking_doupdate_lines(struct tracking *tr, struct coord *cc) struct tracking_line *tl; struct coord c; - dbg(0,"enter\n"); + dbg(1,"enter\n"); h=mapset_open(tr->ms); while ((m=mapset_next(h,1))) { mr=map_rect_new(m, sel); @@ -125,7 +125,7 @@ tracking_doupdate_lines(struct tracking *tr, struct coord *cc) map_rect_destroy(mr); } mapset_close(h); - dbg(0, "exit\n"); + dbg(1, "exit\n"); #if 0 struct transformation t; @@ -146,7 +146,7 @@ static void tracking_free_lines(struct tracking *tr) { struct tracking_line *tl=tr->lines,*next; - dbg(0,"enter(tr=%p)\n", tr); + dbg(1,"enter(tr=%p)\n", tr); while (tl) { next=tl->next; @@ -252,10 +252,10 @@ tracking_update(struct tracking *tr, struct coord *c, int angle) } t=t->next; } - dbg(0,"tr->curr_line=%p\n", tr->curr_line); + dbg(1,"tr->curr_line=%p\n", tr->curr_line); if (!tr->curr_line) return 0; - dbg(0,"found 0x%x,0x%x\n", tr->last_out.x, tr->last_out.y); + dbg(1,"found 0x%x,0x%x\n", tr->last_out.x, tr->last_out.y); *c=tr->last_out; return 1; } diff --git a/xmlconfig.c b/xmlconfig.c index d07dfab4..452c66a7 100644 --- a/xmlconfig.c +++ b/xmlconfig.c @@ -11,6 +11,7 @@ #include "plugin.h" #include "projection.h" #include "route.h" +#include "speech.h" #include "track.h" #include "vehicle.h" #include "xmlconfig.h" @@ -126,6 +127,22 @@ xmlconfig_plugin(struct xmlstate *state) } static int +xmlconfig_speech(struct xmlstate *state) +{ + const char *type; + const char *data; + type=find_attribute(state, "type", 1); + if (! type) + return 0; + data=find_attribute(state, "data", 0); + state->element_object = speech_new(type, data); + if (! state->element_object) + return 0; + navit_set_speech(state->parent->element_object, state->element_object); + return 1; +} + +static int xmlconfig_debug(struct xmlstate *state) { const char *name,*level; @@ -212,6 +229,28 @@ xmlconfig_route(struct xmlstate *state) static int xmlconfig_speed(struct xmlstate *state) { + const char *type; + const char *value; + int v; + enum item_type itype; + char *saveptr, *tok, *type_str, *str; + + type=find_attribute(state, "type", 1); + if (! type) + return 0; + value=find_attribute(state, "value", 1); + if (! value) + return 0; + v=convert_number(value); + type_str=g_strdup(type); + str=type_str; + while ((tok=strtok_r(str, ",", &saveptr))) { + itype=item_from_name(tok); + route_set_speed(state->parent->element_object, itype, v); + str=NULL; + } + g_free(type_str); + return 1; } @@ -437,6 +476,7 @@ struct element_func { { "map", "mapset", xmlconfig_map}, { "navigation", "navit", xmlconfig_navigation}, { "announce", "navigation", xmlconfig_announce}, + { "speech", "navit", xmlconfig_speech}, { "tracking", "navit", xmlconfig_tracking}, { "route", "navit", xmlconfig_route}, { "speed", "route", xmlconfig_speed}, |