Each node in the electrical system graph can now publish to an arbitrary
number of properties which will reflect that node's state.
This commit is contained in:
parent
911e7dbfa8
commit
cc4821e43f
2 changed files with 119 additions and 100 deletions
|
@ -33,20 +33,17 @@
|
|||
FGElectricalComponent::FGElectricalComponent() :
|
||||
kind(-1),
|
||||
name(""),
|
||||
prop(""),
|
||||
value(0.0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
FGElectricalSupplier::FGElectricalSupplier ( string _name, string _prop,
|
||||
string _model,
|
||||
double _volts, double _amps )
|
||||
{
|
||||
FGElectricalSupplier::FGElectricalSupplier ( SGPropertyNode *node ) {
|
||||
kind = FG_SUPPLIER;
|
||||
|
||||
name = _name;
|
||||
prop = _prop;
|
||||
// cout << "Creating a supplier" << endl;
|
||||
name = node->getStringValue("name");
|
||||
string _model = node->getStringValue("kind");
|
||||
// cout << "_model = " << _model << endl;
|
||||
if ( _model == "battery" ) {
|
||||
model = FG_BATTERY;
|
||||
|
@ -57,10 +54,20 @@ FGElectricalSupplier::FGElectricalSupplier ( string _name, string _prop,
|
|||
} else {
|
||||
model = FG_UNKNOWN;
|
||||
}
|
||||
volts = _volts;
|
||||
amps = _amps;
|
||||
volts = node->getDoubleValue("volts");
|
||||
amps = node->getDoubleValue("amps");
|
||||
|
||||
int i;
|
||||
for ( i = 0; i < node->nChildren(); ++i ) {
|
||||
SGPropertyNode *child = node->getChild(i);
|
||||
// cout << " scanning: " << child->getName() << endl;
|
||||
if ( (string)child->getName() == "prop" ) {
|
||||
string prop = child->getStringValue();
|
||||
// cout << " Adding prop = " << prop << endl;
|
||||
add_prop( prop );
|
||||
fgSetDouble( prop.c_str(), amps );
|
||||
}
|
||||
}
|
||||
|
||||
_rpm_node = fgGetNode("/engines/engine[0]/rpm", true);
|
||||
}
|
||||
|
@ -92,28 +99,87 @@ double FGElectricalSupplier::get_output() {
|
|||
}
|
||||
|
||||
|
||||
FGElectricalBus::FGElectricalBus ( string _name, string _prop )
|
||||
{
|
||||
FGElectricalBus::FGElectricalBus ( SGPropertyNode *node ) {
|
||||
kind = FG_BUS;
|
||||
|
||||
name = _name;
|
||||
prop = _prop;
|
||||
name = node->getStringValue("name");
|
||||
int i;
|
||||
for ( i = 0; i < node->nChildren(); ++i ) {
|
||||
SGPropertyNode *child = node->getChild(i);
|
||||
if ( (string)child->getName() == "prop" ) {
|
||||
string prop = child->getStringValue();
|
||||
add_prop( prop );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
FGElectricalOutput::FGElectricalOutput ( string _name, string _prop )
|
||||
{
|
||||
FGElectricalOutput::FGElectricalOutput ( SGPropertyNode *node ) {
|
||||
kind = FG_OUTPUT;
|
||||
|
||||
name = _name;
|
||||
prop = _prop;
|
||||
name = node->getStringValue("name");
|
||||
int i;
|
||||
for ( i = 0; i < node->nChildren(); ++i ) {
|
||||
SGPropertyNode *child = node->getChild(i);
|
||||
if ( (string)child->getName() == "prop" ) {
|
||||
string prop = child->getStringValue();
|
||||
add_prop( prop );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
FGElectricalConnector::FGElectricalConnector ()
|
||||
{
|
||||
FGElectricalConnector::FGElectricalConnector ( SGPropertyNode *node,
|
||||
FGElectricalSystem *es ) {
|
||||
kind = FG_CONNECTOR;
|
||||
name = "connector";
|
||||
int i;
|
||||
for ( i = 0; i < node->nChildren(); ++i ) {
|
||||
SGPropertyNode *child = node->getChild(i);
|
||||
string cname = child->getName();
|
||||
string cval = child->getStringValue();
|
||||
// cout << " " << cname << " = " << cval << endl;
|
||||
if ( cname == "input" ) {
|
||||
FGElectricalComponent *s = es->find( child->getStringValue() );
|
||||
if ( s != NULL ) {
|
||||
add_input( s );
|
||||
if ( s->get_kind() == FG_SUPPLIER ) {
|
||||
s->add_output( this );
|
||||
} else if ( s->get_kind() == FG_BUS ) {
|
||||
s->add_output( this );
|
||||
} else {
|
||||
SG_LOG( SG_ALL, SG_ALERT,
|
||||
"Attempt to connect to something that can't provide an output: "
|
||||
<< child->getStringValue() );
|
||||
}
|
||||
} else {
|
||||
SG_LOG( SG_ALL, SG_ALERT, "Can't find named source: "
|
||||
<< child->getStringValue() );
|
||||
}
|
||||
} else if ( cname == "output" ) {
|
||||
FGElectricalComponent *s = es->find( child->getStringValue() );
|
||||
if ( s != NULL ) {
|
||||
add_output( s );
|
||||
if ( s->get_kind() == FG_BUS ) {
|
||||
s->add_input( this );
|
||||
} else if ( s->get_kind() == FG_OUTPUT ) {
|
||||
s->add_input( this );
|
||||
} else {
|
||||
SG_LOG( SG_ALL, SG_ALERT,
|
||||
"Attempt to connect to something that can't provide an input: "
|
||||
<< child->getStringValue() );
|
||||
}
|
||||
} else {
|
||||
SG_LOG( SG_ALL, SG_ALERT, "Can't find named source: "
|
||||
<< child->getStringValue() );
|
||||
}
|
||||
} else if ( cname == "switch" ) {
|
||||
// set default value of switch to true
|
||||
// cout << "Switch = " << child->getStringValue() << endl;
|
||||
fgSetBool( child->getStringValue(), true );
|
||||
add_switch( fgGetNode( child->getStringValue(), true ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -215,7 +281,7 @@ void FGElectricalSystem::update (double dt) {
|
|||
|
||||
bool FGElectricalSystem::build () {
|
||||
SGPropertyNode *node;
|
||||
int i, j;
|
||||
int i;
|
||||
|
||||
int count = config_props->nChildren();
|
||||
for ( i = 0; i < count; ++i ) {
|
||||
|
@ -224,80 +290,20 @@ bool FGElectricalSystem::build () {
|
|||
// cout << name << endl;
|
||||
if ( name == "supplier" ) {
|
||||
FGElectricalSupplier *s =
|
||||
new FGElectricalSupplier( node->getStringValue("name"),
|
||||
node->getStringValue("prop"),
|
||||
node->getStringValue("kind"),
|
||||
node->getDoubleValue("volts"),
|
||||
node->getDoubleValue("amps") );
|
||||
new FGElectricalSupplier( node );
|
||||
suppliers.push_back( s );
|
||||
} else if ( name == "bus" ) {
|
||||
FGElectricalBus *b =
|
||||
new FGElectricalBus( node->getStringValue("name"),
|
||||
node->getStringValue("prop") );
|
||||
new FGElectricalBus( node );
|
||||
buses.push_back( b );
|
||||
} else if ( name == "output" ) {
|
||||
FGElectricalOutput *o =
|
||||
new FGElectricalOutput( node->getStringValue("name"),
|
||||
node->getStringValue("prop") );
|
||||
new FGElectricalOutput( node );
|
||||
outputs.push_back( o );
|
||||
} else if ( name == "connector" ) {
|
||||
FGElectricalConnector *c =
|
||||
new FGElectricalConnector();
|
||||
new FGElectricalConnector( node, this );
|
||||
connectors.push_back( c );
|
||||
SGPropertyNode *child;
|
||||
int ccount = node->nChildren();
|
||||
for ( j = 0; j < ccount; ++j ) {
|
||||
child = node->getChild(j);
|
||||
string cname = child->getName();
|
||||
string cval = child->getStringValue();
|
||||
// cout << " " << cname << " = " << cval << endl;
|
||||
if ( cname == "input" ) {
|
||||
FGElectricalComponent *s = find( child->getStringValue() );
|
||||
if ( s != NULL ) {
|
||||
c->add_input( s );
|
||||
if ( s->get_kind() == FG_SUPPLIER ) {
|
||||
s->add_output( c );
|
||||
} else if ( s->get_kind() == FG_BUS ) {
|
||||
s->add_output( c );
|
||||
} else {
|
||||
SG_LOG( SG_ALL, SG_ALERT,
|
||||
"Attempt to connect to something that can't provide an output: "
|
||||
<< child->getStringValue() );
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
SG_LOG( SG_ALL, SG_ALERT,
|
||||
"Can't find named source: "
|
||||
<< child->getStringValue() );
|
||||
return false;
|
||||
}
|
||||
} else if ( cname == "output" ) {
|
||||
FGElectricalComponent *s = find( child->getStringValue() );
|
||||
if ( s != NULL ) {
|
||||
c->add_output( s );
|
||||
if ( s->get_kind() == FG_BUS ) {
|
||||
s->add_input( c );
|
||||
} else if ( s->get_kind() == FG_OUTPUT ) {
|
||||
s->add_input( c );
|
||||
} else {
|
||||
SG_LOG( SG_ALL, SG_ALERT,
|
||||
"Attempt to connect to something that can't provide an input: "
|
||||
<< child->getStringValue() );
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
SG_LOG( SG_ALL, SG_ALERT,
|
||||
"Can't find named source: "
|
||||
<< child->getStringValue() );
|
||||
return false;
|
||||
}
|
||||
} else if ( cname == "switch" ) {
|
||||
// set default value of switch to true
|
||||
// cout << "Switch = " << child->getStringValue() << endl;
|
||||
fgSetBool( child->getStringValue(), true );
|
||||
c->add_switch( fgGetNode( child->getStringValue(), true ) );
|
||||
}
|
||||
}
|
||||
} else {
|
||||
SG_LOG( SG_ALL, SG_ALERT, "Unknown component type specified: "
|
||||
<< name );
|
||||
|
@ -341,13 +347,15 @@ void FGElectricalSystem::propogate( FGElectricalComponent *node, double val,
|
|||
node->set_value( current );
|
||||
}
|
||||
|
||||
if ( ! node->get_prop().empty() ) {
|
||||
fgSetDouble( node->get_prop().c_str(), node->get_value() );
|
||||
int i;
|
||||
|
||||
// publish values to specified properties
|
||||
for ( i = 0; i < node->get_num_props(); ++i ) {
|
||||
fgSetDouble( node->get_prop(i).c_str(), node->get_value() );
|
||||
}
|
||||
// cout << s << node->get_name() << " -> " << node->get_value() << endl;
|
||||
|
||||
// propogate to all children
|
||||
int i;
|
||||
for ( i = 0; i < node->get_num_outputs(); ++i ) {
|
||||
propogate( node->get_output(i), current, s );
|
||||
}
|
||||
|
|
|
@ -42,6 +42,10 @@ SG_USING_STD(vector);
|
|||
#include <Main/fgfs.hxx>
|
||||
|
||||
|
||||
// Forward declaration
|
||||
class FGElectricalSystem;
|
||||
|
||||
|
||||
#define FG_UNKNOWN -1
|
||||
#define FG_SUPPLIER 0
|
||||
#define FG_BUS 1
|
||||
|
@ -58,11 +62,11 @@ protected:
|
|||
|
||||
int kind;
|
||||
string name;
|
||||
string prop;
|
||||
double value;
|
||||
|
||||
comp_list inputs;
|
||||
comp_list outputs;
|
||||
string_list props;
|
||||
|
||||
public:
|
||||
|
||||
|
@ -70,12 +74,19 @@ public:
|
|||
virtual ~FGElectricalComponent() {}
|
||||
|
||||
inline string get_name() { return name; }
|
||||
inline string get_prop() { return prop; }
|
||||
|
||||
inline int get_kind() const { return kind; }
|
||||
inline double get_value() const { return value; }
|
||||
inline void set_value( double val ) { value = val; }
|
||||
|
||||
inline int get_num_inputs() const { return outputs.size(); }
|
||||
inline FGElectricalComponent *get_input( const int i ) {
|
||||
return inputs[i];
|
||||
}
|
||||
inline void add_input( FGElectricalComponent *c ) {
|
||||
inputs.push_back( c );
|
||||
}
|
||||
|
||||
inline int get_num_outputs() const { return outputs.size(); }
|
||||
inline FGElectricalComponent *get_output( const int i ) {
|
||||
return outputs[i];
|
||||
|
@ -84,13 +95,14 @@ public:
|
|||
outputs.push_back( c );
|
||||
}
|
||||
|
||||
inline int get_num_inputs() const { return outputs.size(); }
|
||||
inline FGElectricalComponent *get_input( const int i ) {
|
||||
return inputs[i];
|
||||
inline int get_num_props() const { return props.size(); }
|
||||
inline string get_prop( const int i ) {
|
||||
return props[i];
|
||||
}
|
||||
inline void add_input( FGElectricalComponent *c ) {
|
||||
inputs.push_back( c );
|
||||
inline void add_prop( const string &s ) {
|
||||
props.push_back( s );
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -111,8 +123,7 @@ class FGElectricalSupplier : public FGElectricalComponent {
|
|||
|
||||
public:
|
||||
|
||||
FGElectricalSupplier ( string _name, string _prop, string _model,
|
||||
double _volts, double _amps );
|
||||
FGElectricalSupplier ( SGPropertyNode *node );
|
||||
~FGElectricalSupplier () {}
|
||||
|
||||
double get_output();
|
||||
|
@ -125,7 +136,7 @@ class FGElectricalBus : public FGElectricalComponent {
|
|||
|
||||
public:
|
||||
|
||||
FGElectricalBus ( string _name, string _prop );
|
||||
FGElectricalBus ( SGPropertyNode *node );
|
||||
~FGElectricalBus () {}
|
||||
};
|
||||
|
||||
|
@ -136,7 +147,7 @@ class FGElectricalOutput : public FGElectricalComponent {
|
|||
|
||||
public:
|
||||
|
||||
FGElectricalOutput ( string _name, string _prop );
|
||||
FGElectricalOutput ( SGPropertyNode *node );
|
||||
~FGElectricalOutput () {}
|
||||
};
|
||||
|
||||
|
@ -152,7 +163,7 @@ class FGElectricalConnector : public FGElectricalComponent {
|
|||
|
||||
public:
|
||||
|
||||
FGElectricalConnector ();
|
||||
FGElectricalConnector ( SGPropertyNode *node, FGElectricalSystem *es );
|
||||
~FGElectricalConnector () {}
|
||||
|
||||
void add_switch( SGPropertyNode *node ) {
|
||||
|
|
Loading…
Reference in a new issue