/* * IGC parser * @brief parse IGC file, get all data points, compute average horizontal/vertical speed, print to STDOUT * * @author xamidev * @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