1 // digitalcomponent.hxx - Base class for digital autopilot components
3 // Written by Torsten Dreyer
4 // Based heavily on work created by Curtis Olson, started January 2004.
6 // Copyright (C) 2004 Curtis L. Olson - http://www.flightgear.org/~curt
7 // Copyright (C) 2010 Torsten Dreyer - Torsten (at) t3r (dot) de
9 // This program is free software; you can redistribute it and/or
10 // modify it under the terms of the GNU General Public License as
11 // published by the Free Software Foundation; either version 2 of the
12 // License, or (at your option) any later version.
14 // This program is distributed in the hope that it will be useful, but
15 // WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 // General Public License for more details.
19 // You should have received a copy of the GNU General Public License
20 // along with this program; if not, write to the Free Software
21 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 #ifndef __DIGITALCOMPONENT_HXX
24 #define __DIGITALCOMPONENT_HXX 1
26 #include "component.hxx"
28 #include <simgear/props/props.hxx>
29 #include <simgear/props/condition.hxx>
31 namespace FGXMLAutopilot {
34 * @brief Models a digital output bound to a property. May be an inverted output.
36 class DigitalOutput : public SGReferenced {
40 SGPropertyNode_ptr _node;
46 * @brief Constructs an empty, noninverting output
50 inline void setProperty( SGPropertyNode_ptr node );
52 inline void setInverted( bool value ) { _inverted = value; }
53 inline bool isInverted() const { return _inverted; }
55 bool getValue() const;
56 void setValue( bool value );
59 inline DigitalOutput::DigitalOutput() : _inverted(false)
63 inline void DigitalOutput::setProperty( SGPropertyNode_ptr node )
66 _node->setBoolValue( node->getBoolValue() );
69 inline bool DigitalOutput::getValue() const
71 if( _node == NULL ) return false;
72 bool nodeState = _node->getBoolValue();
73 return _inverted ? !nodeState : nodeState;
76 inline void DigitalOutput::setValue( bool value )
78 if( _node == NULL ) return;
79 _node->setBoolValue( _inverted ? !value : value );
82 typedef SGSharedPtr<DigitalOutput> DigitalOutput_ptr;
85 * @brief Base class for digital autopilot components
87 * Each digital component has (at least)
89 * <li>one value input</li>
90 * <li>any number of output properties</li>
93 class DigitalComponent : public Component {
97 class InputMap : public std::map<const std::string,SGSharedPtr<const SGCondition> > {
99 bool get_value( const std::string & name ) const;
103 // typedef std::map<const std::string,SGSharedPtr<const SGCondition> > InputMap;
104 typedef std::map<const std::string,DigitalOutput_ptr> OutputMap;
108 * @brief Named input "pins"
113 * @brief Named output "pins"
118 * @brief Global "inverted" flag for the outputs
123 * @brief Over-rideable hook method to allow derived classes to refine top-level
128 * @return true if the node was handled, false otherwise.
130 virtual bool configure( SGPropertyNode& cfg_node,
131 const std::string& cfg_name,
132 SGPropertyNode& prop_root );
136 #endif // DIGITALCOMPONENT_HXX