Files
igcp/igc.h
2025-11-08 09:05:19 +01:00

93 lines
1.6 KiB
C

/*
* IGC parser
* @brief parse IGC file, get all data points, compute average horizontal/vertical speed, print to STDOUT
*
* @author xamidev <xamidev@riseup.net>
* @license GNU GPL v3
*/
#ifndef IGC_H
#define IGC_H
#define SMALL_NAME_MAX 32
#define NAME_MAX 256
#define TMP_SIZE 8
#include "linkage.h"
enum IGC_RecordType
{
MANUFACTURER = 'A',
HEADER = 'H',
EXTENSION = 'I',
J_EXTENSION = 'J',
DECLARATION = 'C',
SATELLITES = 'F',
DATAPOINT = 'B',
DIFFERENTIAL_GPS = 'D',
PILOT_EVENT = 'E',
GEN_PURPOSE_PLACEHOLDER = 'K',
COMMENT = 'L',
SEC_KEY = 'G',
};
enum Cardinals
{
NORTH = 'N',
SOUTH = 'S',
EAST = 'E',
WEST = 'W'
};
struct Coord
{
char cardinal;
int deg;
int min;
int sec;
};
struct IGC_Header
{
int day;
int month;
int year;
// Not exhaustive
char pilot_name[NAME_MAX];
char crew2_name[NAME_MAX];
char aircraft_name[NAME_MAX];
char aircraft_registration_no[NAME_MAX];
char gps_datum[NAME_MAX];
// (not too important; ignored for now, may be part of "verbose" setting later)
char firmware_ver[NAME_MAX];
char hardware_ver[NAME_MAX];
char frtype[NAME_MAX];
char press_alt_sensor[NAME_MAX];
};
struct IGC_DataPoint
{
// timestamp
int hour;
int minute;
int second;
// coordinates
struct Coord lat;
struct Coord lon;
// altitude
int baro_alt;
int gps_alt;
};
void parse_igc_file(FILE* fp, struct IGC_Header* hdr, struct dp_node* list);
struct IGC_DataPoint* parse_datapoint(char* line);
void show_datapoint(struct IGC_DataPoint* dp);
void show_header_info(struct IGC_Header* hdr);
struct IGC_Header* parse_header_record(struct IGC_Header* hdr, char* line);
#endif