91 lines
1.5 KiB
C
91 lines
1.5 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
|
|
|
|
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_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
|