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

143 lines
2.9 KiB
C

/**
* @copyright Copyright (c) 2020 SoftSolutions, Inc. All rights reserved.
*
* @File: target.c
* @Author: jim billmeyer
*
* @date December 11, 2020, 12:50 AM
*/
#include <stdlib.h>
#include "target.h"
static ownship_t ownship;
static target_t targets[XPNDR_ADSB_TARGETS] = {
{
0,
},
};
/*
* Documented in the header file.
*/
target_t *targetList(void)
{
return targets;
}
/*
* Documented in the header file.
*/
ownship_t *targetOwnship(void)
{
return &ownship;
}
/*
* Documented in the header file.
*/
target_t *targetFind(uint32_t icao)
{
for (uint16_t i = 0; i < XPNDR_ADSB_TARGETS; i++)
{
if (icao == targets[i].icao)
{
// clear strike counter and set find flag while preserving the used bit.
targets[i].flag = TARGET_FLAG_FOUND | TARGET_FLAG_USED;
return &targets[i];
}
}
return 0;
}
/*
* Documented in the header file.
*/
void targetPurge(void)
{
for (uint16_t i = 0; i < XPNDR_ADSB_TARGETS; i++)
{
// the the found flag was not set increment the strike counter.
if ((targets[i].flag & TARGET_FLAG_USED) && ((targets[i].flag & TARGET_FLAG_FOUND) == 0))
{
uint8_t strikes = (targets[i].flag & 0xFE) >> 2;
strikes++;
if (strikes > 5)
{
memset(&targets[i], 0, sizeof(target_t));
}
else
{
// set the strike counter and clear the found flag.
targets[i].flag = strikes << 2 | TARGET_FLAG_USED;
}
}
else
{
// clear the found flag so the target find function can set it
// to signal that the icao address is still in range.
targets[i].flag = targets[i].flag & (TARGET_FLAG_STRIKE_MASK | TARGET_FLAG_USED);
}
}
}
/*
* Documented in the header file.
*/
void targetAdd(target_t *target)
{
for (uint16_t i = 0; i < XPNDR_ADSB_TARGETS; i++)
{
if ((targets[i].flag & TARGET_FLAG_USED) == 0x0)
{
memcpy(&targets[i], target, sizeof(target_t));
targets[i].flag = TARGET_FLAG_USED;
break;
}
}
}
/*
* Documented in the header file.
*/
targetclimb_t targetClimb(int16_t vrate)
{
if (abs(vrate) < 500)
{
return trafLevel;
}
else if (vrate > 0)
{
return trafClimb;
}
else
{
return trafDescend;
}
}
/*
* Documented in the header file.
*/
targetalert_t targetAlert(double dist,
uint16_t alt,
int16_t nvel,
int16_t evel)
{
if (alt <= 3000)
{
if (dist <= 3.0)
{
return trafResolution;
}
else if (dist <= 6.0)
{
return trafAdvisory;
}
}
return trafTraffic;
}