]> git.mxchange.org Git - flightgear.git/blobdiff - src/Autopilot/autopilotgroup.cxx
Interim windows build fix
[flightgear.git] / src / Autopilot / autopilotgroup.cxx
index a856c342fb8d0d4f2bcbbcb49913074eea97b45e..199a14b946fb7d8a8615cf5d81cb4d53d0bcefba 100644 (file)
 #include <boost/foreach.hpp>
 
 using std::vector;
-using std::string;
 using simgear::PropertyList;
+using FGXMLAutopilot::Autopilot;
 
-class FGXMLAutopilotGroupImplementation : public FGXMLAutopilotGroup
+class FGXMLAutopilotGroupImplementation:
+  public FGXMLAutopilotGroup
 {
-public:
-    virtual void addAutopilot( const std::string & name, SGPropertyNode_ptr apNode, SGPropertyNode_ptr config );
+  public:
+    FGXMLAutopilotGroupImplementation(const std::string& nodeName):
+      FGXMLAutopilotGroup(),
+      _nodeName(nodeName)
+    {}
+
+    virtual void addAutopilot( const std::string& name,
+                               SGPropertyNode_ptr apNode,
+                               SGPropertyNode_ptr config );
     virtual void removeAutopilot( const std::string & name );
     void init();
+    InitStatus incrementalInit();
     void reinit();
-    void update( double dt );
-private:
+
+  private:
     void initFrom( SGPropertyNode_ptr rootNode, const char * childName );
-    vector<string> _autopilotNames;
+    std::string _nodeName;
 
 };
 
-void FGXMLAutopilotGroupImplementation::addAutopilot( const std::string & name, SGPropertyNode_ptr apNode, SGPropertyNode_ptr config )
-{
-    BOOST_FOREACH( std::string & n, _autopilotNames ) {
-        if( n == name ) {
-            SG_LOG(SG_ALL, SG_ALERT, "NOT adding duplicate property rule name " << name );
-            return;
-        }
-    }
-    FGXMLAutopilot::Autopilot * ap = new FGXMLAutopilot::Autopilot( apNode, config );
-    ap->set_name( name );
-    set_subsystem( name, ap );
-    _autopilotNames.push_back( name );
-}
-
-void FGXMLAutopilotGroupImplementation::removeAutopilot( const std::string & name )
+//------------------------------------------------------------------------------
+void FGXMLAutopilotGroupImplementation::addAutopilot( const std::string& name,
+                                                      SGPropertyNode_ptr apNode,
+                                                      SGPropertyNode_ptr config )
 {
-    FGXMLAutopilot::Autopilot * ap = (FGXMLAutopilot::Autopilot*)get_subsystem( name );
-    if( ap == NULL ) return; // ?
-    remove_subsystem( name );
-    delete ap;
+  if( has_subsystem(name) )
+  {
+    SG_LOG( SG_AUTOPILOT,
+            SG_ALERT,
+            "NOT adding duplicate " << _nodeName << " name '" << name << "'");
+    return;
+  }
+
+  Autopilot* ap = new Autopilot(apNode, config);
+  ap->set_name( name );
+
+  double updateInterval = config->getDoubleValue("update-interval-secs", 0.0);
+  set_subsystem( name, ap, updateInterval );
 }
 
-
-
-void FGXMLAutopilotGroupImplementation::update( double dt )
+//------------------------------------------------------------------------------
+void FGXMLAutopilotGroupImplementation::removeAutopilot(const std::string& name)
 {
-    // update all configured autopilots
-    SGSubsystemGroup::update( dt );
+  Autopilot* ap = static_cast<Autopilot*>(get_subsystem(name));
+  if( !ap )
+  {
+    SG_LOG( SG_AUTOPILOT,
+            SG_ALERT,
+            "CAN NOT remove unknown " << _nodeName << " '" << name << "'");
+    return;
+  }
+
+  remove_subsystem(name);
 }
 
+//------------------------------------------------------------------------------
 void FGXMLAutopilotGroupImplementation::reinit()
 {
-    SGSubsystemGroup::unbind();
+  SGSubsystemGroup::unbind();
+  clearSubsystems();
 
-    for( vector<string>::size_type i = 0; i < _autopilotNames.size(); i++ ) {
-      removeAutopilot( _autopilotNames[i] );
-    }
-    _autopilotNames.clear();
-    init();
+  init();
 }
 
-void FGXMLAutopilotGroupImplementation::init()
+//------------------------------------------------------------------------------
+SGSubsystem::InitStatus FGXMLAutopilotGroupImplementation::incrementalInit()
 {
-    static const char * nodeNames[] = {
-        "autopilot",
-        "property-rule"
-    };
-    for( unsigned i = 0; i < sizeof(nodeNames)/sizeof(nodeNames[0]); i++ )
-        initFrom( fgGetNode( "/sim/systems" ), nodeNames[i] );
-
-    SGSubsystemGroup::bind();
-    SGSubsystemGroup::init();
+  init();
+  return INIT_DONE;
 }
 
