X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/acaf7113fffde4a6a6f6c0d57a4eea27e1024a31..de2fc9aa9e8db8e0258c8328161c6b5eda176a0a:/src/gpspoint.c diff --git a/src/gpspoint.c b/src/gpspoint.c index 00837a7a..933ff5b9 100644 --- a/src/gpspoint.c +++ b/src/gpspoint.c @@ -19,6 +19,7 @@ * */ +#include #include "viking.h" #include @@ -70,6 +71,12 @@ static gboolean line_has_timestamp = FALSE; 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 */ @@ -132,8 +139,6 @@ static gchar *deslashndup ( const gchar *str, guint16 len ) void a_gpspoint_read_file(VikTrwLayer *trw, FILE *f ) { VikCoordMode coord_mode = vik_trw_layer_get_coord_mode ( trw ); gchar *tag_start, *tag_end; - GHashTable *tracks = vik_trw_layer_get_tracks ( trw ); - GHashTable *waypoints = vik_trw_layer_get_waypoints ( trw ); g_assert ( f != NULL && trw != NULL ); line_type = 0; line_timestamp = 0; @@ -189,15 +194,14 @@ void a_gpspoint_read_file(VikTrwLayer *trw, FILE *f ) { 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 ); - g_hash_table_insert ( waypoints, line_name, wp ); + vik_trw_layer_filein_add_waypoint ( trw, line_name, wp ); + g_free ( line_name ); + line_name = NULL; if ( line_comment ) { @@ -216,22 +220,16 @@ void a_gpspoint_read_file(VikTrwLayer *trw, FILE *f ) { vik_waypoint_set_symbol ( wp, line_symbol ); line_symbol = NULL; } - - line_name = NULL; /* will be freed automatically */ } 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 ); @@ -239,19 +237,30 @@ void a_gpspoint_read_file(VikTrwLayer *trw, FILE *f ) { } pl->trackpoints = NULL; - g_hash_table_insert ( tracks, line_name, pl ); - line_name = NULL; /* will be freed automatically */ + vik_trw_layer_filein_add_track ( trw, line_name, pl ); + g_free ( line_name ); + line_name = NULL; current_track = pl; } 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->extended = TRUE; + tp->speed = line_speed; + tp->course = line_course; + tp->nsats = line_sat; + tp->fix_mode = line_fix; + } + else { + tp->extended = FALSE; + } current_track->trackpoints = g_list_append ( current_track->trackpoints, tp ); } @@ -274,6 +283,12 @@ void a_gpspoint_read_file(VikTrwLayer *trw, FILE *f ) { 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; } } @@ -391,15 +406,44 @@ static void gpspoint_process_key_and_value ( const gchar *key, gint key_len, con { 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_strtod(value, NULL); + } + else if (key_len == 6 && strncasecmp( key, "course", key_len ) == 0 && value != NULL) + { + line_course = g_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 ) { static struct LatLon ll; + gchar *s_lat, *s_lon; vik_coord_to_latlon ( &(wp->coord), &ll ); - fprintf ( f, "type=\"waypoint\" latitude=\"%f\" longitude=\"%f\" name=\"%s\"", ll.lat, ll.lon, name ); - if ( wp->altitude != VIK_DEFAULT_ALTITUDE ) - fprintf ( f, " altitude=\"%f\"", wp->altitude ); + s_lat = a_coords_dtostr(ll.lat); + s_lon = a_coords_dtostr(ll.lon); + fprintf ( f, "type=\"waypoint\" latitude=\"%s\" longitude=\"%s\" name=\"%s\"", s_lat, s_lon, name ); + g_free ( s_lat ); + g_free ( s_lon ); + + if ( wp->altitude != VIK_DEFAULT_ALTITUDE ) { + gchar *s_alt = a_coords_dtostr(wp->altitude); + fprintf ( f, " altitude=\"%s\"", s_alt ); + g_free(s_alt); + } if ( wp->comment ) { gchar *tmp_comment = slashdup(wp->comment); @@ -424,16 +468,44 @@ static void a_gpspoint_write_waypoint ( const gchar *name, VikWaypoint *wp, FILE static void a_gpspoint_write_trackpoint ( VikTrackpoint *tp, FILE *f ) { static struct LatLon ll; + gchar *s_lat, *s_lon; vik_coord_to_latlon ( &(tp->coord), &ll ); - fprintf ( f, "type=\"trackpoint\" latitude=\"%f\" longitude=\"%f\"", ll.lat, ll.lon ); - - if ( tp->altitude != VIK_DEFAULT_ALTITUDE ) - fprintf ( f, " altitude=\"%f\"", tp->altitude ); + /* 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 ); + g_free ( s_lat ); + g_free ( s_lon ); + + if ( tp->altitude != VIK_DEFAULT_ALTITUDE ) { + gchar *s_alt = a_coords_dtostr(tp->altitude); + fprintf ( f, " altitude=\"%s\"", s_alt ); + g_free(s_alt); + } if ( tp->has_timestamp ) fprintf ( f, " unixtime=\"%ld\"", tp->timestamp ); if ( tp->newsegment ) fprintf ( f, " newsegment=\"yes\"" ); + + if (tp->extended) { + 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" ); }