diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b40c67 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.out +*.swp + diff --git a/.igc.c.swp b/.igc.c.swp deleted file mode 100644 index 5c11ac8..0000000 Binary files a/.igc.c.swp and /dev/null differ diff --git a/a.out b/a.out index 92bfae3..73c46c5 100755 Binary files a/a.out and b/a.out differ diff --git a/igc.c b/igc.c index 6077f05..1ddae71 100644 --- a/igc.c +++ b/igc.c @@ -15,6 +15,46 @@ #include #include "igc.h" +struct IGC_DataPoint* parse_datapoint(char* line) +{ + // There probably exists a better and/or prettier way + struct IGC_DataPoint* dp = (struct IGC_DataPoint*)malloc(sizeof(struct IGC_DataPoint)); + char hour[3], min[3], sec[3] = {0}; + char lat_d[3], lat_m[3], lat_s[4] = {0}; + char lon_d[4], lon_m[3], lon_s[4] = {0}; + char baro_alt[6], gps_alt[6] = {0}; + + memcpy(hour, line+1, 2); + memcpy(min, line+3, 2); + memcpy(sec, line+5, 2); + memcpy(lat_d, line+7, 2); + memcpy(lat_m, line+9, 2); + memcpy(lat_s, line+11, 3); + memcpy(lon_d, line+15, 3); + memcpy(lon_m, line+18, 2); + memcpy(lon_s, line+20, 3); + memcpy(baro_alt, line+25, 5); + memcpy(gps_alt, line+30, 5); + + dp->hour = atoi(hour); + dp->minute = atoi(min); + dp->second = atoi(sec); + dp->lat.deg = atoi(lat_d); + dp->lat.min = atoi(lat_m); + dp->lat.sec = atoi(lat_s); + dp->lat.cardinal = line[14] == NORTH ? NORTH : SOUTH; + dp->lon.deg = atoi(lon_d); + dp->lon.min = atoi(lon_m); + dp->lon.sec = atoi(lon_s); + dp->lon.cardinal = line[23] == EAST ? EAST : WEST; + dp->baro_alt = atoi(baro_alt); + dp->gps_alt = atoi(gps_alt); + + printf("Data point: %d:%d:%d | %d°%d'%d\"%c %d°%d'%d\"%c | Baro: %dm GPS: %dm\n", dp->hour, dp->minute, dp->second, dp->lat.deg, dp->lat.min, dp->lat.sec, dp->lat.cardinal, dp->lon.deg, dp->lon.min, dp->lon.sec, dp->lon.cardinal, dp->baro_alt, dp->gps_alt); + + return dp; +} + void parse_igc_file(FILE* fp) { size_t len = 0; @@ -25,38 +65,9 @@ void parse_igc_file(FILE* fp) switch(line[0]) { case DATAPOINT: - struct IGC_DataPoint* dp = (struct IGC_DataPoint*)malloc(sizeof(struct IGC_DataPoint)); - char hour[3], min[3], sec[3] = {0}; - char lat_d[3], lat_m[3], lat_s[4] = {0}; - char lon_d[4], lon_m[3], lon_s[4] = {0}; - - memcpy(hour, line+1, 2); - memcpy(min, line+3, 2); - memcpy(sec, line+5, 2); - memcpy(lat_d, line+7, 2); - memcpy(lat_m, line+9, 2); - memcpy(lat_s, line+11, 3); - memcpy(lon_d, line+15, 3); - memcpy(lon_m, line+18, 2); - memcpy(lon_s, line+20, 3); - - dp->hour = atoi(hour); - dp->minute = atoi(min); - dp->second = atoi(sec); - dp->lat.deg = atoi(lat_d); - dp->lat.min = atoi(lat_m); - dp->lat.sec = atoi(lat_s); - dp->lat.cardinal = line[14] == NORTH ? NORTH : SOUTH; - dp->lon.deg = atoi(lon_d); - dp->lon.min = atoi(lon_m); - dp->lon.sec = atoi(lon_s); - dp->lon.cardinal = line[23] == EAST ? EAST : WEST; - - printf("%s", line); - printf("Data point: %d:%d:%d | %d°%d'%d\"%c %d°%d'%d\"%c\n", dp->hour, dp->minute, dp->second, dp->lat.deg, dp->lat.min, dp->lat.sec, dp->lat.cardinal, dp->lon.deg, dp->lon.min, dp->lon.sec, dp->lon.cardinal); - - // Debug - exit(0); + struct IGC_DataPoint* dp = parse_datapoint(line); + // Doubly linked list of points (so theyre joined in chronological order; opens possibilities for analysis later) + // append_datapoint(dp); break; default: break;