noinst_LIBRARIES = libInstrumentation.a
-libInstrumentation_a_SOURCES = instrument_mgr.cxx instrument_mgr.hxx \
- dme.cxx dme.hxx \
- gps.cxx gps.hxx \
- gyro.cxx gyro.hxx \
- airspeed_indicator.cxx airspeed_indicator.hxx \
- attitude_indicator.cxx attitude_indicator.hxx \
- altimeter.cxx altimeter.hxx \
- turn_indicator.cxx turn_indicator.hxx \
- slip_skid_ball.cxx slip_skid_ball.hxx \
- heading_indicator.cxx heading_indicator.hxx \
- vertical_speed_indicator.cxx vertical_speed_indicator.hxx \
- mag_compass.cxx mag_compass.hxx
+libInstrumentation_a_SOURCES = \
+ instrument_mgr.cxx instrument_mgr.hxx \
+ annunciator.cxx annunciator.hxx \
+ dme.cxx dme.hxx \
+ gps.cxx gps.hxx \
+ gyro.cxx gyro.hxx \
+ airspeed_indicator.cxx airspeed_indicator.hxx \
+ attitude_indicator.cxx attitude_indicator.hxx \
+ altimeter.cxx altimeter.hxx \
+ turn_indicator.cxx turn_indicator.hxx \
+ slip_skid_ball.cxx slip_skid_ball.hxx \
+ heading_indicator.cxx heading_indicator.hxx \
+ vertical_speed_indicator.cxx vertical_speed_indicator.hxx \
+ mag_compass.cxx mag_compass.hxx
INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src
--- /dev/null
+// annunciator.hxx - manage the annunciator states
+// Written by Curtis Olson, started May, 2003.
+
+#include <math.h>
+
+#include <simgear/math/interpolater.hxx>
+
+#include <Main/fg_props.hxx>
+#include <Main/util.hxx>
+
+#include "annunciator.hxx"
+
+
+Annunciator::Annunciator ():
+ timer0( 0.0 ),
+ timer1( 0.0 ),
+ timer2( 0.0 ),
+ timer3( 0.0 ),
+ timer4( 0.0 )
+{
+}
+
+Annunciator::~Annunciator ()
+{
+}
+
+void
+Annunciator::init ()
+{
+ _volts = fgGetNode( "/systems/electrical/volts", true );
+ _vac_l = fgGetNode( "/systems/vacuum[0]/suction-inhg", true );
+ _vac_r = fgGetNode( "/systems/vacuum[1]/suction-inhg", true );
+ _fuel_l = fgGetNode( "/consumables/fuel/tank[0]/level-gal_us", true );
+ _fuel_r = fgGetNode( "/consumables/fuel/tank[1]/level-gal_us", true );
+ _oil_px = fgGetNode( "/engines/engine[0]/oil-pressure-psi", true );
+
+ _ann_volts = fgGetNode( "/instrumentation/annunciator/volts", true );
+ _ann_vac_l = fgGetNode( "/instrumentation/annunciator/vacuum-left", true );
+ _ann_vac_r = fgGetNode( "/instrumentation/annunciator/vacuum-right", true );
+ _ann_fuel_l = fgGetNode( "/instrumentation/annunciator/fuel-left", true );
+ _ann_fuel_r = fgGetNode( "/instrumentation/annunciator/fuel-right", true );
+ _ann_oil_px = fgGetNode( "/instrumentation/annunciator/oil-pressure", true );
+}
+
+void
+Annunciator::update (double dt)
+{
+ // timers
+ timer0 += dt;
+ timer1 += dt;
+ timer2 += dt;
+ timer3 += dt;
+ timer4 += dt;
+
+ if ( _volts->getDoubleValue() < 5.0 ) {
+ // Not enough juice to illuminate the display
+ _ann_volts->setBoolValue( false );
+ _ann_vac_l->setBoolValue( false );
+ _ann_vac_r->setBoolValue( false );
+ _ann_fuel_l->setBoolValue( false );
+ _ann_fuel_r->setBoolValue( false );
+ _ann_oil_px->setBoolValue( false );
+ } else {
+ // Volts
+ if ( _volts->getDoubleValue() < 24.5 ) {
+ if ( timer1 < 10 ) {
+ double rem = timer0 - (int)timer0;
+ if ( rem <= 0.5 ) {
+ _ann_volts->setBoolValue( true );
+ } else {
+ _ann_volts->setBoolValue( false );
+ }
+ } else {
+ _ann_volts->setBoolValue( true );
+ }
+ } else {
+ _ann_volts->setBoolValue( false );
+ timer1 = 0.0;
+ }
+
+ if ( _fuel_l->getDoubleValue() < 5.0
+ && _fuel_r->getDoubleValue() < 5.0 )
+ {
+ if ( timer2 < 10 ) {
+ double rem = timer0 - (int)timer0;
+ if ( rem <= 0.5 ) {
+ _ann_fuel_l->setBoolValue( true );
+ _ann_fuel_r->setBoolValue( true );
+ } else {
+ _ann_fuel_l->setBoolValue( false );
+ _ann_fuel_r->setBoolValue( false );
+ }
+ } else {
+ _ann_fuel_l->setBoolValue( true );
+ _ann_fuel_r->setBoolValue( true );
+ }
+ } else if ( _fuel_l->getDoubleValue() < 5.0 ) {
+ if ( timer2 < 10 ) {
+ double rem = timer0 - (int)timer0;
+ if ( rem <= 0.5 ) {
+ _ann_fuel_l->setBoolValue( true );
+ } else {
+ _ann_fuel_l->setBoolValue( false );
+ }
+ } else {
+ _ann_fuel_l->setBoolValue( true );
+ }
+ _ann_fuel_r->setBoolValue( false );
+ } else if ( _fuel_r->getDoubleValue() < 5.0 ) {
+ if ( timer2 < 10 ) {
+ double rem = timer0 - (int)timer0;
+ if ( rem <= 0.5 ) {
+ _ann_fuel_r->setBoolValue( true );
+ } else {
+ _ann_fuel_r->setBoolValue( false );
+ }
+ } else {
+ _ann_fuel_r->setBoolValue( true );
+ }
+ _ann_fuel_l->setBoolValue( false );
+ } else {
+ _ann_fuel_l->setBoolValue( false );
+ _ann_fuel_r->setBoolValue( false );
+ timer2 = 0.0;
+ }
+
+ // vacuum pumps
+ if ( _vac_l->getDoubleValue() < 3.0
+ && _vac_r->getDoubleValue() < 3.0 )
+ {
+ if ( timer3 < 10 ) {
+ double rem = timer0 - (int)timer0;
+ if ( rem <= 0.5 ) {
+ _ann_vac_l->setBoolValue( true );
+ _ann_vac_r->setBoolValue( true );
+ } else {
+ _ann_vac_l->setBoolValue( false );
+ _ann_vac_r->setBoolValue( false );
+ }
+ } else {
+ _ann_vac_l->setBoolValue( true );
+ _ann_vac_r->setBoolValue( true );
+ }
+ } else if ( _vac_l->getDoubleValue() < 3.0 ) {
+ if ( timer3 < 10 ) {
+ double rem = timer0 - (int)timer0;
+ if ( rem <= 0.5 ) {
+ _ann_vac_l->setBoolValue( true );
+ } else {
+ _ann_vac_l->setBoolValue( false );
+ }
+ } else {
+ _ann_vac_l->setBoolValue( true );
+ }
+ _ann_vac_r->setBoolValue( false );
+ } else if ( _vac_r->getDoubleValue() < 3.0 ) {
+ if ( timer3 < 10 ) {
+ double rem = timer0 - (int)timer0;
+ if ( rem <= 0.5 ) {
+ _ann_vac_r->setBoolValue( true );
+ } else {
+ _ann_vac_r->setBoolValue( false );
+ }
+ } else {
+ _ann_vac_r->setBoolValue( true );
+ }
+ _ann_vac_l->setBoolValue( false );
+ } else {
+ _ann_vac_l->setBoolValue( false );
+ _ann_vac_r->setBoolValue( false );
+ timer3 = 0.0;
+ }
+
+ // Oil pressure
+ if ( _oil_px->getDoubleValue() < 20.0 ) {
+ if ( timer4 < 10 ) {
+ double rem = timer0 - (int)timer0;
+ if ( rem <= 0.5 ) {
+ _ann_oil_px->setBoolValue( true );
+ } else {
+ _ann_oil_px->setBoolValue( false );
+ }
+ } else {
+ _ann_oil_px->setBoolValue( true );
+ }
+ } else {
+ _ann_oil_px->setBoolValue( false );
+ timer4 = 0.0;
+ }
+ }
+}
+
+
+// end of annunciator.cxx
--- /dev/null
+// annunciator.hxx - manage the annunciator states
+// Written by Curtis Olson, started May, 2003.
+
+
+#ifndef __INSTRUMENTS_ANNUNCIATOR_HXX
+#define __INSTRUMENTS_ANNUNCIATOR_HXX 1
+
+#ifndef __cplusplus
+# error This library requires C++
+#endif
+
+#include <simgear/props/props.hxx>
+
+#include <Main/fgfs.hxx>
+
+
+/**
+ * Model the annunciators. This is innitially hard coded for a C172S
+ *
+ * Input properties:
+ *
+ * Amps
+ * L/R Fuel qty
+ * L/R Vacuum pumps
+ * Oil pressure
+ *
+ * Output properties:
+ *
+ * /instrumentation/airspeed-indicator/indicated-speed-kt
+ */
+class Annunciator : public FGSubsystem
+{
+
+ // timers
+ double timer0; // used to sync flashing
+ double timer1;
+ double timer2;
+ double timer3;
+ double timer4;
+
+ // inputs
+ SGPropertyNode *_volts;
+ SGPropertyNode *_vac_l;
+ SGPropertyNode *_vac_r;
+ SGPropertyNode *_fuel_l;
+ SGPropertyNode *_fuel_r;
+ SGPropertyNode *_oil_px;
+
+ // outputs
+ SGPropertyNode *_ann_volts; // VOLTS (red)
+ SGPropertyNode *_ann_vac_l; // L VAC (amber)
+ SGPropertyNode *_ann_vac_r; // VAC R (amber
+ SGPropertyNode *_ann_fuel_l; // L LOW FUEL (amber)
+ SGPropertyNode *_ann_fuel_r; // LOW FUEL R (amber)
+ SGPropertyNode *_ann_oil_px; // OIL PRESS (red)
+
+public:
+
+ Annunciator ();
+ virtual ~Annunciator ();
+
+ virtual void init ();
+ virtual void update (double dt);
+
+private:
+
+};
+
+#endif // __INSTRUMENTS_ANNUNCIATOR_HXX