* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_MATH_H
+#include <math.h>
+#endif
#include "viking.h"
#include <ctype.h>
+#ifdef HAVE_STRING_H
#include <string.h>
+#endif
#include <stdlib.h>
/* strtod */
static time_t line_timestamp = 0;
static gdouble line_altitude = VIK_DEFAULT_ALTITUDE;
static gboolean line_visible = TRUE;
+
+static gboolean line_extended = FALSE;
+static gdouble line_speed = NAN;
+static gdouble line_course = NAN;
+static gint line_sat = 0;
+static gint line_fix = 0;
/* other possible properties go here */
if (line_type == GPSPOINT_TYPE_WAYPOINT && line_name)
{
VikWaypoint *wp = vik_waypoint_new();
- gint i = strlen(line_name);
wp->visible = line_visible;
wp->altitude = line_altitude;
- while ( i-- )
- line_name[i] = toupper(line_name[i]); /* TODO: check for acceptable chars */
vik_coord_load_from_latlon ( &(wp->coord), coord_mode, &line_latlon );
else if (line_type == GPSPOINT_TYPE_TRACK && line_name)
{
VikTrack *pl = vik_track_new();
- gint i = strlen(line_name);
/* Thanks to Peter Jones for this Fix */
if (!line_name) line_name = g_strdup("UNK");
pl->visible = line_visible;
- while ( i-- )
- line_name[i] = toupper(line_name[i]);
-
if ( line_comment )
{
vik_track_set_comment ( pl, line_comment );
}
else if (line_type == GPSPOINT_TYPE_TRACKPOINT && current_track)
{
- VikTrackpoint *tp = g_malloc ( sizeof ( VikTrackpoint ) );
+ VikTrackpoint *tp = vik_trackpoint_new();
vik_coord_load_from_latlon ( &(tp->coord), coord_mode, &line_latlon );
tp->newsegment = line_newsegment;
tp->has_timestamp = line_has_timestamp;
tp->timestamp = line_timestamp;
tp->altitude = line_altitude;
+ if (line_extended) {
+ tp->speed = line_speed;
+ tp->course = line_course;
+ tp->nsats = line_sat;
+ tp->fix_mode = line_fix;
+ }
current_track->trackpoints = g_list_append ( current_track->trackpoints, tp );
}
line_altitude = VIK_DEFAULT_ALTITUDE;
line_visible = TRUE;
line_symbol = NULL;
+
+ line_extended = FALSE;
+ line_speed = NAN;
+ line_course = NAN;
+ line_sat = 0;
+ line_fix = 0;
}
}
}
else if (key_len == 8 && strncasecmp( key, "latitude", key_len ) == 0 && value != NULL)
{
- line_latlon.lat = g_strtod(value, NULL);
+ line_latlon.lat = g_ascii_strtod(value, NULL);
}
else if (key_len == 9 && strncasecmp( key, "longitude", key_len ) == 0 && value != NULL)
{
- line_latlon.lon = g_strtod(value, NULL);
+ line_latlon.lon = g_ascii_strtod(value, NULL);
}
else if (key_len == 8 && strncasecmp( key, "altitude", key_len ) == 0 && value != NULL)
{
- line_altitude = g_strtod(value, NULL);
+ line_altitude = g_ascii_strtod(value, NULL);
}
else if (key_len == 7 && strncasecmp( key, "visible", key_len ) == 0 && value[0] != 'y' && value[0] != 'Y' && value[0] != 't' && value[0] != 'T')
{
}
else if (key_len == 8 && strncasecmp( key, "unixtime", key_len ) == 0 && value != NULL)
{
- line_timestamp = g_strtod(value, NULL);
+ line_timestamp = g_ascii_strtod(value, NULL);
if ( line_timestamp != 0x80000000 )
line_has_timestamp = TRUE;
}
{
line_newsegment = TRUE;
}
+ else if (key_len == 8 && strncasecmp( key, "extended", key_len ) == 0 && value != NULL)
+ {
+ line_extended = TRUE;
+ }
+ else if (key_len == 5 && strncasecmp( key, "speed", key_len ) == 0 && value != NULL)
+ {
+ line_speed = g_ascii_strtod(value, NULL);
+ }
+ else if (key_len == 6 && strncasecmp( key, "course", key_len ) == 0 && value != NULL)
+ {
+ line_course = g_ascii_strtod(value, NULL);
+ }
+ else if (key_len == 3 && strncasecmp( key, "sat", key_len ) == 0 && value != NULL)
+ {
+ line_sat = atoi(value);
+ }
+ else if (key_len == 3 && strncasecmp( key, "fix", key_len ) == 0 && value != NULL)
+ {
+ line_fix = atoi(value);
+ }
}
static void a_gpspoint_write_waypoint ( const gchar *name, VikWaypoint *wp, FILE *f )
gchar *s_lat, *s_lon;
vik_coord_to_latlon ( &(tp->coord), &ll );
+ /* TODO: modify a_coords_dtostr() to accept (optional) buffer
+ * instead of doing malloc/free everytime */
s_lat = a_coords_dtostr(ll.lat);
s_lon = a_coords_dtostr(ll.lon);
fprintf ( f, "type=\"trackpoint\" latitude=\"%s\" longitude=\"%s\"", s_lat, s_lon );
fprintf ( f, " unixtime=\"%ld\"", tp->timestamp );
if ( tp->newsegment )
fprintf ( f, " newsegment=\"yes\"" );
+
+ if (!isnan(tp->speed) || !isnan(tp->course) || tp->nsats > 0) {
+ fprintf ( f, " extended=\"yes\"" );
+ if (!isnan(tp->speed)) {
+ gchar *s_speed = a_coords_dtostr(tp->speed);
+ fprintf ( f, " speed=\"%s\"", s_speed );
+ g_free(s_speed);
+ }
+ if (!isnan(tp->course)) {
+ gchar *s_course = a_coords_dtostr(tp->course);
+ fprintf ( f, " course=\"%s\"", s_course );
+ g_free(s_course);
+ }
+ if (tp->nsats > 0)
+ fprintf ( f, " sat=\"%d\"", tp->nsats );
+ if (tp->fix_mode > 0)
+ fprintf ( f, " fix=\"%d\"", tp->fix_mode );
+ }
fprintf ( f, "\n" );
}