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
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
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
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
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