-void FGXMLAutopilotGroupImplementation::initFrom( SGPropertyNode_ptr rootNode, const char * childName )
+//------------------------------------------------------------------------------
+void FGXMLAutopilotGroupImplementation::init()
 {
-    if( rootNode == NULL )
-        return;
-
-    BOOST_FOREACH( SGPropertyNode_ptr autopilotNode, rootNode->getChildren(childName) ) {
-        SGPropertyNode_ptr pathNode = autopilotNode->getNode( "path" );
-        if( pathNode == NULL ) {
-            SG_LOG( SG_ALL, SG_WARN, "No configuration file specified for this property-rule!");
-            continue;
-        }
-
-        string apName;
-        SGPropertyNode_ptr nameNode = autopilotNode->getNode( "name" );
-        if( nameNode != NULL ) {
-            apName = nameNode->getStringValue();
-        } else {
-          std::ostringstream buf;
-          buf <<  "unnamed_autopilot_" << autopilotNode->getIndex();
-          apName = buf.str();
-        }
-
-        {
-          // check for duplicate names
-          string name = apName;
-          for( unsigned i = 0; get_subsystem( apName.c_str() ) != NULL; i++ ) {
-              std::ostringstream buf;
-              buf <<  name << "_" << i;
-              apName = buf.str();
-          }
-          if( apName != name )
-            SG_LOG( SG_ALL, SG_WARN, "Duplicate property-rule configuration name " << name << ", renamed to " << apName );
-        }
-
-        addAutopilotFromFile( apName, autopilotNode, pathNode->getStringValue() );
-    }
+  initFrom(fgGetNode("/sim/systems"), _nodeName.c_str());
+
+  SGSubsystemGroup::bind();
+  SGSubsystemGroup::init();
 }
 
-void FGXMLAutopilotGroup::addAutopilotFromFile( const std::string & name, SGPropertyNode_ptr apNode, const char * path )
+//------------------------------------------------------------------------------
+void FGXMLAutopilotGroupImplementation::initFrom( SGPropertyNode_ptr rootNode,
+                                                  const char* childName )
 {
-    SGPath config = globals->resolve_maybe_aircraft_path(path);
-    if (config.isNull())
+  if( !rootNode )
+    return;
+
+  BOOST_FOREACH( SGPropertyNode_ptr autopilotNode,
+                 rootNode->getChildren(childName) )
+  {
+    SGPropertyNode_ptr pathNode = autopilotNode->getNode("path");
+    if( !pathNode )
     {
-        SG_LOG( SG_ALL, SG_ALERT, "Cannot find property-rule configuration file '" << path << "'." );
-        return;
+      SG_LOG
+      (
+        SG_AUTOPILOT,
+        SG_WARN,
+        "No configuration file specified for this " << childName << "!"
+      );
+      continue;
     }
-    SG_LOG( SG_ALL, SG_INFO, "Reading property-rule configuration from " << config.str() );
-
-    try {
-        SGPropertyNode_ptr configNode = new SGPropertyNode();
-        readProperties( config.str(), configNode );
 
-        SG_LOG( SG_AUTOPILOT, SG_INFO, "adding  property-rule subsystem " << name );
-        addAutopilot( name, apNode, configNode );
+    std::string apName;
+    SGPropertyNode_ptr nameNode = autopilotNode->getNode( "name" );
+    if( nameNode != NULL ) {
+        apName = nameNode->getStringValue();
+    } else {
+      std::ostringstream buf;
+      buf <<  "unnamed_autopilot_" << autopilotNode->getIndex();
+      apName = buf.str();
+    }
 
-    } catch (const sg_exception& e) {
-        SG_LOG( SG_AUTOPILOT, SG_ALERT, "Failed to load property-rule configuration: "
-            << config.str() << ":" << e.getMessage() );
-        return;
+    {
+      // check for duplicate names
+      std::string name = apName;
+      for( unsigned i = 0; get_subsystem( apName.c_str() ) != NULL; i++ ) {
+          std::ostringstream buf;
+          buf <<  name << "_" << i;
+          apName = buf.str();
+      }
+      if( apName != name )
+        SG_LOG
+        (
+          SG_AUTOPILOT,
+          SG_WARN,
+          "Duplicate " << childName << " configuration name " << name
+                                    << ", renamed to " << apName
+        );
     }
+
+    addAutopilotFromFile(apName, autopilotNode, pathNode->getStringValue());
+  }
+}
+
+void FGXMLAutopilotGroup::addAutopilotFromFile( const std::string& name,
+                                                SGPropertyNode_ptr apNode,
+                                                const char* path )
+{
+  SGPath config = globals->resolve_maybe_aircraft_path(path);
+  if( config.isNull() )
+  {
+    SG_LOG
+    (
+      SG_AUTOPILOT,
+      SG_ALERT,
+      "Cannot find property-rule configuration file '" << path << "'."
+    );
+    return;
+  }
+  SG_LOG
+  (
+    SG_AUTOPILOT,
+    SG_INFO,
+    "Reading property-rule configuration from " << config.str()
+  );
+
+  try
+  {
+    SGPropertyNode_ptr configNode = new SGPropertyNode();
+    readProperties( config.str(), configNode );
+
+    SG_LOG(SG_AUTOPILOT, SG_INFO, "adding  property-rule subsystem " << name);
+    addAutopilot(name, apNode, configNode);
+  }
+  catch (const sg_exception& e)
+  {
+    SG_LOG
+    (
+      SG_AUTOPILOT,
+      SG_ALERT,
+      "Failed to load property-rule configuration: " << config.str()
+                                             << ": " << e.getMessage()
+    );
+    return;
+  }
 }
 
-FGXMLAutopilotGroup * FGXMLAutopilotGroup::createInstance()
+//------------------------------------------------------------------------------
+FGXMLAutopilotGroup*
+FGXMLAutopilotGroup::createInstance(const std::string& nodeName)
 {
-    return new FGXMLAutopilotGroupImplementation();
+  return new FGXMLAutopilotGroupImplementation(nodeName);
 }