Copyright (C) 2004, Danny Ho, danniho@canada.com

FOR PROGRAMMERS:

Below is the CHECKTHREAT function in my Visual Basic program, which determines the level of threat, and initiates TCAS action.
This is for your general interest, use, and critique. Enjoy!

Danny

'******************************

Public Function CheckThreat(Index As Integer) As String 'returns TA, RA, PT, NIT, or NA

If (Traffic(Index).Ref) = 0 Then
CheckThreat = "NA"
Exit Function
End If

CheckThreat = "PT"

'TimeGap = Format(auiTime(3), "00") - Traffic(Index).TempSec(TrendLength)
TimeGap = tmrTCAS.Interval / 1000 ' DELAY OF TRANSPONDER TIMER 'Right(TimeString, 2) - Traffic(Index).TempSec(TrendLength)

'MsgBox Second(Now) & " " & TimeGap
If TimeGap <= 0 Then
TimeGap = 60 + TimeGap
End If

'Traffic(Index).HorTau(TrendLength) = (Dist(Index) / (0.0001 + Traffic(Index).Dist(TrendLength) - Dist(Index)) + Traffic(Index).Dist(TrendLength) / (0.0001 + Traffic(Index).Dist(TrendLength - 1) - Traffic(Index).Dist(TrendLength)) + Traffic(Index).Dist(TrendLength - 1) / (0.0001 + Traffic(Index).Dist(TrendLength - 2) - Traffic(Index).Dist(TrendLength - 1))) / TimeGap
'Traffic(Index).HorTau(TrendLength) = Traffic(Index).Dist(TrendLength) / (0.0000001 + ((Traffic(Index).Dist(TrendLength - 8) - Traffic(Index).Dist(TrendLength) + 0.00001) / (TimeGap + 0.0000001)))
Traffic(Index).HorTau(TrendLength) = Dist(Index) / (TimeGap * (0.0000001 + Traffic(Index).Dist(TrendLength) - Dist(Index)))
If (Traffic(Index).HorTau(TrendLength) < 1) Or (Traffic(Index).HorTau(TrendLength) > 200) Then
Traffic(Index).HorTau(TrendLength) = -1
End If

tmpAltDiff = (Alt(Index) - osAlt)
tmpAltDiffLast = (Traffic(Index).Alt(TrendLength) - Ownship.Alt(TrendLength - 1))

If (Abs(tmpAltDiff) < Abs(tmpAltDiffLast)) And (Abs(tmpAltDiff - tmpAltDiffLast) >= 1) Then
Traffic(Index).VerTau(TrendLength) = Abs(tmpAltDiff) / (TimeGap * Abs(tmpAltDiff - tmpAltDiffLast + 0.0001))
Else
Traffic(Index).VerTau(TrendLength) = -1
End If

Text5.Text = Traffic(Index).HorTau(TrendLength)
Text6.Text = Traffic(Index).VerTau(TrendLength)

'Traffic(Index).HorTau(TrendLength) = HorTau
'Traffic(Index).VerTau(TrendLength) = VerTau

If (Traffic(Index).HorTau(TrendLength) > 1) And (Traffic(Index).VerTau(TrendLength) > 1) And (osAGL > 100) And (Traffic(Index).HorTau(TrendLength) < 120) Then 'regular threat check

If (Traffic(Index).Dist(TrendLength) < TAdmod) And (Abs(Traffic(Index).Alt(TrendLength) - osAlt) < TAalt) Then
CheckThreat = "TA"
RASense = "NA"
End If

If (Traffic(Index).Dist(TrendLength) < RAdmod) And (Abs(Traffic(Index).Alt(TrendLength) - osAlt) < RAalt) Then
CheckThreat = "RA"

End If

If (Traffic(Index).HorTau(TrendLength) < TAtau) And (Traffic(Index).VerTau(TrendLength) < TAtau) Then
CheckThreat = "TA"
RASense = "NA"
End If

If (Traffic(Index).HorTau(TrendLength) < RAtau) And (Traffic(Index).VerTau(TrendLength) < RAtau) Then
CheckThreat = "RA"
End If

End If


If (Traffic(Index).Threat(TrendLength - 2) = "RA" And Traffic(Index).Threat(TrendLength - 1) = "PT" And CheckThreat = "PT" And (Traffic(Index).HorTau(TrendLength) < 0)) Then
If lblMsg <> "CLEAR OF CONFLICT" Then
lblMsg = "CLEAR OF CONFLICT"
RASense = "NA"
End If
End If





'******************
'**** INITIAL RA PSEUDOCODE, osalt, xosalt, alt, xalt, osvs, vs

If CheckThreat = "RA" Then

