Ticket #12: navit_imperial_mph_new.patch

File navit_imperial_mph_new.patch, 10.5 KB (added by xcoldfyrex, 12 years ago)
Line 
1Index: navit/navit/osd/core/osd_core.c
2===================================================================
3--- navit/navit/osd/core/osd_core.c     (revision 2397)
4+++ navit/navit/osd/core/osd_core.c     (working copy)
5@@ -97,20 +97,29 @@
6 }
7 
8 static char *
9-format_distance(double distance, char *sep)
10+format_distance(double distance, char *sep, int imperial)
11 {
12-       if (distance >= 100000)
13-               return g_strdup_printf("%.0f%skm", distance / 1000, sep);
14-       else if (distance >= 10000)
15-               return g_strdup_printf("%.1f%skm", distance / 1000, sep);
16-       else if (distance >= 300)
17-               return g_strdup_printf("%.0f%sm", round(distance / 25) * 25, sep);
18-       else if (distance >= 50)
19-               return g_strdup_printf("%.0f%sm", round(distance / 10) * 10, sep);
20-       else if (distance >= 10)
21-               return g_strdup_printf("%.0f%sm", distance, sep);
22-       else
23-               return g_strdup_printf("%.1f%sm", distance, sep);
24+       if (!strcmp(sep,"US")){
25+               distance *= FEET_PER_METER;
26+               if(distance <= 1500){
27+                       return g_strdup_printf("%.0f%sft", round(distance / 10) * 10 );
28+               } else {
29+                       return g_strdup_printf("%.1f%smi", distance / FEET_PER_MILE );
30+               }
31+       } else {
32+               if (distance >= 100000)
33+                       return g_strdup_printf("%.0f%skm", distance / 1000, sep);
34+               else if (distance >= 10000)
35+                       return g_strdup_printf("%.1f%skm", distance / 1000, sep);
36+               else if (distance >= 300)
37+                       return g_strdup_printf("%.0f%sm", round(distance / 25) * 25, sep);
38+               else if (distance >= 50)
39+                       return g_strdup_printf("%.0f%sm", round(distance / 10) * 10, sep);
40+               else if (distance >= 10)
41+                       return g_strdup_printf("%.0f%sm", distance, sep);
42+               else
43+                       return g_strdup_printf("%.1f%sm", distance, sep);
44+       }
45 }
46 
47 static char *
48@@ -123,8 +132,12 @@
49 }
50 
51 static char *
52-format_speed(double speed, char *sep)
53+format_speed(double speed, char *sep, int imperial)
54 {
55+       if (imperial){
56+               speed *= 1000 * FEET_PER_METER;
57+               return g_strdup_printf("%.0f%smph", speed / FEET_PER_MILE, sep);
58+       }
59        return g_strdup_printf("%.0f%skm/h", speed, sep);
60 }
61 
62@@ -145,7 +158,7 @@
63                 struct vehicle *v)
64 {
65        struct point p,bbox[4];
66-       struct attr attr_dir, destination_attr, position_attr;
67+       struct attr attr_dir, destination_attr, position_attr, imperial_attr;
68        double dir, vdir = 0;
69        char *buffer;
70        struct coord c1, c2;
71@@ -171,7 +184,7 @@
72                        dir = atan2(c2.x - c1.x, c2.y - c1.y) * 180.0 / M_PI;
73                        dir -= vdir;
74                        handle(this->osd_item.gr, this->green, &p, this->osd_item.w/3, dir);
75-                       buffer=format_distance(transform_distance(pro, &c1, &c2),"");
76+                       buffer=format_distance(transform_distance(pro, &c1, &c2),"",navit_get_attr(nav, attr_imperial, &imperial_attr, NULL));
77                        graphics_get_text_bbox(this->osd_item.gr, this->osd_item.font, buffer, 0x10000, 0, bbox, 0);
78                        p.x=(this->osd_item.w-bbox[2].x)/2;
79                        p.y = this->osd_item.h-this->osd_item.h/10;
80@@ -656,7 +669,10 @@
81 
82        switch (attr->type) {
83        case attr_position_speed:
84-               return format_speed(*attr->u.numd,"");
85+               if(!strcmp(format,"miles")){
86+                       return format_speed(*attr->u.numd,"",1);
87+               }
88+               return format_speed(*attr->u.numd,"",0);
89        case attr_position_height:
90        case attr_position_direction:
91                return format_float_0(*attr->u.numd);
92@@ -692,9 +708,12 @@
93                if (!format)
94                        break;
95                if (!strcmp(format,"named"))
96-                       return format_distance(attr->u.num,"");
97+                       return format_distance(attr->u.num,"",0);
98+               if(!strcmp(format,"miles")){
99+                       return format_distance(attr->u.num,"",1);
100+               }
101                if (!strcmp(format,"value") || !strcmp(format,"unit")) {
102-                       char *ret,*tmp=format_distance(attr->u.num," ");
103+                       char *ret,*tmp=format_distance(attr->u.num," ",0);
104                        char *pos=strchr(tmp,' ');
105                        if (! pos)
106                                return tmp;
107@@ -823,10 +842,12 @@
108                                        item=tracking_get_current_item(tracking);
109                                        if (item && !strcmp(key,"route_speed")) {
110                                                double routespeed = -1;
111+                                               struct attr imperial_attr;
112+                                               int imperial = navit_get_attr(navit, attr_imperial, &imperial_attr, NULL);
113                                                int *flags=tracking_get_current_flags(tracking);
114                                                if (flags && (*flags & AF_SPEED_LIMIT) && tracking_get_attr(tracking, attr_maxspeed, &maxspeed_attr, NULL)) {
115                                                        routespeed = maxspeed_attr.u.num;
116-                                                       value = format_speed(routespeed, "");
117+                                                       value = format_speed(routespeed,"",imperial);
118                                                }
119 
120                                                if (routespeed == -1) {
121@@ -836,7 +857,7 @@
122                                                                rprof=vehicleprofile_get_roadprofile(prof, item->type);
123                                                        if (rprof) {
124                                                                routespeed=rprof->speed;
125-                                                               value=format_speed(routespeed,"");
126+                                                               value=format_speed(routespeed,"",imperial);
127                                                        }
128                                                }
129                                        }
130Index: navit/navit/attr_def.h
131===================================================================
132--- navit/navit/attr_def.h      (revision 2397)
133+++ navit/navit/attr_def.h      (working copy)
134@@ -106,6 +106,7 @@
135 ATTR(message_maxage)
136 ATTR(message_maxnum)
137 ATTR(pitch)
138+ATTR(imperial)
139 ATTR(roll)
140 ATTR(yaw)
141 ATTR(route_status)
142Index: navit/navit/navigation.c
143===================================================================
144--- navit/navit/navigation.c    (revision 2397)
145+++ navit/navit/navigation.c    (working copy)
146@@ -1412,7 +1444,7 @@
147                case 2:
148                        return g_strdup(_("Enter the roundabout soon"));
149                case 1:
150-                       d = get_distance(distance, type, 1);
151+                       d = get_distance(nav, distance, type, 1);
152                        /* TRANSLATORS: %s is the distance to the roundabout */
153                        ret = g_strdup_printf(_("In %s, enter the roundabout"), d);
154                        g_free(d);
155@@ -1441,7 +1473,7 @@
156 
157        switch(level) {
158        case 3:
159-               d=get_distance(distance, type, 1);
160+               d=get_distance(nav, distance, type, 1);
161                ret=g_strdup_printf(_("Follow the road for the next %s"), d);
162                g_free(d);
163                return ret;
164@@ -1449,7 +1481,7 @@
165                d=g_strdup(_("soon"));
166                break;
167        case 1:
168-               d=get_distance(distance, type, 0);
169+               d=get_distance(nav, distance, type, 0);
170                break;
171        case 0:
172                skip_roads = count_possible_turns(nav->first,cmd->itm,cmd->delta);
173Index: navit/navit/navigation.h
174===================================================================
175--- navit/navit/navigation.h    (revision 2397)
176+++ navit/navit/navigation.h    (working copy)
177@@ -20,6 +20,9 @@
178 #ifndef NAVIT_NAVIGATION_H
179 #define NAVIT_NAVIGATION_H
180 
181+#define FEET_PER_METER 3.2808399;
182+#define FEET_PER_MILE  5280
183+
184 #ifdef __cplusplus
185 extern "C" {
186 #endif
187*** navit/navit/navit.c Fri Mar 12 23:22:39 2010
188--- navit/navit/navit.c Fri Mar 12 23:30:09 2010
189***************
190*** 138,143 ****
191--- 138,144 ----
192        int graphics_flags;
193        int zoom_min, zoom_max;
194        struct bookmarks *bookmarks;
195+       int imperial;
196  };
197 
198  struct gui *main_loop_gui;
199***************
200*** 1609,1614 ****
201--- 1610,1619 ----
202                attr_updated=(this_->follow_cursor != !!attr->u.num);
203                this_->follow_cursor=!!attr->u.num;
204                break;
205+         case attr_imperial:
206+                 attr_updated=(this_->imperial != attr->u.num);
207+                 this_->imperial=attr->u.num;
208+                 break;
209        default:
210                return 0;
211        }
212***************
213*** 1661,1666 ****
214--- 1666,1674 ----
215 
216                attr->u.str[len] = '\0';
217                break;
218+         case attr_imperial:
219+                 attr->u.num=this_->imperial;
220+                 break;
221        case attr_bookmark_map:
222                attr->u.map=bookmarks_get_map(this_->bookmarks);
223                break;
224
225*** navit/navit/navigation.c    Fri Mar 12 23:33:21 2010
226--- navit/navit/navigation.c    Fri Mar 12 23:53:19 2010
227***************
228*** 314,346 ****
229  }
230 
231  static char *
232! get_distance(int dist, enum attr_type type, int is_length)
233  {
234!       if (type == attr_navigation_long) {
235!               if (is_length)
236!                       return g_strdup_printf(_("%d m"), dist);
237!               else
238!                       return g_strdup_printf(_("in %d m"), dist);
239!       }
240!       if (dist < 1000) {
241!               if (is_length)
242!                       return g_strdup_printf(_("%d meters"), dist);
243!               else
244!                       return g_strdup_printf(_("in %d meters"), dist);
245!       }
246!       if (dist < 5000) {
247!               int rem=(dist/100)%10;
248!               if (rem) {
249                        if (is_length)
250!                               return g_strdup_printf(_("%d.%d kilometers"), dist/1000, rem);
251                        else
252!                               return g_strdup_printf(_("in %d.%d kilometers"), dist/1000, rem);
253                }
254        }
255!       if (is_length)
256!               return g_strdup_printf(ngettext("one kilometer","%d kilometers", dist/1000), dist/1000);
257!       else
258!               return g_strdup_printf(ngettext("in one kilometer","in %d kilometers", dist/1000), dist/1000);
259  }
260 
261 
262--- 314,379 ----
263  }
264 
265  static char *
266! get_distance(struct navigation *nav, int dist, enum attr_type type, int is_length)
267  {
268!       int dist_ft, dist_mi;
269!         struct attr attr;
270!   
271!         navit_get_attr(nav->navit, attr_imperial, &attr, NULL);
272!          if (attr.u.num == 1)  {
273
274!                  dist_ft = dist * FEET_PER_METER;
275!                  dist_mi = dist_ft / FEET_PER_MILE;
276!                  if (dist_ft < 1000) {
277!                          if (is_length)
278!                                  return g_strdup_printf(_("%d feet"), dist_ft);
279!                          else
280!                                  return g_strdup_printf(_("in %d feet"), dist_ft);
281!                  }
282!                  if (dist_ft < 5000) {
283!                          int rem=(dist_ft/528)%10;
284!                          if (rem) {
285!                                  if (is_length)
286!                                          return g_strdup_printf(_("%d.%d miles"), dist_mi, rem);
287!                                  else
288!                                          return g_strdup_printf(_("in %d.%d miles"), dist_mi, rem);
289!                          }
290!                  }
291!                  if (is_length) 
292!                          return g_strdup_printf(ngettext("one mile","%d miles", dist_mi), dist_mi);
293!               
294!                else
295!                       return g_strdup_printf(ngettext("in one mile","in %d miles", dist_mi), dist_mi);
296!               
297!               
298!                } else {
299!               
300!                       if (type == attr_navigation_long) {
301                        if (is_length)
302!                                 return g_strdup_printf(_("%d m"), dist);
303                        else
304!                                 return g_strdup_printf(_("in %d m"), dist);
305                }
306        }
307!       if (dist < 1000) {
308!               if (is_length)
309!                       return g_strdup_printf(_("%d meters"), dist);
310!                 else
311!                         return g_strdup_printf(_("in %d meters"), dist);
312!               }
313!               if (dist < 5000) {
314!                       int rem=(dist/100)%10;
315!                       if (rem) {
316!                               if (is_length)
317!                                       return g_strdup_printf(_("%d.%d kilometer"), dist/1000, rem);
318!                                 else
319!                                         return g_strdup_printf(_("in %d.%d kilometers"), dist/1000, rem);
320!                               }
321!                       }
322!                       if (is_length) 
323!                               return g_strdup_printf(ngettext("one kilometer","%d kilometers", dist/1000), dist/1000);
324!                       else
325!                               return g_strdup_printf(ngettext("in one kilometer","in %d kilometers", dist/1000), dist/1000);
326  }
327 
328