Rise
The Vieneo Province
FMA.cpp
Go to the documentation of this file.
1 #include "../Instrument.h"
2 #include "../../Bus.h"
3 
4 FMA::FMA(int prmX, int prmY, float prmXScale, float prmYScale, Bus* prmBus, Logger* prmLogger, DeviceObject* prmDevice, std::vector<Font*> prmFonts) :
5  Instrument(prmX, prmY, prmXScale, prmYScale, prmBus, prmLogger, prmDevice, prmFonts)
6 {
7  logger->AddToCallStack("FMA::ctor");
8  defaultFont = 1;
9 
10  lateralBox = new Sprite(logger, pDevice, "Textures/Instruments/fma-box.png", prmX, prmY, 0.92f, 0, 0, 51, 54, 0xFFFFFFFF);
11  verticalBox = new Sprite(logger, pDevice, "Textures/Instruments/fma-box.png", prmX + 52, prmY, 0.92f, 0, 0, 51, 54, 0xFFFFFFFF);
12  lateralModeBarCurrent = new Sprite(logger, pDevice, "Textures/Instruments/cas-bar.png", prmX + 2, prmY + 20, 0.93f, 0, 0, 47, 14, 0xFFFFFFFF);
13  verticalModeBarCurrent = new Sprite(logger, pDevice, "Textures/Instruments/cas-bar.png", prmX + 54, prmY + 20, 0.93f, 0, 0, 47, 14, 0xFFFFFFFF);
14  lateralSetBar = new Sprite(logger, pDevice, "Textures/Instruments/cas-bar.png", prmX + 2, prmY + 38, 0.93f, 0, 0, 47, 14, 0xFFFFFFFF);
15  verticalSetBar = new Sprite(logger, pDevice, "Textures/Instruments/cas-bar.png", prmX + 54, prmY + 38, 0.93f, 0, 0, 47, 14, 0xFFFFFFFF);
16 }
17 
19 {
20  lateralBox->Draw();
23 
25  DrawTextW(L"LOC", 2, 3, 0.95f, DT_CENTER, 0xFFAAAAAA, 1, "", 47, 15);
26  DrawTextW(lateralModeText, 2, 20, 0.95f, DT_CENTER, lateralModeTextColor, 1, "", 47, 15);
27  DrawTextW(lateralSetText, 2, 38, 0.95f, DT_CENTER, lateralSetTextColor, 1, "", 47, 15);
28 
29  verticalBox->Draw();
32 
34  DrawTextW(L"G/S", 54, 3, 0.95f, DT_CENTER, 0xFFAAAAAA, 1, "", 47, 15);
35  DrawTextW(verticalModeText, 54, 20, 0.95f, DT_CENTER, verticalModeTextColor, 1, "", 47, 15);
36  DrawTextW(verticalSetText, 54, 38, 0.95f, DT_CENTER, verticalSetTextColor, 1, "", 47, 15);
37 }
38 
39 void FMA::FrameMove(float fElapsed)
40 {
42  {
43  verticalModeTimer = 0.0f; // reset
44  verticalSetTimer = 0.0f; // reset
46  }
47  verticalModeTimer += fElapsed;
48  if (verticalModeTimer <= 3.0f)
49  {
50  verticalModeTextColor = 0xFF000000; // black
51  verticalModeBackColor = 0xFF00FF00; // green
52  }
53  else
54  {
55  verticalModeTextColor = 0xFF00FF00;
56  verticalModeBackColor = 0xFF000000;
57  }
58  verticalSetTimer += fElapsed;
59  if (verticalSetTimer <= 3.0f)
60  {
61  verticalSetTextColor = 0xFF000000; // black
62  verticalSetBackColor = 0xFF00FFFF; // cyan
63  }
64  else
65  {
66  verticalSetTextColor = 0xFF00FFFF;
67  verticalSetBackColor = 0xFF000000;
68  }
69 
71  {
72  lateralModeTimer = 0.0f; // reset
73  lateralSetTimer = 0.0f; // reset
75  }
76  lateralModeTimer += fElapsed;
77  if (lateralModeTimer <= 3.0f)
78  {
79  lateralModeTextColor = 0xFF000000; // black
80  lateralModeBackColor = 0xFF00FF00; // green
81  }
82  else
83  {
84  lateralModeTextColor = 0xFF00FF00;
85  lateralModeBackColor = 0xFF000000;
86  }
87  lateralSetTimer += fElapsed;
88  if (lateralSetTimer <= 3.0f)
89  {
90  lateralSetTextColor = 0xFF000000; // black
91  lateralSetBackColor = 0xFF00FFFF; // cyan
92  }
93  else
94  {
95  lateralSetTextColor = 0xFF00FFFF;
96  lateralSetBackColor = 0xFF000000;
97  }
98 
99  float newVerticalSetValue = 0.0f;
100  // ReSharper disable once CppDefaultCaseNotHandledInSwitchStatement
101  // ReSharper disable once CppIncompleteSwitchStatement
102  switch (bus->AFCS.CurrentVerticalMode)
103  {
104  case Bus::Afcs::VerticalModes::VerticalMode_TakeOff:
105  {
106  wcscpy_s(verticalModeText, 10, L"T/O");
107  verticalSetText[0] = 0;
108  newVerticalSetValue = 0.0f;
109  }
110  break;
111  case Bus::Afcs::VerticalModes::VerticalMode_Off:
112  {
113  if (bus->AFCS.TvmOn)
114  wcscpy_s(verticalModeText, 10, L"TVM");
115  else if (bus->AFCS.DorOn)
116  wcscpy_s(verticalModeText, 10, L"DOR");
117  else
118  verticalModeText[0] = 0;
119  verticalSetText[0] = 0;
120  newVerticalSetValue = 0.0f;
121  }
122  break;
123  case Bus::Afcs::VerticalModes::Pitch:
124  {
125  newVerticalSetValue = D3DXToDegree(bus->AFCS.DesiredPitchRadians);
126 
127  wcscpy_s(verticalModeText, 10, L"PIT");
128 
129  WCHAR arrow;
130  if (newVerticalSetValue >= 0.05f)
131  arrow = L'\u2191'; // up arrow
132  else if (newVerticalSetValue <= -0.05f)
133  arrow = L'\u2193'; // down arrow
134  else
135  arrow = L' '; // space
136 
137  swprintf_s(verticalSetText, 10, L"%c%4.1f°", arrow, fabsf(newVerticalSetValue));
138  }
139  break;
140  case Bus::Afcs::VerticalModes::VerticalSpeed:
141  {
142  newVerticalSetValue = bus->AFCS.DesiredVsiKms;
143 
144  wcscpy_s(verticalModeText, 10, L"VS");
145 
146  WCHAR arrow;
147  if (newVerticalSetValue >= 0.0005f)
148  arrow = L'\u2191'; // up arrow
149  else if (newVerticalSetValue <= -0.0005f)
150  arrow = L'\u2193'; // down arrow
151  else
152  arrow = L' '; // space
153 
154  swprintf_s(verticalSetText, 10, L"%c%5.3f", arrow, fabsf(newVerticalSetValue));
155  }
156  break;
157  case Bus::Afcs::VerticalModes::SpeedPitch:
158  {
159  newVerticalSetValue = bus->AFCS.DesiredIasKms*1000.0f; // meters per second
160 
161  wcscpy_s(verticalModeText, 10, L"SPD");
162 
163  swprintf_s(verticalSetText, 10, L"%4.0f", newVerticalSetValue);
164  }
165  break;
166  case Bus::Afcs::VerticalModes::AltitudeMsl:
167  {
168  wcscpy_s(verticalModeText, 10, L"MSL");
169 
170  swprintf_s(verticalSetText, 10, L"%7.3f", bus->AFCS.DesiredAltitudeKm);
171  newVerticalSetValue = bus->AFCS.DesiredAltitudeKm;
172  }
173  break;
174  case Bus::Afcs::VerticalModes::AltitudeAgl:
175  {
176  wcscpy_s(verticalModeText, 10, L"AGL");
177 
178  swprintf_s(verticalSetText, 10, L"%7.3f", bus->AFCS.DesiredAltitudeKm);
179  newVerticalSetValue = bus->AFCS.DesiredAltitudeKm;
180  }
181  break;
182  case Bus::Afcs::VerticalModes::GlideSlope:
183  {
184  wcscpy_s(verticalModeText, 10, L"G/S");
185 
186  verticalSetText[0] = 0;
187  newVerticalSetValue = 0.0f;
188  }
189  break;
190  }
191  if (newVerticalSetValue != oldVerticalSetValue)
192  {
193  verticalSetTimer = 0.0f;
194  oldVerticalSetValue = newVerticalSetValue;
195  }
196 
197  float newLateralSetValue = 0.0f;
198  // ReSharper disable once CppDefaultCaseNotHandledInSwitchStatement
199  // ReSharper disable once CppIncompleteSwitchStatement
200  switch (bus->AFCS.CurrentLateralMode)
201  {
202  case Bus::Afcs::LateralModes::LateralMode_TakeOff:
203  {
204  wcscpy_s(lateralModeText, 10, L"T/O");
205  lateralSetText[0] = 0;
206  newLateralSetValue = 0.0f;
207  }
208  break;
209  case Bus::Afcs::LateralModes::LateralMode_Off:
210  {
211  if (bus->AFCS.TvmOn)
212  wcscpy_s(lateralModeText, 10, L"TVM");
213  else if (bus->AFCS.DorOn)
214  wcscpy_s(lateralModeText, 10, L"DOR");
215  else
216  lateralModeText[0] = 0;
217  lateralSetText[0] = 0;
218  newLateralSetValue = 0.0f;
219  }
220  break;
221  case Bus::Afcs::LateralModes::Roll:
222  {
223  newLateralSetValue = D3DXToDegree(bus->AFCS.DesiredRollRadians);
224 
225  wcscpy_s(lateralModeText, 10, L"ROL");
226 
227  WCHAR arrow;
228  if (newLateralSetValue >= 0.05f)
229  arrow = L'\u2192'; // right arrow
230  else if (newLateralSetValue <= -0.05f)
231  arrow = L'\u2190'; // left arrow
232  else
233  arrow = L' '; // space
234 
235  swprintf_s(lateralSetText, 10, L"%c%4.1f°", arrow, fabsf(newLateralSetValue));
236  }
237  break;
238  case Bus::Afcs::LateralModes::Heading:
239  {
240  newLateralSetValue = D3DXToDegree(bus->AFCS.DesiredHeadingRadians);
241 
242  wcscpy_s(lateralModeText, 10, L"HDG");
243 
244  swprintf_s(lateralSetText, 10, L"%03.0f", newLateralSetValue);
245  }
246  break;
247  case Bus::Afcs::LateralModes::Navigation:
248  {
249  newLateralSetValue = D3DXToDegree(bus->AFCS.DesiredCourseRadians);
250 
251  wcscpy_s(lateralModeText, 10, L"NAV");
252 
253  swprintf_s(lateralSetText, 10, L"%03.0f", newLateralSetValue);
254  }
255  break;
256  case Bus::Afcs::LateralModes::Localizer:
257  {
258  newLateralSetValue = D3DXToDegree(bus->AFCS.DesiredCourseRadians);
259 
260  wcscpy_s(lateralModeText, 10, L"LOC");
261 
262  swprintf_s(lateralSetText, 10, L"%03.0f", newLateralSetValue);
263  }
264  break;
265  }
266  if (newLateralSetValue != oldLateralSetValue)
267  {
268  lateralSetTimer = 0.0f;
269  oldLateralSetValue = newLateralSetValue;
270  }
271 }
272 
273 /*
274 void FlightModeAnnunciator::Render(float fElapsed)
275 {
276  DWORD apTextColor = 0xFF00FF00;
277  DWORD apBackColor = 0xFF000000;
278  if (oldAutopilotEngaged != bus->AFCS.AutopilotEngaged)
279  {
280  autopilotModeTimer = 0.0f;
281  oldAutopilotEngaged = bus->AFCS.AutopilotEngaged;
282  }
283  autopilotModeTimer += fElapsed;
285  if (autopilotModeTimer <= 3.0f)
286  {
287  if (bus->AFCS.AutopilotEngaged)
288  {
289  apTextColor = 0xFF000000;
290  apBackColor = 0xFF00FF00;
291  }
292  else if (fmodf(autopilotModeTimer, 0.5f) < 0.25f)
293  apTextColor = 0xFFFFFFFF;
294  else
295  apTextColor = 0xFF000000;
296  }
297 
298  DrawTextW(L"→", 129 - 26, 33 + 9, DT_NOCLIP, 0xFF00FF00, 2, "Autopilot");
299 
300 
302  pixel.x = 129;
303  pixel.y = 34;
304  pixel.width = 82;
305  pixel.height = 27;
306  pixel.color = apBackColor;
307  pixel.Update();
308  pixel.Draw();
309  if (bus->AFCS.AutopilotEngaged || autopilotModeTimer <= 3.0f)
310  DrawTextW(L"AP", 129 + 27, 33, DT_NOCLIP, apTextColor, 1, "Autopilot");
311  if (bus->AFCS.AutothrottleEngaged || autopilotModeTimer <= 3.0f)
312  DrawTextW(L"AT", 129 + 27, 63, DT_NOCLIP, apTextColor, 1, "Autothrottle");
313 };
314 */
float verticalModeTimer
Definition: Instrument.h:303
float DesiredVsiKms
Definition: Bus.h:113
struct Bus::Afcs AFCS
Sprite * verticalBox
Definition: Instrument.h:295
Definition: Logger.h:9
Sprite * lateralBox
Definition: Instrument.h:292
enum Bus::Afcs::LateralModes CurrentLateralMode
float verticalSetTimer
Definition: Instrument.h:305
DWORD verticalSetBackColor
Definition: Instrument.h:317
bool DorOn
Definition: Bus.h:130
float oldVerticalSetValue
Definition: Instrument.h:301
WCHAR verticalSetText[10]
Definition: Instrument.h:313
float DesiredCourseRadians
Definition: Bus.h:115
DeviceObject * pDevice
Definition: Instrument.h:17
void FrameMove(float fElapsed) override
Definition: FMA.cpp:39
FMA(int prmX, int prmY, float prmXScale, float prmYScale, Bus *prmBus, Logger *prmLogger, DeviceObject *prmDevice, std::vector< Font *> prmFonts)
Definition: FMA.cpp:4
void Draw(D3DXCOLOR prmColor)
Definition: Sprite.cpp:66
float DesiredRollRadians
Definition: Bus.h:116
float DesiredIasKms
Definition: Bus.h:120
WCHAR verticalModeText[10]
Definition: Instrument.h:312
float lateralSetTimer
Definition: Instrument.h:304
Definition: Bus.h:16
Sprite * lateralSetBar
Definition: Instrument.h:294
int oldActiveVerticalMode
Definition: Instrument.h:299
Definition: Sprite.h:7
Bus * bus
Definition: Instrument.h:18
float oldLateralSetValue
Definition: Instrument.h:300
float DesiredPitchRadians
Definition: Bus.h:117
Sprite * lateralModeBarCurrent
Definition: Instrument.h:293
DWORD lateralSetTextColor
Definition: Instrument.h:314
UINT defaultFont
Definition: Instrument.h:20
DWORD verticalSetTextColor
Definition: Instrument.h:316
enum Bus::Afcs::VerticalModes CurrentVerticalMode
DWORD lateralModeBackColor
Definition: Instrument.h:307
WCHAR lateralModeText[10]
Definition: Instrument.h:310
enum Bus::Afcs::VerticalModes StandbyVerticalMode
float DesiredAltitudeKm
Definition: Bus.h:118
void Render() override
Definition: FMA.cpp:18
DWORD verticalModeTextColor
Definition: Instrument.h:308
Logger * logger
Definition: Instrument.h:19
bool TvmOn
Definition: Bus.h:126
DWORD lateralSetBackColor
Definition: Instrument.h:315
float lateralModeTimer
Definition: Instrument.h:302
float DesiredHeadingRadians
Definition: Bus.h:114
WCHAR lateralSetText[10]
Definition: Instrument.h:311
DWORD lateralModeTextColor
Definition: Instrument.h:306
Sprite * verticalSetBar
Definition: Instrument.h:297
enum Bus::Afcs::LateralModes StandbyLateralMode
int oldActiveLateralMode
Definition: Instrument.h:298
void AddToCallStack(const char *msg)
Definition: Logger.cpp:86
DWORD verticalModeBackColor
Definition: Instrument.h:309
Sprite * verticalModeBarCurrent
Definition: Instrument.h:296