If (osAlt) > (Alt(Index)) Then 'ownship is higher
If ((Traffic(Index).HorTau(TrendLength) * MaxRate / 60 + osAlt) - (Traffic(Index).HorTau(TrendLength) * Vs(Index) / 60 + Alt(Index))) > RAalt Then 'cross descend is not necessary
RARate = (((Traffic(Index).HorTau(TrendLength) * Vs(Index) / 60 + Alt(Index) + RAalt) - osAlt)) / (Traffic(Index).HorTau(TrendLength) / 60 + 0.0001) 'determine min RA rate
If (RARate < 0) And (RARate < osVs) Then 'if RARATE > osvs then CLIMB CLIMB!!!
' If lblMsg <> "DO NOT DESCEND" Then lblMsg = "DO NOT DESCEND"

If RARate > osVs And RASense = "UP" Then
If lblMsg <> "INCREASE CLIMB" Then lblMsg = "INCREASE CLIMB"
Else
If RASense = "DOWN" Then
If lblMsg <> "CLIMB, CLIMB NOW" Then lblMsg = "CLIMB, CLIMB NOW"
Else
If lblMsg <> "CLIMB, CLIMB" Then lblMsg = "CLIMB, CLIMB"
End If
End If

Else 'must climb
If RARate > osVs And RASense = "UP" Then
If lblMsg <> "INCREASE CLIMB" Then lblMsg = "INCREASE CLIMB"
Else
If RASense = "DOWN" Then
If lblMsg <> "CLIMB, CLIMB NOW" Then lblMsg = "CLIMB, CLIMB NOW"
Else
If lblMsg <> "CLIMB, CLIMB" Then lblMsg = "CLIMB, CLIMB"
End If
End If
End If

RASense = "UP"

Else 'must cross descend to avoid
RARate = ((Traffic(Index).HorTau(TrendLength) * Vs(Index) / 60 + Alt(Index) - RAalt) - osAlt) / (Traffic(Index).HorTau(TrendLength) / 60 + 0.0001)

If RASense = "DOWN" And RARate < osVs Then
If lblMsg <> "INCREASE DESCEND" Then lblMsg = "INCREASE DESCEND"
Else
If lblMsg <> "CROSSING DESCEND" Then lblMsg = "CROSSING DESCEND"
End If

RASense = "DOWN"

End If
Else 'ownship is below threat
If ((Traffic(Index).HorTau(TrendLength) * Vs(Index) / 60 + Alt(Index)) - (osAlt - Traffic(Index).HorTau(TrendLength) * MaxRate / 60)) > RAalt Then 'cross climb is not necessary

RARate = ((Traffic(Index).HorTau(TrendLength) * Vs(Index) / 60 + Alt(Index) - RAalt) - osAlt) / (Traffic(Index).HorTau(TrendLength) / 60 + 0.0001) 'determine min RA rate

If (RARate > 0) And (RARate > osVs) Then
' If lblMsg <> "DO NOT CLIMB" Then lblMsg = "DO NOT CLIMB"

If RARate < osVs And RASense = "DOWN" Then
If lblMsg <> "INCREASE DESCEND" Then lblMsg = "INCREASE DESCEND"
Else
If RASense = "UP" Then
If lblMsg <> "DESCEND, DESCEND NOW" Then lblMsg = "DESCEND, DESCEND NOW"
Else
If lblMsg <> "DESCEND, DESCEND" Then lblMsg = "DESCEND, DESCEND"
End If
End If

Else 'must descend

If RARate < osVs And RASense = "DOWN" Then
If lblMsg <> "INCREASE DESCEND" Then lblMsg = "INCREASE DESCEND"
Else
If RASense = "UP" Then
If lblMsg <> "DESCEND, DESCEND NOW" Then lblMsg = "DESCEND, DESCEND NOW"
Else
If lblMsg <> "DESCEND, DESCEND" Then lblMsg = "DESCEND, DESCEND"
End If
End If

End If

RASense = "DOWN"

Else 'must cross climb to avoid
RARate = ((Traffic(Index).HorTau(TrendLength) * Vs(Index) / 60 + Alt(Index) + RAalt) - osAlt) / (Traffic(Index).HorTau(TrendLength) / 60 + 0.0001)

If RASense = "UP" And RARate > osVs Then
If lblMsg <> "INCREASE CLIMB" Then lblMsg = "INCREASE CLIMB"
Else
If lblMsg <> "CROSSING CLIMB" Then lblMsg = "CROSSING CLIMB"
End If

RASense = "UP"

End If
End If

'**** END RA SELECTION
'*********************

End If

If (CheckThreat = "TA") And (Traffic(Index).Threat(TrendLength) <> "TA") Then
If lblMsg <> "TRAFFIC, TRAFFIC" Then lblMsg = "TRAFFIC, TRAFFIC"
RASense = "NA"
End If

If CheckThreat = "" Then
chechthreat = "NA"
End If

If RASense = "NA" Then
Call FillRA(vbBlack, 0, 19)
Else
Call DrawRA
End If

End Function