ardupilot/libraries/AP_ADSB/sagetech-sdk/target.h

132 lines
2.7 KiB
C

/**
* @copyright Copyright (c) 2020 Sagetech, Inc. All rights reserved.
*
* @File: target.h
* @Author: jim billmeyer
*
* @date December 11, 2020, 12:49 AM
*/
#ifndef TARGET_H
#define TARGET_H
#include <string.h>
#include <stdbool.h>
#include <stdint.h>
#define XPNDR_ADSB_TARGETS 400 // change this to the max number of
// target supported in the system.
typedef enum
{
trafLevel,
trafClimb,
trafDescend
} targetclimb_t;
typedef enum
{
trafTraffic,
trafAdvisory,
trafResolution
} targetalert_t;
// bit 0 - target found flag.
// bit 1 - target slot in use.
// bits 2-7 - the strike counter.
#define TARGET_FLAG_FOUND 0x01
#define TARGET_FLAG_USED 0x02
#define TARGET_FLAG_STRIKE_MASK 0xFC
typedef struct __attribute__((packed))
{
uint32_t icao;
bool airborne;
float bearing;
uint8_t distance;
int8_t altDiff;
int16_t nvel;
int16_t evel;
targetclimb_t climb;
targetalert_t alert;
#ifdef TARGET_SVR
msg_svr_t svr;
#endif
uint8_t flag; // used internally to purge stale targets.
} target_t;
typedef struct
{
uint32_t icao;
bool airborne;
float lat;
float lon;
int32_t alt;
int16_t heading;
uint16_t speed;
} ownship_t;
/**
* Gets the target list.
*
* @return The array of traffic targets.
*/
target_t *targetList(void);
/**
* Gets the ownship target information.
*
* @return The ownship target info.
*/
ownship_t *targetOwnship(void);
/**
* Find a target based on its icao number.
*
* @param icao The target's icao number
*
* @return A pointer to the target element or null if not found.
*/
target_t *targetFind(uint32_t icao);
/**
* Purge the traffic target list of stale traffic.
*
* The traffic gets purged if a find has not been done based
* on a strike counter.
*/
void targetPurge(void);
/**
* Adds a target to the traffic target list.
*
* @param target The target to add.
*/
void targetAdd(target_t *target);
/**
* Gets the target climb flag based on the vertical rate.
*
* @param vrate The current vertical rate of climb for the target.
*
* @return The level, climb or descend flag.
*/
targetclimb_t targetClimb(int16_t vrate);
/**
* Gets the traffic alert flag.
*
* @param dist The distance of the target to the ownship.
* @param alt The altitude difference between the target and ownship.
* @param nvel The NS speed vector of the target.
* @param evel The EW speed vector of the target.
*
* @return The traffic flag based on the parameters.
*/
targetalert_t targetAlert(double dist,
uint16_t alt,
int16_t nvel,
int16_t evel);
#endif /* TARGET_H */