]> git.mxchange.org Git - flightgear.git/commitdiff
Templated subsystem handling
authorJames Turner <zakalawe@mac.com>
Thu, 10 Dec 2015 21:05:54 +0000 (15:05 -0600)
committerJames Turner <zakalawe@mac.com>
Thu, 10 Dec 2015 21:53:05 +0000 (15:53 -0600)
- remove explicit FGControls var from globals, as part of work
  towards unit-testing infrastructure.

src/Aircraft/controls.cxx
src/Aircraft/controls.hxx
src/Main/fg_init.cxx
src/Main/globals.cxx
src/Main/globals.hxx

index 879662bc28251afcceeaffcf8249621c25ebc0c3..e49b6e55a3396ae4bc603f9fb120aecc31fab964 100644 (file)
@@ -78,7 +78,6 @@ FGControls::FGControls() :
     }
   
     reset_all();
-    globals->set_controls( this );
 }
 
 
@@ -162,9 +161,8 @@ void FGControls::reset_all()
 
 
 // Destructor
-FGControls::~FGControls() {
-    if (globals)
-        globals->set_controls( NULL );
+FGControls::~FGControls()
+{
 }
 
 
index 980233e5ad3ffcba3984674301e79c625fb23a1f..aefe94b8dde9515bc0a5ba70583ef7156092a67a 100644 (file)
@@ -639,6 +639,7 @@ public:
     // controls/autoflight/autopilot[n]/
     void set_autopilot_engage( int ap, bool val );
 
+    static const char* subsystemName() { return "controls"; }
 private:
     inline void do_autocoordination() {
       // check for autocoordination
index 56111fbc93e319a1e502055d97c87548859472dd..0b58c32cbe5165eaaf7755b825215275bdfa3264 100644 (file)
@@ -849,7 +849,7 @@ void fgCreateSubsystems(bool duringReset) {
     // Initialize the controls subsystem.
     ////////////////////////////////////////////////////////////////////
     
-    globals->add_subsystem("controls", new FGControls, SGSubsystemMgr::GENERAL);
+    globals->add_new_subsystem<FGControls>(SGSubsystemMgr::GENERAL);
 
     ////////////////////////////////////////////////////////////////////
     // Initialize the input subsystem.
index d1ec0b47cd8d51a9a9d7d4ab16e720f709dfdf6e..22d5eff46637fab14687fbd4c3fbe711904503f7 100644 (file)
@@ -160,7 +160,6 @@ FGGlobals::FGGlobals() :
     time_params( NULL ),
     ephem( NULL ),
     route_mgr( NULL ),
-    controls( NULL ),
     viewmgr( NULL ),
     commands( SGCommandMgr::instance() ),
     channel_options_list( NULL ),
@@ -509,7 +508,7 @@ FGGlobals::get_subsystem_mgr () const
 }
 
 SGSubsystem *
-FGGlobals::get_subsystem (const char * name)
+FGGlobals::get_subsystem (const char * name) const
 {
     if (!subsystem_mgr) {
         return NULL;
@@ -751,6 +750,11 @@ void FGGlobals::set_matlib( SGMaterialLib *m )
     matlib = m;
 }
 
+FGControls *FGGlobals::get_controls() const
+{
+    return get_subsystem<FGControls>();
+}
+
 FGSampleQueue* FGGlobals::get_chatter_queue() const
 {
     return _chatter_queue;
index f5a3f20d5dbedc0ceea03230fb0a731bf00d3ebd..889fa40aabe5480c8948078e3e82fc1a3ec134e0 100644 (file)
@@ -123,9 +123,6 @@ private:
     // Global autopilot "route"
     FGRouteMgr *route_mgr;
 
-    // control input state
-    FGControls *controls;
-
     // viewer manager
     FGViewMgr *viewmgr;
 
@@ -180,19 +177,36 @@ public:
     virtual FGRenderer *get_renderer () const;
     void set_renderer(FGRenderer* render);
     
-    virtual SGSubsystemMgr *get_subsystem_mgr () const;
+    SGSubsystemMgr *get_subsystem_mgr () const;
+
+    SGSubsystem *get_subsystem (const char * name) const;
 
-    virtual SGSubsystem *get_subsystem (const char * name);
+    template<class T>
+    T* get_subsystem() const
+    {
+        return dynamic_cast<T*>(get_subsystem(T::subsystemName()));
+    }
 
-    virtual void add_subsystem (const char * name,
+
+    void add_subsystem (const char * name,
                                 SGSubsystem * subsystem,
                                 SGSubsystemMgr::GroupType
                                 type = SGSubsystemMgr::GENERAL,
                                 double min_time_sec = 0);
 
-    virtual SGEventMgr *get_event_mgr () const;
+    template<class T>
+    T* add_new_subsystem (SGSubsystemMgr::GroupType
+                                type = SGSubsystemMgr::GENERAL,
+                                double min_time_sec = 0)
+    {
+        T* sub = new T;
+        add_subsystem(T::subsystemName(), sub, type, min_time_sec);
+        return sub;
+    }
+
+    SGEventMgr *get_event_mgr () const;
 
-    virtual SGSoundMgr *get_soundmgr () const;
+    SGSoundMgr *get_soundmgr () const;
 
     inline double get_sim_time_sec () const { return sim_time_sec; }
     inline void inc_sim_time_sec (double dt) { sim_time_sec += dt; }
@@ -293,9 +307,6 @@ public:
     inline SGMaterialLib *get_matlib() const { return matlib; }
     void set_matlib( SGMaterialLib *m );
 
-    inline FGControls *get_controls() const { return controls; }
-    inline void set_controls( FGControls *c ) { controls = c; }
-
     inline FGViewMgr *get_viewmgr() const { return viewmgr; }
     inline void set_viewmgr( FGViewMgr *vm ) { viewmgr = vm; }
     FGViewer *get_current_view() const;
@@ -337,6 +348,8 @@ public:
         initial_waypoints = list;
     }
 
+    FGControls *get_controls() const;
+
     FGScenery * get_scenery () const;
     void set_scenery ( FGScenery *s );