1
0
Fork 0

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:
curt 2002-09-26 04:51:23 +00:00
parent 911e7dbfa8
commit cc4821e43f
2 changed files with 119 additions and 100 deletions

View file

@ -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 );
}

View file

@ -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 ) {