1
0
Fork 0

Migrate transponder to AbstractInstrument

This commit is contained in:
James Turner 2019-06-03 13:49:48 +01:00
parent ff009bc58f
commit a26c671200
4 changed files with 51 additions and 44 deletions

View file

@ -70,7 +70,7 @@ void AbstractInstrument::unbind()
bool AbstractInstrument::isServiceableAndPowered() const
{
if (!_serviceableNode->getBoolValue() || !_powerButtonNode->getBoolValue())
if (!_serviceableNode->getBoolValue() || !isPowerSwitchOn())
return false;
if (_powerSupplyNode->getDoubleValue() < _minimumSupplyVolts)
@ -78,3 +78,13 @@ bool AbstractInstrument::isServiceableAndPowered() const
return true;
}
void AbstractInstrument::setMinimumSupplyVolts(double v)
{
_minimumSupplyVolts = v;
}
bool AbstractInstrument::isPowerSwitchOn() const
{
return _powerButtonNode->getBoolValue();
}

View file

@ -39,6 +39,10 @@ protected:
int number() const { return _index; }
void unbind() override;
void setMinimumSupplyVolts(double v);
virtual bool isPowerSwitchOn() const;
private:
std::string _name;
int _index = 0;

View file

@ -45,9 +45,7 @@
// this is /instrumentation/airspeed-indicator/indicated-speed-kt but this can be
// changed by setting the airspeed-path property as shown above.
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <config.h>
#include "transponder.hxx"
@ -66,15 +64,17 @@ const int INVALID_ALTITUDE = -9999;
const int INVALID_AIRSPEED = -9999;
const int INVALID_ID = -9999;
Transponder::Transponder(SGPropertyNode *node)
:
_identMode(false),
_name(node->getStringValue("name", "transponder")),
_num(node->getIntValue("number", 0)),
_mode((Mode) node->getIntValue("mode", 1)),
_listener_active(0)
Transponder::Transponder(SGPropertyNode *node) :
_mode((Mode) node->getIntValue("mode", 1))
{
_requiredBusVolts = node->getDoubleValue("bus-volts", 8.0);
readConfig(node, "transponder");
// ensure older power-supply name works
if (node->hasChild("bus-volts")) {
SG_LOG(SG_INSTR, SG_DEV_WARN, "Transponder: use new supply-volatge prop: 'minimum-supply-volts' instead of 'bus-volts'");
setMinimumSupplyVolts(node->getDoubleValue("bus-volts", 8.0));
}
_altitudeSourcePath = node->getStringValue("encoder-path", "/instrumentation/altimeter");
_autoGroundPath = node->getStringValue("auto-ground");
_airspeedSourcePath = node->getStringValue("airspeed-path", "/instrumentation/airspeed-indicator/indicated-speed-kt");
@ -89,10 +89,10 @@ Transponder::~Transponder()
void Transponder::init()
{
SGPropertyNode *node = fgGetNode("/instrumentation/" + _name, _num, true );
SGPropertyNode *node = fgGetNode(nodePath(), true);
initServicePowerProperties(node);
// Inputs
_busPower_node = fgGetNode("/systems/electrical/outputs/transponder", true);
_pressureAltitude_node = fgGetNode(_altitudeSourcePath, true);
_autoGround_node = fgGetNode(_autoGroundPath, true);
_airspeedIndicator_node = fgGetNode(_airspeedSourcePath, true);
@ -123,9 +123,6 @@ void Transponder::init()
_identBtn_node->setBoolValue(false);
_identBtn_node->addChangeListener(this);
_serviceable_node = node->getChild("serviceable", 0, true);
_serviceable_node->setBoolValue(true);
_idCode_node = node->getChild("id-code", 0, true);
_idCode_node->addChangeListener(this);
// set default, but don't overwrite value from defaults.xml or -set.xml
@ -153,7 +150,7 @@ void Transponder::init()
void Transponder::bind()
{
if (_kt70Compat) {
SGPropertyNode *node = fgGetNode("/instrumentation/" + _name, _num, true );
SGPropertyNode *node = fgGetNode(nodePath(), true );
_tiedProperties.setRoot(node);
_tiedProperties.Tie("annunciators/fl", this,
@ -174,12 +171,12 @@ void Transponder::bind()
void Transponder::unbind()
{
_tiedProperties.Untie();
AbstractInstrument::unbind();
}
void Transponder::update(double dt)
{
if (has_power() && _serviceable_node->getBoolValue())
if (isServiceableAndPowered())
{
// Mode C & S send also altitude
Mode effectiveMode = (_knob == KNOB_ALT || _knob == KNOB_GROUND) ? _mode : MODE_A;
@ -243,7 +240,7 @@ void Transponder::update(double dt)
}
}
else
{
{ // un-powered or u/s
_altitude_node->setIntValue(INVALID_ALTITUDE);
_altitudeValid_node->setBoolValue(false);
_ident_node->setBoolValue(false);
@ -314,11 +311,6 @@ void Transponder::valueChanged(SGPropertyNode *prop)
_listener_active--;
}
bool Transponder::has_power() const
{
return (_knob_node->getIntValue() > KNOB_STANDBY) && (_busPower_node->getDoubleValue() > _requiredBusVolts);
}
bool Transponder::getFLAnnunciator() const
{
return (_knob == KNOB_ALT) || (_knob == KNOB_GROUND) || (_knob == KNOB_TEST);
@ -349,3 +341,9 @@ bool Transponder::getReplyAnnunciator() const
return _identMode || (_knob == KNOB_TEST);
}
bool Transponder::isPowerSwitchOn() const
{
return (_knob_node->getIntValue() > KNOB_STANDBY);
}

View file

@ -22,25 +22,24 @@
#ifndef TRANSPONDER_HXX
#define TRANSPONDER_HXX 1
#ifndef __cplusplus
# error This library requires C++
#endif
#include <Main/fg_props.hxx>
#include <Instrumentation/AbstractInstrument.hxx>
#include <simgear/structure/subsystem_mgr.hxx>
#include <simgear/props/tiedpropertylist.hxx>
class Transponder : public SGSubsystem, public SGPropertyChangeListener
class Transponder : public AbstractInstrument, public SGPropertyChangeListener
{
public:
Transponder(SGPropertyNode *node);
virtual ~Transponder();
virtual void init ();
virtual void update (double dt);
virtual void bind();
virtual void unbind();
void init () override;
void update (double dt) override;
void bind() override;
void unbind() override;
protected:
bool isPowerSwitchOn() const override;
private:
enum Mode
@ -73,8 +72,6 @@ private:
SGPropertyNode_ptr _pressureAltitude_node;
SGPropertyNode_ptr _autoGround_node;
SGPropertyNode_ptr _airspeedIndicator_node;
SGPropertyNode_ptr _busPower_node;
SGPropertyNode_ptr _serviceable_node;
SGPropertyNode_ptr _mode_node;
SGPropertyNode_ptr _knob_node;
@ -84,7 +81,7 @@ private:
simgear::TiedPropertyList _tiedProperties;
SGPropertyNode_ptr _identBtn_node;
bool _identMode;
bool _identMode = false;
bool _kt70Compat;
// Outputs
@ -96,20 +93,18 @@ private:
SGPropertyNode_ptr _airspeed_node;
// Internal
std::string _name;
int _num;
Mode _mode;
KnobPosition _knob;
double _identTime;
int _listener_active;
int _listener_active = 0;
double _requiredBusVolts;
std::string _altitudeSourcePath;
std::string _autoGroundPath;
std::string _airspeedSourcePath;
void valueChanged (SGPropertyNode *);
void valueChanged (SGPropertyNode *) override;
int setMinMax(int val);
bool has_power() const;
};
#endif // TRANSPONDER_HXX