Parsing datapoints

This commit is contained in:
2025-11-07 17:35:30 +01:00
parent b65edb40cf
commit 41b7075457
4 changed files with 46 additions and 32 deletions

75
igc.c
View File

@@ -15,6 +15,46 @@
#include <string.h>
#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;