summaryrefslogtreecommitdiff
path: root/navit/vehicle/webos
diff options
context:
space:
mode:
authornorad <norad@ffa7fe5e-494d-0410-b361-a75ebd5db220>2011-09-04 09:39:25 +0000
committernorad <norad@ffa7fe5e-494d-0410-b361-a75ebd5db220>2011-09-04 09:39:25 +0000
commiteda199b7945db7f61b8295c0beacd5c29bcc0060 (patch)
tree267616656f39d38ff968fdf24ba673d6216d0ca8 /navit/vehicle/webos
parent72a367abd010672abdb2ce006e0029e902a1279d (diff)
downloadnavit-eda199b7945db7f61b8295c0beacd5c29bcc0060.tar.gz
Patch:vehicle/webos:implement GPS timeout differently
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@4753 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/vehicle/webos')
-rw-r--r--navit/vehicle/webos/vehicle_webos.c57
1 files changed, 30 insertions, 27 deletions
diff --git a/navit/vehicle/webos/vehicle_webos.c b/navit/vehicle/webos/vehicle_webos.c
index 3aac8b657..ac4b1bc6e 100644
--- a/navit/vehicle/webos/vehicle_webos.c
+++ b/navit/vehicle/webos/vehicle_webos.c
@@ -48,7 +48,7 @@ struct vehicle_priv {
int pdk_version;
struct event_timeout *ev_timeout;
struct callback *timeout_cb;
- char has_fix;
+ unsigned int delta;
};
static void
@@ -93,16 +93,12 @@ vehicle_webos_gps_update(struct vehicle_priv *priv, PDL_Location *location)
struct timeval tv;
gettimeofday(&tv,NULL);
- event_remove_timeout(priv->ev_timeout);
- priv->ev_timeout = NULL;
-
- int new_timeout = (priv->fix_time == 0 ? 1 : (int)difftime(tv.tv_sec, priv->fix_time)) * 2000;
-
+ priv->delta = (unsigned int)difftime(tv.tv_sec, priv->fix_time);
+ dbg(1,"delta(%i)\n",priv->delta);
priv->fix_time = tv.tv_sec;
- priv->has_fix = 1;
priv->geo.lat = location->latitude;
/* workaround for webOS GPS bug following */
- priv->geo.lng = (priv->pdk_version == 200 && location->longitude >= -1 && location->longitude <= 1) ?
+ priv->geo.lng = (priv->pdk_version == 200 && location->longitude >= -1 && location->longitude <= 1) ?
-location->longitude : location->longitude;
dbg(2,"Location: %f %f %f %.12g %.12g +-%fm\n",
@@ -126,20 +122,25 @@ vehicle_webos_gps_update(struct vehicle_priv *priv, PDL_Location *location)
g_free(location);
callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
-
- dbg(1, "add timeout(%i)\n", new_timeout);
- priv->ev_timeout = event_add_timeout(new_timeout, 0, priv->timeout_cb);
}
static void
vehicle_webos_timeout_callback(struct vehicle_priv *priv)
{
- dbg(1, "GPS timeout triggered cb(%p)\n", priv->timeout_cb);
+ struct timeval tv;
+ gettimeofday(&tv,NULL);
- priv->fix_time = 0;
- priv->has_fix = 0;
+ if (priv->fix_time) {
+ int delta = (int)difftime(tv.tv_sec, priv->fix_time);
- callback_list_call_attr_0(priv->cbl, attr_position_fix_type);
+ if (delta >= priv->delta*2) {
+ dbg(1, "GPS timeout triggered cb(%p)\n", priv->timeout_cb);
+
+ priv->delta = 0;
+
+ callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+ }
+ }
}
static void
@@ -160,8 +161,8 @@ static int
vehicle_webos_open(struct vehicle_priv *priv)
{
PDL_Err err;
-
- priv->pdk_version = PDL_GetPDKVersion();
+
+ priv->pdk_version = PDL_GetPDKVersion();
dbg(1,"pdk_version(%d)\n", priv->pdk_version);
if (priv->pdk_version <= 100) {
@@ -186,6 +187,8 @@ vehicle_webos_open(struct vehicle_priv *priv)
}
}
+ priv->ev_timeout = event_add_timeout(1000, 1, priv->timeout_cb);
+
return 1;
}
@@ -204,23 +207,23 @@ vehicle_webos_position_attr_get(struct vehicle_priv *priv,
{
switch (type) {
case attr_position_height:
- dbg(1,"Altitude: %f\n", priv->altitude);
+ dbg(2,"Altitude: %f\n", priv->altitude);
attr->u.numd = &priv->altitude;
break;
case attr_position_speed:
- dbg(1,"Speed: %f\n", priv->speed);
+ dbg(2,"Speed: %f\n", priv->speed);
attr->u.numd = &priv->speed;
break;
case attr_position_direction:
- dbg(1,"Direction: %f\n", priv->track);
+ dbg(2,"Direction: %f\n", priv->track);
attr->u.numd = &priv->track;
break;
case attr_position_coord_geo:
- dbg(1,"Coord: %.12g %.12g\n", priv->geo.lat, priv->geo.lng);
+ dbg(2,"Coord: %.12g %.12g\n", priv->geo.lat, priv->geo.lng);
attr->u.coord_geo = &priv->geo;
break;
case attr_position_radius:
- dbg(1,"Radius: %f\n", priv->radius);
+ dbg(2,"Radius: %f\n", priv->radius);
attr->u.numd = &priv->radius;
break;
case attr_position_time_iso8601:
@@ -235,16 +238,16 @@ vehicle_webos_position_attr_get(struct vehicle_priv *priv,
priv->fix_time = 0;
return 0;
}
- dbg(1,"Fix Time: %d %s\n", priv->fix_time, priv->fixiso8601);
+ dbg(2,"Fix Time: %d %s\n", priv->fix_time, priv->fixiso8601);
}
else {
- dbg(1,"Fix Time: %d\n", priv->fix_time);
+ dbg(2,"Fix Time: %d\n", priv->fix_time);
return 0;
}
break;
case attr_position_fix_type:
- if (!priv->has_fix || priv->radius == 0.0)
+ if (priv->delta == 0 || priv->radius == 0.0)
attr->u.num = 0; // strength = 1
else if (priv->radius > 20.0)
attr->u.num = 1; // strength >= 2
@@ -253,7 +256,7 @@ vehicle_webos_position_attr_get(struct vehicle_priv *priv,
break;
case attr_position_sats_used:
- if (!priv->has_fix)
+ if (priv->delta == 0)
attr->u.num = 0;
else if (priv->radius <= 6.0 )
attr->u.num = 6; // strength = 5
@@ -333,7 +336,7 @@ vehicle_webos_new(struct vehicle_methods
}
vehicle_webos_open(priv);
-
+
return priv;
}