1
0
Fork 0

Add a very simplistic (small single engine type) annunciator model. With

the exception of flashing the annunciator light for 10 seconds and then going
steady on, this could almost be done entirely in an xml instrument ...
This commit is contained in:
curt 2003-05-27 19:12:33 +00:00
parent c538cc44fd
commit 940d12528b
3 changed files with 277 additions and 12 deletions

View file

@ -1,16 +1,18 @@
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

View file

@ -0,0 +1,194 @@
// 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

View file

@ -0,0 +1,69 @@
// 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