summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--debug.c19
-rw-r--r--debug.h4
-rw-r--r--graphics.c6
-rw-r--r--navigation.c10
-rw-r--r--navit.c6
-rw-r--r--navit.h2
-rw-r--r--navit.xml14
-rw-r--r--plugin_def.h2
-rw-r--r--profile.c15
-rw-r--r--route.c96
-rw-r--r--route.h5
-rw-r--r--speech.c36
-rw-r--r--speech.h20
-rw-r--r--speech/cmdline/speech_cmdline.c42
-rw-r--r--speech/speech_dispatcher/speech_speech_dispatcher.c58
-rw-r--r--track.c10
-rw-r--r--xmlconfig.c40
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
diff --git a/debug.c b/debug.c
index 1bb15493..fdf5e15e 100644
--- a/debug.c
+++ b/debug.c
@@ -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);
+}
+
+
diff --git a/debug.h b/debug.h
index b181e21d..700c136e 100644
--- a/debug.h
+++ b/debug.h
@@ -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 */
diff --git a/graphics.c b/graphics.c
index eb639ba3..5206d8c6 100644
--- a/graphics.c
+++ b/graphics.c
@@ -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);
diff --git a/navit.c b/navit.c
index 6afea119..9ddb2034 100644
--- a/navit.c
+++ b/navit.c
@@ -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_)
diff --git a/navit.h b/navit.h
index 11a7b409..84ab3db5 100644
--- a/navit.h
+++ b/navit.h
@@ -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_);
diff --git a/navit.xml b/navit.xml
index 134827eb..a5be21f2 100644
--- a/navit.xml
+++ b/navit.xml
@@ -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))
diff --git a/profile.c b/profile.c
index c8ea5371..a3b715a9 100644
--- a/profile.c
+++ b/profile.c
@@ -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);
}
diff --git a/route.c b/route.c
index 4e8e8c21..03554a9f 100644
--- a/route.c
+++ b/route.c
@@ -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++;
}
diff --git a/route.h b/route.h
index cf21cc22..682a8d52 100644
--- a/route.h
+++ b/route.h
@@ -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);
diff --git a/speech.c b/speech.c
index 7c32862a..9e42a7e7 100644
--- a/speech.c
+++ b/speech.c
@@ -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);
+}
diff --git a/speech.h b/speech.h
index 09217c64..0542d828 100644
--- a/speech.h
+++ b/speech.h
@@ -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);
}
diff --git a/track.c b/track.c
index 9f3e9ebf..b1fae031 100644
--- a/track.c
+++ b/track.c
@@ -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},