Skip to content

Commit

Permalink
Need to convert everything to use heap
Browse files Browse the repository at this point in the history
  • Loading branch information
scheibo committed Feb 28, 2014
1 parent f6d7326 commit 138c957
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 21 deletions.
7 changes: 4 additions & 3 deletions Makefile
Expand Up @@ -5,6 +5,7 @@ CFLAGS += $(WARN) $(DEBUG) -pthread

#TARGET = fitparse
#OBJECTS = activity.o fit.o tcx.o gpx.o
HEADERS = $(wildcard *.h)

default: gpx

Expand All @@ -13,13 +14,13 @@ all: gpx
gpx: gpx.o activity.o util.o lib/mxml/libmxml.a lib/date/libdate.a
$(CC) $^ $(CFLAGS) -o $@

gpx.o: gpx.c gpx.h lib/mxml/mxml.h
gpx.o: gpx.c gpx.h lib/mxml/mxml.h $(HEADERS)
$(CC) $(CFLAGS) -Ilib/mxml -c $< -o $@

util.o: util.c lib/date/date.h
util.o: util.c lib/date/date.h $(HEADERS)
$(CC) $(CFLAGS) -Ilib/date -c $< -o $@

activity.o: activity.c
activity.o: activity.c $(HEADERS)
$(CC) $(CFLAGS) -c $< -o $@

lib/mxml/Makefile:
Expand Down
3 changes: 2 additions & 1 deletion activity.h
Expand Up @@ -112,6 +112,7 @@ typedef struct {
uint32_t *laps; /* TODO array of timestamps, always at least one */
DataPoint *data_points;
DataPoint *last_point;
DataPoint has_data;
/*
//Summary summary; // can include derived statistics (totalAscent, NP, avg)
//Summary * lap_summaries; // can include derived statistics (totalAscent, NP,
Expand All @@ -120,7 +121,7 @@ typedef struct {
} Activity;

#define activity_new() \
{ UnknownSport, NULL, NULL }
{ UnknownSport, NULL, NULL, NULL, {0} }

void activity_destroy(Activity *a);
int activity_add_point(Activity *a, DataPoint *point);
Expand Down
29 changes: 20 additions & 9 deletions fix.c
Expand Up @@ -4,32 +4,43 @@
#include "activity.h"
#include "fix.h"

/* used to handle gaps in recording by inserting interpolated/zero samples to ensure dataPoints are contiguous in time */
/* used to handle gaps in recording by inserting interpolated/zero samples to
* ensure dataPoints are contiguous in time */
int fix_gps(Activity *a) {
DataPoint *fill_data, *last_good = NULL;
int errors = 0, last_good_index = -1, index = 0, fill_index;
double delta_latitude, delta_longitude;

// ignore null or files without GPS data
if (!a || !a->data_points || !a->has_data->latitude || !a->has_data->longitude) { /* TODO add has_data */
if (!a || !a->data_points || !a->has_data.latitude ||
!a->has_data.longitude) { /* TODO add has_data */
return -1;
}

for (data = a->data_points; data; data = data->next, index++) {
/* is this one decent? */
if (data->latitude >= -90 && data->latitude <= 90 && data->longitude >= -180 && data->longitude <= 180) {
if (data->latitude >= -90 && data->latitude <= 90 &&
data->longitude >= -180 && data->longitude <= 180) {
if (last_good && (last_good->next != data)) {
/* interpolate from last_good to here then set last_good to here */
delta_latitude = (data->latitude - last_good->latitude) / (double)(index-last_good_index);
delta_longitude = (data->longitude - last_good->longitude) / (double)(index-last_good_index);
for (fill_data = last_good->next, fill_index = last_good_index + 1; fill_data != data; fill_data = fill_data->next, fill_index++) {
fill_data->latitude = last_good->latitude + (double)((fill_index-last_good_index)*delta_latitude);
fill_data->longitude = last_good->longitude + (double)((fill_index-last_good_index)*delta_longitude);
delta_latitude = (data->latitude - last_good->latitude) /
(double)(index - last_good_index);
delta_longitude = (data->longitude - last_good->longitude) /
(double)(index - last_good_index);
for (fill_data = last_good->next, fill_index = last_good_index + 1;
fill_data != data; fill_data = fill_data->next, fill_index++) {
fill_data->latitude =
last_good->latitude +
(double)((fill_index - last_good_index) * delta_latitude);
fill_data->longitude =
last_good->longitude +
(double)((fill_index - last_good_index) * delta_longitude);
errors++;
}
} else if (!last_good) {
/* fill to front */
for (fill_data = a->data_points; fill_data != data; fill_data = fill_data->next) {
for (fill_data = a->data_points; fill_data != data;
fill_data = fill_data->next) {
fill_data->latitude = data->latitude;
fill_data->longitude = data->longitude;
errors++;
Expand Down
3 changes: 2 additions & 1 deletion fix.h
Expand Up @@ -7,7 +7,8 @@ int fix_gps(Activity *a);
/*
int fix_gaps(Activity *a);
int fix_spikes(Activity *a);
int fix_hr(Activity *a); // TODO probably needs HR max from athletes and other values?
int fix_hr(Activity *a); // TODO probably needs HR max from athletes and other
values?
*/

#endif /* _FIX_H_ */
10 changes: 3 additions & 7 deletions gpx.c
Expand Up @@ -65,20 +65,16 @@ static int sax_cb(mxml_node_t *node, mxml_sax_event_t event, void *sax_data) {
return 0;
} else if (!strcmp(name, "time")) {
state->data.timestamp = parse_timestamp(data);
if (!state->data.timestamp) state->data.timestamp = UNSET_TIMESTAMP;
} else if (!strcmp(name, "ele")) {
state->data.altitude = (int32_t)(strtod(data, &end) * 1000);
if (*end) state->data.altitude = UNSET_ALTITUDE;
} else if (!strcmp(name, "gpxtpx:hr")) {
} else if (!strcmp(name, "gpxdata:hr") || !strcmp(name, "gpxtpx:hr")) {
state->data.heart_rate = (uint8_t) strtod(data, &end);
if (*end) state->data.heart_rate = UNSET_HEART_RATE;
} else if (!strcmp(name, "gpxdata:hr")) {
state->data.heart_rate = (uint8_t) strtod(data, &end);
if (*end) state->data.heart_rate = UNSET_HEART_RATE;
} else if (!strcmp(name, "gpxdata:temp")) {
} else if (!strcmp(name, "gpxdata:temp") || !strcmp(name, "gpxtpx:atemp")) {
state->data.temperature = (int8_t) strtod(data, &end);
if (*end) state->data.temperature = UNSET_TEMPERATURE;
} else if (!strcmp(name, "gpxdata:cadence")) {
} else if (!strcmp(name, "gpxdata:cadence") || !strcmp(name, "gpxtpx:cad")) {
state->data.cadence = (uint8_t) strtod(data, &end);
if (*end) state->data.cadence = UNSET_CADENCE;
} else if (!strcmp(name, "gpxdata:bikepower")) {
Expand Down

0 comments on commit 138c957

Please sign in to comment.