summaryrefslogtreecommitdiff
path: root/navit/vehicle
diff options
context:
space:
mode:
authornorad <norad@ffa7fe5e-494d-0410-b361-a75ebd5db220>2012-04-22 12:43:53 +0000
committernorad <norad@ffa7fe5e-494d-0410-b361-a75ebd5db220>2012-04-22 12:43:53 +0000
commitd60dc73787e0ee91dc6c7cac0c33884ab2aab9e6 (patch)
treea46e6b82e41da871efd828e95119dd55f1c06fff /navit/vehicle
parent1c9c487bf0fa9fcddf30045dcacd82e4350f9831 (diff)
downloadnavit-svn-d60dc73787e0ee91dc6c7cac0c33884ab2aab9e6.tar.gz
Fix:vehicle/webos:use more of the NMEA data. Remove 1sec throttling
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@5030 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/vehicle')
-rw-r--r--navit/vehicle/webos/bluetooth.c59
-rw-r--r--navit/vehicle/webos/vehicle_webos.c77
-rw-r--r--navit/vehicle/webos/vehicle_webos.h11
3 files changed, 108 insertions, 39 deletions
diff --git a/navit/vehicle/webos/bluetooth.c b/navit/vehicle/webos/bluetooth.c
index ee627afb..b2066721 100644
--- a/navit/vehicle/webos/bluetooth.c
+++ b/navit/vehicle/webos/bluetooth.c
@@ -105,6 +105,8 @@ vehicle_webos_init_pdl_locationtracking_callback(struct vehicle_priv *priv, stru
{
PDL_Err err;
+ priv->gps_type = param ? GPS_TYPE_INT: GPS_TYPE_NONE;
+
dbg(1,"Calling PDL_EnableLocationTracking(%i)\n",param);
err = PDL_EnableLocationTracking(param);
@@ -195,14 +197,14 @@ vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer)
*p++ = '\0';
}
- if (buffer[0] == '$') {
- struct timeval tv;
- gettimeofday(&tv,NULL);
+// if (buffer[0] == '$') {
+// struct timeval tv;
+// gettimeofday(&tv,NULL);
- priv->delta = (unsigned int)difftime(tv.tv_sec, priv->fix_time);
- priv->fix_time = tv.tv_sec;
- dbg(2,"delta(%i)\n",priv->delta);
- }
+ priv->delta = 0; // (unsigned int)difftime(tv.tv_sec, priv->fix_time);
+// priv->fix_time = tv.tv_sec;
+// dbg(2,"delta(%i)\n",priv->delta);
+// }
if (!strncmp(buffer, "$GPGGA", 6)) {
/* 1 1111
@@ -227,26 +229,23 @@ vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer)
if (!g_strcasecmp(item[5],"W"))
priv->geo.lng=-priv->geo.lng;
- }
-#if 0
priv->valid=attr_position_valid_valid;
- dbg(2, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng);
+ dbg(2, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng);
} else
priv->valid=attr_position_valid_invalid;
if (*item[6])
sscanf(item[6], "%d", &priv->status);
if (*item[7])
- sscanf(item[7], "%d", &priv->sats_used);
+ sscanf(item[7], "%d", &priv->sats_used);
if (*item[8])
sscanf(item[8], "%lf", &priv->hdop);
-#endif
-/* if (*item[1]) {
+ if (*item[1]) {
struct tm tm;
strptime(item[1],"%H%M%S",&tm);
priv->fix_time = mktime(&tm);
}
-*/
+
if (*item[9])
sscanf(item[9], "%lf", &priv->altitude);
@@ -295,7 +294,6 @@ vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer)
priv->speed = g_ascii_strtod( item[7], NULL );
priv->speed *= 1.852;
-#if 0
struct tm tm;
char time[13];
@@ -304,6 +302,7 @@ vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer)
strptime(time,"%H%M%S%d%m%y",&tm);
priv->fix_time = mktime(&tm);
+#if 0
sscanf(item[9], "%02d%02d%02d",
&priv->fixday,
&priv->fixmonth,
@@ -313,7 +312,6 @@ vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer)
}
ret = 1;
}
-#if 0
if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) {
/*
0 GSV Satellites in view
@@ -331,6 +329,7 @@ vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer)
if (item[3]) {
sscanf(item[3], "%d", &priv->sats_visible);
}
+#if 0
j=4;
while (j+4 <= i && priv->current_count < 24) {
struct gps_sat *sat=&priv->next[priv->next_count++];
@@ -350,8 +349,8 @@ vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer)
priv->current_count=priv->next_count;
priv->next_count=0;
}
- }
#endif
+ }
#if 0
if (!strncmp(buffer, "$GPZDA", 6)) {
/*
@@ -370,7 +369,6 @@ vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer)
}
}
#endif
-#if 0
if (!strncmp(buffer, "$IISMD", 6)) {
/*
0 1 2 3 4
@@ -385,7 +383,6 @@ vehicle_webos_parse_nmea(struct vehicle_priv *priv, char *buffer)
dbg(1,"magnetic %d\n", priv->magnetic_direction);
}
}
-#endif
return ret;
}
@@ -410,6 +407,8 @@ vehicle_webos_spp_handle_read(PDL_ServiceParameters *params, void *user)
memmove(priv->buffer + priv->buffer_pos, buffer, size);
+
+
priv->buffer_pos += size;
priv->buffer[priv->buffer_pos] = '\0';
dbg(1, "size=%d pos=%d buffer='%s'\n", size,
@@ -434,8 +433,21 @@ vehicle_webos_spp_handle_read(PDL_ServiceParameters *params, void *user)
dbg(0,"Overflow. Most likely wrong baud rate or no nmea protocol\n");
priv->buffer_pos = 0;
}
- if (rc && priv->delta)
- callback_list_call_attr_0(priv->cbl, attr_position_coord_geo);
+ if (rc) {
+ SDL_Event event;
+ SDL_UserEvent userevent;
+
+ userevent.type = SDL_USEREVENT;
+ userevent.code = PDL_GPS_UPDATE;
+ userevent.data1 = NULL;
+ userevent.data2 = NULL;
+
+ event.type = SDL_USEREVENT;
+ event.user = userevent;
+
+ SDL_PushEvent(&event);
+
+ }
vehicle_webos_spp_init_read(priv, buffer_size - priv->buffer_pos - 1);
}
@@ -472,6 +484,8 @@ vehicle_webos_spp_handle_open(PDL_ServiceParameters *params, void *user)
dbg(1,"instanceId(%i)\n",priv->spp_instance_id);
+ priv->gps_type = GPS_TYPE_BT;
+
vehicle_webos_spp_init_read(priv, buffer_size-1);
}
@@ -535,6 +549,9 @@ vehicle_webos_spp_notify(PDL_ServiceParameters *params, void *user)
}
}
else if(strcmp(notification,"notifndisconnected") == 0) {
+ priv->gps_type = GPS_TYPE_NONE;
+ snprintf(parameters, sizeof(parameters), "{\"instanceId\":%i}",priv->spp_instance_id);
+ mlPDL_ServiceCall("palm://com.palm.service.bluetooth.spp/close", parameters);
priv->spp_instance_id = 0;
}
diff --git a/navit/vehicle/webos/vehicle_webos.c b/navit/vehicle/webos/vehicle_webos.c
index 9ee8ed9e..ebbf071a 100644
--- a/navit/vehicle/webos/vehicle_webos.c
+++ b/navit/vehicle/webos/vehicle_webos.c
@@ -178,6 +178,9 @@ vehicle_webos_open(struct vehicle_priv *priv)
// vehicle_webos_close(priv);
// return 0;
}
+
+ priv->gps_type = GPS_TYPE_INT;
+
if(!vehicle_webos_bt_open(priv))
return 0;
}
@@ -212,6 +215,26 @@ vehicle_webos_position_attr_get(struct vehicle_priv *priv,
dbg(2,"Direction: %f\n", priv->track);
attr->u.numd = &priv->track;
break;
+ case attr_position_magnetic_direction:
+ switch (priv->gps_type) {
+ case GPS_TYPE_BT:
+ attr->u.num = priv->magnetic_direction;
+ break;
+ default:
+ return 0;
+ break;
+ }
+ break;
+ case attr_position_hdop:
+ switch (priv->gps_type) {
+ case GPS_TYPE_BT:
+ attr->u.numd = &priv->hdop;
+ break;
+ default:
+ return 0;
+ break;
+ }
+ break;
case attr_position_coord_geo:
dbg(2,"Coord: %.12g %.12g\n", priv->geo.lat, priv->geo.lng);
attr->u.coord_geo = &priv->geo;
@@ -241,26 +264,44 @@ vehicle_webos_position_attr_get(struct vehicle_priv *priv,
break;
case attr_position_fix_type:
- 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
- else
- attr->u.num = 2; // strength >= 2
-
+ switch (priv->gps_type) {
+ case GPS_TYPE_INT:
+ 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
+ else
+ attr->u.num = 2; // strength >= 2
+ break;
+ case GPS_TYPE_BT:
+ attr->u.num = priv->status;
+ break;
+ default:
+ return 0;
+ break;
+ }
break;
case attr_position_sats_used:
- if (priv->delta <= 0)
- attr->u.num = 0;
- else if (priv->radius <= 6.0 )
- attr->u.num = 6; // strength = 5
- else if (priv->radius <= 10.0 )
- attr->u.num = 5; // strength = 4
- else if (priv->radius <= 15.0 )
- attr->u.num = 4; // strength = 3
- else
- return 0;
-
+ switch (priv->gps_type) {
+ case GPS_TYPE_INT:
+ if (priv->delta <= 0)
+ attr->u.num = 0;
+ else if (priv->radius <= 6.0 )
+ attr->u.num = 6; // strength = 5
+ else if (priv->radius <= 10.0 )
+ attr->u.num = 5; // strength = 4
+ else if (priv->radius <= 15.0 )
+ attr->u.num = 4; // strength = 3
+ else
+ return 0;
+ break;
+ case GPS_TYPE_BT:
+ attr->u.num = priv->sats_used;
+ break;
+ default:
+ return 0;
+ break;
+ }
break;
default:
return 0;
diff --git a/navit/vehicle/webos/vehicle_webos.h b/navit/vehicle/webos/vehicle_webos.h
index 5de0c8d3..4c797305 100644
--- a/navit/vehicle/webos/vehicle_webos.h
+++ b/navit/vehicle/webos/vehicle_webos.h
@@ -1,5 +1,9 @@
#include "coord.h"
+#define GPS_TYPE_NONE 0
+#define GPS_TYPE_INT 1
+#define GPS_TYPE_BT 2
+
struct vehicle_priv {
char *address;
char *source;
@@ -9,10 +13,17 @@ struct vehicle_priv {
char *nmea_data;
char fixiso8601[128];
double track, speed, altitude, radius;
+ double hdop;
+ int gps_type;
int pdk_version;
int spp_instance_id;
int buffer_pos;
int delta;
+ int sats_used;
+ int sats_visible;
+ int magnetic_direction;
+ int status;
+ int valid;
time_t fix_time;
struct attr ** attrs;
struct callback *event_cb;