Rise
The Vieneo Province
TCAS.cpp
Go to the documentation of this file.
1 #include "Module.h"
2 
3 TCAS::TCAS(Bus* prmBus, Logger* prmLogger, D3DXMATRIX* prmMatrixView) : Module(prmBus)
4 {
5  logger = prmLogger;
6  matrixView = prmMatrixView;
7  for (int i = 0; i < MAX_SCAN; i++)
8  olddistance[i] = -1.0f;
9 }
10 
11 void TCAS::FrameMove(float fElapsed)
12 {
13  if (ourcockpit.gndvehicle ||
14  ourcockpit.texturelib == Apartment || ourcockpit.texturelib == SimBay || ourcockpit.texturelib == ControlTower ||
15  ourcockpit.power < 0.5f)
16  {
17  secsincelast = 0.0f;
18  coctime = 0.0f;
19  tcasmode = Bus::TcasEnum::Clear_Of_Conflict;
20  for (int i = 0; i < MAX_SCAN; i++)
21  olddistance[i] = -1.0f;
22  return;
23  }
24 
25  if (advanceframe < 1.0f)
26  {
27  advanceframe += fElapsed;
28  return;
29  }
30  advanceframe = 0.0f;
31 
32  float tcastime = 999.0f; // reset
33  //bus->TCASTargetOrdinal = -1; // reset
34  for (int t = 1; t < MAX_SCAN; t++)
35  {
36  if (playerships[t].active && playerships[t].visible)
37  {
38  // this is used in TCAS but easiest to do it here because we have distance and elapsed time
39  const float traversed = olddistance[t] - playerships[t].distance; // was 18 now 5
40  if (traversed > 0.0f && olddistance[t] != -1.0f) // 13 (only if positive)
41  playerships[t].closurerate = traversed; // 13km in 0.5 sec is 26km/s
42  else
43  playerships[t].closurerate = 0.0f;
45 
46  const float oldMsl = playerships[t].msl;
47  playerships[t].msl = D3DXVec3Length(&playerships[t].position) - radiusC;
48  playerships[t].vsi = (playerships[t].msl - oldMsl);// fElapsedTime;
49 
50  if (playerships[0].logolight && // our power has to be on
51  !playerships[0].docked && // we are not docked
52  !playerships[0].groundvehicle && // don't run for if we are in gv
53  playerships[0].reference != REF_ONGROUND && // don't run if we are on ground
54  playerships[0].reference != REF_INANOTHER && // don't run if we are in another
55  playerships[t].logolight &&
56  !playerships[t].docked &&
57  !playerships[t].groundvehicle &&
58  playerships[t].reference != REF_ONGROUND &&
59  playerships[t].reference != REF_INANOTHER &&
60  playerships[t].distance < ourcockpit.scanrange &&
61  playerships[t].type != VehicleType::FloatingMan &&
62  playerships[t].type != VehicleType::BeishtKione &&
63  playerships[t].closurerate > 0.0f)
64  {
65  const float timetoimpact = playerships[t].distance / playerships[t].closurerate; // seconds
66  if (timetoimpact < tcastime) // 0.19 seconds
67  {
68  tcastime = timetoimpact;
70  }
71  }
72  }
73  }
74 
75  secsincelast++;
76  if (secsincelast >= 3.0f) // last spoke
77  {
78  const Bus::TcasEnum oldtcasmode = tcasmode;
79 
80  if (tcastime < 40.0f && tcasmode == Bus::TcasEnum::Clear_Of_Conflict) // new advisory
81  {
82  tcasmode = Bus::TcasEnum::Traffic_Advisory;
83  coctime = 0.0f;
84  }
85  else if (tcastime < 25.0f) // RA
86  {
87  D3DXVECTOR3 result1;
88  D3DXVec3Subtract(&result1, &playerships[0].position, &playerships[bus->TCASTargetOrdinal].position);
89  D3DXVec3TransformCoord(&result1, &result1, matrixView);
90 
91  if (result1.z != 0.0f)
92  {
93  const float bear1 = D3DXToDegree(atanf(result1.x / result1.z));
94  float mark1 = D3DXToDegree(atanf(result1.y / result1.z));
95  float f_temp = sqrtf(mark1 * mark1 + bear1 * bear1);
96  if (f_temp > 180.0f)
97  {
98  f_temp = 180.0f / f_temp;
99  mark1 *= f_temp;
100  }
101  if (result1.z > 0.0f) // Behind us
102  {
103  mark1 = -mark1;
104  }
105  if (mark1 < 0.0f)
106  {
107  if (tcasmode != Bus::TcasEnum::RA_Monitor_Climb)
108  tcasmode = Bus::TcasEnum::RA_Climb;
109  }
110  else
111  {
112  if (tcasmode != Bus::TcasEnum::RA_Monitor_Descent)
113  tcasmode = Bus::TcasEnum::RA_Descend;
114  }
115  }
116 
117  coctime = 0.0f;
118  }
119  else if (tcastime >= 40.0f && tcasmode != Bus::TcasEnum::Clear_Of_Conflict)
120  {
121  coctime += fElapsed;
122  if (coctime > 10.0f || tcastime == 999.0f)
123  tcasmode = Bus::TcasEnum::Clear_Of_Conflict;
124  }
125 
126  if (tcasmode != oldtcasmode || tcasmode >= Bus::TcasEnum::RA_Monitor_Climb)
127  {
128  Command command;
129  switch (tcasmode)
130  {
131  case Bus::TcasEnum::Clear_Of_Conflict: command.name = "TCASClear"; break;
132  case Bus::TcasEnum::Traffic_Advisory: command.name = "TCASTraffic"; break;
133  case Bus::TcasEnum::RA_Climb: command.name = "TCASClimb"; break;
134  case Bus::TcasEnum::RA_Descend: command.name = "TCASDescend"; break;
135  default: command.name = "TCASMonitor"; break;
136  }
137  bus->commandStream.emplace_back(command);
138 
139  char msg[999];
140  sprintf_s(msg, 999, "TCAS traffic ordinal %i tti %.1f mode %i",
141  bus->TCASTargetOrdinal, tcastime, tcasmode);
142  logger->Log(msg);
143 
144  secsincelast = 0.0f;
145 
146  if (tcasmode == Bus::TcasEnum::RA_Climb)
147  tcasmode = Bus::TcasEnum::RA_Monitor_Climb;
148  else if (tcasmode == Bus::TcasEnum::RA_Descend)
149  tcasmode = Bus::TcasEnum::RA_Monitor_Descent;
150 
151  bus->TCAS = tcasmode;
152  }
153  }
154 }
#define radiusC
Definition: globals.h:88
void FrameMove(float fElapsedTime) override
Definition: TCAS.cpp:11
Scockpit ourcockpit
Definition: globals.cpp:176
enum Bus::TcasEnum TCAS
float power
Definition: globals.h:608
short TCASTargetOrdinal
Definition: Bus.h:252
std::vector< Command > commandStream
Definition: Bus.h:342
D3DXMATRIX * matrixView
Definition: Module.h:446
D3DXVECTOR3 position
Definition: globals.h:549
Bus::TcasEnum tcasmode
Definition: Module.h:448
Definition: Logger.h:9
TCAS(Bus *prmBus, Logger *prmLogger, D3DXMATRIX *prmMatrixView)
Definition: TCAS.cpp:3
s_network_objects playerships[MAX_SCAN]
Definition: globals.cpp:174
short texturelib
Definition: globals.h:612
float closurerate
Definition: globals.h:590
float coctime
Definition: Module.h:450
TcasEnum
Definition: Bus.h:243
Definition: Bus.h:16
std::string name
Definition: Command.h:11
Logger * logger
Definition: Module.h:445
float scanrange
Definition: globals.h:645
float advanceframe
Definition: Module.h:451
Definition: Module.h:12
Definition: Command.h:5
float olddistance[MAX_SCAN]
Definition: Module.h:452
void Log(const char *msg, Level level=Info, int errorCode=0)
Definition: Logger.cpp:11
Bus * bus
Definition: Module.h:17
float secsincelast
Definition: Module.h:449
unsigned char type
Definition: globals.h:532
bool gndvehicle
Definition: globals.h:604