kopia lustrzana https://github.com/cariboulabs/cariboulite
97 wiersze
3.2 KiB
C
97 wiersze
3.2 KiB
C
/*
|
|
* Modified source file by David Michaeli @ CaribouLabs Ltd. Apr. 2022
|
|
* Source of file: https://github.com/watson/libmodes
|
|
* Author: Thomas Watson (@watson)
|
|
* Contact: w@tson.dk / https://twitter.com/wa7son
|
|
* License: BSD-2-Clause
|
|
*/
|
|
#ifndef __MODE_S_DECODER_H
|
|
#define __MODE_S_DECODER_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <unistd.h>
|
|
#include <math.h>
|
|
#include <time.h>
|
|
|
|
#define MODE_S_ICAO_CACHE_LEN 1024 // Power of two required
|
|
#define MODE_S_LONG_MSG_BYTES (112/8)
|
|
#define MODE_S_UNIT_FEET 0
|
|
#define MODE_S_UNIT_METERS 1
|
|
|
|
// Program state
|
|
typedef struct
|
|
{
|
|
// Internal state - recently seen ICAO addresses cache
|
|
uint32_t icao_cache[sizeof(uint32_t)*MODE_S_ICAO_CACHE_LEN*2];
|
|
|
|
// Configuration
|
|
int fix_errors; // Single bit error correction if true
|
|
int aggressive; // Aggressive detection algorithm
|
|
int check_crc; // Only display messages with good CRC
|
|
} mode_s_t;
|
|
|
|
// The struct we use to store information about a decoded message
|
|
struct mode_s_msg
|
|
{
|
|
// ------ Generic fields ------------
|
|
unsigned char msg[MODE_S_LONG_MSG_BYTES]; // Binary message
|
|
int msgbits; // Number of bits in message
|
|
int msgtype; // Downlink format #
|
|
int crcok; // True if CRC was valid
|
|
uint32_t crc; // Message CRC
|
|
int errorbit; // Bit corrected. -1 if no bit corrected.
|
|
int aa1, aa2, aa3; // ICAO Address bytes 1 2 and 3
|
|
int phase_corrected; // True if phase correction was applied.
|
|
|
|
// ------ DF 11 ---------------------
|
|
int ca; // Responder capabilities.
|
|
|
|
// ------ DF 17 ---------------------
|
|
int metype; // Extended squitter message type.
|
|
int mesub; // Extended squitter message subtype.
|
|
int heading_is_valid;
|
|
int heading;
|
|
int aircraft_type;
|
|
int fflag; // 1 = Odd, 0 = Even CPR message.
|
|
int tflag; // UTC synchronized?
|
|
int raw_latitude; // Non decoded latitude
|
|
int raw_longitude; // Non decoded longitude
|
|
char flight[9]; // 8 chars flight number.
|
|
int ew_dir; // 0 = East, 1 = West.
|
|
int ew_velocity; // E/W velocity.
|
|
int ns_dir; // 0 = North, 1 = South.
|
|
int ns_velocity; // N/S velocity.
|
|
int vert_rate_source; // Vertical rate source.
|
|
int vert_rate_sign; // Vertical rate sign.
|
|
int vert_rate; // Vertical rate.
|
|
int velocity; // Computed from EW and NS velocity.
|
|
|
|
// ------ DF4, DF5, DF20, DF21 -------
|
|
int fs; // Flight status for DF4,5,20,21
|
|
int dr; // Request extraction of downlink request.
|
|
int um; // Request extraction of downlink request.
|
|
int identity; // 13 bits identity (Squawk).
|
|
|
|
// Fields used by multiple message types.
|
|
int altitude, unit;
|
|
};
|
|
|
|
typedef void (*mode_s_callback_t)(mode_s_t *self, struct mode_s_msg *mm);
|
|
|
|
void mode_s_init(mode_s_t *self);
|
|
void mode_s_detect(mode_s_t *self, uint16_t *mag, uint32_t maglen, mode_s_callback_t);
|
|
void mode_s_decode(mode_s_t *self, struct mode_s_msg *mm, unsigned char *msg);
|
|
void mode_s_display_message(struct mode_s_msg *mm);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
#endif |