inst_vertical_speed_indicator.cxx
instrument_mgr.cxx
kr_87.cxx
- kt_70.cxx
mag_compass.cxx
marker_beacon.cxx
mk_viii.cxx
inst_vertical_speed_indicator.hxx
instrument_mgr.hxx
kr_87.hxx
- kt_70.hxx
mag_compass.hxx
marker_beacon.hxx
mk_viii.hxx
#include "heading_indicator_fg.hxx"
#include "heading_indicator_dg.hxx"
#include "kr_87.hxx"
-#include "kt_70.hxx"
#include "mag_compass.hxx"
#include "marker_beacon.hxx"
#include "newnavradio.hxx"
} else if ( name == "KR-87" ) {
set_subsystem( id, new FGKR_87( node ) );
- } else if ( name == "KT-70" ) {
- set_subsystem( id, new FGKT_70( node ) );
-
} else if ( name == "magnetic-compass" ) {
set_subsystem( id, new MagCompass( node ) );
} else if ( name == "slip-skid-ball" ) {
set_subsystem( id, new SlipSkidBall( node ), 0.03 );
- } else if ( name == "transponder" ) {
+ } else if (( name == "transponder" ) || ( name == "KT-70" )) {
+ if (name == "KT-70") {
+ SG_LOG(SG_INSTR, SG_WARN, "KT-70 legacy instrument compatability. "
+ "Please update aircraft to use transponder directly");
+ // force configuration into compatability mode
+ node->setBoolValue("kt70-compatability", true);
+ }
set_subsystem( id, new Transponder( node ), 0.2 );
} else if ( name == "turn-indicator" ) {
+++ /dev/null
-// kt-70.cxx -- class to impliment the King KT 70 panel-m transponder
-//
-// Written by Curtis Olson, started July 2002.
-//
-// Copyright (C) 2002 Curtis L. Olson - http://www.flightgear.org/~curt
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-//
-// $Id$
-
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <iostream>
-#include <string>
-#include <sstream>
-
-#include <simgear/compiler.h>
-#include <simgear/math/sg_random.h>
-
-#include "kt_70.hxx"
-
-
-// Constructor
-FGKT_70::FGKT_70(SGPropertyNode *node) :
- r_flash_time(0.0),
- ident_mode(false),
- ident_btn(false),
- last_ident_btn(false),
- digit1(1), digit2(2), digit3(0), digit4(0),
- func_knob(4),
- id_code(1200),
- flight_level(0),
- fl_ann(0),
- alt_ann(0),
- gnd_ann(0),
- on_ann(0),
- sby_ann(0),
- reply_ann(0),
- name("kt-70"),
- num(0)
-{
- int i;
- for ( i = 0; i < node->nChildren(); ++i ) {
- SGPropertyNode *child = node->getChild(i);
- string cname = child->getName();
- string cval = child->getStringValue();
- if ( cname == "name" ) {
- name = cval;
- } else if ( cname == "number" ) {
- num = child->getIntValue();
- } else {
- SG_LOG( SG_INSTR, SG_WARN,
- "Error in kt-70 config logic" );
- if ( name.length() ) {
- SG_LOG( SG_INSTR, SG_WARN, "Section = " << name );
- }
- }
- }
-
-}
-
-
-// Destructor
-FGKT_70::~FGKT_70() { }
-
-
-void FGKT_70::init ()
-{
- string branch;
- branch = "/instrumentation/" + name;
-
- SGPropertyNode *node = fgGetNode(branch.c_str(), num, true );
- // Inputs
- lon_node = fgGetNode("/position/longitude-deg", true);
- lat_node = fgGetNode("/position/latitude-deg", true);
- alt_node = fgGetNode("/position/altitude-ft", true);
- bus_power = fgGetNode("/systems/electrical/outputs/transponder", true);
- serviceable_node = (node->getChild("inputs", 0, true))
- ->getChild("serviceable", 0, true);
- serviceable_node->setBoolValue(true);
-}
-
-
-void FGKT_70::bind ()
-{
- std::ostringstream temp;
- string branch;
- temp << num;
- branch = "/instrumentation/" + name + "[" + temp.str() + "]";
- _tiedProperties.setRoot(fgGetNode(branch, true));
-
- // internal values
-
- // modes
- // input and buttons
- _tiedProperties.Tie("inputs/ident-btn", this,
- &FGKT_70::get_ident_btn, &FGKT_70::set_ident_btn);
- fgSetArchivable((branch + "/inputs/rotation-deg").c_str());
- _tiedProperties.Tie("inputs/digit1", this,
- &FGKT_70::get_digit1, &FGKT_70::set_digit1);
- fgSetArchivable((branch + "/inputs/digit1").c_str());
- _tiedProperties.Tie("inputs/digit2", this,
- &FGKT_70::get_digit2, &FGKT_70::set_digit2);
- fgSetArchivable((branch + "/inputs/digit2").c_str());
- _tiedProperties.Tie("inputs/digit3", this,
- &FGKT_70::get_digit3, &FGKT_70::set_digit3);
- fgSetArchivable((branch + "/inputs/digit3").c_str());
- _tiedProperties.Tie("inputs/digit4", this,
- &FGKT_70::get_digit4, &FGKT_70::set_digit4);
- fgSetArchivable((branch + "/inputs/digit4").c_str());
- _tiedProperties.Tie("inputs/func-knob", this,
- &FGKT_70::get_func_knob, &FGKT_70::set_func_knob);
- fgSetArchivable((branch + "/inputs/func-knob").c_str());
-
- // outputs
- _tiedProperties.Tie("outputs/id-code", this,
- &FGKT_70::get_id_code, &FGKT_70::set_id_code);
- fgSetArchivable((branch + "/outputs/id-code").c_str());
- _tiedProperties.Tie("outputs/flight-level", this,
- &FGKT_70::get_flight_level);
-
- // annunciators
- _tiedProperties.Tie("annunciators/fl", this,
- &FGKT_70::get_fl_ann );
- _tiedProperties.Tie("annunciators/alt", this,
- &FGKT_70::get_alt_ann );
- _tiedProperties.Tie("annunciators/gnd", this,
- &FGKT_70::get_gnd_ann );
- _tiedProperties.Tie("annunciators/on", this,
- &FGKT_70::get_on_ann );
- _tiedProperties.Tie("annunciators/sby", this,
- &FGKT_70::get_sby_ann );
- _tiedProperties.Tie("annunciators/reply", this,
- &FGKT_70::get_reply_ann );
-}
-
-
-void FGKT_70::unbind () {
- _tiedProperties.Untie();
-}
-
-
-// Update the various nav values based on position and valid tuned in navs
-void FGKT_70::update( double dt ) {
- // start with all annunciators off (reply ann is handled
- // separately) and then turn on the ones we want
- fl_ann = false;
- alt_ann = false;
- gnd_ann = false;
- on_ann = false;
- sby_ann = false;
- reply_ann = false;
-
- if ( has_power() && serviceable_node->getBoolValue() ) {
- // sanity checks
- if ( digit1 < 0 ) { digit1 = 0; }
- if ( digit1 > 7 ) { digit1 = 7; }
- if ( digit2 < 0 ) { digit2 = 0; }
- if ( digit2 > 7 ) { digit2 = 7; }
- if ( digit3 < 0 ) { digit3 = 0; }
- if ( digit3 > 7 ) { digit3 = 7; }
- if ( digit4 < 0 ) { digit4 = 0; }
- if ( digit4 > 7 ) { digit4 = 7; }
-
- id_code = digit1 * 1000 + digit2 * 100 + digit3 * 10 + digit4;
-
- // flight level computation
-
- // FIXME!!!! This needs to be computed relative to 29.92 inHg,
- // but for the moment, until I figure out how to do that, I'll
- // just use true altitude.
- flight_level = (int)( (alt_node->getDoubleValue() + 50.0) / 100.0);
-
- // ident button
- if ( ident_btn && !last_ident_btn ) {
- // ident button depressed
- r_flash_time = 0.0;
- ident_mode = true;
- }
- r_flash_time += dt;
- if ( r_flash_time > 18.0 ) {
- ident_mode = false;
- }
-
- if ( ident_mode ) {
- reply_ann = true;
- } else {
- reply_ann = false;
- }
-
- if ( func_knob == 1 ) {
- sby_ann = true;
- } else if ( func_knob == 2 ) { // selftest
- fl_ann = true;
- alt_ann = true;
- gnd_ann = true;
- on_ann = true;
- sby_ann = true;
- reply_ann = true;
- id_code = 8888;
- flight_level = 888;
- } else if ( func_knob == 3 ) {
- fl_ann = true;
- gnd_ann = true;
- } else if ( func_knob == 4 ) {
- on_ann = true;
- } else if ( func_knob == 5 ) {
- fl_ann = true;
- alt_ann = true;
- }
- }
-}
+++ /dev/null
-// kt-70.hxx -- class to impliment the King KT 70 panel-m transponder
-//
-// Written by Curtis Olson, started July 2002.
-//
-// Copyright (C) 2002 Curtis L. Olson - http://www.flightgear.org/~curt
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License as
-// published by the Free Software Foundation; either version 2 of the
-// License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-//
-// $Id$
-
-
-#ifndef _FG_KT_70_HXX
-#define _FG_KT_70_HXX
-
-
-#include <Main/fg_props.hxx>
-
-#include <simgear/compiler.h>
-#include <simgear/structure/subsystem_mgr.hxx>
-#include <simgear/props/tiedpropertylist.hxx>
-#include <simgear/math/interpolater.hxx>
-#include <simgear/timing/timestamp.hxx>
-
-#include <Navaids/navlist.hxx>
-#include <Sound/beacon.hxx>
-#include <Sound/morse.hxx>
-
-
-class FGKT_70 : public SGSubsystem
-{
-private:
- SGPropertyNode_ptr lon_node;
- SGPropertyNode_ptr lat_node;
- SGPropertyNode_ptr alt_node;
- SGPropertyNode_ptr bus_power;
- SGPropertyNode_ptr serviceable_node;
-
- // internal values
- double r_flash_time;
-
- // modes
- bool ident_mode; // false = normal, true = ident/squawk
-
- // input and buttons
- bool ident_btn;
- bool last_ident_btn;
- int digit1, digit2, digit3, digit4;
- int func_knob; // 0 = OFF, 1 = SBY, 2 = TST, 3 = GND, 4 = ON,
- // 5 = ALT
-
- // outputs
- int id_code;
- int flight_level;
-
- // annunciators
- bool fl_ann; // flight level
- bool alt_ann; // altitude
- bool gnd_ann; // ground
- bool on_ann; // on
- bool sby_ann; // standby
- bool reply_ann; // reply
-
- string name;
- int num;
- simgear::TiedPropertyList _tiedProperties;
-
-public:
-
- FGKT_70(SGPropertyNode *node);
- ~FGKT_70();
-
- void init ();
- void bind ();
- void unbind ();
- void update (double dt);
- void search () { /* empty placeholder */ }
-
- // internal values
- inline bool has_power() const {
- return (func_knob > 0) && (bus_power->getDoubleValue() > 1.0);
- }
-
- // input and buttons
- inline bool get_ident_btn() const { return ident_btn; }
- inline void set_ident_btn( bool val ) { ident_btn = val; }
- inline int get_digit1() const { return digit1; }
- inline void set_digit1( int val ) { digit1 = val; }
- inline int get_digit2() const { return digit2; }
- inline void set_digit2( int val ) { digit2 = val; }
- inline int get_digit3() const { return digit3; }
- inline void set_digit3( int val ) { digit3 = val; }
- inline int get_digit4() const { return digit4; }
- inline void set_digit4( int val ) { digit4 = val; }
- inline int get_func_knob() const { return func_knob; }
- inline void set_func_knob( int val ) { func_knob = val; }
-
- // outputs
- inline int get_id_code () const { return id_code; }
- inline void set_id_code( int c ) { id_code = c; }
- inline int get_flight_level () const { return flight_level; }
-
- // annunciators
- inline bool get_fl_ann() const { return fl_ann; }
- inline bool get_alt_ann() const { return alt_ann; }
- inline bool get_gnd_ann() const { return gnd_ann; }
- inline bool get_on_ann() const { return on_ann; }
- inline bool get_sby_ann() const { return sby_ann; }
- inline bool get_reply_ann() const { return reply_ann; }
-};
-
-
-#endif // _FG_KT_70_HXX
{
_requiredBusVolts = node->getDoubleValue("bus-volts", 8.0);
_altitudeSourcePath = node->getStringValue("encoder-path", "/instrumentation/altimeter");
+ _kt70Compat = node->getBoolValue("kt70-compatability", false);
}
void Transponder::init()
{
- string branch;
- branch = "/instrumentation/" + _name;
-
- SGPropertyNode *node = fgGetNode(branch.c_str(), _num, true );
+ SGPropertyNode *node = fgGetNode("/instrumentation/" + _name, _num, true );
// Inputs
_busPower_node = fgGetNode("/systems/electrical/outputs/transponder", true);
_digit_node[i]->addChangeListener(this);
}
- _knob_node = in_node->getChild("knob-mode", 0, true); // 0=OFF, 1=SBY, 2=ON, 3=ALT, 4=TST
- if (!_knob_node->hasValue()) {
- _knob_node->setIntValue(0);
+ _knob_node = in_node->getChild("knob-mode", 0, true);
+ if (!_knob_node->hasValue()) {
+ _knob = KNOB_ON;
+ // default to, if aircraft wants to start dark, it can do this
+ // in its -set.xml
+ _knob_node->setIntValue(_knob);
+ } else {
+ _knob = static_cast<KnobPosition>(_knob_node->getIntValue());
}
+ _knob_node->addChangeListener(this);
+
_mode_node = in_node->getChild("mode", 0, true);
_mode_node->setIntValue(_mode);
_mode_node->addChangeListener(this);
_altitudeValid_node = node->getChild("altitude-valid", 0, true);
_ident_node = node->getChild("ident", 0, true);
_transmittedId_node = node->getChild("transmitted-id", 0, true);
+
+ if (_kt70Compat) {
+ // alias the properties through
+ SGPropertyNode_ptr output = node->getChild("outputs", 0, true);
+ output->getChild("flight-level", 0, true)->alias(_altitude_node);
+ output->getChild("id-code", 0, true)->alias(_idCode_node);
+ in_node->getChild("func-knob", 0, true)->alias(_knob_node);
+ }
+}
+
+void Transponder::bind()
+{
+ if (_kt70Compat) {
+ SGPropertyNode *node = fgGetNode("/instrumentation/" + _name, _num, true );
+ _tiedProperties.setRoot(node);
+
+ _tiedProperties.Tie("annunciators/fl", this,
+ &Transponder::getFLAnnunciator );
+ _tiedProperties.Tie("annunciators/alt", this,
+ &Transponder::getAltAnnunciator );
+ _tiedProperties.Tie("annunciators/gnd", this,
+ &Transponder::getGroundAnnuciator );
+ _tiedProperties.Tie("annunciators/on", this,
+ &Transponder::getOnAnnunciator );
+ _tiedProperties.Tie("annunciators/sby", this,
+ &Transponder::getStandbyAnnunciator );
+ _tiedProperties.Tie("annunciators/reply", this,
+ &Transponder::getReplyAnnunciator );
+ } // of kt70 backwards compatability
+}
+
+void Transponder::unbind()
+{
+ _tiedProperties.Untie();
}
if (has_power() && _serviceable_node->getBoolValue())
{
// Mode C & S send also altitude
- Mode effectiveMode = (_knob_node->getIntValue() == KNOB_ALT) ? _mode : MODE_A;
+ Mode effectiveMode = (_knob == KNOB_ALT) ? _mode : MODE_A;
SGPropertyNode* altitudeSource = NULL;
switch (effectiveMode) {
}
}
- _transmittedId_node->setIntValue(_idCode_node->getIntValue());
+ if (_knob > KNOB_ON) {
+ _transmittedId_node->setIntValue(_idCode_node->getIntValue());
+ } else {
+ _transmittedId_node->setIntValue(INVALID_ID);
+ }
}
else
{
return;
}
+ if (prop == _knob_node) {
+ _knob = static_cast<KnobPosition>(prop->getIntValue());
+ return;
+ }
+
if (_listener_active)
return;
{
return (_knob_node->getIntValue() > KNOB_STANDBY) && (_busPower_node->getDoubleValue() > _requiredBusVolts);
}
+
+bool Transponder::getFLAnnunciator() const
+{
+ return (_knob == KNOB_ALT) || (_knob == KNOB_GROUND) || (_knob == KNOB_TEST);
+}
+
+bool Transponder::getAltAnnunciator() const
+{
+ return (_knob == KNOB_ALT) || (_knob == KNOB_TEST);
+}
+
+bool Transponder::getGroundAnnuciator() const
+{
+ return (_knob == KNOB_GROUND) || (_knob == KNOB_TEST);
+}
+
+bool Transponder::getOnAnnunciator() const
+{
+ return (_knob == KNOB_ON) || (_knob == KNOB_TEST);
+}
+
+bool Transponder::getStandbyAnnunciator() const
+{
+ return (_knob == KNOB_STANDBY) || (_knob == KNOB_TEST);
+}
+
+bool Transponder::getReplyAnnunciator() const
+{
+ return _identMode || (_knob == KNOB_TEST);
+}
+
#include <Main/fg_props.hxx>
#include <simgear/structure/subsystem_mgr.hxx>
-
+#include <simgear/props/tiedpropertylist.hxx>
class Transponder : public SGSubsystem, public SGPropertyChangeListener
{
virtual void init ();
virtual void update (double dt);
-
+ virtual void bind();
+ virtual void unbind();
+
private:
enum Mode
{
{
KNOB_OFF = 0,
KNOB_STANDBY,
+ KNOB_TEST,
+ KNOB_GROUND,
KNOB_ON,
- KNOB_ALT,
- KNOB_TEST
+ KNOB_ALT
};
+ // annunciators, for KT-70 compatability only
+ // these should be replaced with conditionals in the instrument
+ bool getFLAnnunciator() const;
+ bool getAltAnnunciator() const;
+ bool getGroundAnnuciator() const;
+ bool getOnAnnunciator() const;
+ bool getStandbyAnnunciator() const;
+ bool getReplyAnnunciator() const;
+
// Inputs
SGPropertyNode_ptr _pressureAltitude_node;
SGPropertyNode_ptr _busPower_node;
SGPropertyNode_ptr _idCode_node;
SGPropertyNode_ptr _digit_node[4];
+ simgear::TiedPropertyList _tiedProperties;
SGPropertyNode_ptr _identBtn_node;
bool _identMode;
-
+ bool _kt70Compat;
+
// Outputs
SGPropertyNode_ptr _altitude_node;
SGPropertyNode_ptr _altitudeValid_node;
std::string _name;
int _num;
Mode _mode;
+ KnobPosition _knob;
double _identTime;
int _listener_active;
double _requiredBusVolts;