QFlightInstruments
QFlightInstruments is a Qt library containing flight instruments widgets.
qfi_EADI.h
1 /****************************************************************************//*
2  * Copyright (C) 2021 Marek M. Cel
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom
9  * the Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included
12  * in all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20  * IN THE SOFTWARE.
21  ******************************************************************************/
22 #ifndef QFI_EADI_H
23 #define QFI_EADI_H
24 
26 
27 #include <QGraphicsView>
28 #include <QGraphicsRectItem>
29 #include <QGraphicsSvgItem>
30 
32 
36 class qfi_EADI : public QGraphicsView
37 {
38  Q_OBJECT
39 
40 public:
41 
43  enum class FltMode
44  {
45  Off = 0,
46  FD,
47  CMD
48  };
49 
51  enum class SpdMode
52  {
53  Off = 0,
54  FMC_SPD
55  };
56 
58  enum class LNAV
59  {
60  Off = 0,
61  HDG,
62  NAV,
63  NAV_ARM,
64  APR,
65  APR_ARM,
66  BC,
67  BC_ARM
68  };
69 
71  enum class VNAV
72  {
73  Off = 0,
74  ALT,
75  IAS,
76  VS,
77  ALT_SEL,
78  GS,
79  GS_ARM
80  };
81 
83  enum class PressureMode
84  {
85  STD = 0,
86  MB,
87  IN
88  };
89 
91  explicit qfi_EADI( QWidget *parent = Q_NULLPTR );
92 
94  virtual ~qfi_EADI();
95 
97  void reinit();
98 
100  void redraw();
101 
103  inline void setFltMode( FltMode fltMode )
104  {
105  _fltMode = fltMode;
106  }
107 
109  inline void setSpdMode( SpdMode spdMode )
110  {
111  _spdMode = spdMode;
112  }
113 
115  inline void setLNAV( LNAV lnav )
116  {
117  _lnav = lnav;
118  }
119 
121  inline void setVNAV( VNAV vnav )
122  {
123  _vnav = vnav;
124  }
125 
127  inline void setRoll( double roll )
128  {
129  _adi->setRoll( roll );
130  }
131 
133  inline void setPitch( double pitch )
134  {
135  _adi->setPitch( pitch );
136  }
137 
142  inline void setFPM( double aoa, double sideslip, bool visible = true )
143  {
144  _adi->setFPM( aoa, sideslip, visible );
145  }
146 
148  inline void setSlipSkid( double slipSkid )
149  {
150  _adi->setSlipSkid( slipSkid );
151  }
152 
156  inline void setTurnRate( double turnRate )
157  {
158  _adi->setTurnRate( turnRate );
159  }
160 
166  inline void setDots( double dotH, double dotV, bool visibleH, bool visibleV )
167  {
168  _adi->setDots( dotH, dotV, visibleH, visibleV );
169  }
170 
175  inline void setFD( double roll, double pitch, bool visible = true )
176  {
177  _adi->setFD( roll, pitch, visible );
178  }
179 
181  inline void setStall( bool stall )
182  {
183  _adi->setStall( stall );
184  }
185 
187  inline void setAltitude( double altitude )
188  {
189  _alt->setAltitude( altitude );
190  }
191 
195  inline void setPressure( double pressure, PressureMode pressureMode )
196  {
197  _alt->setPressure( pressure, pressureMode );
198  }
199 
201  inline void setAirspeed( double airspeed )
202  {
203  _asi->setAirspeed( airspeed );
204  }
205 
207  inline void setMachNo( double machNo )
208  {
209  _asi->setMachNo( machNo );
210  }
211 
213  inline void setHeading( double heading )
214  {
215  _hdg->setHeading( heading );
216  }
217 
219  inline void setClimbRate( double climbRate )
220  {
221  _vsi->setClimbRate( climbRate );
222  }
223 
225  inline void setAirspeedSel( double airspeed )
226  {
227  _asi->setAirspeedSel( airspeed );
228  }
229 
231  inline void setAltitudeSel( double altitude )
232  {
233  _alt->setAltitudeSel( altitude );
234  }
235 
237  inline void setHeadingSel( double heading )
238  {
239  _hdg->setHeadingSel( heading );
240  }
241 
243  inline void setVfe( double vfe )
244  {
245  _asi->setVfe( vfe );
246  }
247 
249  inline void setVne( double vne )
250  {
251  _asi->setVne( vne );
252  }
253 
254 protected:
255 
257  void resizeEvent( QResizeEvent *event );
258 
259 private:
260 
261  class ADI;
262  class ALT;
263  class ASI;
264  class HDG;
265  class VSI;
266 
267  QGraphicsScene *_scene;
268 
269  qfi_EADI::ADI *_adi;
270  qfi_EADI::ALT *_alt;
271  qfi_EADI::ASI *_asi;
272  qfi_EADI::HDG *_hdg;
273  qfi_EADI::VSI *_vsi;
274 
275  QGraphicsSvgItem *_itemBack;
276  QGraphicsSvgItem *_itemMask;
277 
278  QGraphicsTextItem *_itemFMA;
279  QGraphicsTextItem *_itemSPD;
280 
281  QGraphicsTextItem *_itemLNAV;
282  QGraphicsTextItem *_itemVNAV;
283 
284  QGraphicsTextItem *_itemLNAV_ARM;
285  QGraphicsTextItem *_itemVNAV_ARM;
286 
287  FltMode _fltMode;
288  SpdMode _spdMode;
289 
290  LNAV _lnav;
291  VNAV _vnav;
292 
293  double _scaleX;
294  double _scaleY;
295 
296  QPointF _originalFMA;
297  QPointF _originalSPD;
298 
299  QPointF _originalLNAV;
300  QPointF _originalVNAV;
301 
302  QPointF _originalLNAV_ARM;
303  QPointF _originalVNAV_ARM;
304 
305  const int _originalHeight;
306  const int _originalWidth;
307 
308  const int _backZ;
309  const int _maskZ;
310  const int _textZ;
311 
312  void init();
313 
314  void reset();
315 
316  void updateView();
317 
319  class ADI
320  {
321  public:
322  ADI( QGraphicsScene *scene );
323 
324  void init( double scaleX, double scaleY );
325  void update( double scaleX, double scaleY );
326 
327  void setRoll( double roll );
328  void setPitch( double pitch );
329  void setFPM( double aoa, double sideslip, bool visible = true );
330  void setSlipSkid( double slipSkid );
331  void setTurnRate( double turnRate );
332  void setDots( double dotH, double dotV, bool visibleH, bool visibleV );
333  void setFD( double roll, double pitch, bool visible = true );
334  void setStall( bool stall );
335 
336  private:
337 
338  QGraphicsScene *_scene;
339 
340  QGraphicsSvgItem *_itemBack;
341  QGraphicsSvgItem *_itemLadd;
342  QGraphicsSvgItem *_itemRoll;
343  QGraphicsSvgItem *_itemSlip;
344  QGraphicsSvgItem *_itemTurn;
345  QGraphicsSvgItem *_itemDotH;
346  QGraphicsSvgItem *_itemDotV;
347  QGraphicsSvgItem *_itemFD;
348  QGraphicsSvgItem *_itemStall;
349  QGraphicsSvgItem *_itemMask;
350  QGraphicsSvgItem *_itemScaleH;
351  QGraphicsSvgItem *_itemScaleV;
352  QGraphicsSvgItem *_itemFPM;
353  QGraphicsSvgItem *_itemFPMX;
354 
355  double _roll;
356  double _pitch;
357  double _slipSkid;
358  double _turnRate;
359  double _dotH;
360  double _dotV;
361  double _fdRoll;
362  double _fdPitch;
363  double _angleOfAttack;
364  double _sideslipAngle;
365 
366  bool _fpmValid;
367 
368  bool _fpmVisible;
369  bool _dotVisibleH;
370  bool _dotVisibleV;
371  bool _fdVisible;
372 
373  bool _stall;
374 
375  double _laddDeltaX_new;
376  double _laddDeltaX_old;
377  double _laddDeltaY_new;
378  double _laddDeltaY_old;
379  double _laddBackDeltaX_new;
380  double _laddBackDeltaX_old;
381  double _laddBackDeltaY_new;
382  double _laddBackDeltaY_old;
383  double _slipDeltaX_new;
384  double _slipDeltaX_old;
385  double _slipDeltaY_new;
386  double _slipDeltaY_old;
387  double _turnDeltaX_new;
388  double _turnDeltaX_old;
389  double _dotHDeltaX_new;
390  double _dotHDeltaX_old;
391  double _dotVDeltaY_new;
392  double _dotVDeltaY_old;
393  double _fdDeltaX_new;
394  double _fdDeltaX_old;
395  double _fdDeltaY_new;
396  double _fdDeltaY_old;
397  double _fpmDeltaX_new;
398  double _fpmDeltaX_old;
399  double _fpmDeltaY_new;
400  double _fpmDeltaY_old;
401  double _fpmxDeltaX_new;
402  double _fpmxDeltaX_old;
403  double _fpmxDeltaY_new;
404  double _fpmxDeltaY_old;
405 
406  double _scaleX;
407  double _scaleY;
408 
409  const double _originalPixPerDeg;
410  const double _deltaLaddBack_max;
411  const double _deltaLaddBack_min;
412  const double _maxSlipDeflection;
413  const double _maxTurnDeflection;
414  const double _maxDotsDeflection;
415 
416  QPointF _originalAdiCtr;
417  QPointF _originalBackPos;
418  QPointF _originalLaddPos;
419  QPointF _originalRollPos;
420  QPointF _originalSlipPos;
421  QPointF _originalTurnPos;
422  QPointF _originalDotHPos;
423  QPointF _originalDotVPos;
424  QPointF _originalFdPos;
425  QPointF _originalStallPos;
426  QPointF _originalScaleHPos;
427  QPointF _originalScaleVPos;
428  QPointF _originalFpmPos;
429 
430  const int _backZ;
431  const int _laddZ;
432  const int _rollZ;
433  const int _slipZ;
434  const int _fpmZ;
435  const int _dotsZ;
436  const int _fdZ;
437  const int _scalesZ;
438  const int _maskZ;
439  const int _turnZ;
440  const int _stallZ;
441 
442  void reset();
443 
444  void updateLadd( double delta, double sinRoll, double cosRoll );
445  void updateLaddBack( double delta, double sinRoll, double cosRoll );
446  void updateRoll();
447  void updateSlipSkid( double sinRoll, double cosRoll );
448  void updateTurnRate();
449  void updateDots();
450  void updateFD( double sinRoll, double cosRoll );
451  void updateStall();
452  void updateFPM();
453  };
454 
456  class ALT
457  {
458  public:
459  ALT( QGraphicsScene *scene );
460 
461  void init( double scaleX, double scaleY );
462  void update( double scaleX, double scaleY );
463 
464  void setAltitude( double altitude );
465  void setPressure( double pressure, qfi_EADI::PressureMode pressureMode );
466  void setAltitudeSel( double altitude );
467 
468  private:
469 
470  QGraphicsScene *_scene;
471 
472  QGraphicsSvgItem *_itemBack;
473  QGraphicsSvgItem *_itemScale1;
474  QGraphicsSvgItem *_itemScale2;
475  QGraphicsTextItem *_itemLabel1;
476  QGraphicsTextItem *_itemLabel2;
477  QGraphicsTextItem *_itemLabel3;
478  QGraphicsSvgItem *_itemGround;
479  QGraphicsSvgItem *_itemBugAlt;
480  QGraphicsSvgItem *_itemFrame;
481  QGraphicsTextItem *_itemAltitude;
482  QGraphicsTextItem *_itemPressure;
483  QGraphicsTextItem *_itemSetpoint;
484 
485  double _altitude;
486  double _pressure;
487  double _altitude_sel;
488 
489  qfi_EADI::PressureMode _pressureMode;
490 
491  double _scale1DeltaY_new;
492  double _scale1DeltaY_old;
493  double _scale2DeltaY_new;
494  double _scale2DeltaY_old;
495  double _groundDeltaY_new;
496  double _groundDeltaY_old;
497  double _labelsDeltaY_new;
498  double _labelsDeltaY_old;
499  double _bugDeltaY_new;
500  double _bugDeltaY_old;
501 
502  double _scaleX;
503  double _scaleY;
504 
505  const double _originalPixPerAlt;
506  const double _originalScaleHeight;
507  const double _originalLabelsX;
508  const double _originalLabel1Y;
509  const double _originalLabel2Y;
510  const double _originalLabel3Y;
511 
512  QPointF _originalBackPos;
513  QPointF _originalScale1Pos;
514  QPointF _originalScale2Pos;
515  QPointF _originalGroundPos;
516  QPointF _originalFramePos;
517  QPointF _originalAltitudeCtr;
518  QPointF _originalPressureCtr;
519  QPointF _originalAltitudeSet;
520 
521  const int _backZ;
522  const int _scaleZ;
523  const int _labelsZ;
524  const int _groundZ;
525  const int _altBugZ;
526  const int _frameZ;
527  const int _frameTextZ;
528 
529  void reset();
530 
531  void updateAltitude();
532  void updatePressure();
533  void updateAltitudeBug();
534  void updateScale();
535  void updateScaleLabels();
536  };
537 
539  class ASI
540  {
541  public:
542  ASI( QGraphicsScene *scene );
543 
544  void init( double scaleX, double scaleY );
545  void update( double scaleX, double scaleY );
546 
547  void setAirspeed( double airspeed );
548  void setMachNo( double machNo );
549  void setAirspeedSel( double airspeed );
550  void setVfe( double vfe );
551  void setVne( double vne );
552 
553  private:
554 
555  QGraphicsScene *_scene;
556 
557  QGraphicsSvgItem *_itemBack;
558  QGraphicsSvgItem *_itemScale1;
559  QGraphicsSvgItem *_itemScale2;
560  QGraphicsTextItem *_itemLabel1;
561  QGraphicsTextItem *_itemLabel2;
562  QGraphicsTextItem *_itemLabel3;
563  QGraphicsTextItem *_itemLabel4;
564  QGraphicsTextItem *_itemLabel5;
565  QGraphicsTextItem *_itemLabel6;
566  QGraphicsTextItem *_itemLabel7;
567  QGraphicsSvgItem *_itemBugIAS;
568  QGraphicsSvgItem *_itemFrame;
569  QGraphicsRectItem *_itemVfe;
570  QGraphicsSvgItem *_itemVne;
571  QGraphicsTextItem *_itemAirspeed;
572  QGraphicsTextItem *_itemMachNo;
573  QGraphicsTextItem *_itemSetpoint;
574 
575  QBrush _vfeBrush;
576  QPen _vfePen;
577 
578  double _airspeed;
579  double _machNo;
580  double _airspeed_sel;
581  double _vfe;
582  double _vne;
583 
584  double _scale1DeltaY_new;
585  double _scale1DeltaY_old;
586  double _scale2DeltaY_new;
587  double _scale2DeltaY_old;
588  double _labelsDeltaY_new;
589  double _labelsDeltaY_old;
590  double _bugDeltaY_new;
591  double _bugDeltaY_old;
592  double _vneDeltaY_new;
593  double _vneDeltaY_old;
594 
595  double _scaleX;
596  double _scaleY;
597 
598  const double _originalPixPerSpd;
599  const double _originalScaleHeight;
600  const double _originalLabelsX;
601  const double _originalLabel1Y;
602  const double _originalLabel2Y;
603  const double _originalLabel3Y;
604  const double _originalLabel4Y;
605  const double _originalLabel5Y;
606  const double _originalLabel6Y;
607  const double _originalLabel7Y;
608  const double _originalVfeWidth;
609 
610  QPointF _originalBackPos;
611  QPointF _originalScale1Pos;
612  QPointF _originalScale2Pos;
613  QPointF _originalFramePos;
614  QPointF _originalAirspeedCtr;
615  QPointF _originalMachNoCtr;
616  QPointF _originalAirspeedSet;
617  QPointF _originalVfePos;
618 
619  const int _backZ;
620  const int _scaleZ;
621  const int _labelsZ;
622  const int _iasBugZ;
623  const int _iasVfeZ;
624  const int _iasVneZ;
625  const int _frameZ;
626  const int _frameTextZ;
627 
628  void reset();
629 
630  void updateAirspeed();
631  void updateAirspeedBug();
632  void updateScale();
633  void updateScaleLabels();
634  void updateVfe();
635  void updateVne();
636  };
637 
639  class HDG
640  {
641  public:
642  HDG( QGraphicsScene *scene );
643 
644  void init( double scaleX, double scaleY );
645  void update( double scaleX, double scaleY );
646 
647  void setHeading( double heading );
648  void setHeadingSel( double heading );
649 
650  private:
651 
652  QGraphicsScene *_scene;
653 
654  QGraphicsSvgItem *_itemBack;
655  QGraphicsSvgItem *_itemFace;
656  QGraphicsSvgItem *_itemHdgBug;
657  QGraphicsSvgItem *_itemMarks;
658  QGraphicsTextItem *_itemFrameText;
659 
660  double _heading;
661  double _heading_sel;
662 
663  double _scaleX;
664  double _scaleY;
665 
666  QPointF _originalHsiCtr;
667  QPointF _originalBackPos;
668  QPointF _originalFacePos;
669  QPointF _originalBugPos;
670  QPointF _originalMarksPos;
671  QPointF _originalFrameTextCtr;
672 
673  const int _backZ;
674  const int _faceZ;
675  const int _hdgBugZ;
676  const int _marksZ;
677  const int _frameTextZ;
678 
679  void reset();
680 
681  void updateHeading();
682  };
683 
685  class VSI
686  {
687  public:
688  VSI( QGraphicsScene *scene );
689 
690  void init( double scaleX, double scaleY );
691  void update( double scaleX, double scaleY );
692 
693  void setClimbRate( double climbRate );
694 
695  private:
696 
697  QGraphicsScene *_scene;
698 
699  QGraphicsSvgItem *_itemScale;
700  QGraphicsRectItem *_itemMarker;
701 
702  double _climbRate;
703 
704  double _scaleX;
705  double _scaleY;
706 
707  const double _originalMarkerWidth;
708  const double _originalPixPerSpd1;
709  const double _originalPixPerSpd2;
710  const double _originalPixPerSpd4;
711 
712  QPointF _originalScalePos;
713  QPointF _originalMarkerPos;
714 
715  QBrush _markerBrush;
716 
717  QPen _markerPen;
718 
719  const int _scaleZ;
720  const int _markerZ;
721 
722  void reset();
723 
724  void updateVSI();
725  };
726 };
727 
729 
730 #endif // QFI_EADI_H
qfi_EADI::VNAV
VNAV
Definition: qfi_EADI.h:71
qfi_EADI::PressureMode
PressureMode
Definition: qfi_EADI.h:83
qfi_EADI::setAltitude
void setAltitude(double altitude)
Definition: qfi_EADI.h:187
qfi_EADI::setVfe
void setVfe(double vfe)
Definition: qfi_EADI.h:243
qfi_EADI::setFPM
void setFPM(double aoa, double sideslip, bool visible=true)
Definition: qfi_EADI.h:142
qfi_EADI::LNAV
LNAV
Definition: qfi_EADI.h:58
qfi_EADI::~qfi_EADI
virtual ~qfi_EADI()
Destructor.
Definition: qfi_EADI.cpp:102
qfi_EADI::setRoll
void setRoll(double roll)
Definition: qfi_EADI.h:127
qfi_EADI::setFltMode
void setFltMode(FltMode fltMode)
Definition: qfi_EADI.h:103
qfi_EADI::setVne
void setVne(double vne)
Definition: qfi_EADI.h:249
qfi_EADI::setFD
void setFD(double roll, double pitch, bool visible=true)
Definition: qfi_EADI.h:175
qfi_EADI::setAirspeed
void setAirspeed(double airspeed)
Definition: qfi_EADI.h:201
qfi_EADI::setAirspeedSel
void setAirspeedSel(double airspeed)
Definition: qfi_EADI.h:225
qfi_EADI::PressureMode::STD
@ STD
standard (displays STD instead of numerical value)
qfi_EADI::setPressure
void setPressure(double pressure, PressureMode pressureMode)
Definition: qfi_EADI.h:195
qfi_EADI::setHeadingSel
void setHeadingSel(double heading)
Definition: qfi_EADI.h:237
qfi_EADI::setDots
void setDots(double dotH, double dotV, bool visibleH, bool visibleV)
Definition: qfi_EADI.h:166
qfi_EADI::setTurnRate
void setTurnRate(double turnRate)
Definition: qfi_EADI.h:156
qfi_EADI::setPitch
void setPitch(double pitch)
Definition: qfi_EADI.h:133
qfi_EADI::PressureMode::MB
@ MB
milibars
qfi_EADI::setHeading
void setHeading(double heading)
Definition: qfi_EADI.h:213
qfi_EADI::setSlipSkid
void setSlipSkid(double slipSkid)
Definition: qfi_EADI.h:148
qfi_EADI::reinit
void reinit()
Definition: qfi_EADI.cpp:131
qfi_EADI::qfi_EADI
qfi_EADI(QWidget *parent=Q_NULLPTR)
Constructor.
Definition: qfi_EADI.cpp:36
qfi_EADI::setStall
void setStall(bool stall)
Definition: qfi_EADI.h:181
qfi_EADI::SpdMode
SpdMode
Definition: qfi_EADI.h:51
qfi_EADI::setAltitudeSel
void setAltitudeSel(double altitude)
Definition: qfi_EADI.h:231
qfi_EADI::PressureMode::IN
@ IN
inches of mercury
qfi_EADI::setMachNo
void setMachNo(double machNo)
Definition: qfi_EADI.h:207
qfi_EADI::FltMode
FltMode
Definition: qfi_EADI.h:43
qfi_EADI
This class provides EADI widget class.
Definition: qfi_EADI.h:36
qfi_EADI::redraw
void redraw()
Definition: qfi_EADI.cpp:143
qfi_EADI::setClimbRate
void setClimbRate(double climbRate)
Definition: qfi_EADI.h:219
qfi_EADI::setSpdMode
void setSpdMode(SpdMode spdMode)
Definition: qfi_EADI.h:109