summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkazer_ <kazer_@ffa7fe5e-494d-0410-b361-a75ebd5db220>2015-07-14 23:04:05 +0000
committerkazer_ <kazer_@ffa7fe5e-494d-0410-b361-a75ebd5db220>2015-07-14 23:04:05 +0000
commitd70ac096422f6c148a5f3444fbfa10eed744311d (patch)
treeb1898635bf291409aabd75bc9d19310a6ed6d7cc
parent690bb8146056ba1e6c6351831a515b98caa5088e (diff)
downloadnavit-svn-d70ac096422f6c148a5f3444fbfa10eed744311d.tar.gz
Fix:Core:Merge Robotaxi's PR for imperial units
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@6127 ffa7fe5e-494d-0410-b361-a75ebd5db220
-rw-r--r--navit/navigation.c205
-rw-r--r--navit/navigation.h5
-rw-r--r--navit/osd/core/osd_core.c2
3 files changed, 134 insertions, 78 deletions
diff --git a/navit/navigation.c b/navit/navigation.c
index 2ecd13bf..2f5ced43 100644
--- a/navit/navigation.c
+++ b/navit/navigation.c
@@ -193,6 +193,9 @@ struct navigation {
int flags;
};
+/** @brief Set of simplified distance values that are easy to be pronounced.
+* Used for the 'vocabulary_distances' configuration.
+*/
int distances[]={1,2,3,4,5,10,25,50,75,100,150,200,250,300,400,500,750,-1};
@@ -916,109 +919,161 @@ round_distance(int dist)
return dist*10000;
}
+/** @brief Returns the last element of the simplified numbers containing a distance value.
+* @return value with the highest distance.
+*/
static int
-round_for_vocabulary(int vocabulary, int dist, int factor)
+distance_set_last()
{
- if (!(vocabulary & 256)) {
- if (factor != 1)
- dist=(dist+factor/2)/factor;
- } else
- factor=1;
- if (!(vocabulary & 255)) {
- int i=0,d=0,m=0;
- while (distances[i] > 0) {
- if (!i || abs(distances[i]-dist) <= d) {
- d=abs(distances[i]-dist);
- m=i;
- }
- if (distances[i] > dist)
- break;
+ static int i=0;
+ if (i == 0) {
+ while (distances[i] > 0)
i++;
- }
- dbg(lvl_debug,"converted %d to %d with factor %d\n",dist,distances[m],factor);
- dist=distances[m];
}
- return dist*factor;
+ return distances[i-1];
}
+/** @brief Restricts the distance value to a simple set of pronounceable numbers.
+* @param dist The distance to be processed
+* @return distance Simplified distance value
+*/
static int
-vocabulary_last(int vocabulary)
+round_distance_reduced( int dist )
{
- int i=0;
- if (vocabulary == 65535)
- return 1000;
- while (distances[i] > 0)
+ int factor = 1;
+ if (dist > distance_set_last())
+ {
+ dist=(dist+500)/1000;
+ factor = 1000;
+ }
+
+ int i=0,d=0,m=0;
+ while (distances[i] > 0) {
+ if (!i || abs(distances[i]-dist) <= d) {
+ d=abs(distances[i]-dist);
+ m=i;
+ }
+ if (distances[i] > dist)
+ break;
i++;
- return distances[i-1];
+ }
+ dbg(lvl_debug,"converted %d to %d with factor %d\n",dist,distances[m],factor);
+ return distances[m] * factor;
+
}
+
+/** @brief Generates the distance string.
+* Considers the configuration of 'imperial' units and 'vocabulary_distances'.
+* 'imperial' if set distinguishes the distance statement between miles and feet. Maximum distance in feet is 500.
+* 'vocabulary_distances' if set constrains the distance values to a set of simple pronounceable numbers.
+*
+* @param nav The navigation object.
+* @param dist Distance in meters.
+* @param type The type of announcement precision.
+* @param is_length 1 for length statement, 0 for distance statement.
+* @return String with length/distance statement.
+*/
static char *
-get_distance(struct navigation *nav, int dist, enum attr_type type, int is_length)
+get_distance_str(struct navigation *nav, int dist_meters, enum attr_type type, int is_length)
{
- int imperial=0,vocabulary=65535;
- struct attr attr;
+ int imperial=0,vocabulary=1; /* default configuration */
- if (type == attr_navigation_long_exact) {
- if (is_length)
- return g_strdup_printf(_("%d m"), dist);
- else
- return g_strdup_printf(_("in %d m"), dist);
- }
+ /* Get configuration */
+ struct attr attr;
if (navit_get_attr(nav->navit, attr_imperial, &attr, NULL))
imperial=attr.u.num;
if (nav->speech && speech_get_attr(nav->speech, attr_vocabulary_distances, &attr, NULL))
vocabulary=attr.u.num;
+ /****************************/
+
if (imperial) {
- if (dist*FEET_PER_METER < vocabulary_last(vocabulary)) {
- dist=round_for_vocabulary(vocabulary, dist*FEET_PER_METER, 1);
+
+ int dist_feet = dist_meters * FEET_PER_METER;
+
+ if (vocabulary > 0)
+ {
+ /* normal statement */
+ if (type != attr_navigation_long_exact)
+ dist_feet = round_distance(dist_feet);
+ }
+ else
+ {
+ /* statement with reduced vocabularies */
+ dist_feet = round_distance_reduced(dist_feet);
+ }
+
+ // check for statement in feet
+ if (dist_feet <= 500)
+ {
+ if (is_length)
+ return g_strdup_printf(_("%d feet"), dist_feet);
+ else
+ return g_strdup_printf(_("in %d feet"), dist_feet);
+ }
+
+ int dist_miles = (double) dist_meters / (double)METERS_PER_MILE + 0.5;
+
+ if (vocabulary == 0)
+ {
+ /* statement with reduced vocabularies */
+ dist_miles = round_distance_reduced(dist_miles);
+ }
+
+ if ((dist_meters < METERS_PER_MILE) && (vocabulary > 0))
+ {
+ /* values smaller than one need extra treatment for one decimal place. For reduced vocabulary it shall remain 'one'. */
+ int rem = (((double)dist_meters / (double)METERS_PER_MILE) + 0.05) * 10.0;
+ dist_miles= 0;
if (is_length)
- return g_strdup_printf(_("%d feet"), dist);
+ return g_strdup_printf(_("%d.%d miles"), dist_miles, rem);
else
- return g_strdup_printf(_("in %d feet"), dist);
+ return g_strdup_printf(_("in %d.%d miles"), dist_miles, rem);
}
+
+ if (is_length)
+ return g_strdup_printf(navit_nls_ngettext("one mile","%d miles", dist_miles), dist_miles);
+ else
+ return g_strdup_printf(navit_nls_ngettext("in one mile","in %d miles", dist_miles), dist_miles);
+
} else {
- if (dist < vocabulary_last(vocabulary)) {
- dist=round_for_vocabulary(vocabulary, dist, 1);
+
+ if (vocabulary > 0)
+ {
+ /* normal statement */
+ if (type != attr_navigation_long_exact)
+ dist_meters = round_distance(dist_meters);
+ }
+ else
+ {
+ /* statement with reduced vocabularies */
+ dist_meters = round_distance_reduced(dist_meters);
+ }
+
+ if (dist_meters < 1000)
+ {
if (is_length)
- return g_strdup_printf(_("%d meters"), dist);
+ return g_strdup_printf(_("%d meters"), dist_meters);
else
- return g_strdup_printf(_("in %d meters"), dist);
+ return g_strdup_printf(_("in %d meters"), dist_meters);
}
- }
- if (imperial)
- dist=round_for_vocabulary(vocabulary, dist*FEET_PER_METER*1000/FEET_PER_MILE, 1000);
- else
- dist=round_for_vocabulary(vocabulary, dist, 1000);
- if (dist < 5000) {
- int rem=(dist/100)%10;
- if (rem) {
- if (imperial) {
- if (is_length)
- return g_strdup_printf(_("%d.%d miles"), dist/1000, rem);
- else
- return g_strdup_printf(_("in %d.%d miles"), dist/1000, rem);
- } else {
+ if (dist_meters < 5000) {
+ /* Distances below 5 km shall be announced with one decimal place. */
+ int rem=(dist_meters/100)%10;
+ if (rem) {
if (is_length)
- return g_strdup_printf(_("%d.%d kilometers"), dist/1000, rem);
+ return g_strdup_printf(_("%d.%d kilometers"), dist_meters/1000, rem);
else
- return g_strdup_printf(_("in %d.%d kilometers"), dist/1000, rem);
+ return g_strdup_printf(_("in %d.%d kilometers"), dist_meters/1000, rem);
}
}
- }
- if (imperial) {
- if (is_length)
- return g_strdup_printf(navit_nls_ngettext("one mile","%d miles", dist/1000), dist/1000);
- else
- return g_strdup_printf(navit_nls_ngettext("in one mile","in %d miles", dist/1000), dist/1000);
- } else {
- if (is_length)
- return g_strdup_printf(navit_nls_ngettext("one kilometer","%d kilometers", dist/1000), dist/1000);
+ if (is_length)
+ return g_strdup_printf(navit_nls_ngettext("one kilometer","%d kilometers", dist_meters/1000), dist_meters/1000);
else
- return g_strdup_printf(navit_nls_ngettext("in one kilometer","in %d kilometers", dist/1000), dist/1000);
+ return g_strdup_printf(navit_nls_ngettext("in one kilometer","in %d kilometers", dist_meters/1000), dist_meters/1000);
}
}
-
/**
* @brief Initializes a navigation_way
*
@@ -1727,7 +1782,7 @@ navigation_itm_new(struct navigation *this_, struct item *routeitem)
mselexit.order = 18;
map_rect_destroy(mr);
- mr = map_rect_new (tmap, &mselexit);
+ mr = map_rect_new(tmap, &mselexit);
while ((rampitem=map_rect_get_item(mr)))
{
@@ -2750,7 +2805,7 @@ command_new(struct navigation *this_, struct navigation_itm *itm, struct navigat
{
struct navigation_command *ret=g_new0(struct navigation_command, 1);
struct navigation_way *w; /* the way in which to turn. */
- int more_ways_for_strength = 0; /* Counts the number of ways of the current node that turn
+ int more_ways_for_strength = 0; /* Counts the number of ways of the current node that turn
to the same direction as the route way. Strengthening criterion. */
int turn_no_of_route_way = 0; /* The number of the route way of all ways that turn to the same direction.
Count direction from abs(0 degree) up to abs(180 degree). Strengthening criterion. */
@@ -3257,12 +3312,12 @@ show_maneuver(struct navigation *nav, struct navigation_itm *itm, struct navigat
switch (level)
{
case 3:
- d=get_distance(nav, distance, type, 1);
+ d=get_distance_str(nav, distance, type, 1);
return g_strdup_printf(_("Follow the road for the next %s"), d);
case 2:
return g_strdup(_("Enter the roundabout soon"));
case 1:
- d = get_distance(nav, distance, type, 0);
+ d = get_distance_str(nav, distance, attr_navigation_short, 0);
/* TRANSLATORS: %s is the distance to the roundabout */
ret = g_strdup_printf(_("Enter the roundabout %s"), d);
g_free(d);
@@ -3308,7 +3363,7 @@ show_maneuver(struct navigation *nav, struct navigation_itm *itm, struct navigat
d=g_strdup(_("soon"));
break;
case 1 :
- d=get_distance(nav, distance, attr_navigation_short, 0);
+ d=get_distance_str(nav, distance, attr_navigation_short, 0);
break;
case 0 :
d=g_strdup(_("now"));
@@ -3518,7 +3573,7 @@ show_maneuver(struct navigation *nav, struct navigation_itm *itm, struct navigat
switch (level)
{
case 3:
- d=get_distance(nav, distance, type, 1);
+ d=get_distance_str(nav, distance, type, 1);
ret=g_strdup_printf(_("Follow the road for the next %s"), d);
break;
case 2:
diff --git a/navit/navigation.h b/navit/navigation.h
index 528678e2..45c74025 100644
--- a/navit/navigation.h
+++ b/navit/navigation.h
@@ -20,8 +20,9 @@
#ifndef NAVIT_NAVIGATION_H
#define NAVIT_NAVIGATION_H
-#define FEET_PER_METER 3.2808399
-#define FEET_PER_MILE 5280
+#define FEET_PER_METER 3.2808399
+#define FEET_PER_MILE 5280
+#define METERS_PER_MILE 1609
#ifdef __cplusplus
extern "C" {
diff --git a/navit/osd/core/osd_core.c b/navit/osd/core/osd_core.c
index 557690d6..19e2324e 100644
--- a/navit/osd/core/osd_core.c
+++ b/navit/osd/core/osd_core.c
@@ -150,7 +150,7 @@ format_distance(double distance, char *sep, int imperial)
{
if (imperial){
distance *= FEET_PER_METER;
- if(distance <= 1500){
+ if(distance <= 500){
return g_strdup_printf("%.0f%sft", round(distance / 10) * 10, sep);
} else {
return g_strdup_printf("%.1f%smi", distance / FEET_PER_MILE, sep);