From cc4821e43f0c939964ed89b4b7f29c76d3cf3d2d Mon Sep 17 00:00:00 2001 From: curt Date: Thu, 26 Sep 2002 04:51:23 +0000 Subject: [PATCH] Each node in the electrical system graph can now publish to an arbitrary number of properties which will reflect that node's state. --- src/Systems/electrical.cxx | 184 +++++++++++++++++++------------------ src/Systems/electrical.hxx | 35 ++++--- 2 files changed, 119 insertions(+), 100 deletions(-) diff --git a/src/Systems/electrical.cxx b/src/Systems/electrical.cxx index f04d553d9..f4eebbbac 100644 --- a/src/Systems/electrical.cxx +++ b/src/Systems/electrical.cxx @@ -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"); - fgSetDouble( prop.c_str(), 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 ); } diff --git a/src/Systems/electrical.hxx b/src/Systems/electrical.hxx index 1e94f2fb7..da29db546 100644 --- a/src/Systems/electrical.hxx +++ b/src/Systems/electrical.hxx @@ -42,6 +42,10 @@ SG_USING_STD(vector); #include
+// 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 ) {