]> git.mxchange.org Git - flightgear.git/blob - src/Instrumentation/annunciator.cxx
don't be afraid of the comma operator!
[flightgear.git] / src / Instrumentation / annunciator.cxx
1 // annunciator.hxx - manage the annunciator states
2 // Written by Curtis Olson, started May, 2003.
3
4 #include <math.h>
5
6 #include <simgear/math/interpolater.hxx>
7
8 #include <Main/fg_props.hxx>
9 #include <Main/util.hxx>
10
11 #include "annunciator.hxx"
12
13
14 Annunciator::Annunciator ():
15     timer0( 0.0 ),
16     timer1( 0.0 ),
17     timer2( 0.0 ),
18     timer3( 0.0 ),
19     timer4( 0.0 )
20 {
21 }
22
23 Annunciator::~Annunciator ()
24 {
25 }
26
27 void
28 Annunciator::init ()
29 {
30     _volts = fgGetNode( "/systems/electrical/volts", true );
31     _vac_l = fgGetNode( "/systems/vacuum[0]/suction-inhg", true );
32     _vac_r = fgGetNode( "/systems/vacuum[1]/suction-inhg", true );
33     _fuel_l = fgGetNode( "/consumables/fuel/tank[0]/level-gal_us", true );
34     _fuel_r = fgGetNode( "/consumables/fuel/tank[1]/level-gal_us", true );
35     _oil_px = fgGetNode( "/engines/engine[0]/oil-pressure-psi", true );
36     _elec_serv = fgGetNode( "/systems/electrical/serviceable", true );
37
38     _ann_volts = fgGetNode( "/instrumentation/annunciator/volts", true );
39     _ann_vac_l = fgGetNode( "/instrumentation/annunciator/vacuum-left", true );
40     _ann_vac_r = fgGetNode( "/instrumentation/annunciator/vacuum-right", true );
41     _ann_fuel_l = fgGetNode( "/instrumentation/annunciator/fuel-left", true );
42     _ann_fuel_r = fgGetNode( "/instrumentation/annunciator/fuel-right", true );
43     _ann_oil_px = fgGetNode( "/instrumentation/annunciator/oil-pressure", true );
44 }
45
46 void
47 Annunciator::update (double dt)
48 {
49     // timers
50     timer0 += dt;
51     timer1 += dt;
52     timer2 += dt;
53     timer3 += dt;
54     timer4 += dt;
55
56     if ( _volts->getDoubleValue() < 5.0 || !_elec_serv->getBoolValue() ) {
57         // Not enough juice to illuminate the display
58         _ann_volts->setBoolValue( false );
59         _ann_vac_l->setBoolValue( false );
60         _ann_vac_r->setBoolValue( false );
61         _ann_fuel_l->setBoolValue( false );
62         _ann_fuel_r->setBoolValue( false );
63         _ann_oil_px->setBoolValue( false );
64     } else {
65         // Volts
66         if ( _volts->getDoubleValue() < 24.5 ) {
67             if ( timer1 < 10 ) { 
68                 double rem = timer0 - (int)timer0;
69                 if ( rem <= 0.5 ) {
70                     _ann_volts->setBoolValue( true );
71                 } else {
72                     _ann_volts->setBoolValue( false );
73                 }
74             } else {
75                 _ann_volts->setBoolValue( true );
76             }
77         } else {
78             _ann_volts->setBoolValue( false );
79             timer1 = 0.0;
80         }
81
82         if ( _fuel_l->getDoubleValue() < 5.0
83              && _fuel_r->getDoubleValue() < 5.0 )
84         {
85             if ( timer2 < 10 ) {
86                 double rem = timer0 - (int)timer0;
87                 if ( rem <= 0.5 ) {
88                     _ann_fuel_l->setBoolValue( true );
89                     _ann_fuel_r->setBoolValue( true );
90                 } else {
91                     _ann_fuel_l->setBoolValue( false );
92                     _ann_fuel_r->setBoolValue( false );
93                 }
94             } else {
95                 _ann_fuel_l->setBoolValue( true );
96                 _ann_fuel_r->setBoolValue( true );
97             }
98         } else if ( _fuel_l->getDoubleValue() < 5.0 ) {
99             if ( timer2 < 10 ) {
100                 double rem = timer0 - (int)timer0;
101                 if ( rem <= 0.5 ) {
102                     _ann_fuel_l->setBoolValue( true );
103                 } else {
104                     _ann_fuel_l->setBoolValue( false );
105                 }
106             } else {
107                 _ann_fuel_l->setBoolValue( true );
108             }
109             _ann_fuel_r->setBoolValue( false );
110         } else if ( _fuel_r->getDoubleValue() < 5.0 ) {
111             if ( timer2 < 10 ) {
112                 double rem = timer0 - (int)timer0;
113                 if ( rem <= 0.5 ) {
114                     _ann_fuel_r->setBoolValue( true );
115                 } else {
116                     _ann_fuel_r->setBoolValue( false );
117                 }
118             } else {
119                 _ann_fuel_r->setBoolValue( true );
120             }
121             _ann_fuel_l->setBoolValue( false );
122         } else {
123             _ann_fuel_l->setBoolValue( false );
124             _ann_fuel_r->setBoolValue( false );
125             timer2 = 0.0;
126         }
127
128         // vacuum pumps
129         if ( _vac_l->getDoubleValue() < 3.0
130              && _vac_r->getDoubleValue() < 3.0 )
131         {
132             if ( timer3 < 10 ) {
133                 double rem = timer0 - (int)timer0;
134                 if ( rem <= 0.5 ) {
135                     _ann_vac_l->setBoolValue( true );
136                     _ann_vac_r->setBoolValue( true );
137                 } else {
138                     _ann_vac_l->setBoolValue( false );
139                     _ann_vac_r->setBoolValue( false );
140                 }
141             } else {
142                 _ann_vac_l->setBoolValue( true );
143                 _ann_vac_r->setBoolValue( true );
144             }
145         } else if ( _vac_l->getDoubleValue() < 3.0 ) {
146             if ( timer3 < 10 ) {
147                 double rem = timer0 - (int)timer0;
148                 if ( rem <= 0.5 ) {
149                     _ann_vac_l->setBoolValue( true );
150                 } else {
151                     _ann_vac_l->setBoolValue( false );
152                 }
153             } else {
154                 _ann_vac_l->setBoolValue( true );
155             }
156             _ann_vac_r->setBoolValue( false );
157         } else if ( _vac_r->getDoubleValue() < 3.0 ) {
158             if ( timer3 < 10 ) {
159                 double rem = timer0 - (int)timer0;
160                 if ( rem <= 0.5 ) {
161                     _ann_vac_r->setBoolValue( true );
162                 } else {
163                     _ann_vac_r->setBoolValue( false );
164                 }
165             } else {
166                 _ann_vac_r->setBoolValue( true );
167             }
168             _ann_vac_l->setBoolValue( false );
169         } else {
170             _ann_vac_l->setBoolValue( false );
171             _ann_vac_r->setBoolValue( false );
172             timer3 = 0.0;
173         }
174
175         // Oil pressure
176         if ( _oil_px->getDoubleValue() < 20.0 ) {
177             if ( timer4 < 10 ) {
178                 double rem = timer0 - (int)timer0;
179                 if ( rem <= 0.5 ) {
180                     _ann_oil_px->setBoolValue( true );
181                 } else {
182                     _ann_oil_px->setBoolValue( false );
183                 }
184             } else {
185                 _ann_oil_px->setBoolValue( true );
186             }
187         } else {
188             _ann_oil_px->setBoolValue( false );
189             timer4 = 0.0;
190         }
191     }
192 }
193
194
195 // end of annunciator.cxx