1
0
Fork 0

TCAS Instrument: add configuration options

This commit is contained in:
legoboyvdlp R 2019-05-14 19:03:26 +01:00
parent f159b98224
commit 16b178a2d9
2 changed files with 62 additions and 10 deletions

View file

@ -504,7 +504,7 @@ TCAS::AdvisoryCoordinator::update(int mode)
} }
/* [TCASII]: "Aural annunciations are inhibited below 500+/-100 feet AGL." */ /* [TCASII]: "Aural annunciations are inhibited below 500+/-100 feet AGL." */
if ((tcas->threatDetector.getRadarAlt() > 500)&& if ((tcas->threatDetector.getRadarAlt() > tcas->_TAInhbAlt) &&
(mode >= SwitchTaOnly)) (mode >= SwitchTaOnly))
tcas->annunciator.trigger(current, revertedRA); tcas->annunciator.trigger(current, revertedRA);
else else
@ -633,7 +633,7 @@ TCAS::ThreatDetector::checkThreat(int mode, const SGPropertyNode* pModel)
currentThreat.relativeAltitudeFt = altFt - self.pressureAltFt; currentThreat.relativeAltitudeFt = altFt - self.pressureAltFt;
// save computation time: don't care when relative altitude is excessive // save computation time: don't care when relative altitude is excessive
if (fabs(currentThreat.relativeAltitudeFt) > 10000) if (fabs(currentThreat.relativeAltitudeFt) > tcas->_verticalRange)
return threatLevel; return threatLevel;
// position data of current intruder // position data of current intruder
@ -645,7 +645,7 @@ TCAS::ThreatDetector::checkThreat(int mode, const SGPropertyNode* pModel)
calcRangeBearing(self.lat, self.lon, lat, lon, distanceNm, bearing); calcRangeBearing(self.lat, self.lon, lat, lon, distanceNm, bearing);
// save computation time: don't care for excessive distances (also captures NaNs...) // save computation time: don't care for excessive distances (also captures NaNs...)
if ((distanceNm > 10)||(distanceNm < 0)) if ((distanceNm > tcas->_lateralRange) || (distanceNm < 0))
return threatLevel; return threatLevel;
currentThreat.verticalFps = pModel->getDoubleValue("velocities/vertical-speed-fps"); currentThreat.verticalFps = pModel->getDoubleValue("velocities/vertical-speed-fps");
@ -653,8 +653,8 @@ TCAS::ThreatDetector::checkThreat(int mode, const SGPropertyNode* pModel)
/* Detect proximity targets /* Detect proximity targets
* [TCASII]: "Any target that is less than 6 nmi in range and within +/-1200ft * [TCASII]: "Any target that is less than 6 nmi in range and within +/-1200ft
* vertically, but that does not meet the intruder or threat criteria." */ * vertically, but that does not meet the intruder or threat criteria." */
if ((distanceNm < 6)&& if ((distanceNm < tcas->_proxLatRange) &&
(fabs(currentThreat.relativeAltitudeFt) < 1200)) (fabs(currentThreat.relativeAltitudeFt) < tcas->_proxVertRange))
{ {
// at least a proximity target // at least a proximity target
threatLevel = ThreatProximity; threatLevel = ThreatProximity;
@ -1050,13 +1050,13 @@ TCAS::AdvisoryGenerator::resolution(int mode, int threatLevel, float rangeNm, fl
{ {
/* [TCASII]: "... less than 360 feet, TCAS considers the reporting aircraft /* [TCASII]: "... less than 360 feet, TCAS considers the reporting aircraft
* to be on the ground. If TCAS determines the intruder to be on the ground, it * to be on the ground. If TCAS determines the intruder to be on the ground, it
* inhibits the generation of advisories against this aircraft."*/ * New custom logic for the A320 - if enabled explicitly this will only occur if your altitude is less than 1700 */
if (altFt < 360) if ((altFt < tcas->_intruderInhbAlt) && (!tcas->_intruderInhbSelfAltToggle || pSelf->radarAltFt < tcas->_intruderInhbSelfAlt))
threatLevel = ThreatTA; threatLevel = ThreatTA;
/* [EUROACAS]: "Certain RAs are inhibited at altitudes based on inputs from the radio altimeter: /* [EUROACAS]: "Certain RAs are inhibited at altitudes based on inputs from the radio altimeter:
* [..] (c)1000ft (+/- 100ft) and below, all RAs are inhibited;" */ * [..] (c)1000ft (+/- 100ft) and below, all RAs are inhibited;" */
if (pSelf->radarAltFt < 1000) if (pSelf->radarAltFt < tcas->_RAInhbAlt)
threatLevel = ThreatTA; threatLevel = ThreatTA;
// RAs only issued in mode "Auto" (= "TA/RA" mode) // RAs only issued in mode "Auto" (= "TA/RA" mode)
@ -1124,7 +1124,7 @@ TCAS::AdvisoryGenerator::resolution(int mode, int threatLevel, float rangeNm, fl
/* [TCASII]: "TCAS is designed to inhibit Increase Descent RAs below 1450 feet AGL; */ /* [TCASII]: "TCAS is designed to inhibit Increase Descent RAs below 1450 feet AGL; */
/* [TCASII]: "Descend RAs below 1100 feet AGL;" (inhibited) */ /* [TCASII]: "Descend RAs below 1100 feet AGL;" (inhibited) */
if (pSelf->radarAltFt < 1100) if (pSelf->radarAltFt < tcas->_DesInhbAlt)
{ {
RA &= ~AdvisoryDescend; RA &= ~AdvisoryDescend;
//TODO Support "Do not descend" RA //TODO Support "Do not descend" RA
@ -1152,6 +1152,17 @@ TCAS::AdvisoryGenerator::resolution(int mode, int threatLevel, float rangeNm, fl
TCAS::TCAS(SGPropertyNode* pNode) : TCAS::TCAS(SGPropertyNode* pNode) :
name("tcas"), name("tcas"),
num(0), num(0),
_verticalRange(10000),
_lateralRange(10),
_proxVertRange(1200),
_proxLatRange(6),
_incDesInhbAlt(1450),
_DesInhbAlt(1100),
_RAInhbAlt(1000),
_TAInhbAlt(500),
_intruderInhbAlt(360),
_intruderInhbSelfAltToggle(false),
_intruderInhbSelfAlt(1700),
nextUpdateTime(0), nextUpdateTime(0),
selfTestStep(0), selfTestStep(0),
properties_handler(this), properties_handler(this),
@ -1166,11 +1177,38 @@ TCAS::TCAS(SGPropertyNode* pNode) :
SGPropertyNode* pChild = pNode->getChild(i); SGPropertyNode* pChild = pNode->getChild(i);
string cname = pChild->getName(); string cname = pChild->getName();
string cval = pChild->getStringValue(); string cval = pChild->getStringValue();
int cintval = pChild->getIntValue();
if (cintval < 0 || cintval == NULL) {
SG_LOG(SG_INSTR, SG_WARN, "Error in TCAS config logic: value less than zero or nil. Skipping!");
}
if (cname == "name") if (cname == "name")
name = cval; name = cval;
else if (cname == "number") else if (cname == "number")
num = pChild->getIntValue(); num = cintval;
else if (cname == "vertical-range" && cintval > 0)
_verticalRange = cintval;
else if (cname == "lateral-range" && cintval > 0)
_lateralRange = cintval;
else if (cname == "prox-vertical-range" && cintval > 0)
_proxVertRange = cintval;
else if (cname == "prox-lateral-range" && cintval > 0)
_proxLatRange = cintval;
else if (cname == "inc-des-inhb-alt" && cintval > 0)
_incDesInhbAlt = cintval;
else if (cname == "des-inhb-alt" && cintval > 0)
_DesInhbAlt = cintval;
else if (cname == "ra-inhb-alt" && cintval > 0)
_RAInhbAlt = cintval;
else if (cname == "ta-inhb-alt" && cintval > 0)
_TAInhbAlt = cintval;
else if (cname == "intruder-inhb-alt" && cintval > 0)
_intruderInhbAlt = cintval;
else if (cname == "intruder-use-self-alt")
_intruderInhbSelfAltToggle = pChild->getBoolValue();
else if (cname == "intruder-self-alt" && cintval > 0)
_intruderInhbSelfAlt = cintval;
else else
{ {
SG_LOG(SG_INSTR, SG_WARN, "Error in TCAS config logic"); SG_LOG(SG_INSTR, SG_WARN, "Error in TCAS config logic");

View file

@ -387,6 +387,20 @@ public:
virtual void init (void); virtual void init (void);
virtual void reinit (void); virtual void reinit (void);
virtual void update (double dt); virtual void update (double dt);
/* configuration options */
int _verticalRange;
int _lateralRange;
int _proxVertRange;
int _proxLatRange;
int _incDesInhbAlt;
int _DesInhbAlt;
int _RAInhbAlt;
int _TAInhbAlt;
int _intruderInhbAlt;
bool _intruderInhbSelfAltToggle;
int _intruderInhbSelfAlt;
}; };
#ifdef _MSC_VER #ifdef _MSC_VER