User:Bugman/subsystems: Difference between revisions

From FlightGear wiki
Jump to navigation Jump to search
(→‎All subsystems: Converted to the XML output.)
(→‎All subsystems: Updates for the latest on next.)
 
(51 intermediate revisions by the same user not shown)
Line 7: Line 7:
{{collapsible script
{{collapsible script
| type  = Python script
| type  = Python script
| title  = Python script for finding all subsystems within the flightgear and simgear C++ code bases.
| title  = The ''find_subsystems.py'' script for finding all subsystems within the flightgear and simgear C++ code bases.
| intro  = This script requires the ''grep'' Unix command, which can be installed on any OS.  And it must be run with Python3.
| intro  = This script requires the ''grep'' Unix command, which can be installed on any OS.  And it must be run with Python3.
| lang  = python
| lang  = python
Line 14: Line 14:


# Python module imports.
# Python module imports.
from argparse import ArgumentParser
import operator
import operator
from os import access, F_OK, sep
from re import search, split
from re import search, split
from subprocess import PIPE, Popen
from subprocess import PIPE, Popen
Line 23: Line 25:
SIMGEAR_PATH = "/flightgear/src/flightgear-simgear"
SIMGEAR_PATH = "/flightgear/src/flightgear-simgear"
FLIGHTGEAR_PATH = "/flightgear/src/flightgear-flightgear"
FLIGHTGEAR_PATH = "/flightgear/src/flightgear-flightgear"
# Directories to exclude from the grep.
EXCLUDE_DIR = [
    ".git",
    "build*"
]




Line 28: Line 36:
     """Class for finding all subsystems and subsystem groups."""
     """Class for finding all subsystems and subsystem groups."""


     def __init__(self):
     def __init__(self, output=True):
         """Find all subsystems and subsystem groups."""
         """Find all subsystems and subsystem groups.
 
        @keyword output:    A flag which if False will suppress all output to STDOUT.
        @type output:      bool
        """
 
        # Command line options.
        self.parse_arguments()


         # SGSubsystem storage lists.
         # SGSubsystem storage lists.
         self.subsystems = [[], [], [], []]
         self.subsystems = [[], [], [], []]
         self.groups = [[], [], [], []]
         self.groups = [[], [], [], []]
        # Grep exclude options.
        self.grep_exclude_dir = ""
        for name in EXCLUDE_DIR:
            self.grep_exclude_dir += "--exclude-dir \"%s\" " % name


         # The base objects.
         # The base objects.
         subsystem_base = Subsystem("SGSubsystem")
         subsystem_base = Subsystem("SGSubsystem", xml=self.output_xml)
         group_base = Subsystem("SGSubsystemGroup", base_class=Subsystem("SGSubsystem"))
         group_base = Subsystem("SGSubsystemGroup", base_class=Subsystem("SGSubsystem"), xml=self.output_xml)


         # Add some problematic non-parsable classes.
         # Add some problematic non-parsable classes.
         self.subsystems[1].append(Subsystem("FGAISim", base_class=Subsystem("FGInterface", base_class=Subsystem("SGSubsystem")), file_name="src/FDM/SP/AISim.hpp"))
         if self.category_subsystems:
            self.subsystems[1].append(Subsystem("FGAISim", base_class=Subsystem("FGInterface", base_class=Subsystem("SGSubsystem")), static_id="aisim", declaration_file="src/FDM/SP/AISim.hpp", root_path=self.root_path("src/FDM/SP/AISim.hpp"), full_path=self.output_full_path, xml=self.output_xml))


         # Find all SGSubsystem and SGSubsystemGroup derived classes.
         # Find all SGSubsystem and SGSubsystemGroup derived classes.
         paths = [SIMGEAR_PATH, FLIGHTGEAR_PATH]
         paths = [SIMGEAR_PATH, FLIGHTGEAR_PATH]
         printout = [False, True]
         if not self.output_flightgear:
         for i in range(len(paths)):
            paths = [SIMGEAR_PATH]
             self.find_primary(path=paths[i], text="classes", primary=self.subsystems[0], base_name="SGSubsystem", base=subsystem_base, skip=["SGSubsystemGroup"], printout=printout[i])
         for path in paths:
             self.find_primary(path=paths[i], text="groups", primary=self.groups[0], base_name="SGSubsystemGroup", base=group_base, printout=printout[i])
             if self.category_subsystems:
                self.find_primary(path=path, text="classes", primary=self.subsystems[0], base_name="SGSubsystem", base=subsystem_base, skip=["SGSubsystemGroup"])
             if self.category_groups:
                self.find_primary(path=path, text="groups", primary=self.groups[0], base_name="SGSubsystemGroup", base=group_base)


             self.find_secondary(path=paths[i], text="classes", primary=self.subsystems[0], secondary=self.subsystems[1], printout=printout[i])
             if self.category_subsystems:
             self.find_secondary(path=paths[i], text="groups", primary=self.groups[0], secondary=self.groups[1], printout=printout[i])
                self.find_secondary(path=path, text="classes", primary=self.subsystems[0], secondary=self.subsystems[1])
             if self.category_groups:
                self.find_secondary(path=path, text="groups", primary=self.groups[0], secondary=self.groups[1])


             self.find_tertiary(path=paths[i], text="classes", secondary=self.subsystems[1], tertiary=self.subsystems[2], printout=printout[i])
             if self.category_subsystems:
             self.find_tertiary(path=paths[i], text="groups", secondary=self.groups[1], tertiary=self.groups[2], printout=printout[i])
                self.find_tertiary(path=path, text="classes", secondary=self.subsystems[1], tertiary=self.subsystems[2])
             if self.category_groups:
                self.find_tertiary(path=path, text="groups", secondary=self.groups[1], tertiary=self.groups[2])


             self.find_quaternary(path=paths[i], text="classes", tertiary=self.subsystems[2], quaternary=self.subsystems[3], printout=printout[i])
             if self.category_subsystems:
             self.find_quaternary(path=paths[i], text="groups", tertiary=self.groups[2], quaternary=self.groups[3], printout=printout[i])
                self.find_quaternary(path=path, text="classes", tertiary=self.subsystems[2], quaternary=self.subsystems[3])
             if self.category_groups:
                self.find_quaternary(path=path, text="groups", tertiary=self.groups[2], quaternary=self.groups[3])
 
        # Find the subsystem and subsystem group implementation files.
        self.find_implementations()
 
        # Text search.
        if self.search_flag:
            self.search()


         # Final summary.
         # Final summary.
         print("\nTotal: %i subsystem classes." % len(self.subsystems[0] + self.subsystems[1] + self.subsystems[2] + self.subsystems[3]))
         if output:
        print("Total: %i subsystem groups." % len(self.groups[0] + self.groups[1] + self.groups[2] + self.groups[3]))
            self.summarise()




Line 85: Line 122:




     def find_primary(self, path=None, text=None, primary=None, base_name=None, base=None, skip=[], printout=False):
    def find_implementations(self):
        """Find all implementation files for all subsystems and subsystem groups."""
 
        # Loop over all subsystems and groups.
        for subsystem in self.subsystems[0] + self.subsystems[1] + self.subsystems[2] + self.subsystems[3] + self.groups[0] + self.groups[1] + self.groups[2] + self.groups[3]:
            # The repository location.
            if self.is_simgear(subsystem.declaration_file):
                path = SIMGEAR_PATH
            else:
                path = FLIGHTGEAR_PATH
 
            # The grep command for the ctor and dtor implementation.
            ctor = "\<%s\>::\<%s\>[ \(]" % (subsystem.name, subsystem.name)
            dtor = "\<%s\>::\~\<%s\>[ \(]" % (subsystem.name, subsystem.name)
            grep_ctor = 'grep -rI "%s\{{!}}%s"' % (ctor, dtor)
 
            # The grep command for any function implementation.
            grep_any = 'grep -rI %s "^[A-Za-z ]*\<%s\>::"' % (self.grep_exclude_dir, subsystem.name)
 
            # Search for matching file roots.
            if subsystem.declaration_file[-3:] == "hxx":
                # The probable implementation file name.
                file_name = subsystem.declaration_file[:-3] + "cxx"
                full_path = path + sep + file_name
                if access(full_path, F_OK):
                    # The Unix grep commands to run.
                    cmds = [
                        '%s %s' % (grep_ctor, full_path),
                        '%s %s {{!}} grep -v "return"' % (grep_any, full_path)
                    ]
 
                    # Search.
                    for cmd in cmds:
                        pipe = Popen(cmd, shell=True, stdout=PIPE)
                        lines = pipe.stdout.readlines()
                        if len(lines):
                            subsystem.add_implementation_file(file_name)
                            break
 
            # Search everywhere.
            else:
                # The Unix grep commands to run.
                cmds = [
                    'cd %s; %s' % (path, grep_ctor),
                    'cd %s; %s {{!}} grep -v "return"' % (path, grep_any)
                ]
 
                # Search.
                for cmd in cmds:
                    pipe = Popen(cmd, shell=True, stdout=PIPE)
 
                    # Read all output.
                    files = []
                    for line in pipe.stdout.readlines():
                        # Convert the byte-array.
                        line = line.decode()
 
                        # Add the file if not already present.
                        file_name = line.split(":")[0]
                        if file_name not in files:
                            files.append(file_name)
 
                    # Bad grep.
                    if len(files) > 1:
                        sys.stderr.write("Warning: Excessive grep matching, too many implementation files found for:\n")
                        sys.stderr.write("    %s: %s\n" % (subsystem.name, files))
 
                    # Store the implementation file.
                    elif len(files):
                        subsystem.add_implementation_file(files[0])
                        break
 
 
     def find_primary(self, path=None, text=None, primary=None, base_name=None, base=None, skip=[]):
         """Find all primary subsystems and groups
         """Find all primary subsystems and groups


Line 100: Line 210:
         @keyword skip:      A list of class names to skip.
         @keyword skip:      A list of class names to skip.
         @type skip:        list of str
         @type skip:        list of str
        @keyword printout:  A flag which if True will activate the printout of subsystems.
        @type printout:    bool
         """
         """
        # Printout.
        sys.stderr.write("Finding all primary %s in: %s\n" % (text, path))


         # Find all subsystems or groups.
         # Find all subsystems or groups.
         for file_name, class_name in self.grep(path=path, base_name=base_name):
         for file_name, class_name in self.grep(path=path, base_name=base_name, simgear=True):
             if class_name in skip:
             if class_name in skip:
                 continue
                 continue
             primary.append(Subsystem(class_name, base_class=base, file_name=file_name))
             primary.append(Subsystem(class_name, base_class=base, declaration_file=file_name, root_path=self.root_path(file_name), full_path=self.output_full_path, xml=self.output_xml))


         # Sort the subsystems by name.
         # Sort the subsystems by name.
         primary.sort(key=operator.attrgetter('name'))
         primary.sort(key=operator.attrgetter('name'))


        # Printout.
        if printout:
            counts = self.count(primary)
            print("\nPrimary %s (%i subsystems, %i groups):" % (text, counts[0], counts[1]))
            for subsystem in primary:
                print("    %s" % subsystem)


 
     def find_secondary(self, path=None, text=None, primary=None, secondary=None):
     def find_secondary(self, path=None, text=None, primary=None, secondary=None, printout=False):
         """Find all secondary subsystems and groups
         """Find all secondary subsystems and groups


Line 132: Line 236:
         @keyword secondary: The secondary list of subsystems or groups.
         @keyword secondary: The secondary list of subsystems or groups.
         @type secondary:    list of Subsystem instances
         @type secondary:    list of Subsystem instances
        @keyword printout:  A flag which if True will activate the printout of subsystems.
        @type printout:    bool
         """
         """
        # Printout.
        sys.stderr.write("Finding all secondary %s in: %s\n" % (text, path))


         # Loop over all primary subsystems.
         # Loop over all primary subsystems.
         for subsystem in primary:
         for subsystem in primary:
             for file_name, derived_class in self.grep(path=path, base_name=subsystem.name):
             for file_name, derived_class in self.grep(path=path, base_name=subsystem.name, simgear=self.is_simgear(subsystem.declaration_file)):
                 secondary.append(Subsystem(derived_class, base_class=subsystem, file_name=file_name))
                 secondary.append(Subsystem(derived_class, base_class=subsystem, declaration_file=file_name, root_path=self.root_path(file_name), full_path=self.output_full_path, xml=self.output_xml))


         # Sort the subsystems by name.
         # Sort the subsystems by name.
         secondary.sort(key=operator.attrgetter('name'))
         secondary.sort(key=operator.attrgetter('name'))
        # Printout.
        if printout and secondary:
            counts = self.count(secondary)
            print("\nSecondary %s (%i subsystems, %i groups):" % (text, counts[0], counts[1]))
            for subsystem in secondary:
                print("    %s" % subsystem)




     def find_tertiary(self, path=None, text=None, secondary=None, tertiary=None, printout=False):
     def find_tertiary(self, path=None, text=None, secondary=None, tertiary=None):
         """Find all tertiary subsystems and groups
         """Find all tertiary subsystems and groups


Line 163: Line 261:
         @keyword tertiary:  The tertiary list of subsystems or groups.
         @keyword tertiary:  The tertiary list of subsystems or groups.
         @type tertiary:    list of Subsystem instances
         @type tertiary:    list of Subsystem instances
        @keyword printout:  A flag which if True will activate the printout of subsystems.
        @type printout:    bool
         """
         """
        # Printout.
        sys.stderr.write("Finding all tertiary %s in: %s\n" % (text, path))


         # Loop over all secondary subsystems.
         # Loop over all secondary subsystems.
         for subsystem in secondary:
         for subsystem in secondary:
             for file_name, derived_class in self.grep(path=path, base_name=subsystem.name):
             for file_name, derived_class in self.grep(path=path, base_name=subsystem.name, simgear=self.is_simgear(subsystem.declaration_file)):
                 tertiary.append(Subsystem(derived_class, base_class=subsystem, file_name=file_name))
                 tertiary.append(Subsystem(derived_class, base_class=subsystem, declaration_file=file_name, root_path=self.root_path(file_name), full_path=self.output_full_path, xml=self.output_xml))


         # Sort all subsystems by name.
         # Sort all subsystems by name.
         tertiary.sort(key=operator.attrgetter('name'))
         tertiary.sort(key=operator.attrgetter('name'))
        # Printout.
        if printout and tertiary:
            counts = self.count(tertiary)
            print("\nTertiary %s (%i subsystems, %i groups):" % (text, counts[0], counts[1]))
            for subsystem in tertiary:
                print("    %s" % subsystem)




     def find_quaternary(self, path=None, text=None, tertiary=None, quaternary=None, printout=False):
     def find_quaternary(self, path=None, text=None, tertiary=None, quaternary=None):
         """Find all tertiary subsystems and groups
         """Find all quaternary subsystems and groups


         @keyword path:          The path to the repository to search through.
         @keyword path:          The path to the repository to search through.
Line 194: Line 286:
         @keyword quaternary:    The quaternary list of subsystems or groups.
         @keyword quaternary:    The quaternary list of subsystems or groups.
         @type quaternary:      list of Subsystem instances
         @type quaternary:      list of Subsystem instances
        @keyword printout:      A flag which if True will activate the printout of subsystems.
        @type printout:        bool
         """
         """
        # Printout.
        sys.stderr.write("Finding all quaternary %s in: %s\n" % (text, path))


         # Loop over all tertiary subsystems.
         # Loop over all tertiary subsystems.
         for subsystem in tertiary:
         for subsystem in tertiary:
             for file_name, derived_class in self.grep(path=path, base_name=subsystem.name):
             for file_name, derived_class in self.grep(path=path, base_name=subsystem.name, simgear=self.is_simgear(subsystem.declaration_file)):
                 quaternary.append(Subsystem(derived_class, base_class=subsystem, file_name=file_name))
                 quaternary.append(Subsystem(derived_class, base_class=subsystem, declaration_file=file_name, root_path=self.root_path(file_name), full_path=self.output_full_path, xml=self.output_xml))


         # Sort all subsystems by name.
         # Sort all subsystems by name.
         quaternary.sort(key=operator.attrgetter('name'))
         quaternary.sort(key=operator.attrgetter('name'))
        # Printout.
        if printout and quaternary:
            counts = self.count(quaternary)
            print("\nQuaternary %s (%i subsystems, %i groups):" % (text, counts[0], counts[1]))
            for subsystem in quaternary:
                print("    %s" % subsystem)




     def grep(self, path=None, base_name=None):
     def grep(self, path=None, base_name=None, simgear=False):
         """Generator method for finding all classes derived from the given base name and repository.
         """Generator method for finding all classes derived from the given base name and repository.


Line 221: Line 307:
         @keyword base_name: The name of the base class.
         @keyword base_name: The name of the base class.
         @type base_name:    str
         @type base_name:    str
        @keyword simgear:  A flag specifying if the base class belongs to Simgear or not.
        @type simgear:      bool
         @return:            The source file and the name of the derived class.
         @return:            The source file and the name of the derived class.
         @rtype:            str, str
         @rtype:            str, str
Line 226: Line 314:


         # The Unix grep command to run.
         # The Unix grep command to run.
         cmd = 'cd %s; grep -rI "public \<%s\>" {{!}} grep -v "%s::"' % (path, base_name, base_name)
         if simgear:
            cmd = 'cd %s; grep -rI %s "public \<%s\>\{{!}}public simgear.*::\<%s\>" {{!}} grep -v "%s::"' % (path, self.grep_exclude_dir, base_name, base_name, base_name)
        else:
            cmd = 'cd %s; grep -rI %s "public \<%s\>" {{!}} grep -v "%s::"' % (path, self.grep_exclude_dir, base_name, base_name)
         pipe = Popen(cmd, shell=True, stdout=PIPE)
         pipe = Popen(cmd, shell=True, stdout=PIPE)


Line 240: Line 331:
             # Cannot handle this line!
             # Cannot handle this line!
             if not search("class ", line):
             if not search("class ", line):
                 sys.stderr.write("\nSkipping: %s\n" % repr(line[:-1]))
                 sys.stderr.write("Skipping: %s\n" % repr(line[:-1]))
                 continue
                 continue


Line 254: Line 345:
             # Generator method.
             # Generator method.
             yield file_name, class_name
             yield file_name, class_name
    def is_simgear(self, file_name):
        """Determine if the file is from simgear.
        @param file_name:  The name of the file.
        @type file_name:    str
        @return:            True if the file is from simgear, False otherwise.
        @rtype:            bool
        """
        # Basic path check.
        if file_name[:7] == "simgear":
            return True
        return False
    def parse_arguments(self):
        """Parse the command line arguments."""
        # The argument parser.
        parser = ArgumentParser()
        # The output arguments.
        group = parser.add_argument_group("output arguments", "Change the output format.")
        group.add_argument("-t", "--text", default=False, action="store_true", help="Output in plain text format (the default).")
        group.add_argument("-x", "--xml", default=False, action="store_true", help="Output in XML format.")
        group.add_argument("-l", "--files", default=False, action="store_true", help="List all declaration and/or implementation files.")
        group.add_argument("-d", "--declaration-files", default=False, action="store_true", help="List the files where subsystems and subsystem groups are declared.")
        group.add_argument("-i", "--implementation-files", default=False, action="store_true", help="List the files where subsystems and subsystem groups are implemented.")
        group.add_argument("--classes", default=False, action="store_true", help="List all class names.")
        group.add_argument("-p", "--full-path", default=False, action="store_true", help="For file listings, include the SIMGEAR or FLIGHTGEAR absolute path.")
        # The text search arguments.
        group = parser.add_argument_group("text search arguments", "Search for certain text in the files.")
        group.add_argument("--search", metavar="TEXT", help="Search for the given text in the declaration and implementation files.")
        group.add_argument("--get-subsystem", default=False, action="store_true", help="Search for all get_subsystems() function calls.")
        group.add_argument("-c", "--includes", default=False, action="store_true", help="Extend the search to include included files.")
        # Code base selection.
        group = parser.add_argument_group("code base selections", "Choose between simgear and flightgear.")
        group.add_argument("-s", "--simgear", default=False, action="store_true", help="Exclusively output simgear subsystems.")
        group.add_argument("-f", "--flightgear", default=False, action="store_true", help="Exclusively output flightgear subsystems.")
        # Category selection.
        group = parser.add_argument_group("category selections", "Choose between subsystems and subsystem groups.")
        group.add_argument("-n", "--no-groups", default=False, action="store_true", help="Skip subsystem groups.")
        group.add_argument("-g", "--groups", default=False, action="store_true", help="Only process subsystem groups.")
        # Parse the arguments.
        args = parser.parse_args()
        # The output arguments.
        self.output_xml = args.xml
        self.output_format = "text"
        if args.text:
            self.output_format = "text"
        elif args.xml:
            self.output_format = "xml"
        elif args.files:
            self.output_format = "files"
        elif args.classes:
            self.output_format = "classes"
        elif args.declaration_files:
            self.output_format = "declaration files"
        elif args.implementation_files:
            self.output_format = "implementation files"
        self.output_full_path = args.full_path
        # The text search arguments.
        self.search_flag = False
        if args.search or args.get_subsystem:
            self.search_flag = True
        self.search_text = args.search
        self.search_get_subsystem = args.get_subsystem
        self.search_includes = args.includes
        # The code base arguments.
        self.output_simgear = True
        self.output_flightgear = True
        if args.simgear:
            self.output_flightgear = False
        if args.flightgear:
            self.output_simgear = False
        # The category arguments.
        self.category_subsystems = True
        self.category_groups = True
        if args.groups:
            self.category_subsystems = False
        if args.no_groups:
            self.category_groups = False
    def root_path(self, file_name):
        """Determine the root for the given file.
        @param file_name:  The name of the file.
        @type file_name:    str
        @return:            The root path.
        @rtype:            str
        """
        # The relative or absolute path.
        if self.is_simgear(file_name):
            return SIMGEAR_PATH
        else:
            return FLIGHTGEAR_PATH
    def search(self):
        """Search for certain text in the declaration and implementation files (and includes)."""
        # The search text.
        search_text = self.search_text
        if self.search_get_subsystem:
            search_text = "get_subsystem"
        # Loop over all subsystems and groups.
        for subsystem in self.subsystems[0] + self.subsystems[1] + self.subsystems[2] + self.subsystems[3] + self.groups[0] + self.groups[1] + self.groups[2] + self.groups[3]:
            # The repository location.
            if self.is_simgear(subsystem.declaration_file):
                path = SIMGEAR_PATH
            else:
                path = FLIGHTGEAR_PATH
            # The files to search through.
            root = ""
            if not subsystem.root_path:
                root = path + sep
            files = [root+subsystem.declaration_file]
            if subsystem.implementation_file:
                files.append(root+subsystem.implementation_file)
            # Loop over each file.
            for file_name in files:
                # Extract the contents.
                file = open(file_name)
                lines = file.readlines()
                file.close()
                # Search.
                for line in lines:
                    if search(search_text, line):
                        print("%s: %s" % (file_name, line))
    def summarise(self):
        """Print out a summary of all found subsystems and subsystem groups."""
        # Basic file or class listings.
        if self.output_format in ["files", "declaration files", "implementation files", "classes"]:
            # Concatenate the lists.
            subsystem_list = []
            if self.category_subsystems:
                subsystem_list += self.subsystems[0] + self.subsystems[1] + self.subsystems[2] + self.subsystems[3]
            if self.category_groups:
                subsystem_list += self.groups[0] + self.groups[1] + self.groups[2] + self.groups[3]
            # Loop over each subsystem, printing out the source files.
            for subsystem in subsystem_list:
                # Code base selections.
                if self.is_simgear(subsystem.declaration_file) and not self.output_simgear:
                    continue
                if not self.is_simgear(subsystem.declaration_file) and not self.output_flightgear:
                    continue
                # Output the source files.
                if self.output_format in ["files", "declaration files"]:
                    if subsystem.full_path:
                        print("%s%s%s" % (subsystem.root_path, sep, subsystem.declaration_file))
                    else:
                        print("%s" % subsystem.declaration_file)
                if self.output_format in ["files", "implementation files"]:
                    if subsystem.implementation_file:
                        if subsystem.full_path:
                            print("%s%s%s" % (subsystem.root_path, sep, subsystem.implementation_file))
                        else:
                            print("%s" % subsystem.implementation_file)
                # Output the class name.
                if self.output_format == "classes":
                    print("%s" % subsystem.name)
            # Skip the rest of the function.
            return
        # XML start.
        if self.output_xml:
            print("<?xml version=\"1.0\"?>")
            print("<subsystems>")
        # Subsystem and group printouts.
        labels = ["primary", "secondary", "tertiary", "quaternary"]
        labels2 = ["Primary", "Secondary", "Tertiary", "Quaternary"]
        classes = ["subsystems", "groups"]
        for i in range(len(self.subsystems)):
            for j in range(len(classes)):
                if classes[j] == "subsystems":
                    subsystem_list = self.subsystems[i]
                else:
                    subsystem_list = self.groups[i]
                # Nothing in the list.
                if not len(subsystem_list):
                    continue
                # Count all.
                counts = self.count(subsystem_list)
                # Start.
                if self.output_xml:
                    print("  <%s_%s count=\"%i\">" % (labels[i], classes[j], counts[j]))
                else:
                    print("\n%s %s (%i):" % (labels2[i], classes[j], counts[j]))
                # Subsystems.
                for subsystem in subsystem_list:
                    for line in repr(subsystem).split("\n"):
                        print("    %s" % (line))
                # End.
                if self.output_xml:
                    print("  </%s_%s>" % (labels[i], classes[j]))
        # Counts.
        subsystem_classes = len(self.subsystems[0] + self.subsystems[1] + self.subsystems[2] + self.subsystems[3])
        subsystem_groups = len(self.groups[0] + self.groups[1] + self.groups[2] + self.groups[3])
        subsystem_total = subsystem_classes + subsystem_groups
        # Separate simgear and flightgear subsystems.
        subsystem_classes_simgear = 0
        subsystem_classes_flightgear = 0
        subsystem_groups_simgear = 0
        subsystem_groups_flightgear = 0
        for subsystem in self.subsystems[0] + self.subsystems[1] + self.subsystems[2] + self.subsystems[3]:
            if self.is_simgear(subsystem.declaration_file):
                subsystem_classes_simgear += 1
            else:
                subsystem_classes_flightgear += 1
        for group in self.groups[0] + self.groups[1] + self.groups[2] + self.groups[3]:
            if self.is_simgear(group.declaration_file):
                subsystem_groups_simgear += 1
            else:
                subsystem_groups_flightgear += 1
        # Sums.
        simgear_total = subsystem_classes_simgear + subsystem_groups_simgear
        flightgear_total = subsystem_classes_flightgear + subsystem_groups_flightgear
        if self.output_xml:
            print("  <counts>")
            print("    <simgear>")
            if self.category_subsystems:
                print("      <subsystem_classes>%i</subsystem_classes>" % subsystem_classes_simgear)
            if self.category_groups:
                print("      <subsystem_groups>%i</subsystem_groups>" % subsystem_groups_simgear)
            if self.category_subsystems and self.category_groups:
                print("      <total>%i</total>" % simgear_total)
            print("    </simgear>")
            print("    <flightgear>")
            if self.category_subsystems:
                print("      <subsystem_classes>%i</subsystem_classes>" % subsystem_classes_flightgear)
            if self.category_groups:
                print("      <subsystem_groups>%i</subsystem_groups>" % subsystem_groups_flightgear)
            if self.category_subsystems and self.category_groups:
                print("      <total>%i</total>" % flightgear_total)
            print("    </flightgear>")
            print("    <combined>")
            if self.category_subsystems:
                print("      <subsystem_classes>%i</subsystem_classes>" % subsystem_classes)
            if self.category_groups:
                print("      <subsystem_groups>%i</subsystem_groups>" % subsystem_groups)
            if self.category_subsystems and self.category_groups:
                print("      <total>%i</total>" % subsystem_total)
            print("    </combined>")
            print("  </counts>")
        else:
            print("\nCounts: %i subsystem classes (%i flightgear, %i simgear)." % (subsystem_classes, subsystem_classes_flightgear, subsystem_classes_simgear))
            print("Counts: %i subsystem groups (%i flightgear, %i simgear)." % (subsystem_groups, subsystem_groups_flightgear, subsystem_groups_simgear))
            print("Counts: %i subsystem classes and groups (%i flightgear, %i simgear)." % (subsystem_total, flightgear_total, simgear_total))
        # XML end.
        if self.output_xml:
            print("</subsystems>")




Line 260: Line 635:
     """Object for storing the information for a specific subsystem."""
     """Object for storing the information for a specific subsystem."""


     def __init__(self, name, base_class=None, file_name=None):
     def __init__(self, name, base_class=None, static_id=None, declaration_file=None, implementation_file=None, root_path=None, full_path=False, xml=False):
         """Set up the object.
         """Set up the object.


         @param name:           The name of the subsystem.
         @param name:                   The name of the subsystem.
         @type name:             str
         @type name:                     str
         @keyword base_class:   The name of the base class.
         @keyword base_class:           The name of the base class.
         @type base_class:       str
         @type base_class:               str
         @keyword file_name:     The name of the file containing the subsystem declaration.
        @keyword static_id:            The value returned by staticSubsystemClassId().
         @type file_name:       str
        @type static_id:                str
         @keyword declaration_file:     The name of the file containing the subsystem declaration.
         @type declaration_file:        str
        @keyword implementation_file:  The name of the file containing the subsystem implementation.
        @type implementation_file:     str or None
        @keyword root_path:            The root path to the files.
        @type root_path:                str
        @keyword full_path:            A flag which if True will cause the full paths to be shown.
        @type full_path:                bool
        @keyword xml:                  Produce a valid XML representation of the object.
        @type xml:                      bool
         """
         """


Line 274: Line 659:
         self.name = name
         self.name = name
         self.base_class = base_class
         self.base_class = base_class
         self.file_name = file_name
         self.staticSubsystemClassId = static_id
        self.implementation_file = implementation_file
        self.declaration_file = declaration_file
        self.root_path = root_path
        self.full_path = full_path
        self.xml = xml
 
        # Data extraction.
        self.info_extraction()




Line 283: Line 676:
         @rtype:    str
         @rtype:    str
         """
         """
        # The subsystem name.
        string = "<%s" % self.name


         # The inheritance chain.
         # The inheritance chain.
        inheritance = ""
         if self.base_class:
         if self.base_class:
             string += " : %s" % self.base_class.name
             inheritance += "%s" % self.base_class.name
             if self.base_class.base_class:
             if self.base_class.base_class:
                 string += " : %s" % self.base_class.base_class.name
                 inheritance += " : %s" % self.base_class.base_class.name
                 if self.base_class.base_class.base_class:
                 if self.base_class.base_class.base_class:
                     string += " : %s" % self.base_class.base_class.base_class.name
                     inheritance += " : %s" % self.base_class.base_class.base_class.name
                     if self.base_class.base_class.base_class.base_class:
                     if self.base_class.base_class.base_class.base_class:
                         string += " : %s" % self.base_class.base_class.base_class.base_class.name
                         inheritance += " : %s" % self.base_class.base_class.base_class.base_class.name
                         if self.base_class.base_class.base_class.base_class.base_class:
                         if self.base_class.base_class.base_class.base_class.base_class:
                             string += " : %s" % self.base_class.base_class.base_class.base_class.base_class.name
                             inheritance += " : %s" % self.base_class.base_class.base_class.base_class.base_class.name
 
        # XML representation.
        if self.xml:
            return self.__repr_xml__(inheritance)
 
        # The subsystem name and inheritance chain.
        string = "<%s : %s" % (self.name, inheritance)
 
        # Add the static class ID.
        if self.staticSubsystemClassId:
            string += " staticSubsystemClassId is \"%s\"" % self.staticSubsystemClassId
 
        # Add the declaration file name.
        file = self.declaration_file
        if self.full_path:
            file = self.root_path + sep + self.declaration_file
        string += " declared in \"%s\"" % file


         # Add the source file name.
         # Add the implementation file name.
         string += " in %s" % repr(self.file_name)
         if self.implementation_file:
            file = self.implementation_file
            if self.full_path:
                file = self.root_path + sep + self.implementation_file
            string += ", implemented in \"%s\"" % file


         # Closure.
         # Closure.
Line 307: Line 719:
         # Return the representation.
         # Return the representation.
         return string
         return string
    def __repr_xml__(self, inheritance=""):
        """Create a XML representation of the object.
        @keyword inheritance:  The string representation of the inheritance chain.
        @type inheritance:      str
        @return:                The XML representation.
        @rtype:                str
        """
        # Start.
        string = "<%s>\n" % self.name
        # The inheritance chain.
        string += "  <inheritance>%s</inheritance>\n" % inheritance
        # Add the static class ID.
        if self.staticSubsystemClassId:
            string += "  <staticSubsystemClassId>%s</staticSubsystemClassId>\n" % self.staticSubsystemClassId
        # Add the declaration file name.
        file = self.declaration_file
        if self.full_path:
            file = self.root_path + sep + self.declaration_file
        string += "  <declaration>%s</declaration>\n" % file
        # Add the implementation file name.
        if self.implementation_file:
            file = self.implementation_file
            if self.full_path:
                file = self.root_path + sep + self.implementation_file
            string += "  <implementation>%s</implementation>\n" % file
        # End.
        string += "</%s>" % self.name
        # Return the string.
        return string
    def add_implementation_file(self, implementation_file=None):
        """Set up the object.
        @keyword implementation_file:  The path of the file containing the subsystem implementation.
        @type implementation_file:      str or None
        """
        # Store the file.
        self.implementation_file = implementation_file
    def info_extraction(self):
        """Extract subsystem information from the source files."""
        # No declaration.
        if not self.declaration_file:
            return
        # Open the declaration file.
        file = open(self.root_path + sep + self.declaration_file)
        lines = file.readlines()
        file.close()
        # Loop over the file contents.
        in_decl = False
        for i in range(len(lines)):
            # The start of the declaration.
            if search("^class %s : " % self.name, lines[i]):
                in_decl = True
                continue
            # Skip the line.
            if not in_decl:
                continue
            # Out of the declaration.
            if search("^};", lines[i]):
                in_decl = False
                continue
            # The static subsystem class ID.
            if search("static const char\* staticSubsystemClassId()", lines[i]):
                id = lines[i].split("return \"")[1]
                id = id.split("\"")[0]
                self.staticSubsystemClassId = id




Line 347: Line 845:


The result is:
The result is:
{{collapsible script
| type  = Text output
| title  = A listing of all flightgear and simgear subsystems and subsystem groups.
| intro  = Output from the Python script for finding all subsystems within the flightgear and simgear C++ code bases.  The error output from the script was redirected and hence not shown below.
| lang  = c
| script =
Primary subsystems (91):
    <AbstractInstrument : SGSubsystem declared in "src/Instrumentation/AbstractInstrument.hxx", implemented in "src/Instrumentation/AbstractInstrument.cxx">
    <AirportDynamicsManager : SGSubsystem staticSubsystemClassId is "airport-dynamics" declared in "src/Airports/airportdynamicsmanager.hxx", implemented in "src/Airports/airportdynamicsmanager.cxx">
    <AirspeedIndicator : SGSubsystem staticSubsystemClassId is "airspeed-indicator" declared in "src/Instrumentation/airspeed_indicator.hxx", implemented in "src/Instrumentation/airspeed_indicator.cxx">
    <Altimeter : SGSubsystem staticSubsystemClassId is "altimeter" declared in "src/Instrumentation/altimeter.hxx", implemented in "src/Instrumentation/altimeter.cxx">
    <AnotherSub : SGSubsystem staticSubsystemClassId is "anothersub" declared in "simgear/structure/subsystem_test.cxx">
    <AreaSampler : SGSubsystem staticSubsystemClassId is "area" declared in "src/Environment/terrainsampler.cxx", implemented in "src/Environment/terrainsampler.cxx">
    <AttitudeIndicator : SGSubsystem staticSubsystemClassId is "attitude-indicator" declared in "src/Instrumentation/attitude_indicator.hxx", implemented in "src/Instrumentation/attitude_indicator.cxx">
    <Clock : SGSubsystem staticSubsystemClassId is "clock" declared in "src/Instrumentation/clock.hxx", implemented in "src/Instrumentation/clock.cxx">
    <Component : SGSubsystem declared in "src/Autopilot/component.hxx", implemented in "src/Autopilot/component.cxx">
    <DCLGPS : SGSubsystem declared in "src/Instrumentation/dclgps.hxx", implemented in "src/Instrumentation/dclgps.cxx">
    <Ephemeris : SGSubsystem staticSubsystemClassId is "ephemeris" declared in "src/Environment/ephemeris.hxx", implemented in "src/Environment/ephemeris.cxx">
    <FDMShell : SGSubsystem staticSubsystemClassId is "flight" declared in "src/FDM/fdm_shell.hxx", implemented in "src/FDM/fdm_shell.cxx">
    <FGAIManager : SGSubsystem staticSubsystemClassId is "ai-model" declared in "src/AIModel/AIManager.hxx", implemented in "src/AIModel/AIManager.cxx">
    <FGATCManager : SGSubsystem staticSubsystemClassId is "ATC" declared in "src/ATC/atc_mgr.hxx", implemented in "src/ATC/atc_mgr.cxx">
    <FGAircraftModel : SGSubsystem staticSubsystemClassId is "aircraft-model" declared in "src/Model/acmodel.hxx", implemented in "src/Model/acmodel.cxx">
    <FGCom : SGSubsystem staticSubsystemClassId is "fgcom" declared in "src/Network/fgcom.hxx", implemented in "src/Network/fgcom.cxx">
    <FGControls : SGSubsystem staticSubsystemClassId is "controls" declared in "src/Aircraft/controls.hxx", implemented in "src/Aircraft/controls.cxx">
    <FGDNSClient : SGSubsystem staticSubsystemClassId is "dns" declared in "src/Network/DNSClient.hxx", implemented in "src/Network/DNSClient.cxx">
    <FGElectricalSystem : SGSubsystem staticSubsystemClassId is "electrical" declared in "src/Systems/electrical.hxx", implemented in "src/Systems/electrical.cxx">
    <FGEventInput : SGSubsystem declared in "src/Input/FGEventInput.hxx", implemented in "src/Input/FGEventInput.cxx">
    <FGFlightHistory : SGSubsystem staticSubsystemClassId is "history" declared in "src/Aircraft/FlightHistory.hxx", implemented in "src/Aircraft/FlightHistory.cxx">
    <FGHTTPClient : SGSubsystem staticSubsystemClassId is "http" declared in "src/Network/HTTPClient.hxx", implemented in "src/Network/HTTPClient.cxx">
    <FGHttpd : SGSubsystem staticSubsystemClassId is "httpd" declared in "src/Network/http/httpd.hxx">
    <FGIO : SGSubsystem staticSubsystemClassId is "io" declared in "src/Main/fg_io.hxx", implemented in "src/Main/fg_io.cxx">
    <FGInterface : SGSubsystem declared in "src/FDM/flight.hxx", implemented in "src/FDM/flight.cxx">
    <FGJoystickInput : SGSubsystem staticSubsystemClassId is "input-joystick" declared in "src/Input/FGJoystickInput.hxx", implemented in "src/Input/FGJoystickInput.cxx">
    <FGKR_87 : SGSubsystem staticSubsystemClassId is "KR-87" declared in "src/Instrumentation/kr_87.hxx", implemented in "src/Instrumentation/kr_87.cxx">
    <FGKeyboardInput : SGSubsystem staticSubsystemClassId is "input-keyboard" declared in "src/Input/FGKeyboardInput.hxx", implemented in "src/Input/FGKeyboardInput.cxx">
    <FGLight : SGSubsystem staticSubsystemClassId is "lighting" declared in "src/Time/light.hxx", implemented in "src/Time/light.cxx">
    <FGLogger : SGSubsystem staticSubsystemClassId is "logger" declared in "src/Main/logger.hxx", implemented in "src/Main/logger.cxx">
    <FGMagVarManager : SGSubsystem staticSubsystemClassId is "magvar" declared in "src/Environment/magvarmanager.hxx", implemented in "src/Environment/magvarmanager.cxx">
    <FGModelMgr : SGSubsystem staticSubsystemClassId is "model-manager" declared in "src/Model/modelmgr.hxx", implemented in "src/Model/modelmgr.cxx">
    <FGMouseInput : SGSubsystem staticSubsystemClassId is "input-mouse" declared in "src/Input/FGMouseInput.hxx", implemented in "src/Input/FGMouseInput.cxx">
    <FGMultiplayMgr : SGSubsystem staticSubsystemClassId is "mp" declared in "src/MultiPlayer/multiplaymgr.hxx", implemented in "src/MultiPlayer/multiplaymgr.cxx">
    <FGNasalSys : SGSubsystem staticSubsystemClassId is "nasal" declared in "src/Scripting/NasalSys.hxx", implemented in "src/Scripting/NasalSys.cxx">
    <FGPanel : SGSubsystem staticSubsystemClassId is "panel" declared in "utils/fgpanel/FGPanel.hxx", implemented in "utils/fgpanel/FGPanel.cxx">
    <FGPanelProtocol : SGSubsystem staticSubsystemClassId is "panel-protocol" declared in "utils/fgpanel/FGPanelProtocol.hxx", implemented in "utils/fgpanel/FGPanelProtocol.cxx">
    <FGPrecipitationMgr : SGSubsystem staticSubsystemClassId is "precipitation" declared in "src/Environment/precipitation_mgr.hxx", implemented in "src/Environment/precipitation_mgr.cxx">
    <FGProperties : SGSubsystem staticSubsystemClassId is "properties" declared in "src/Main/fg_props.hxx", implemented in "src/Main/fg_props.cxx">
    <FGReplay : SGSubsystem staticSubsystemClassId is "replay" declared in "src/Aircraft/replay.hxx", implemented in "src/Aircraft/replay.cxx">
    <FGRidgeLift : SGSubsystem staticSubsystemClassId is "ridgelift" declared in "src/Environment/ridge_lift.hxx", implemented in "src/Environment/ridge_lift.cxx">
    <FGRouteMgr : SGSubsystem staticSubsystemClassId is "route-manager" declared in "src/Autopilot/route_mgr.hxx", implemented in "src/Autopilot/route_mgr.cxx">
    <FGScenery : SGSubsystem staticSubsystemClassId is "scenery" declared in "src/Scenery/scenery.hxx", implemented in "src/Scenery/scenery.cxx">
    <FGSoundManager : SGSubsystem staticSubsystemClassId is "sound" declared in "src/Sound/soundmanager.hxx", implemented in "src/Sound/soundmanager.cxx">
    <FGSubmodelMgr : SGSubsystem staticSubsystemClassId is "submodel-mgr" declared in "src/AIModel/submodel.hxx", implemented in "src/AIModel/submodel.cxx">
    <FGSubsystemExample : SGSubsystem declared in "docs-mini/README.introduction">
    <FGTrafficManager : SGSubsystem staticSubsystemClassId is "traffic-manager" declared in "src/Traffic/TrafficMgr.hxx", implemented in "src/Traffic/TrafficMgr.cxx">
    <FGViewMgr : SGSubsystem staticSubsystemClassId is "view-manager" declared in "src/Viewer/viewmgr.hxx", implemented in "src/Viewer/viewmgr.cxx">
    <FGVoiceMgr : SGSubsystem staticSubsystemClassId is "voice" declared in "src/Sound/voice.hxx", implemented in "src/Sound/voice.cxx">
    <FakeRadioSub : SGSubsystem staticSubsystemClassId is "fake-radio" declared in "simgear/structure/subsystem_test.cxx">
    <GPS : SGSubsystem staticSubsystemClassId is "gps" declared in "src/Instrumentation/gps.hxx", implemented in "src/Instrumentation/gps.cxx">
    <GSDI : SGSubsystem staticSubsystemClassId is "gsdi" declared in "src/Instrumentation/gsdi.hxx", implemented in "src/Instrumentation/gsdi.cxx">
    <GUIMgr : SGSubsystem staticSubsystemClassId is "CanvasGUI" declared in "src/Canvas/gui_mgr.hxx", implemented in "src/Canvas/gui_mgr.cxx">
    <GroundRadar : SGSubsystem staticSubsystemClassId is "groundradar" declared in "src/Cockpit/groundradar.hxx", implemented in "src/Cockpit/groundradar.cxx">
    <HUD : SGSubsystem staticSubsystemClassId is "hud" declared in "src/Instrumentation/HUD/HUD.hxx", implemented in "src/Instrumentation/HUD/HUD.cxx">
    <HeadingIndicator : SGSubsystem staticSubsystemClassId is "heading-indicator" declared in "src/Instrumentation/heading_indicator.hxx", implemented in "src/Instrumentation/heading_indicator.cxx">
    <HeadingIndicatorDG : SGSubsystem staticSubsystemClassId is "heading-indicator-dg" declared in "src/Instrumentation/heading_indicator_dg.hxx", implemented in "src/Instrumentation/heading_indicator_dg.cxx">
    <HeadingIndicatorFG : SGSubsystem staticSubsystemClassId is "heading-indicator-fg" declared in "src/Instrumentation/heading_indicator_fg.hxx", implemented in "src/Instrumentation/heading_indicator_fg.cxx">
    <InstVerticalSpeedIndicator : SGSubsystem staticSubsystemClassId is "inst-vertical-speed-indicator" declared in "src/Instrumentation/inst_vertical_speed_indicator.hxx", implemented in "src/Instrumentation/inst_vertical_speed_indicator.cxx">
    <LayerInterpolateController : SGSubsystem declared in "src/Environment/environment_ctrl.hxx">
    <MK_VIII : SGSubsystem staticSubsystemClassId is "mk-viii" declared in "src/Instrumentation/mk_viii.hxx", implemented in "src/Instrumentation/mk_viii.cxx">
    <MagCompass : SGSubsystem staticSubsystemClassId is "magnetic-compass" declared in "src/Instrumentation/mag_compass.hxx", implemented in "src/Instrumentation/mag_compass.cxx">
    <MasterReferenceGyro : SGSubsystem staticSubsystemClassId is "master-reference-gyro" declared in "src/Instrumentation/mrg.hxx", implemented in "src/Instrumentation/mrg.cxx">
    <MySub1 : SGSubsystem staticSubsystemClassId is "mysub" declared in "simgear/structure/subsystem_test.cxx">
    <NavDisplay : SGSubsystem staticSubsystemClassId is "navigation-display" declared in "src/Cockpit/NavDisplay.hxx", implemented in "src/Cockpit/NavDisplay.cxx">
    <NavRadio : SGSubsystem staticSubsystemClassId is "nav-radio" declared in "src/Instrumentation/newnavradio.hxx">
    <NewGUI : SGSubsystem staticSubsystemClassId is "gui" declared in "src/GUI/new_gui.hxx", implemented in "src/GUI/new_gui.cxx">
    <PerformanceDB : SGSubsystem staticSubsystemClassId is "aircraft-performance-db" declared in "src/AIModel/performancedb.hxx", implemented in "src/AIModel/performancedb.cxx">
    <PitotSystem : SGSubsystem staticSubsystemClassId is "pitot" declared in "src/Systems/pitot.hxx", implemented in "src/Systems/pitot.cxx">
    <PropertyBasedMgr : SGSubsystem declared in "simgear/props/PropertyBasedMgr.hxx", implemented in "simgear/props/PropertyBasedMgr.cxx">
    <PropertyInterpolationMgr : SGSubsystem declared in "simgear/props/PropertyInterpolationMgr.hxx", implemented in "simgear/props/PropertyInterpolationMgr.cxx">
    <RadarAltimeter : SGSubsystem staticSubsystemClassId is "radar-altimeter" declared in "src/Instrumentation/rad_alt.hxx", implemented in "src/Instrumentation/rad_alt.cxx">
    <RealWxController : SGSubsystem declared in "src/Environment/realwx_ctrl.hxx", implemented in "src/Environment/realwx_ctrl.cxx">
    <SGEventMgr : SGSubsystem staticSubsystemClassId is "events" declared in "simgear/structure/event_mgr.hxx", implemented in "simgear/structure/event_mgr.cxx">
    <SGInterpolator : SGSubsystem staticSubsystemClassId is "interpolator" declared in "simgear/misc/interpolator.hxx", implemented in "simgear/misc/interpolator.cxx">
    <SGPerformanceMonitor : SGSubsystem staticSubsystemClassId is "performance-mon" declared in "simgear/structure/SGPerfMon.hxx", implemented in "simgear/structure/SGPerfMon.cxx">
    <SGSoundMgr : SGSubsystem staticSubsystemClassId is "sound" declared in "simgear/sound/soundmgr.hxx">
    <SGSubsystemMgr : SGSubsystem staticSubsystemClassId is "subsystem-mgr" declared in "simgear/structure/subsystem_mgr.hxx", implemented in "simgear/structure/subsystem_mgr.cxx">
    <SGTerraSync : SGSubsystem staticSubsystemClassId is "terrasync" declared in "simgear/scene/tsync/terrasync.hxx", implemented in "simgear/scene/tsync/terrasync.cxx">
    <SlipSkidBall : SGSubsystem staticSubsystemClassId is "slip-skid-ball" declared in "src/Instrumentation/slip_skid_ball.hxx", implemented in "src/Instrumentation/slip_skid_ball.cxx">
    <StaticSystem : SGSubsystem staticSubsystemClassId is "static" declared in "src/Systems/static.hxx", implemented in "src/Systems/static.cxx">
    <SwiftConnection : SGSubsystem staticSubsystemClassId is "swift" declared in "src/Network/Swift/swift_connection.hxx", implemented in "src/Network/Swift/swift_connection.cxx">
    <TACAN : SGSubsystem staticSubsystemClassId is "tacan" declared in "src/Instrumentation/tacan.hxx", implemented in "src/Instrumentation/tacan.cxx">
    <TCAS : SGSubsystem staticSubsystemClassId is "tcas" declared in "src/Instrumentation/tcas.hxx", implemented in "src/Instrumentation/tcas.cxx">
    <TestPilot : SGSubsystem declared in "test_suite/FGTestApi/TestPilot.hxx", implemented in "test_suite/FGTestApi/TestPilot.cxx">
    <TimeManager : SGSubsystem staticSubsystemClassId is "time" declared in "src/Time/TimeManager.hxx", implemented in "src/Time/TimeManager.cxx">
    <TurnIndicator : SGSubsystem staticSubsystemClassId is "turn-indicator" declared in "src/Instrumentation/turn_indicator.hxx", implemented in "src/Instrumentation/turn_indicator.cxx">
    <VacuumSystem : SGSubsystem staticSubsystemClassId is "vacuum" declared in "src/Systems/vacuum.hxx", implemented in "src/Systems/vacuum.cxx">
    <VerticalSpeedIndicator : SGSubsystem staticSubsystemClassId is "vertical-speed-indicator" declared in "src/Instrumentation/vertical_speed_indicator.hxx", implemented in "src/Instrumentation/vertical_speed_indicator.cxx">
    <View : SGSubsystem staticSubsystemClassId is "view" declared in "src/Viewer/view.hxx", implemented in "src/Viewer/view.cxx">
    <wxRadarBg : SGSubsystem staticSubsystemClassId is "radar" declared in "src/Cockpit/wxradar.hxx", implemented in "src/Cockpit/wxradar.cxx">
Primary groups (9):
    <Autopilot : SGSubsystemGroup : SGSubsystem staticSubsystemClassId is "autopilot" declared in "src/Autopilot/autopilot.hxx", implemented in "src/Autopilot/autopilot.cxx">
    <CockpitDisplayManager : SGSubsystemGroup : SGSubsystem staticSubsystemClassId is "cockpit-displays" declared in "src/Cockpit/cockpitDisplayManager.hxx", implemented in "src/Cockpit/cockpitDisplayManager.cxx">
    <FGEnvironmentMgr : SGSubsystemGroup : SGSubsystem staticSubsystemClassId is "environment" declared in "src/Environment/environment_mgr.hxx", implemented in "src/Environment/environment_mgr.cxx">
    <FGInput : SGSubsystemGroup : SGSubsystem staticSubsystemClassId is "input" declared in "src/Input/input.hxx", implemented in "src/Input/input.cxx">
    <FGInstrumentMgr : SGSubsystemGroup : SGSubsystem staticSubsystemClassId is "instrumentation" declared in "src/Instrumentation/instrument_mgr.hxx", implemented in "src/Instrumentation/instrument_mgr.cxx">
    <FGSystemMgr : SGSubsystemGroup : SGSubsystem staticSubsystemClassId is "systems" declared in "src/Systems/system_mgr.hxx", implemented in "src/Systems/system_mgr.cxx">
    <FGXMLAutopilotGroup : SGSubsystemGroup : SGSubsystem staticSubsystemClassId is "xml-rules" declared in "src/Autopilot/autopilotgroup.hxx", implemented in "src/Autopilot/autopilotgroup.cxx">
    <InstrumentGroup : SGSubsystemGroup : SGSubsystem staticSubsystemClassId is "instruments" declared in "simgear/structure/subsystem_test.cxx">
    <TerrainSampler : SGSubsystemGroup : SGSubsystem declared in "src/Environment/terrainsampler.hxx">
Secondary subsystems (34):
    <ADF : AbstractInstrument : SGSubsystem staticSubsystemClassId is "adf" declared in "src/Instrumentation/adf.hxx", implemented in "src/Instrumentation/adf.cxx">
    <AnalogComponent : Component : SGSubsystem declared in "src/Autopilot/analogcomponent.hxx", implemented in "src/Autopilot/analogcomponent.cxx">
    <BasicRealWxController : RealWxController : SGSubsystem declared in "src/Environment/realwx_ctrl.cxx", implemented in "src/Environment/realwx_ctrl.cxx">
    <CanvasMgr : PropertyBasedMgr : SGSubsystem declared in "simgear/canvas/CanvasMgr.hxx", implemented in "simgear/canvas/CanvasMgr.cxx">
    <CommRadio : AbstractInstrument : SGSubsystem staticSubsystemClassId is "comm-radio" declared in "src/Instrumentation/commradio.hxx">
    <DME : AbstractInstrument : SGSubsystem staticSubsystemClassId is "dme" declared in "src/Instrumentation/dme.hxx", implemented in "src/Instrumentation/dme.cxx">
    <DigitalComponent : Component : SGSubsystem declared in "src/Autopilot/digitalcomponent.hxx", implemented in "src/Autopilot/digitalcomponent.cxx">
    <FGACMS : FGInterface : SGSubsystem staticSubsystemClassId is "acms" declared in "src/FDM/SP/ACMS.hxx", implemented in "src/FDM/SP/ACMS.cxx">
    <FGADA : FGInterface : SGSubsystem staticSubsystemClassId is "ada" declared in "src/FDM/SP/ADA.hxx", implemented in "src/FDM/SP/ADA.cxx">
    <FGAISim : FGInterface : SGSubsystem staticSubsystemClassId is "aisim" declared in "src/FDM/SP/AISim.hpp", implemented in "src/FDM/SP/AISim.cpp">
    <FGBalloonSim : FGInterface : SGSubsystem staticSubsystemClassId is "balloon" declared in "src/FDM/SP/Balloon.h", implemented in "src/FDM/SP/Balloon.cxx">
    <FGExternalNet : FGInterface : SGSubsystem staticSubsystemClassId is "network" declared in "src/FDM/ExternalNet/ExternalNet.hxx", implemented in "src/FDM/ExternalNet/ExternalNet.cxx">
    <FGExternalPipe : FGInterface : SGSubsystem staticSubsystemClassId is "pipe" declared in "src/FDM/ExternalPipe/ExternalPipe.hxx", implemented in "src/FDM/ExternalPipe/ExternalPipe.cxx">
    <FGHIDEventInput : FGEventInput : SGSubsystem staticSubsystemClassId is "input-event-hid" declared in "src/Input/FGHIDEventInput.hxx", implemented in "src/Input/FGHIDEventInput.cxx">
    <FGInterpolator : PropertyInterpolationMgr : SGSubsystem staticSubsystemClassId is "prop-interpolator" declared in "src/Main/FGInterpolator.hxx", implemented in "src/Main/FGInterpolator.cxx">
    <FGJSBsim : FGInterface : SGSubsystem staticSubsystemClassId is "jsb" declared in "src/FDM/JSBSim/JSBSim.hxx", implemented in "src/FDM/JSBSim/JSBSim.cxx">
    <FGLaRCsim : FGInterface : SGSubsystem staticSubsystemClassId is "larcsim" declared in "src/FDM/LaRCsim/LaRCsim.hxx", implemented in "src/FDM/LaRCsim/LaRCsim.cxx">
    <FGLinuxEventInput : FGEventInput : SGSubsystem staticSubsystemClassId is "input-event" declared in "src/Input/FGLinuxEventInput.hxx", implemented in "src/Input/FGLinuxEventInput.cxx">
    <FGMacOSXEventInput : FGEventInput : SGSubsystem staticSubsystemClassId is "input-event" declared in "src/Input/FGMacOSXEventInput.hxx", implemented in "src/Input/FGMacOSXEventInput.cxx">
    <FGMagicCarpet : FGInterface : SGSubsystem staticSubsystemClassId is "magic" declared in "src/FDM/SP/MagicCarpet.hxx", implemented in "src/FDM/SP/MagicCarpet.cxx">
    <FGMarkerBeacon : AbstractInstrument : SGSubsystem staticSubsystemClassId is "marker-beacon" declared in "src/Instrumentation/marker_beacon.hxx", implemented in "src/Instrumentation/marker_beacon.cxx">
    <FGNavRadio : AbstractInstrument : SGSubsystem staticSubsystemClassId is "old-navradio" declared in "src/Instrumentation/navradio.hxx", implemented in "src/Instrumentation/navradio.cxx">
    <FGNullFDM : FGInterface : SGSubsystem staticSubsystemClassId is "null" declared in "src/FDM/NullFDM.hxx", implemented in "src/FDM/NullFDM.cxx">
    <FGReadablePanel : FGPanel : SGSubsystem staticSubsystemClassId is "readable-panel" declared in "utils/fgpanel/panel_io.hxx", implemented in "utils/fgpanel/panel_io.cxx">
    <FGSoundManager : SGSoundMgr : SGSubsystem staticSubsystemClassId is "sound" declared in "src/Sound/soundmanager.hxx", implemented in "src/Sound/soundmanager.cxx">
    <FGUFO : FGInterface : SGSubsystem staticSubsystemClassId is "ufo" declared in "src/FDM/UFO.hxx", implemented in "src/FDM/UFO.cxx">
    <KLN89 : DCLGPS : SGSubsystem staticSubsystemClassId is "KLN89" declared in "src/Instrumentation/KLN89/kln89.hxx", implemented in "src/Instrumentation/KLN89/kln89.cxx">
    <LayerInterpolateControllerImplementation : LayerInterpolateController : SGSubsystem staticSubsystemClassId is "layer-interpolate-controller" declared in "src/Environment/environment_ctrl.cxx", implemented in "src/Environment/environment_ctrl.cxx">
    <MongooseHttpd : FGHttpd : SGSubsystem staticSubsystemClassId is "mongoose-httpd" declared in "src/Network/http/httpd.cxx", implemented in "src/Network/http/httpd.cxx">
    <NavRadioImpl : NavRadio : SGSubsystem declared in "src/Instrumentation/newnavradio.cxx", implemented in "src/Instrumentation/newnavradio.cxx">
    <StateMachineComponent : Component : SGSubsystem staticSubsystemClassId is "state-machine" declared in "src/Autopilot/autopilot.cxx">
    <Transponder : AbstractInstrument : SGSubsystem staticSubsystemClassId is "transponder" declared in "src/Instrumentation/transponder.hxx", implemented in "src/Instrumentation/transponder.cxx">
    <YASim : FGInterface : SGSubsystem staticSubsystemClassId is "yasim" declared in "src/FDM/YASim/YASim.hxx", implemented in "src/FDM/YASim/YASim.cxx">
    <agRadar : wxRadarBg : SGSubsystem staticSubsystemClassId is "air-ground-radar" declared in "src/Cockpit/agradar.hxx", implemented in "src/Cockpit/agradar.cxx">
Secondary groups (2):
    <FGXMLAutopilotGroupImplementation : FGXMLAutopilotGroup : SGSubsystemGroup : SGSubsystem staticSubsystemClassId is "xml-autopilot-group" declared in "src/Autopilot/autopilotgroup.cxx", implemented in "src/Autopilot/autopilotgroup.cxx">
    <TerrainSamplerImplementation : TerrainSampler : SGSubsystemGroup : SGSubsystem staticSubsystemClassId is "terrain-sampler" declared in "src/Environment/terrainsampler.cxx", implemented in "src/Environment/terrainsampler.cxx">
Tertiary subsystems (8):
    <CanvasMgr : CanvasMgr : PropertyBasedMgr : SGSubsystem staticSubsystemClassId is "Canvas" declared in "src/Canvas/canvas_mgr.hxx", implemented in "src/Canvas/canvas_mgr.cxx">
    <CommRadioImpl : CommRadio : AbstractInstrument : SGSubsystem declared in "src/Instrumentation/commradio.cxx", implemented in "src/Instrumentation/commradio.cxx">
    <DigitalFilter : AnalogComponent : Component : SGSubsystem staticSubsystemClassId is "filter" declared in "src/Autopilot/digitalfilter.hxx", implemented in "src/Autopilot/digitalfilter.cxx">
    <Logic : DigitalComponent : Component : SGSubsystem staticSubsystemClassId is "logic" declared in "src/Autopilot/logic.hxx", implemented in "src/Autopilot/logic.cxx">
    <NoaaMetarRealWxController : BasicRealWxController : RealWxController : SGSubsystem staticSubsystemClassId is "noaa-metar-real-wx-controller" declared in "src/Environment/realwx_ctrl.cxx", implemented in "src/Environment/realwx_ctrl.cxx">
    <PIDController : AnalogComponent : Component : SGSubsystem staticSubsystemClassId is "pid-controller" declared in "src/Autopilot/pidcontroller.hxx", implemented in "src/Autopilot/pidcontroller.cxx">
    <PISimpleController : AnalogComponent : Component : SGSubsystem staticSubsystemClassId is "pi-simple-controller" declared in "src/Autopilot/pisimplecontroller.hxx", implemented in "src/Autopilot/pisimplecontroller.cxx">
    <Predictor : AnalogComponent : Component : SGSubsystem staticSubsystemClassId is "predict-simple" declared in "src/Autopilot/predictor.hxx", implemented in "src/Autopilot/predictor.cxx">
Quaternary subsystems (1):
    <FlipFlop : Logic : DigitalComponent : Component : SGSubsystem staticSubsystemClassId is "flipflop" declared in "src/Autopilot/flipflop.hxx", implemented in "src/Autopilot/flipflop.cxx">
Counts: 134 subsystem classes (122 flightgear, 12 simgear).
Counts: 11 subsystem groups (10 flightgear, 1 simgear).
Counts: 145 subsystem classes and groups (132 flightgear, 13 simgear).
}}


{{collapsible script
{{collapsible script
Line 354: Line 1,020:
| lang  = xml
| lang  = xml
| script =  
| script =  
<?xml version="1.0"?>
<subsystems>
<subsystems>
   <primary_classes subsystems="91" groups="0">
   <primary_subsystems count="91">
     <ADF from="SGSubsystem" in="src/Instrumentation/adf.hxx"/>
     <AbstractInstrument>
    <AirportDynamicsManager from="SGSubsystem" in="src/Airports/airportdynamicsmanager.hxx"/>
      <inheritance>SGSubsystem</inheritance>
     <AirspeedIndicator from="SGSubsystem" in="src/Instrumentation/airspeed_indicator.hxx"/>
      <declaration>src/Instrumentation/AbstractInstrument.hxx</declaration>
    <Altimeter from="SGSubsystem" in="src/Instrumentation/altimeter.hxx"/>
      <implementation>src/Instrumentation/AbstractInstrument.cxx</implementation>
     <AreaSampler from="SGSubsystem" in="src/Environment/terrainsampler.cxx"/>
     </AbstractInstrument>
     <AttitudeIndicator from="SGSubsystem" in="src/Instrumentation/attitude_indicator.hxx"/>
    <AirportDynamicsManager>
    <Clock from="SGSubsystem" in="src/Instrumentation/clock.hxx"/>
      <inheritance>SGSubsystem</inheritance>
     <CommRadio from="SGSubsystem" in="src/Instrumentation/commradio.hxx"/>
      <staticSubsystemClassId>airport-dynamics</staticSubsystemClassId>
    <Component from="SGSubsystem" in="src/Autopilot/component.hxx"/>
      <declaration>src/Airports/airportdynamicsmanager.hxx</declaration>
     <DCLGPS from="SGSubsystem" in="src/Instrumentation/dclgps.hxx"/>
      <implementation>src/Airports/airportdynamicsmanager.cxx</implementation>
     <DME from="SGSubsystem" in="src/Instrumentation/dme.hxx"/>
     </AirportDynamicsManager>
    <Ephemeris from="SGSubsystem" in="src/Environment/ephemeris.hxx"/>
     <AirspeedIndicator>
    <FDMShell from="SGSubsystem" in="src/FDM/fdm_shell.hxx"/>
      <inheritance>SGSubsystem</inheritance>
     <FGAIManager from="SGSubsystem" in="src/AIModel/AIManager.hxx"/>
      <staticSubsystemClassId>airspeed-indicator</staticSubsystemClassId>
    <FGATCManager from="SGSubsystem" in="src/ATC/atc_mgr.hxx"/>
      <declaration>src/Instrumentation/airspeed_indicator.hxx</declaration>
    <FGAircraftModel from="SGSubsystem" in="src/Model/acmodel.hxx"/>
      <implementation>src/Instrumentation/airspeed_indicator.cxx</implementation>
     <FGCom from="SGSubsystem" in="src/Network/fgcom.hxx"/>
     </AirspeedIndicator>
     <FGControls from="SGSubsystem" in="src/Aircraft/controls.hxx"/>
    <Altimeter>
    <FGDNSClient from="SGSubsystem" in="src/Network/DNSClient.hxx"/>
      <inheritance>SGSubsystem</inheritance>
    <FGElectricalSystem from="SGSubsystem" in="src/Systems/electrical.hxx"/>
      <staticSubsystemClassId>altimeter</staticSubsystemClassId>
     <FGEventInput from="SGSubsystem" in="src/Input/FGEventInput.hxx"/>
      <declaration>src/Instrumentation/altimeter.hxx</declaration>
     <FGFX from="SGSubsystem" in="docs-mini/README.introduction"/>
      <implementation>src/Instrumentation/altimeter.cxx</implementation>
    <FGFlightHistory from="SGSubsystem" in="src/Aircraft/FlightHistory.hxx"/>
     </Altimeter>
    <FGHTTPClient from="SGSubsystem" in="src/Network/HTTPClient.hxx"/>
     <AnotherSub>
     <FGHttpd from="SGSubsystem" in="src/Network/http/httpd.hxx"/>
      <inheritance>SGSubsystem</inheritance>
     <FGIO from="SGSubsystem" in="src/Main/fg_io.hxx"/>
      <staticSubsystemClassId>anothersub</staticSubsystemClassId>
    <FGInterface from="SGSubsystem" in="src/FDM/flight.hxx"/>
      <declaration>simgear/structure/subsystem_test.cxx</declaration>
     <FGJoystickInput from="SGSubsystem" in="src/Input/FGJoystickInput.hxx"/>
     </AnotherSub>
    <FGKR_87 from="SGSubsystem" in="src/Instrumentation/kr_87.hxx"/>
    <AreaSampler>
     <FGKeyboardInput from="SGSubsystem" in="src/Input/FGKeyboardInput.hxx"/>
      <inheritance>SGSubsystem</inheritance>
    <FGLight from="SGSubsystem" in="src/Time/light.hxx"/>
      <staticSubsystemClassId>area</staticSubsystemClassId>
     <FGLogger from="SGSubsystem" in="src/Main/logger.hxx"/>
      <declaration>src/Environment/terrainsampler.cxx</declaration>
     <FGMagVarManager from="SGSubsystem" in="src/Environment/magvarmanager.hxx"/>
      <implementation>src/Environment/terrainsampler.cxx</implementation>
    <FGMarkerBeacon from="SGSubsystem" in="src/Instrumentation/marker_beacon.hxx"/>
     </AreaSampler>
     <FGModelMgr from="SGSubsystem" in="src/Model/modelmgr.hxx"/>
     <AttitudeIndicator>
    <FGMouseInput from="SGSubsystem" in="src/Input/FGMouseInput.hxx"/>
      <inheritance>SGSubsystem</inheritance>
     <FGMultiplayMgr from="SGSubsystem" in="src/MultiPlayer/multiplaymgr.hxx"/>
      <staticSubsystemClassId>attitude-indicator</staticSubsystemClassId>
     <FGNasalSys from="SGSubsystem" in="src/Scripting/NasalSys.hxx"/>
      <declaration>src/Instrumentation/attitude_indicator.hxx</declaration>
    <FGNavRadio from="SGSubsystem" in="src/Instrumentation/navradio.hxx"/>
      <implementation>src/Instrumentation/attitude_indicator.cxx</implementation>
     <FGPanel from="SGSubsystem" in="utils/fgpanel/FGPanel.hxx"/>
     </AttitudeIndicator>
    <FGPanelProtocol from="SGSubsystem" in="utils/fgpanel/FGPanelProtocol.hxx"/>
     <Clock>
     <FGPrecipitationMgr from="SGSubsystem" in="src/Environment/precipitation_mgr.hxx"/>
      <inheritance>SGSubsystem</inheritance>
     <FGProperties from="SGSubsystem" in="src/Main/fg_props.hxx"/>
      <staticSubsystemClassId>clock</staticSubsystemClassId>
    <FGReplay from="SGSubsystem" in="src/Aircraft/replay.hxx"/>
      <declaration>src/Instrumentation/clock.hxx</declaration>
    <FGRidgeLift from="SGSubsystem" in="src/Environment/ridge_lift.hxx"/>
      <implementation>src/Instrumentation/clock.cxx</implementation>
     <FGRouteMgr from="SGSubsystem" in="src/Autopilot/route_mgr.hxx"/>
     </Clock>
     <FGScenery from="SGSubsystem" in="src/Scenery/scenery.hxx"/>
     <Component>
    <FGSoundManager from="SGSubsystem" in="src/Sound/soundmanager.hxx"/>
      <inheritance>SGSubsystem</inheritance>
     <FGSubmodelMgr from="SGSubsystem" in="src/AIModel/submodel.hxx"/>
      <declaration>src/Autopilot/component.hxx</declaration>
    <FGTrafficManager from="SGSubsystem" in="src/Traffic/TrafficMgr.hxx"/>
      <implementation>src/Autopilot/component.cxx</implementation>
     <FGViewMgr from="SGSubsystem" in="src/Viewer/viewmgr.hxx"/>
     </Component>
     <FGVoiceMgr from="SGSubsystem" in="src/Sound/voice.hxx"/>
    <DCLGPS>
    <GPS from="SGSubsystem" in="src/Instrumentation/gps.hxx"/>
      <inheritance>SGSubsystem</inheritance>
     <GSDI from="SGSubsystem" in="src/Instrumentation/gsdi.hxx"/>
      <declaration>src/Instrumentation/dclgps.hxx</declaration>
    <GUIMgr from="SGSubsystem" in="src/Canvas/gui_mgr.hxx"/>
      <implementation>src/Instrumentation/dclgps.cxx</implementation>
     <GroundRadar from="SGSubsystem" in="src/Cockpit/groundradar.hxx"/>
     </DCLGPS>
     <HUD from="SGSubsystem" in="src/Instrumentation/HUD/HUD.hxx"/>
    <Ephemeris>
    <HeadingIndicator from="SGSubsystem" in="src/Instrumentation/heading_indicator.hxx"/>
      <inheritance>SGSubsystem</inheritance>
    <HeadingIndicatorDG from="SGSubsystem" in="src/Instrumentation/heading_indicator_dg.hxx"/>
      <staticSubsystemClassId>ephemeris</staticSubsystemClassId>
     <HeadingIndicatorFG from="SGSubsystem" in="src/Instrumentation/heading_indicator_fg.hxx"/>
      <declaration>src/Environment/ephemeris.hxx</declaration>
    <InstVerticalSpeedIndicator from="SGSubsystem" in="src/Instrumentation/inst_vertical_speed_indicator.hxx"/>
      <implementation>src/Environment/ephemeris.cxx</implementation>
     <LayerInterpolateController from="SGSubsystem" in="src/Environment/environment_ctrl.hxx"/>
     </Ephemeris>
     <MK_VIII from="SGSubsystem" in="src/Instrumentation/mk_viii.hxx"/>
     <FDMShell>
    <MagCompass from="SGSubsystem" in="src/Instrumentation/mag_compass.hxx"/>
      <inheritance>SGSubsystem</inheritance>
     <MasterReferenceGyro from="SGSubsystem" in="src/Instrumentation/mrg.hxx"/>
      <staticSubsystemClassId>flight</staticSubsystemClassId>
    <NavDisplay from="SGSubsystem" in="src/Cockpit/NavDisplay.hxx"/>
      <declaration>src/FDM/fdm_shell.hxx</declaration>
     <NavRadio from="SGSubsystem" in="src/Instrumentation/newnavradio.hxx"/>
      <implementation>src/FDM/fdm_shell.cxx</implementation>
    <NewGUI from="SGSubsystem" in="src/GUI/new_gui.hxx"/>
     </FDMShell>
     <PerformanceDB from="SGSubsystem" in="src/AIModel/performancedb.hxx"/>
    <FGAIManager>
     <PitotSystem from="SGSubsystem" in="src/Systems/pitot.hxx"/>
      <inheritance>SGSubsystem</inheritance>
    <PropertyBasedMgr from="SGSubsystem" in="simgear/props/PropertyBasedMgr.hxx"/>
      <staticSubsystemClassId>ai-model</staticSubsystemClassId>
    <PropertyInterpolationMgr from="SGSubsystem" in="simgear/props/PropertyInterpolationMgr.hxx"/>
      <declaration>src/AIModel/AIManager.hxx</declaration>
     <RadarAltimeter from="SGSubsystem" in="src/Instrumentation/rad_alt.hxx"/>
      <implementation>src/AIModel/AIManager.cxx</implementation>
     <RealWxController from="SGSubsystem" in="src/Environment/realwx_ctrl.hxx"/>
     </FGAIManager>
    <SGEventMgr from="SGSubsystem" in="simgear/structure/event_mgr.hxx"/>
     <FGATCManager>
    <SGInterpolator from="SGSubsystem" in="simgear/misc/interpolator.hxx"/>
      <inheritance>SGSubsystem</inheritance>
     <SGPerformanceMonitor from="SGSubsystem" in="simgear/structure/SGPerfMon.hxx"/>
      <staticSubsystemClassId>ATC</staticSubsystemClassId>
     <SGSoundMgr from="SGSubsystem" in="simgear/sound/soundmgr.hxx"/>
      <declaration>src/ATC/atc_mgr.hxx</declaration>
    <SGSubsystemMgr from="SGSubsystem" in="simgear/structure/subsystem_mgr.hxx"/>
      <implementation>src/ATC/atc_mgr.cxx</implementation>
    <SGTerraSync from="SGSubsystem" in="simgear/scene/tsync/terrasync.hxx"/>
     </FGATCManager>
     <SlipSkidBall from="SGSubsystem" in="src/Instrumentation/slip_skid_ball.hxx"/>
    <FGAircraftModel>
     <StaticSystem from="SGSubsystem" in="src/Systems/static.hxx"/>
      <inheritance>SGSubsystem</inheritance>
    <TACAN from="SGSubsystem" in="src/Instrumentation/tacan.hxx"/>
      <staticSubsystemClassId>aircraft-model</staticSubsystemClassId>
     <TCAS from="SGSubsystem" in="src/Instrumentation/tcas.hxx"/>
      <declaration>src/Model/acmodel.hxx</declaration>
    <TimeManager from="SGSubsystem" in="src/Time/TimeManager.hxx"/>
      <implementation>src/Model/acmodel.cxx</implementation>
     <Transponder from="SGSubsystem" in="src/Instrumentation/transponder.hxx"/>
     </FGAircraftModel>
     <TurnIndicator from="SGSubsystem" in="src/Instrumentation/turn_indicator.hxx"/>
     <FGCom>
    <VacuumSystem from="SGSubsystem" in="src/Systems/vacuum.hxx"/>
      <inheritance>SGSubsystem</inheritance>
     <VerticalSpeedIndicator from="SGSubsystem" in="src/Instrumentation/vertical_speed_indicator.hxx"/>
      <staticSubsystemClassId>fgcom</staticSubsystemClassId>
    <View from="SGSubsystem" in="src/Viewer/view.hxx"/>
      <declaration>src/Network/fgcom.hxx</declaration>
     <wxRadarBg from="SGSubsystem" in="src/Cockpit/wxradar.hxx"/>
      <implementation>src/Network/fgcom.cxx</implementation>
  </primary_classes>
     </FGCom>
  <primary_groups subsystems="0" groups="8">
     <FGControls>
    <Autopilot from="SGSubsystemGroup : SGSubsystem" in="src/Autopilot/autopilot.hxx"/>
      <inheritance>SGSubsystem</inheritance>
    <CockpitDisplayManager from="SGSubsystemGroup : SGSubsystem" in="src/Cockpit/cockpitDisplayManager.hxx"/>
      <staticSubsystemClassId>controls</staticSubsystemClassId>
     <FGEnvironmentMgr from="SGSubsystemGroup : SGSubsystem" in="src/Environment/environment_mgr.hxx"/>
      <declaration>src/Aircraft/controls.hxx</declaration>
     <FGInput from="SGSubsystemGroup : SGSubsystem" in="src/Input/input.hxx"/>
      <implementation>src/Aircraft/controls.cxx</implementation>
    <FGInstrumentMgr from="SGSubsystemGroup : SGSubsystem" in="src/Instrumentation/instrument_mgr.hxx"/>
     </FGControls>
    <FGSystemMgr from="SGSubsystemGroup : SGSubsystem" in="src/Systems/system_mgr.hxx"/>
    <FGDNSClient>
     <FGXMLAutopilotGroup from="SGSubsystemGroup : SGSubsystem" in="src/Autopilot/autopilotgroup.hxx"/>
      <inheritance>SGSubsystem</inheritance>
     <TerrainSampler from="SGSubsystemGroup : SGSubsystem" in="src/Environment/terrainsampler.hxx"/>
      <staticSubsystemClassId>dns</staticSubsystemClassId>
      <declaration>src/Network/DNSClient.hxx</declaration>
      <implementation>src/Network/DNSClient.cxx</implementation>
     </FGDNSClient>
     <FGElectricalSystem>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>electrical</staticSubsystemClassId>
      <declaration>src/Systems/electrical.hxx</declaration>
      <implementation>src/Systems/electrical.cxx</implementation>
     </FGElectricalSystem>
    <FGEventInput>
      <inheritance>SGSubsystem</inheritance>
      <declaration>src/Input/FGEventInput.hxx</declaration>
      <implementation>src/Input/FGEventInput.cxx</implementation>
     </FGEventInput>
     <FGFlightHistory>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>history</staticSubsystemClassId>
      <declaration>src/Aircraft/FlightHistory.hxx</declaration>
      <implementation>src/Aircraft/FlightHistory.cxx</implementation>
    </FGFlightHistory>
     <FGHTTPClient>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>http</staticSubsystemClassId>
      <declaration>src/Network/HTTPClient.hxx</declaration>
      <implementation>src/Network/HTTPClient.cxx</implementation>
     </FGHTTPClient>
     <FGHttpd>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>httpd</staticSubsystemClassId>
      <declaration>src/Network/http/httpd.hxx</declaration>
     </FGHttpd>
    <FGIO>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>io</staticSubsystemClassId>
      <declaration>src/Main/fg_io.hxx</declaration>
      <implementation>src/Main/fg_io.cxx</implementation>
    </FGIO>
     <FGInterface>
      <inheritance>SGSubsystem</inheritance>
      <declaration>src/FDM/flight.hxx</declaration>
      <implementation>src/FDM/flight.cxx</implementation>
     </FGInterface>
     <FGJoystickInput>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>input-joystick</staticSubsystemClassId>
      <declaration>src/Input/FGJoystickInput.hxx</declaration>
      <implementation>src/Input/FGJoystickInput.cxx</implementation>
     </FGJoystickInput>
     <FGKR_87>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>KR-87</staticSubsystemClassId>
      <declaration>src/Instrumentation/kr_87.hxx</declaration>
      <implementation>src/Instrumentation/kr_87.cxx</implementation>
     </FGKR_87>
     <FGKeyboardInput>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>input-keyboard</staticSubsystemClassId>
      <declaration>src/Input/FGKeyboardInput.hxx</declaration>
      <implementation>src/Input/FGKeyboardInput.cxx</implementation>
     </FGKeyboardInput>
     <FGLight>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>lighting</staticSubsystemClassId>
      <declaration>src/Time/light.hxx</declaration>
      <implementation>src/Time/light.cxx</implementation>
     </FGLight>
    <FGLogger>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>logger</staticSubsystemClassId>
      <declaration>src/Main/logger.hxx</declaration>
      <implementation>src/Main/logger.cxx</implementation>
     </FGLogger>
     <FGMagVarManager>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>magvar</staticSubsystemClassId>
      <declaration>src/Environment/magvarmanager.hxx</declaration>
      <implementation>src/Environment/magvarmanager.cxx</implementation>
     </FGMagVarManager>
    <FGModelMgr>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>model-manager</staticSubsystemClassId>
      <declaration>src/Model/modelmgr.hxx</declaration>
      <implementation>src/Model/modelmgr.cxx</implementation>
     </FGModelMgr>
    <FGMouseInput>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>input-mouse</staticSubsystemClassId>
      <declaration>src/Input/FGMouseInput.hxx</declaration>
      <implementation>src/Input/FGMouseInput.cxx</implementation>
     </FGMouseInput>
     <FGMultiplayMgr>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>mp</staticSubsystemClassId>
      <declaration>src/MultiPlayer/multiplaymgr.hxx</declaration>
      <implementation>src/MultiPlayer/multiplaymgr.cxx</implementation>
     </FGMultiplayMgr>
     <FGNasalSys>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>nasal</staticSubsystemClassId>
      <declaration>src/Scripting/NasalSys.hxx</declaration>
      <implementation>src/Scripting/NasalSys.cxx</implementation>
    </FGNasalSys>
    <FGPanel>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>panel</staticSubsystemClassId>
      <declaration>utils/fgpanel/FGPanel.hxx</declaration>
      <implementation>utils/fgpanel/FGPanel.cxx</implementation>
    </FGPanel>
    <FGPanelProtocol>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>panel-protocol</staticSubsystemClassId>
      <declaration>utils/fgpanel/FGPanelProtocol.hxx</declaration>
      <implementation>utils/fgpanel/FGPanelProtocol.cxx</implementation>
    </FGPanelProtocol>
    <FGPrecipitationMgr>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>precipitation</staticSubsystemClassId>
      <declaration>src/Environment/precipitation_mgr.hxx</declaration>
      <implementation>src/Environment/precipitation_mgr.cxx</implementation>
    </FGPrecipitationMgr>
    <FGProperties>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>properties</staticSubsystemClassId>
      <declaration>src/Main/fg_props.hxx</declaration>
      <implementation>src/Main/fg_props.cxx</implementation>
    </FGProperties>
    <FGReplay>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>replay</staticSubsystemClassId>
      <declaration>src/Aircraft/replay.hxx</declaration>
      <implementation>src/Aircraft/replay.cxx</implementation>
    </FGReplay>
    <FGRidgeLift>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>ridgelift</staticSubsystemClassId>
      <declaration>src/Environment/ridge_lift.hxx</declaration>
      <implementation>src/Environment/ridge_lift.cxx</implementation>
    </FGRidgeLift>
    <FGRouteMgr>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>route-manager</staticSubsystemClassId>
      <declaration>src/Autopilot/route_mgr.hxx</declaration>
      <implementation>src/Autopilot/route_mgr.cxx</implementation>
    </FGRouteMgr>
    <FGScenery>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>scenery</staticSubsystemClassId>
      <declaration>src/Scenery/scenery.hxx</declaration>
      <implementation>src/Scenery/scenery.cxx</implementation>
    </FGScenery>
    <FGSoundManager>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>sound</staticSubsystemClassId>
      <declaration>src/Sound/soundmanager.hxx</declaration>
      <implementation>src/Sound/soundmanager.cxx</implementation>
    </FGSoundManager>
    <FGSubmodelMgr>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>submodel-mgr</staticSubsystemClassId>
      <declaration>src/AIModel/submodel.hxx</declaration>
      <implementation>src/AIModel/submodel.cxx</implementation>
    </FGSubmodelMgr>
    <FGSubsystemExample>
      <inheritance>SGSubsystem</inheritance>
      <declaration>docs-mini/README.introduction</declaration>
    </FGSubsystemExample>
    <FGTrafficManager>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>traffic-manager</staticSubsystemClassId>
      <declaration>src/Traffic/TrafficMgr.hxx</declaration>
      <implementation>src/Traffic/TrafficMgr.cxx</implementation>
    </FGTrafficManager>
    <FGViewMgr>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>view-manager</staticSubsystemClassId>
      <declaration>src/Viewer/viewmgr.hxx</declaration>
      <implementation>src/Viewer/viewmgr.cxx</implementation>
    </FGViewMgr>
    <FGVoiceMgr>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>voice</staticSubsystemClassId>
      <declaration>src/Sound/voice.hxx</declaration>
      <implementation>src/Sound/voice.cxx</implementation>
    </FGVoiceMgr>
    <FakeRadioSub>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>fake-radio</staticSubsystemClassId>
      <declaration>simgear/structure/subsystem_test.cxx</declaration>
    </FakeRadioSub>
    <GPS>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>gps</staticSubsystemClassId>
      <declaration>src/Instrumentation/gps.hxx</declaration>
      <implementation>src/Instrumentation/gps.cxx</implementation>
    </GPS>
    <GSDI>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>gsdi</staticSubsystemClassId>
      <declaration>src/Instrumentation/gsdi.hxx</declaration>
      <implementation>src/Instrumentation/gsdi.cxx</implementation>
    </GSDI>
    <GUIMgr>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>CanvasGUI</staticSubsystemClassId>
      <declaration>src/Canvas/gui_mgr.hxx</declaration>
      <implementation>src/Canvas/gui_mgr.cxx</implementation>
    </GUIMgr>
    <GroundRadar>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>groundradar</staticSubsystemClassId>
      <declaration>src/Cockpit/groundradar.hxx</declaration>
      <implementation>src/Cockpit/groundradar.cxx</implementation>
    </GroundRadar>
    <HUD>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>hud</staticSubsystemClassId>
      <declaration>src/Instrumentation/HUD/HUD.hxx</declaration>
      <implementation>src/Instrumentation/HUD/HUD.cxx</implementation>
    </HUD>
    <HeadingIndicator>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>heading-indicator</staticSubsystemClassId>
      <declaration>src/Instrumentation/heading_indicator.hxx</declaration>
      <implementation>src/Instrumentation/heading_indicator.cxx</implementation>
    </HeadingIndicator>
    <HeadingIndicatorDG>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>heading-indicator-dg</staticSubsystemClassId>
      <declaration>src/Instrumentation/heading_indicator_dg.hxx</declaration>
      <implementation>src/Instrumentation/heading_indicator_dg.cxx</implementation>
    </HeadingIndicatorDG>
    <HeadingIndicatorFG>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>heading-indicator-fg</staticSubsystemClassId>
      <declaration>src/Instrumentation/heading_indicator_fg.hxx</declaration>
      <implementation>src/Instrumentation/heading_indicator_fg.cxx</implementation>
    </HeadingIndicatorFG>
    <InstVerticalSpeedIndicator>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>inst-vertical-speed-indicator</staticSubsystemClassId>
      <declaration>src/Instrumentation/inst_vertical_speed_indicator.hxx</declaration>
      <implementation>src/Instrumentation/inst_vertical_speed_indicator.cxx</implementation>
    </InstVerticalSpeedIndicator>
    <LayerInterpolateController>
      <inheritance>SGSubsystem</inheritance>
      <declaration>src/Environment/environment_ctrl.hxx</declaration>
    </LayerInterpolateController>
    <MK_VIII>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>mk-viii</staticSubsystemClassId>
      <declaration>src/Instrumentation/mk_viii.hxx</declaration>
      <implementation>src/Instrumentation/mk_viii.cxx</implementation>
    </MK_VIII>
    <MagCompass>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>magnetic-compass</staticSubsystemClassId>
      <declaration>src/Instrumentation/mag_compass.hxx</declaration>
      <implementation>src/Instrumentation/mag_compass.cxx</implementation>
    </MagCompass>
    <MasterReferenceGyro>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>master-reference-gyro</staticSubsystemClassId>
      <declaration>src/Instrumentation/mrg.hxx</declaration>
      <implementation>src/Instrumentation/mrg.cxx</implementation>
    </MasterReferenceGyro>
    <MySub1>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>mysub</staticSubsystemClassId>
      <declaration>simgear/structure/subsystem_test.cxx</declaration>
    </MySub1>
    <NavDisplay>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>navigation-display</staticSubsystemClassId>
      <declaration>src/Cockpit/NavDisplay.hxx</declaration>
      <implementation>src/Cockpit/NavDisplay.cxx</implementation>
    </NavDisplay>
    <NavRadio>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>nav-radio</staticSubsystemClassId>
      <declaration>src/Instrumentation/newnavradio.hxx</declaration>
    </NavRadio>
    <NewGUI>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>gui</staticSubsystemClassId>
      <declaration>src/GUI/new_gui.hxx</declaration>
      <implementation>src/GUI/new_gui.cxx</implementation>
    </NewGUI>
    <PerformanceDB>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>aircraft-performance-db</staticSubsystemClassId>
      <declaration>src/AIModel/performancedb.hxx</declaration>
      <implementation>src/AIModel/performancedb.cxx</implementation>
    </PerformanceDB>
    <PitotSystem>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>pitot</staticSubsystemClassId>
      <declaration>src/Systems/pitot.hxx</declaration>
      <implementation>src/Systems/pitot.cxx</implementation>
    </PitotSystem>
    <PropertyBasedMgr>
      <inheritance>SGSubsystem</inheritance>
      <declaration>simgear/props/PropertyBasedMgr.hxx</declaration>
      <implementation>simgear/props/PropertyBasedMgr.cxx</implementation>
    </PropertyBasedMgr>
    <PropertyInterpolationMgr>
      <inheritance>SGSubsystem</inheritance>
      <declaration>simgear/props/PropertyInterpolationMgr.hxx</declaration>
      <implementation>simgear/props/PropertyInterpolationMgr.cxx</implementation>
    </PropertyInterpolationMgr>
    <RadarAltimeter>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>radar-altimeter</staticSubsystemClassId>
      <declaration>src/Instrumentation/rad_alt.hxx</declaration>
      <implementation>src/Instrumentation/rad_alt.cxx</implementation>
    </RadarAltimeter>
    <RealWxController>
      <inheritance>SGSubsystem</inheritance>
      <declaration>src/Environment/realwx_ctrl.hxx</declaration>
      <implementation>src/Environment/realwx_ctrl.cxx</implementation>
    </RealWxController>
    <SGEventMgr>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>events</staticSubsystemClassId>
      <declaration>simgear/structure/event_mgr.hxx</declaration>
      <implementation>simgear/structure/event_mgr.cxx</implementation>
    </SGEventMgr>
    <SGInterpolator>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>interpolator</staticSubsystemClassId>
      <declaration>simgear/misc/interpolator.hxx</declaration>
      <implementation>simgear/misc/interpolator.cxx</implementation>
    </SGInterpolator>
    <SGPerformanceMonitor>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>performance-mon</staticSubsystemClassId>
      <declaration>simgear/structure/SGPerfMon.hxx</declaration>
      <implementation>simgear/structure/SGPerfMon.cxx</implementation>
    </SGPerformanceMonitor>
    <SGSoundMgr>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>sound</staticSubsystemClassId>
      <declaration>simgear/sound/soundmgr.hxx</declaration>
    </SGSoundMgr>
    <SGSubsystemMgr>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>subsystem-mgr</staticSubsystemClassId>
      <declaration>simgear/structure/subsystem_mgr.hxx</declaration>
      <implementation>simgear/structure/subsystem_mgr.cxx</implementation>
    </SGSubsystemMgr>
    <SGTerraSync>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>terrasync</staticSubsystemClassId>
      <declaration>simgear/scene/tsync/terrasync.hxx</declaration>
      <implementation>simgear/scene/tsync/terrasync.cxx</implementation>
    </SGTerraSync>
    <SlipSkidBall>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>slip-skid-ball</staticSubsystemClassId>
      <declaration>src/Instrumentation/slip_skid_ball.hxx</declaration>
      <implementation>src/Instrumentation/slip_skid_ball.cxx</implementation>
    </SlipSkidBall>
    <StaticSystem>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>static</staticSubsystemClassId>
      <declaration>src/Systems/static.hxx</declaration>
      <implementation>src/Systems/static.cxx</implementation>
    </StaticSystem>
    <SwiftConnection>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>swift</staticSubsystemClassId>
      <declaration>src/Network/Swift/swift_connection.hxx</declaration>
      <implementation>src/Network/Swift/swift_connection.cxx</implementation>
    </SwiftConnection>
    <TACAN>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>tacan</staticSubsystemClassId>
      <declaration>src/Instrumentation/tacan.hxx</declaration>
      <implementation>src/Instrumentation/tacan.cxx</implementation>
    </TACAN>
    <TCAS>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>tcas</staticSubsystemClassId>
      <declaration>src/Instrumentation/tcas.hxx</declaration>
      <implementation>src/Instrumentation/tcas.cxx</implementation>
    </TCAS>
    <TestPilot>
      <inheritance>SGSubsystem</inheritance>
      <declaration>test_suite/FGTestApi/TestPilot.hxx</declaration>
      <implementation>test_suite/FGTestApi/TestPilot.cxx</implementation>
    </TestPilot>
    <TimeManager>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>time</staticSubsystemClassId>
      <declaration>src/Time/TimeManager.hxx</declaration>
      <implementation>src/Time/TimeManager.cxx</implementation>
    </TimeManager>
    <TurnIndicator>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>turn-indicator</staticSubsystemClassId>
      <declaration>src/Instrumentation/turn_indicator.hxx</declaration>
      <implementation>src/Instrumentation/turn_indicator.cxx</implementation>
    </TurnIndicator>
    <VacuumSystem>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>vacuum</staticSubsystemClassId>
      <declaration>src/Systems/vacuum.hxx</declaration>
      <implementation>src/Systems/vacuum.cxx</implementation>
    </VacuumSystem>
    <VerticalSpeedIndicator>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>vertical-speed-indicator</staticSubsystemClassId>
      <declaration>src/Instrumentation/vertical_speed_indicator.hxx</declaration>
      <implementation>src/Instrumentation/vertical_speed_indicator.cxx</implementation>
    </VerticalSpeedIndicator>
    <View>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>view</staticSubsystemClassId>
      <declaration>src/Viewer/view.hxx</declaration>
      <implementation>src/Viewer/view.cxx</implementation>
    </View>
    <wxRadarBg>
      <inheritance>SGSubsystem</inheritance>
      <staticSubsystemClassId>radar</staticSubsystemClassId>
      <declaration>src/Cockpit/wxradar.hxx</declaration>
      <implementation>src/Cockpit/wxradar.cxx</implementation>
    </wxRadarBg>
  </primary_subsystems>
  <primary_groups count="9">
    <Autopilot>
      <inheritance>SGSubsystemGroup : SGSubsystem</inheritance>
      <staticSubsystemClassId>autopilot</staticSubsystemClassId>
      <declaration>src/Autopilot/autopilot.hxx</declaration>
      <implementation>src/Autopilot/autopilot.cxx</implementation>
    </Autopilot>
    <CockpitDisplayManager>
      <inheritance>SGSubsystemGroup : SGSubsystem</inheritance>
      <staticSubsystemClassId>cockpit-displays</staticSubsystemClassId>
      <declaration>src/Cockpit/cockpitDisplayManager.hxx</declaration>
      <implementation>src/Cockpit/cockpitDisplayManager.cxx</implementation>
    </CockpitDisplayManager>
    <FGEnvironmentMgr>
      <inheritance>SGSubsystemGroup : SGSubsystem</inheritance>
      <staticSubsystemClassId>environment</staticSubsystemClassId>
      <declaration>src/Environment/environment_mgr.hxx</declaration>
      <implementation>src/Environment/environment_mgr.cxx</implementation>
    </FGEnvironmentMgr>
    <FGInput>
      <inheritance>SGSubsystemGroup : SGSubsystem</inheritance>
      <staticSubsystemClassId>input</staticSubsystemClassId>
      <declaration>src/Input/input.hxx</declaration>
      <implementation>src/Input/input.cxx</implementation>
    </FGInput>
    <FGInstrumentMgr>
      <inheritance>SGSubsystemGroup : SGSubsystem</inheritance>
      <staticSubsystemClassId>instrumentation</staticSubsystemClassId>
      <declaration>src/Instrumentation/instrument_mgr.hxx</declaration>
      <implementation>src/Instrumentation/instrument_mgr.cxx</implementation>
    </FGInstrumentMgr>
    <FGSystemMgr>
      <inheritance>SGSubsystemGroup : SGSubsystem</inheritance>
      <staticSubsystemClassId>systems</staticSubsystemClassId>
      <declaration>src/Systems/system_mgr.hxx</declaration>
      <implementation>src/Systems/system_mgr.cxx</implementation>
    </FGSystemMgr>
    <FGXMLAutopilotGroup>
      <inheritance>SGSubsystemGroup : SGSubsystem</inheritance>
      <staticSubsystemClassId>xml-rules</staticSubsystemClassId>
      <declaration>src/Autopilot/autopilotgroup.hxx</declaration>
      <implementation>src/Autopilot/autopilotgroup.cxx</implementation>
    </FGXMLAutopilotGroup>
    <InstrumentGroup>
      <inheritance>SGSubsystemGroup : SGSubsystem</inheritance>
      <staticSubsystemClassId>instruments</staticSubsystemClassId>
      <declaration>simgear/structure/subsystem_test.cxx</declaration>
    </InstrumentGroup>
    <TerrainSampler>
      <inheritance>SGSubsystemGroup : SGSubsystem</inheritance>
      <declaration>src/Environment/terrainsampler.hxx</declaration>
    </TerrainSampler>
   </primary_groups>
   </primary_groups>
   <secondary_classes subsystems="28" groups="0">
   <secondary_subsystems count="34">
     <AnalogComponent from="Component : SGSubsystem" in="src/Autopilot/analogcomponent.hxx"/>
    <ADF>
     <BasicRealWxController from="RealWxController : SGSubsystem" in="src/Environment/realwx_ctrl.cxx"/>
      <inheritance>AbstractInstrument : SGSubsystem</inheritance>
     <CanvasMgr from="PropertyBasedMgr : SGSubsystem" in="simgear/canvas/CanvasMgr.hxx"/>
      <staticSubsystemClassId>adf</staticSubsystemClassId>
     <CommRadioImpl from="CommRadio : SGSubsystem" in="src/Instrumentation/commradio.cxx"/>
      <declaration>src/Instrumentation/adf.hxx</declaration>
     <DigitalComponent from="Component : SGSubsystem" in="src/Autopilot/digitalcomponent.hxx"/>
      <implementation>src/Instrumentation/adf.cxx</implementation>
     <FGACMS from="FGInterface : SGSubsystem" in="src/FDM/SP/ACMS.hxx"/>
    </ADF>
     <FGADA from="FGInterface : SGSubsystem" in="src/FDM/SP/ADA.hxx"/>
     <AnalogComponent>
     <FGAISim from="FGInterface : SGSubsystem" in="src/FDM/SP/AISim.hpp"/>
      <inheritance>Component : SGSubsystem</inheritance>
     <FGBalloonSim from="FGInterface : SGSubsystem" in="src/FDM/SP/Balloon.h"/>
      <declaration>src/Autopilot/analogcomponent.hxx</declaration>
     <FGExternalNet from="FGInterface : SGSubsystem" in="src/FDM/ExternalNet/ExternalNet.hxx"/>
      <implementation>src/Autopilot/analogcomponent.cxx</implementation>
     <FGExternalPipe from="FGInterface : SGSubsystem" in="src/FDM/ExternalPipe/ExternalPipe.hxx"/>
    </AnalogComponent>
     <FGHIDEventInput from="FGEventInput : SGSubsystem" in="src/Input/FGHIDEventInput.hxx"/>
     <BasicRealWxController>
     <FGJSBsim from="FGInterface : SGSubsystem" in="src/FDM/JSBSim/JSBSim.hxx"/>
      <inheritance>RealWxController : SGSubsystem</inheritance>
     <FGLaRCsim from="FGInterface : SGSubsystem" in="src/FDM/LaRCsim/LaRCsim.hxx"/>
      <declaration>src/Environment/realwx_ctrl.cxx</declaration>
     <FGLinuxEventInput from="FGEventInput : SGSubsystem" in="src/Input/FGLinuxEventInput.hxx"/>
      <implementation>src/Environment/realwx_ctrl.cxx</implementation>
     <FGMacOSXEventInput from="FGEventInput : SGSubsystem" in="src/Input/FGMacOSXEventInput.hxx"/>
    </BasicRealWxController>
     <FGMagicCarpet from="FGInterface : SGSubsystem" in="src/FDM/SP/MagicCarpet.hxx"/>
     <CanvasMgr>
     <FGNullFDM from="FGInterface : SGSubsystem" in="src/FDM/NullFDM.hxx"/>
      <inheritance>PropertyBasedMgr : SGSubsystem</inheritance>
     <FGReadablePanel from="FGPanel : SGSubsystem" in="utils/fgpanel/panel_io.hxx"/>
      <declaration>simgear/canvas/CanvasMgr.hxx</declaration>
     <FGSoundManager from="SGSoundMgr : SGSubsystem" in="src/Sound/soundmanager.hxx"/>
      <implementation>simgear/canvas/CanvasMgr.cxx</implementation>
     <FGUFO from="FGInterface : SGSubsystem" in="src/FDM/UFO.hxx"/>
    </CanvasMgr>
     <KLN89 from="DCLGPS : SGSubsystem" in="src/Instrumentation/KLN89/kln89.hxx"/>
     <CommRadio>
     <LayerInterpolateControllerImplementation from="LayerInterpolateController : SGSubsystem" in="src/Environment/environment_ctrl.cxx"/>
      <inheritance>AbstractInstrument : SGSubsystem</inheritance>
     <MongooseHttpd from="FGHttpd : SGSubsystem" in="src/Network/http/httpd.cxx"/>
      <staticSubsystemClassId>comm-radio</staticSubsystemClassId>
     <NavRadioImpl from="NavRadio : SGSubsystem" in="src/Instrumentation/newnavradio.cxx"/>
      <declaration>src/Instrumentation/commradio.hxx</declaration>
     <StateMachineComponent from="Component : SGSubsystem" in="src/Autopilot/autopilot.cxx"/>
    </CommRadio>
     <YASim from="FGInterface : SGSubsystem" in="src/FDM/YASim/YASim.hxx"/>
    <DME>
     <agRadar from="wxRadarBg : SGSubsystem" in="src/Cockpit/agradar.hxx"/>
      <inheritance>AbstractInstrument : SGSubsystem</inheritance>
   </secondary_classes>
      <staticSubsystemClassId>dme</staticSubsystemClassId>
   <secondary_groups subsystems="0" groups="2">
      <declaration>src/Instrumentation/dme.hxx</declaration>
     <FGXMLAutopilotGroupImplementation from="FGXMLAutopilotGroup : SGSubsystemGroup : SGSubsystem" in="src/Autopilot/autopilotgroup.cxx"/>
      <implementation>src/Instrumentation/dme.cxx</implementation>
     <TerrainSamplerImplementation from="TerrainSampler : SGSubsystemGroup : SGSubsystem" in="src/Environment/terrainsampler.cxx"/>
    </DME>
     <DigitalComponent>
      <inheritance>Component : SGSubsystem</inheritance>
      <declaration>src/Autopilot/digitalcomponent.hxx</declaration>
      <implementation>src/Autopilot/digitalcomponent.cxx</implementation>
    </DigitalComponent>
     <FGACMS>
      <inheritance>FGInterface : SGSubsystem</inheritance>
      <staticSubsystemClassId>acms</staticSubsystemClassId>
      <declaration>src/FDM/SP/ACMS.hxx</declaration>
      <implementation>src/FDM/SP/ACMS.cxx</implementation>
    </FGACMS>
     <FGADA>
      <inheritance>FGInterface : SGSubsystem</inheritance>
      <staticSubsystemClassId>ada</staticSubsystemClassId>
      <declaration>src/FDM/SP/ADA.hxx</declaration>
      <implementation>src/FDM/SP/ADA.cxx</implementation>
    </FGADA>
     <FGAISim>
      <inheritance>FGInterface : SGSubsystem</inheritance>
      <staticSubsystemClassId>aisim</staticSubsystemClassId>
      <declaration>src/FDM/SP/AISim.hpp</declaration>
      <implementation>src/FDM/SP/AISim.cpp</implementation>
    </FGAISim>
     <FGBalloonSim>
      <inheritance>FGInterface : SGSubsystem</inheritance>
      <staticSubsystemClassId>balloon</staticSubsystemClassId>
      <declaration>src/FDM/SP/Balloon.h</declaration>
      <implementation>src/FDM/SP/Balloon.cxx</implementation>
    </FGBalloonSim>
     <FGExternalNet>
      <inheritance>FGInterface : SGSubsystem</inheritance>
      <staticSubsystemClassId>network</staticSubsystemClassId>
      <declaration>src/FDM/ExternalNet/ExternalNet.hxx</declaration>
      <implementation>src/FDM/ExternalNet/ExternalNet.cxx</implementation>
    </FGExternalNet>
     <FGExternalPipe>
      <inheritance>FGInterface : SGSubsystem</inheritance>
      <staticSubsystemClassId>pipe</staticSubsystemClassId>
      <declaration>src/FDM/ExternalPipe/ExternalPipe.hxx</declaration>
      <implementation>src/FDM/ExternalPipe/ExternalPipe.cxx</implementation>
    </FGExternalPipe>
     <FGHIDEventInput>
      <inheritance>FGEventInput : SGSubsystem</inheritance>
      <staticSubsystemClassId>input-event-hid</staticSubsystemClassId>
      <declaration>src/Input/FGHIDEventInput.hxx</declaration>
      <implementation>src/Input/FGHIDEventInput.cxx</implementation>
    </FGHIDEventInput>
    <FGInterpolator>
      <inheritance>PropertyInterpolationMgr : SGSubsystem</inheritance>
      <staticSubsystemClassId>prop-interpolator</staticSubsystemClassId>
      <declaration>src/Main/FGInterpolator.hxx</declaration>
      <implementation>src/Main/FGInterpolator.cxx</implementation>
    </FGInterpolator>
     <FGJSBsim>
      <inheritance>FGInterface : SGSubsystem</inheritance>
      <staticSubsystemClassId>jsb</staticSubsystemClassId>
      <declaration>src/FDM/JSBSim/JSBSim.hxx</declaration>
      <implementation>src/FDM/JSBSim/JSBSim.cxx</implementation>
    </FGJSBsim>
     <FGLaRCsim>
      <inheritance>FGInterface : SGSubsystem</inheritance>
      <staticSubsystemClassId>larcsim</staticSubsystemClassId>
      <declaration>src/FDM/LaRCsim/LaRCsim.hxx</declaration>
      <implementation>src/FDM/LaRCsim/LaRCsim.cxx</implementation>
    </FGLaRCsim>
     <FGLinuxEventInput>
      <inheritance>FGEventInput : SGSubsystem</inheritance>
      <staticSubsystemClassId>input-event</staticSubsystemClassId>
      <declaration>src/Input/FGLinuxEventInput.hxx</declaration>
      <implementation>src/Input/FGLinuxEventInput.cxx</implementation>
    </FGLinuxEventInput>
     <FGMacOSXEventInput>
      <inheritance>FGEventInput : SGSubsystem</inheritance>
      <staticSubsystemClassId>input-event</staticSubsystemClassId>
      <declaration>src/Input/FGMacOSXEventInput.hxx</declaration>
      <implementation>src/Input/FGMacOSXEventInput.cxx</implementation>
    </FGMacOSXEventInput>
     <FGMagicCarpet>
      <inheritance>FGInterface : SGSubsystem</inheritance>
      <staticSubsystemClassId>magic</staticSubsystemClassId>
      <declaration>src/FDM/SP/MagicCarpet.hxx</declaration>
      <implementation>src/FDM/SP/MagicCarpet.cxx</implementation>
    </FGMagicCarpet>
    <FGMarkerBeacon>
      <inheritance>AbstractInstrument : SGSubsystem</inheritance>
      <staticSubsystemClassId>marker-beacon</staticSubsystemClassId>
      <declaration>src/Instrumentation/marker_beacon.hxx</declaration>
      <implementation>src/Instrumentation/marker_beacon.cxx</implementation>
    </FGMarkerBeacon>
    <FGNavRadio>
      <inheritance>AbstractInstrument : SGSubsystem</inheritance>
      <staticSubsystemClassId>old-navradio</staticSubsystemClassId>
      <declaration>src/Instrumentation/navradio.hxx</declaration>
      <implementation>src/Instrumentation/navradio.cxx</implementation>
    </FGNavRadio>
     <FGNullFDM>
      <inheritance>FGInterface : SGSubsystem</inheritance>
      <staticSubsystemClassId>null</staticSubsystemClassId>
      <declaration>src/FDM/NullFDM.hxx</declaration>
      <implementation>src/FDM/NullFDM.cxx</implementation>
    </FGNullFDM>
     <FGReadablePanel>
      <inheritance>FGPanel : SGSubsystem</inheritance>
      <staticSubsystemClassId>readable-panel</staticSubsystemClassId>
      <declaration>utils/fgpanel/panel_io.hxx</declaration>
      <implementation>utils/fgpanel/panel_io.cxx</implementation>
    </FGReadablePanel>
     <FGSoundManager>
      <inheritance>SGSoundMgr : SGSubsystem</inheritance>
      <staticSubsystemClassId>sound</staticSubsystemClassId>
      <declaration>src/Sound/soundmanager.hxx</declaration>
      <implementation>src/Sound/soundmanager.cxx</implementation>
    </FGSoundManager>
     <FGUFO>
      <inheritance>FGInterface : SGSubsystem</inheritance>
      <staticSubsystemClassId>ufo</staticSubsystemClassId>
      <declaration>src/FDM/UFO.hxx</declaration>
      <implementation>src/FDM/UFO.cxx</implementation>
    </FGUFO>
     <KLN89>
      <inheritance>DCLGPS : SGSubsystem</inheritance>
      <staticSubsystemClassId>KLN89</staticSubsystemClassId>
      <declaration>src/Instrumentation/KLN89/kln89.hxx</declaration>
      <implementation>src/Instrumentation/KLN89/kln89.cxx</implementation>
    </KLN89>
     <LayerInterpolateControllerImplementation>
      <inheritance>LayerInterpolateController : SGSubsystem</inheritance>
      <staticSubsystemClassId>layer-interpolate-controller</staticSubsystemClassId>
      <declaration>src/Environment/environment_ctrl.cxx</declaration>
      <implementation>src/Environment/environment_ctrl.cxx</implementation>
    </LayerInterpolateControllerImplementation>
     <MongooseHttpd>
      <inheritance>FGHttpd : SGSubsystem</inheritance>
      <staticSubsystemClassId>mongoose-httpd</staticSubsystemClassId>
      <declaration>src/Network/http/httpd.cxx</declaration>
      <implementation>src/Network/http/httpd.cxx</implementation>
    </MongooseHttpd>
     <NavRadioImpl>
      <inheritance>NavRadio : SGSubsystem</inheritance>
      <declaration>src/Instrumentation/newnavradio.cxx</declaration>
      <implementation>src/Instrumentation/newnavradio.cxx</implementation>
    </NavRadioImpl>
     <StateMachineComponent>
      <inheritance>Component : SGSubsystem</inheritance>
      <staticSubsystemClassId>state-machine</staticSubsystemClassId>
      <declaration>src/Autopilot/autopilot.cxx</declaration>
    </StateMachineComponent>
    <Transponder>
      <inheritance>AbstractInstrument : SGSubsystem</inheritance>
      <staticSubsystemClassId>transponder</staticSubsystemClassId>
      <declaration>src/Instrumentation/transponder.hxx</declaration>
      <implementation>src/Instrumentation/transponder.cxx</implementation>
    </Transponder>
     <YASim>
      <inheritance>FGInterface : SGSubsystem</inheritance>
      <staticSubsystemClassId>yasim</staticSubsystemClassId>
      <declaration>src/FDM/YASim/YASim.hxx</declaration>
      <implementation>src/FDM/YASim/YASim.cxx</implementation>
    </YASim>
     <agRadar>
      <inheritance>wxRadarBg : SGSubsystem</inheritance>
      <staticSubsystemClassId>air-ground-radar</staticSubsystemClassId>
      <declaration>src/Cockpit/agradar.hxx</declaration>
      <implementation>src/Cockpit/agradar.cxx</implementation>
    </agRadar>
   </secondary_subsystems>
   <secondary_groups count="2">
     <FGXMLAutopilotGroupImplementation>
      <inheritance>FGXMLAutopilotGroup : SGSubsystemGroup : SGSubsystem</inheritance>
      <staticSubsystemClassId>xml-autopilot-group</staticSubsystemClassId>
      <declaration>src/Autopilot/autopilotgroup.cxx</declaration>
      <implementation>src/Autopilot/autopilotgroup.cxx</implementation>
    </FGXMLAutopilotGroupImplementation>
     <TerrainSamplerImplementation>
      <inheritance>TerrainSampler : SGSubsystemGroup : SGSubsystem</inheritance>
      <staticSubsystemClassId>terrain-sampler</staticSubsystemClassId>
      <declaration>src/Environment/terrainsampler.cxx</declaration>
      <implementation>src/Environment/terrainsampler.cxx</implementation>
    </TerrainSamplerImplementation>
   </secondary_groups>
   </secondary_groups>
   <tertiary_classes subsystems="6" groups="0">
   <tertiary_subsystems count="8">
     <DigitalFilter from="AnalogComponent : Component : SGSubsystem" in="src/Autopilot/digitalfilter.hxx"/>
    <CanvasMgr>
     <Logic from="DigitalComponent : Component : SGSubsystem" in="src/Autopilot/logic.hxx"/>
      <inheritance>CanvasMgr : PropertyBasedMgr : SGSubsystem</inheritance>
     <NoaaMetarRealWxController from="BasicRealWxController : RealWxController : SGSubsystem" in="src/Environment/realwx_ctrl.cxx"/>
      <staticSubsystemClassId>Canvas</staticSubsystemClassId>
     <PIDController from="AnalogComponent : Component : SGSubsystem" in="src/Autopilot/pidcontroller.hxx"/>
      <declaration>src/Canvas/canvas_mgr.hxx</declaration>
     <PISimpleController from="AnalogComponent : Component : SGSubsystem" in="src/Autopilot/pisimplecontroller.hxx"/>
      <implementation>src/Canvas/canvas_mgr.cxx</implementation>
     <Predictor from="AnalogComponent : Component : SGSubsystem" in="src/Autopilot/predictor.hxx"/>
    </CanvasMgr>
   </tertiary_classes>
    <CommRadioImpl>
   <quaternary_classes subsystems="1" groups="0">
      <inheritance>CommRadio : AbstractInstrument : SGSubsystem</inheritance>
     <FlipFlop from="Logic : DigitalComponent : Component : SGSubsystem" in="src/Autopilot/flipflop.hxx"/>
      <declaration>src/Instrumentation/commradio.cxx</declaration>
   </quaternary_classes>
      <implementation>src/Instrumentation/commradio.cxx</implementation>
<total subsystem_classes="126" subsystem_groups="10"/>
    </CommRadioImpl>
     <DigitalFilter>
      <inheritance>AnalogComponent : Component : SGSubsystem</inheritance>
      <staticSubsystemClassId>filter</staticSubsystemClassId>
      <declaration>src/Autopilot/digitalfilter.hxx</declaration>
      <implementation>src/Autopilot/digitalfilter.cxx</implementation>
    </DigitalFilter>
     <Logic>
      <inheritance>DigitalComponent : Component : SGSubsystem</inheritance>
      <staticSubsystemClassId>logic</staticSubsystemClassId>
      <declaration>src/Autopilot/logic.hxx</declaration>
      <implementation>src/Autopilot/logic.cxx</implementation>
    </Logic>
     <NoaaMetarRealWxController>
      <inheritance>BasicRealWxController : RealWxController : SGSubsystem</inheritance>
      <staticSubsystemClassId>noaa-metar-real-wx-controller</staticSubsystemClassId>
      <declaration>src/Environment/realwx_ctrl.cxx</declaration>
      <implementation>src/Environment/realwx_ctrl.cxx</implementation>
    </NoaaMetarRealWxController>
     <PIDController>
      <inheritance>AnalogComponent : Component : SGSubsystem</inheritance>
      <staticSubsystemClassId>pid-controller</staticSubsystemClassId>
      <declaration>src/Autopilot/pidcontroller.hxx</declaration>
      <implementation>src/Autopilot/pidcontroller.cxx</implementation>
    </PIDController>
     <PISimpleController>
      <inheritance>AnalogComponent : Component : SGSubsystem</inheritance>
      <staticSubsystemClassId>pi-simple-controller</staticSubsystemClassId>
      <declaration>src/Autopilot/pisimplecontroller.hxx</declaration>
      <implementation>src/Autopilot/pisimplecontroller.cxx</implementation>
    </PISimpleController>
     <Predictor>
      <inheritance>AnalogComponent : Component : SGSubsystem</inheritance>
      <staticSubsystemClassId>predict-simple</staticSubsystemClassId>
      <declaration>src/Autopilot/predictor.hxx</declaration>
      <implementation>src/Autopilot/predictor.cxx</implementation>
    </Predictor>
   </tertiary_subsystems>
   <quaternary_subsystems count="1">
     <FlipFlop>
      <inheritance>Logic : DigitalComponent : Component : SGSubsystem</inheritance>
      <staticSubsystemClassId>flipflop</staticSubsystemClassId>
      <declaration>src/Autopilot/flipflop.hxx</declaration>
      <implementation>src/Autopilot/flipflop.cxx</implementation>
    </FlipFlop>
  </quaternary_subsystems>
   <counts>
    <simgear>
      <subsystem_classes>12</subsystem_classes>
      <subsystem_groups>1</subsystem_groups>
      <total>13</total>
    </simgear>
    <flightgear>
      <subsystem_classes>122</subsystem_classes>
      <subsystem_groups>10</subsystem_groups>
      <total>132</total>
    </flightgear>
    <combined>
      <subsystem_classes>134</subsystem_classes>
      <subsystem_groups>11</subsystem_groups>
      <total>145</total>
    </combined>
  </counts>
</subsystems>
</subsystems>
| show  = 1
}}
 
{{collapsible script
| type  = File listing output
| title  = The declaration and implementation files for all flightgear and simgear subsystems and subsystem groups.
| intro  = File listing output from the Python script for finding all subsystems within the flightgear and simgear C++ code bases.  The error output from the script was redirected and hence not shown below.
| lang  = shell
| script =
$ ./find_subsystems.py -l 2> /dev/null {{!}} sort
docs-mini/README.introduction
simgear/canvas/CanvasMgr.cxx
simgear/canvas/CanvasMgr.hxx
simgear/misc/interpolator.cxx
simgear/misc/interpolator.hxx
simgear/props/PropertyBasedMgr.cxx
simgear/props/PropertyBasedMgr.hxx
simgear/props/PropertyInterpolationMgr.cxx
simgear/props/PropertyInterpolationMgr.hxx
simgear/scene/tsync/terrasync.cxx
simgear/scene/tsync/terrasync.hxx
simgear/sound/soundmgr.hxx
simgear/structure/event_mgr.cxx
simgear/structure/event_mgr.hxx
simgear/structure/SGPerfMon.cxx
simgear/structure/SGPerfMon.hxx
simgear/structure/subsystem_mgr.cxx
simgear/structure/subsystem_mgr.hxx
simgear/structure/subsystem_test.cxx
simgear/structure/subsystem_test.cxx
simgear/structure/subsystem_test.cxx
simgear/structure/subsystem_test.cxx
src/AIModel/AIManager.cxx
src/AIModel/AIManager.hxx
src/AIModel/performancedb.cxx
src/AIModel/performancedb.hxx
src/AIModel/submodel.cxx
src/AIModel/submodel.hxx
src/Aircraft/controls.cxx
src/Aircraft/controls.hxx
src/Aircraft/FlightHistory.cxx
src/Aircraft/FlightHistory.hxx
src/Aircraft/replay.cxx
src/Aircraft/replay.hxx
src/Airports/airportdynamicsmanager.cxx
src/Airports/airportdynamicsmanager.hxx
src/ATC/atc_mgr.cxx
src/ATC/atc_mgr.hxx
src/Autopilot/analogcomponent.cxx
src/Autopilot/analogcomponent.hxx
src/Autopilot/autopilot.cxx
src/Autopilot/autopilot.cxx
src/Autopilot/autopilotgroup.cxx
src/Autopilot/autopilotgroup.cxx
src/Autopilot/autopilotgroup.cxx
src/Autopilot/autopilotgroup.hxx
src/Autopilot/autopilot.hxx
src/Autopilot/component.cxx
src/Autopilot/component.hxx
src/Autopilot/digitalcomponent.cxx
src/Autopilot/digitalcomponent.hxx
src/Autopilot/digitalfilter.cxx
src/Autopilot/digitalfilter.hxx
src/Autopilot/flipflop.cxx
src/Autopilot/flipflop.hxx
src/Autopilot/logic.cxx
src/Autopilot/logic.hxx
src/Autopilot/pidcontroller.cxx
src/Autopilot/pidcontroller.hxx
src/Autopilot/pisimplecontroller.cxx
src/Autopilot/pisimplecontroller.hxx
src/Autopilot/predictor.cxx
src/Autopilot/predictor.hxx
src/Autopilot/route_mgr.cxx
src/Autopilot/route_mgr.hxx
src/Canvas/canvas_mgr.cxx
src/Canvas/canvas_mgr.hxx
src/Canvas/gui_mgr.cxx
src/Canvas/gui_mgr.hxx
src/Cockpit/agradar.cxx
src/Cockpit/agradar.hxx
src/Cockpit/cockpitDisplayManager.cxx
src/Cockpit/cockpitDisplayManager.hxx
src/Cockpit/groundradar.cxx
src/Cockpit/groundradar.hxx
src/Cockpit/NavDisplay.cxx
src/Cockpit/NavDisplay.hxx
src/Cockpit/wxradar.cxx
src/Cockpit/wxradar.hxx
src/Environment/environment_ctrl.cxx
src/Environment/environment_ctrl.cxx
src/Environment/environment_ctrl.hxx
src/Environment/environment_mgr.cxx
src/Environment/environment_mgr.hxx
src/Environment/ephemeris.cxx
src/Environment/ephemeris.hxx
src/Environment/magvarmanager.cxx
src/Environment/magvarmanager.hxx
src/Environment/precipitation_mgr.cxx
src/Environment/precipitation_mgr.hxx
src/Environment/realwx_ctrl.cxx
src/Environment/realwx_ctrl.cxx
src/Environment/realwx_ctrl.cxx
src/Environment/realwx_ctrl.cxx
src/Environment/realwx_ctrl.cxx
src/Environment/realwx_ctrl.hxx
src/Environment/ridge_lift.cxx
src/Environment/ridge_lift.hxx
src/Environment/terrainsampler.cxx
src/Environment/terrainsampler.cxx
src/Environment/terrainsampler.cxx
src/Environment/terrainsampler.cxx
src/Environment/terrainsampler.hxx
src/FDM/ExternalNet/ExternalNet.cxx
src/FDM/ExternalNet/ExternalNet.hxx
src/FDM/ExternalPipe/ExternalPipe.cxx
src/FDM/ExternalPipe/ExternalPipe.hxx
src/FDM/fdm_shell.cxx
src/FDM/fdm_shell.hxx
src/FDM/flight.cxx
src/FDM/flight.hxx
src/FDM/JSBSim/JSBSim.cxx
src/FDM/JSBSim/JSBSim.hxx
src/FDM/LaRCsim/LaRCsim.cxx
src/FDM/LaRCsim/LaRCsim.hxx
src/FDM/NullFDM.cxx
src/FDM/NullFDM.hxx
src/FDM/SP/ACMS.cxx
src/FDM/SP/ACMS.hxx
src/FDM/SP/ADA.cxx
src/FDM/SP/ADA.hxx
src/FDM/SP/AISim.cpp
src/FDM/SP/AISim.hpp
src/FDM/SP/Balloon.cxx
src/FDM/SP/Balloon.h
src/FDM/SP/MagicCarpet.cxx
src/FDM/SP/MagicCarpet.hxx
src/FDM/UFO.cxx
src/FDM/UFO.hxx
src/FDM/YASim/YASim.cxx
src/FDM/YASim/YASim.hxx
src/GUI/new_gui.cxx
src/GUI/new_gui.hxx
src/Input/FGEventInput.cxx
src/Input/FGEventInput.hxx
src/Input/FGHIDEventInput.cxx
src/Input/FGHIDEventInput.hxx
src/Input/FGJoystickInput.cxx
src/Input/FGJoystickInput.hxx
src/Input/FGKeyboardInput.cxx
src/Input/FGKeyboardInput.hxx
src/Input/FGLinuxEventInput.cxx
src/Input/FGLinuxEventInput.hxx
src/Input/FGMacOSXEventInput.cxx
src/Input/FGMacOSXEventInput.hxx
src/Input/FGMouseInput.cxx
src/Input/FGMouseInput.hxx
src/Input/input.cxx
src/Input/input.hxx
src/Instrumentation/AbstractInstrument.cxx
src/Instrumentation/AbstractInstrument.hxx
src/Instrumentation/adf.cxx
src/Instrumentation/adf.hxx
src/Instrumentation/airspeed_indicator.cxx
src/Instrumentation/airspeed_indicator.hxx
src/Instrumentation/altimeter.cxx
src/Instrumentation/altimeter.hxx
src/Instrumentation/attitude_indicator.cxx
src/Instrumentation/attitude_indicator.hxx
src/Instrumentation/clock.cxx
src/Instrumentation/clock.hxx
src/Instrumentation/commradio.cxx
src/Instrumentation/commradio.cxx
src/Instrumentation/commradio.hxx
src/Instrumentation/dclgps.cxx
src/Instrumentation/dclgps.hxx
src/Instrumentation/dme.cxx
src/Instrumentation/dme.hxx
src/Instrumentation/gps.cxx
src/Instrumentation/gps.hxx
src/Instrumentation/gsdi.cxx
src/Instrumentation/gsdi.hxx
src/Instrumentation/heading_indicator.cxx
src/Instrumentation/heading_indicator_dg.cxx
src/Instrumentation/heading_indicator_dg.hxx
src/Instrumentation/heading_indicator_fg.cxx
src/Instrumentation/heading_indicator_fg.hxx
src/Instrumentation/heading_indicator.hxx
src/Instrumentation/HUD/HUD.cxx
src/Instrumentation/HUD/HUD.hxx
src/Instrumentation/instrument_mgr.cxx
src/Instrumentation/instrument_mgr.hxx
src/Instrumentation/inst_vertical_speed_indicator.cxx
src/Instrumentation/inst_vertical_speed_indicator.hxx
src/Instrumentation/KLN89/kln89.cxx
src/Instrumentation/KLN89/kln89.hxx
src/Instrumentation/kr_87.cxx
src/Instrumentation/kr_87.hxx
src/Instrumentation/mag_compass.cxx
src/Instrumentation/mag_compass.hxx
src/Instrumentation/marker_beacon.cxx
src/Instrumentation/marker_beacon.hxx
src/Instrumentation/mk_viii.cxx
src/Instrumentation/mk_viii.hxx
src/Instrumentation/mrg.cxx
src/Instrumentation/mrg.hxx
src/Instrumentation/navradio.cxx
src/Instrumentation/navradio.hxx
src/Instrumentation/newnavradio.cxx
src/Instrumentation/newnavradio.cxx
src/Instrumentation/newnavradio.hxx
src/Instrumentation/rad_alt.cxx
src/Instrumentation/rad_alt.hxx
src/Instrumentation/slip_skid_ball.cxx
src/Instrumentation/slip_skid_ball.hxx
src/Instrumentation/tacan.cxx
src/Instrumentation/tacan.hxx
src/Instrumentation/tcas.cxx
src/Instrumentation/tcas.hxx
src/Instrumentation/transponder.cxx
src/Instrumentation/transponder.hxx
src/Instrumentation/turn_indicator.cxx
src/Instrumentation/turn_indicator.hxx
src/Instrumentation/vertical_speed_indicator.cxx
src/Instrumentation/vertical_speed_indicator.hxx
src/Main/FGInterpolator.cxx
src/Main/FGInterpolator.hxx
src/Main/fg_io.cxx
src/Main/fg_io.hxx
src/Main/fg_props.cxx
src/Main/fg_props.hxx
src/Main/logger.cxx
src/Main/logger.hxx
src/Model/acmodel.cxx
src/Model/acmodel.hxx
src/Model/modelmgr.cxx
src/Model/modelmgr.hxx
src/MultiPlayer/multiplaymgr.cxx
src/MultiPlayer/multiplaymgr.hxx
src/Network/DNSClient.cxx
src/Network/DNSClient.hxx
src/Network/fgcom.cxx
src/Network/fgcom.hxx
src/Network/HTTPClient.cxx
src/Network/HTTPClient.hxx
src/Network/http/httpd.cxx
src/Network/http/httpd.cxx
src/Network/http/httpd.hxx
src/Network/Swift/swift_connection.cxx
src/Network/Swift/swift_connection.hxx
src/Scenery/scenery.cxx
src/Scenery/scenery.hxx
src/Scripting/NasalSys.cxx
src/Scripting/NasalSys.hxx
src/Sound/soundmanager.cxx
src/Sound/soundmanager.cxx
src/Sound/soundmanager.hxx
src/Sound/soundmanager.hxx
src/Sound/voice.cxx
src/Sound/voice.hxx
src/Systems/electrical.cxx
src/Systems/electrical.hxx
src/Systems/pitot.cxx
src/Systems/pitot.hxx
src/Systems/static.cxx
src/Systems/static.hxx
src/Systems/system_mgr.cxx
src/Systems/system_mgr.hxx
src/Systems/vacuum.cxx
src/Systems/vacuum.hxx
src/Time/light.cxx
src/Time/light.hxx
src/Time/TimeManager.cxx
src/Time/TimeManager.hxx
src/Traffic/TrafficMgr.cxx
src/Traffic/TrafficMgr.hxx
src/Viewer/view.cxx
src/Viewer/view.hxx
src/Viewer/viewmgr.cxx
src/Viewer/viewmgr.hxx
test_suite/FGTestApi/TestPilot.cxx
test_suite/FGTestApi/TestPilot.hxx
utils/fgpanel/FGPanel.cxx
utils/fgpanel/FGPanel.hxx
utils/fgpanel/FGPanelProtocol.cxx
utils/fgpanel/FGPanelProtocol.hxx
utils/fgpanel/panel_io.cxx
utils/fgpanel/panel_io.hxx
}}
 
{{collapsible script
| type  = Flightgear subsystem declaration file listing output
| title  = The declaration files for all flightgear subsystems (excluding simgear sources and excluding subsystem groups).
| intro  = Declaration file listing output from the Python script for finding all subsystems within the flightgear C++ code base.  The error output from the script was redirected and hence not shown below.
| lang  = shell
| script =
$ ./find_subsystems.py -dfnp 2> /dev/null {{!}} sort
/flightgear/src/flightgear-flightgear/docs-mini/README.introduction
/flightgear/src/flightgear-flightgear/src/AIModel/AIManager.hxx
/flightgear/src/flightgear-flightgear/src/AIModel/performancedb.hxx
/flightgear/src/flightgear-flightgear/src/AIModel/submodel.hxx
/flightgear/src/flightgear-flightgear/src/Aircraft/controls.hxx
/flightgear/src/flightgear-flightgear/src/Aircraft/FlightHistory.hxx
/flightgear/src/flightgear-flightgear/src/Aircraft/replay.hxx
/flightgear/src/flightgear-flightgear/src/Airports/airportdynamicsmanager.hxx
/flightgear/src/flightgear-flightgear/src/ATC/atc_mgr.hxx
/flightgear/src/flightgear-flightgear/src/Autopilot/analogcomponent.hxx
/flightgear/src/flightgear-flightgear/src/Autopilot/autopilot.cxx
/flightgear/src/flightgear-flightgear/src/Autopilot/component.hxx
/flightgear/src/flightgear-flightgear/src/Autopilot/digitalcomponent.hxx
/flightgear/src/flightgear-flightgear/src/Autopilot/digitalfilter.hxx
/flightgear/src/flightgear-flightgear/src/Autopilot/flipflop.hxx
/flightgear/src/flightgear-flightgear/src/Autopilot/logic.hxx
/flightgear/src/flightgear-flightgear/src/Autopilot/pidcontroller.hxx
/flightgear/src/flightgear-flightgear/src/Autopilot/pisimplecontroller.hxx
/flightgear/src/flightgear-flightgear/src/Autopilot/predictor.hxx
/flightgear/src/flightgear-flightgear/src/Autopilot/route_mgr.hxx
/flightgear/src/flightgear-flightgear/src/Canvas/canvas_mgr.hxx
/flightgear/src/flightgear-flightgear/src/Canvas/gui_mgr.hxx
/flightgear/src/flightgear-flightgear/src/Cockpit/agradar.hxx
/flightgear/src/flightgear-flightgear/src/Cockpit/groundradar.hxx
/flightgear/src/flightgear-flightgear/src/Cockpit/NavDisplay.hxx
/flightgear/src/flightgear-flightgear/src/Cockpit/wxradar.hxx
/flightgear/src/flightgear-flightgear/src/Environment/environment_ctrl.cxx
/flightgear/src/flightgear-flightgear/src/Environment/environment_ctrl.hxx
/flightgear/src/flightgear-flightgear/src/Environment/ephemeris.hxx
/flightgear/src/flightgear-flightgear/src/Environment/magvarmanager.hxx
/flightgear/src/flightgear-flightgear/src/Environment/precipitation_mgr.hxx
/flightgear/src/flightgear-flightgear/src/Environment/realwx_ctrl.cxx
/flightgear/src/flightgear-flightgear/src/Environment/realwx_ctrl.cxx
/flightgear/src/flightgear-flightgear/src/Environment/realwx_ctrl.hxx
/flightgear/src/flightgear-flightgear/src/Environment/ridge_lift.hxx
/flightgear/src/flightgear-flightgear/src/Environment/terrainsampler.cxx
/flightgear/src/flightgear-flightgear/src/FDM/ExternalNet/ExternalNet.hxx
/flightgear/src/flightgear-flightgear/src/FDM/ExternalPipe/ExternalPipe.hxx
/flightgear/src/flightgear-flightgear/src/FDM/fdm_shell.hxx
/flightgear/src/flightgear-flightgear/src/FDM/flight.hxx
/flightgear/src/flightgear-flightgear/src/FDM/JSBSim/JSBSim.hxx
/flightgear/src/flightgear-flightgear/src/FDM/LaRCsim/LaRCsim.hxx
/flightgear/src/flightgear-flightgear/src/FDM/NullFDM.hxx
/flightgear/src/flightgear-flightgear/src/FDM/SP/ACMS.hxx
/flightgear/src/flightgear-flightgear/src/FDM/SP/ADA.hxx
/flightgear/src/flightgear-flightgear/src/FDM/SP/AISim.hpp
/flightgear/src/flightgear-flightgear/src/FDM/SP/Balloon.h
/flightgear/src/flightgear-flightgear/src/FDM/SP/MagicCarpet.hxx
/flightgear/src/flightgear-flightgear/src/FDM/UFO.hxx
/flightgear/src/flightgear-flightgear/src/FDM/YASim/YASim.hxx
/flightgear/src/flightgear-flightgear/src/GUI/new_gui.hxx
/flightgear/src/flightgear-flightgear/src/Input/FGEventInput.hxx
/flightgear/src/flightgear-flightgear/src/Input/FGHIDEventInput.hxx
/flightgear/src/flightgear-flightgear/src/Input/FGJoystickInput.hxx
/flightgear/src/flightgear-flightgear/src/Input/FGKeyboardInput.hxx
/flightgear/src/flightgear-flightgear/src/Input/FGLinuxEventInput.hxx
/flightgear/src/flightgear-flightgear/src/Input/FGMacOSXEventInput.hxx
/flightgear/src/flightgear-flightgear/src/Input/FGMouseInput.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/AbstractInstrument.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/adf.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/airspeed_indicator.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/altimeter.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/attitude_indicator.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/clock.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/commradio.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/commradio.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/dclgps.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/dme.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/gps.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/gsdi.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/heading_indicator_dg.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/heading_indicator_fg.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/heading_indicator.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/HUD/HUD.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/inst_vertical_speed_indicator.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/KLN89/kln89.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/kr_87.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/mag_compass.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/marker_beacon.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/mk_viii.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/mrg.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/navradio.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/newnavradio.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/newnavradio.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/rad_alt.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/slip_skid_ball.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/tacan.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/tcas.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/transponder.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/turn_indicator.hxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/vertical_speed_indicator.hxx
/flightgear/src/flightgear-flightgear/src/Main/FGInterpolator.hxx
/flightgear/src/flightgear-flightgear/src/Main/fg_io.hxx
/flightgear/src/flightgear-flightgear/src/Main/fg_props.hxx
/flightgear/src/flightgear-flightgear/src/Main/logger.hxx
/flightgear/src/flightgear-flightgear/src/Model/acmodel.hxx
/flightgear/src/flightgear-flightgear/src/Model/modelmgr.hxx
/flightgear/src/flightgear-flightgear/src/MultiPlayer/multiplaymgr.hxx
/flightgear/src/flightgear-flightgear/src/Network/DNSClient.hxx
/flightgear/src/flightgear-flightgear/src/Network/fgcom.hxx
/flightgear/src/flightgear-flightgear/src/Network/HTTPClient.hxx
/flightgear/src/flightgear-flightgear/src/Network/http/httpd.cxx
/flightgear/src/flightgear-flightgear/src/Network/http/httpd.hxx
/flightgear/src/flightgear-flightgear/src/Network/Swift/swift_connection.hxx
/flightgear/src/flightgear-flightgear/src/Scenery/scenery.hxx
/flightgear/src/flightgear-flightgear/src/Scripting/NasalSys.hxx
/flightgear/src/flightgear-flightgear/src/Sound/soundmanager.hxx
/flightgear/src/flightgear-flightgear/src/Sound/soundmanager.hxx
/flightgear/src/flightgear-flightgear/src/Sound/voice.hxx
/flightgear/src/flightgear-flightgear/src/Systems/electrical.hxx
/flightgear/src/flightgear-flightgear/src/Systems/pitot.hxx
/flightgear/src/flightgear-flightgear/src/Systems/static.hxx
/flightgear/src/flightgear-flightgear/src/Systems/vacuum.hxx
/flightgear/src/flightgear-flightgear/src/Time/light.hxx
/flightgear/src/flightgear-flightgear/src/Time/TimeManager.hxx
/flightgear/src/flightgear-flightgear/src/Traffic/TrafficMgr.hxx
/flightgear/src/flightgear-flightgear/src/Viewer/view.hxx
/flightgear/src/flightgear-flightgear/src/Viewer/viewmgr.hxx
/flightgear/src/flightgear-flightgear/test_suite/FGTestApi/TestPilot.hxx
/flightgear/src/flightgear-flightgear/utils/fgpanel/FGPanel.hxx
/flightgear/src/flightgear-flightgear/utils/fgpanel/FGPanelProtocol.hxx
/flightgear/src/flightgear-flightgear/utils/fgpanel/panel_io.hxx
}}
 
{{collapsible script
| type  = Flightgear subsystem implementation file listing output
| title  = The implementation files for all flightgear subsystems (excluding simgear sources and excluding subsystem groups).
| intro  = Implementation file listing output from the Python script for finding all subsystems within the flightgear C++ code base.  The error output from the script was redirected and hence not shown below.
| lang  = cpp
| script =
$ ./find_subsystems.py -ifnp 2> /dev/null {{!}} sort
/flightgear/src/flightgear-flightgear/src/Instrumentation/AbstractInstrument.cxx
/flightgear/src/flightgear-flightgear/src/Airports/airportdynamicsmanager.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/airspeed_indicator.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/altimeter.cxx
/flightgear/src/flightgear-flightgear/src/Environment/terrainsampler.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/attitude_indicator.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/clock.cxx
/flightgear/src/flightgear-flightgear/src/Autopilot/component.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/dclgps.cxx
/flightgear/src/flightgear-flightgear/src/Environment/ephemeris.cxx
/flightgear/src/flightgear-flightgear/src/FDM/fdm_shell.cxx
/flightgear/src/flightgear-flightgear/src/AIModel/AIManager.cxx
/flightgear/src/flightgear-flightgear/src/ATC/atc_mgr.cxx
/flightgear/src/flightgear-flightgear/src/Model/acmodel.cxx
/flightgear/src/flightgear-flightgear/src/Network/fgcom.cxx
/flightgear/src/flightgear-flightgear/src/Aircraft/controls.cxx
/flightgear/src/flightgear-flightgear/src/Network/DNSClient.cxx
/flightgear/src/flightgear-flightgear/src/Systems/electrical.cxx
/flightgear/src/flightgear-flightgear/src/Input/FGEventInput.cxx
/flightgear/src/flightgear-flightgear/src/Aircraft/FlightHistory.cxx
/flightgear/src/flightgear-flightgear/src/Network/HTTPClient.cxx
/flightgear/src/flightgear-flightgear/src/Main/fg_io.cxx
/flightgear/src/flightgear-flightgear/src/FDM/flight.cxx
/flightgear/src/flightgear-flightgear/src/Input/FGJoystickInput.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/kr_87.cxx
/flightgear/src/flightgear-flightgear/src/Input/FGKeyboardInput.cxx
/flightgear/src/flightgear-flightgear/src/Time/light.cxx
/flightgear/src/flightgear-flightgear/src/Main/logger.cxx
/flightgear/src/flightgear-flightgear/src/Environment/magvarmanager.cxx
/flightgear/src/flightgear-flightgear/src/Model/modelmgr.cxx
/flightgear/src/flightgear-flightgear/src/Input/FGMouseInput.cxx
/flightgear/src/flightgear-flightgear/src/MultiPlayer/multiplaymgr.cxx
/flightgear/src/flightgear-flightgear/src/Scripting/NasalSys.cxx
/flightgear/src/flightgear-flightgear/utils/fgpanel/FGPanel.cxx
/flightgear/src/flightgear-flightgear/utils/fgpanel/FGPanelProtocol.cxx
/flightgear/src/flightgear-flightgear/src/Environment/precipitation_mgr.cxx
/flightgear/src/flightgear-flightgear/src/Main/fg_props.cxx
/flightgear/src/flightgear-flightgear/src/Aircraft/replay.cxx
/flightgear/src/flightgear-flightgear/src/Environment/ridge_lift.cxx
/flightgear/src/flightgear-flightgear/src/Autopilot/route_mgr.cxx
/flightgear/src/flightgear-flightgear/src/Scenery/scenery.cxx
/flightgear/src/flightgear-flightgear/src/Sound/soundmanager.cxx
/flightgear/src/flightgear-flightgear/src/AIModel/submodel.cxx
/flightgear/src/flightgear-flightgear/src/Traffic/TrafficMgr.cxx
/flightgear/src/flightgear-flightgear/src/Viewer/viewmgr.cxx
/flightgear/src/flightgear-flightgear/src/Sound/voice.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/gps.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/gsdi.cxx
/flightgear/src/flightgear-flightgear/src/Canvas/gui_mgr.cxx
/flightgear/src/flightgear-flightgear/src/Cockpit/groundradar.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/HUD/HUD.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/heading_indicator.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/heading_indicator_dg.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/heading_indicator_fg.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/inst_vertical_speed_indicator.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/mk_viii.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/mag_compass.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/mrg.cxx
/flightgear/src/flightgear-flightgear/src/Cockpit/NavDisplay.cxx
/flightgear/src/flightgear-flightgear/src/GUI/new_gui.cxx
/flightgear/src/flightgear-flightgear/src/AIModel/performancedb.cxx
/flightgear/src/flightgear-flightgear/src/Systems/pitot.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/rad_alt.cxx
/flightgear/src/flightgear-flightgear/src/Environment/realwx_ctrl.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/slip_skid_ball.cxx
/flightgear/src/flightgear-flightgear/src/Systems/static.cxx
/flightgear/src/flightgear-flightgear/src/Network/Swift/swift_connection.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/tacan.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/tcas.cxx
/flightgear/src/flightgear-flightgear/test_suite/FGTestApi/TestPilot.cxx
/flightgear/src/flightgear-flightgear/src/Time/TimeManager.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/turn_indicator.cxx
/flightgear/src/flightgear-flightgear/src/Systems/vacuum.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/vertical_speed_indicator.cxx
/flightgear/src/flightgear-flightgear/src/Viewer/view.cxx
/flightgear/src/flightgear-flightgear/src/Cockpit/wxradar.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/adf.cxx
/flightgear/src/flightgear-flightgear/src/Autopilot/analogcomponent.cxx
/flightgear/src/flightgear-flightgear/src/Environment/realwx_ctrl.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/dme.cxx
/flightgear/src/flightgear-flightgear/src/Autopilot/digitalcomponent.cxx
/flightgear/src/flightgear-flightgear/src/FDM/SP/ACMS.cxx
/flightgear/src/flightgear-flightgear/src/FDM/SP/ADA.cxx
/flightgear/src/flightgear-flightgear/src/FDM/SP/AISim.cpp
/flightgear/src/flightgear-flightgear/src/FDM/SP/Balloon.cxx
/flightgear/src/flightgear-flightgear/src/FDM/ExternalNet/ExternalNet.cxx
/flightgear/src/flightgear-flightgear/src/FDM/ExternalPipe/ExternalPipe.cxx
/flightgear/src/flightgear-flightgear/src/Input/FGHIDEventInput.cxx
/flightgear/src/flightgear-flightgear/src/Main/FGInterpolator.cxx
/flightgear/src/flightgear-flightgear/src/FDM/JSBSim/JSBSim.cxx
/flightgear/src/flightgear-flightgear/src/FDM/LaRCsim/LaRCsim.cxx
/flightgear/src/flightgear-flightgear/src/Input/FGLinuxEventInput.cxx
/flightgear/src/flightgear-flightgear/src/Input/FGMacOSXEventInput.cxx
/flightgear/src/flightgear-flightgear/src/FDM/SP/MagicCarpet.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/marker_beacon.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/navradio.cxx
/flightgear/src/flightgear-flightgear/src/FDM/NullFDM.cxx
/flightgear/src/flightgear-flightgear/utils/fgpanel/panel_io.cxx
/flightgear/src/flightgear-flightgear/src/Sound/soundmanager.cxx
/flightgear/src/flightgear-flightgear/src/FDM/UFO.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/KLN89/kln89.cxx
/flightgear/src/flightgear-flightgear/src/Environment/environment_ctrl.cxx
/flightgear/src/flightgear-flightgear/src/Network/http/httpd.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/newnavradio.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/transponder.cxx
/flightgear/src/flightgear-flightgear/src/FDM/YASim/YASim.cxx
/flightgear/src/flightgear-flightgear/src/Cockpit/agradar.cxx
/flightgear/src/flightgear-flightgear/src/Canvas/canvas_mgr.cxx
/flightgear/src/flightgear-flightgear/src/Instrumentation/commradio.cxx
/flightgear/src/flightgear-flightgear/src/Autopilot/digitalfilter.cxx
/flightgear/src/flightgear-flightgear/src/Autopilot/logic.cxx
/flightgear/src/flightgear-flightgear/src/Environment/realwx_ctrl.cxx
/flightgear/src/flightgear-flightgear/src/Autopilot/pidcontroller.cxx
/flightgear/src/flightgear-flightgear/src/Autopilot/pisimplecontroller.cxx
/flightgear/src/flightgear-flightgear/src/Autopilot/predictor.cxx
/flightgear/src/flightgear-flightgear/src/Autopilot/flipflop.cxx
}}
 
{{collapsible script
| type  = Grep output
| title  = Searching for SGSky dependencies for all subsystems.
| intro  = This is an example to show how to use the file listing outputs of the script to hunt down subsystem dependencies.
| lang   = shell
| script =
$ ./find_subsystems.py -lp {{!}} sort {{!}} xargs grep SGSky
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::get_visibility );
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::get_3dCloudDensity,
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::set_3dCloudDensity);
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::get_3dCloudVisRange,
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::set_3dCloudVisRange);
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::get_3dCloudImpostorDistance,
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::set_3dCloudImpostorDistance);
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::get_3dCloudLoD1Range,
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::set_3dCloudLoD1Range);
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::get_3dCloudLoD2Range,
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::set_3dCloudLoD2Range);
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::get_3dCloudWrap,
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::set_3dCloudWrap);
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::get_3dCloudUseImpostors,
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.cxx:          &SGSky::set_3dCloudUseImpostors);
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.hxx:class SGSky;
/flightgear/src/flightgear-flightgear/src/Environment/environment_mgr.hxx:    SGSky* _sky;
/flightgear/src/flightgear-flightgear/src/Environment/precipitation_mgr.cxx:    SGSky* thesky = globals->get_renderer()->getSky();
/flightgear/src/flightgear-flightgear/src/Environment/precipitation_mgr.cxx:    {"SGSky", SGSubsystemMgr::Dependency::NONSUBSYSTEM_HARD}});
/flightgear/src/flightgear-flightgear/src/Scenery/scenery.cxx:        {"SGSky", SGSubsystemMgr::Dependency::NONSUBSYSTEM_HARD}});
/flightgear/src/flightgear-flightgear/src/Time/light.cxx:    SGSky* thesky = globals->get_renderer()->getSky();
/flightgear/src/flightgear-flightgear/src/Time/light.cxx:    SGSky* thesky = globals->get_renderer()->getSky();
}}
 
{{collapsible script
| type  = Grep output
| title  = Searching for all direct subsystem instantiations.
| lang  = c
| script =
$ ./find_subsystems.py --classes 2> /dev/null {{!}} xargs -I{} grep -nrI "new.*\<{}\>" src {{!}} sort -u
src/Autopilot/autopilot.cxx:134:      componentForge["pid-controller"]      = new CreateAndConfigureFunctor<PIDController,Component>();
src/Autopilot/autopilot.cxx:135:      componentForge["pi-simple-controller"] = new CreateAndConfigureFunctor<PISimpleController,Component>();
src/Autopilot/autopilot.cxx:136:      componentForge["predict-simple"]      = new CreateAndConfigureFunctor<Predictor,Component>();
src/Autopilot/autopilot.cxx:137:      componentForge["filter"]              = new CreateAndConfigureFunctor<DigitalFilter,Component>();
src/Autopilot/autopilot.cxx:138:      componentForge["logic"]                = new CreateAndConfigureFunctor<Logic,Component>();
src/Autopilot/autopilot.cxx:139:      componentForge["flipflop"]            = new CreateAndConfigureFunctor<FlipFlop,Component>();
src/Autopilot/autopilot.cxx:87:    return new StateMachineComponent(cfg, prop_root);
src/Autopilot/autopilotgroup.cxx:229:  return new FGXMLAutopilotGroupImplementation(nodeName);
src/Autopilot/autopilotgroup.cxx:82:  Autopilot* ap = new Autopilot(apNode, config);
src/Cockpit/cockpitDisplayManager.cxx:100:            set_subsystem( id, new wxRadarBg ( node ) );
src/Cockpit/cockpitDisplayManager.cxx:103:            set_subsystem( id, new GroundRadar( node ) );
src/Cockpit/cockpitDisplayManager.cxx:106:            set_subsystem( id, new agRadar( node ) );
src/Cockpit/cockpitDisplayManager.cxx:109:            set_subsystem( id, new NavDisplay( node ) );
src/Cockpit/panel_io.cxx:658:  FGPanel * panel = new FGPanel();
src/Cockpit/panel_io.cxx:784:                    gps = new KLN89(instrument);
src/Environment/environment_ctrl.cxx:349:    return new LayerInterpolateControllerImplementation( rootNode );
src/Environment/environment_mgr.cxx:100:  set_subsystem("magvar", new FGMagVarManager);
src/Environment/environment_mgr.cxx:95:  set_subsystem("precipitation", new FGPrecipitationMgr);
src/Environment/environment_mgr.cxx:98:  set_subsystem("ridgelift", new FGRidgeLift);
src/Environment/realwx_ctrl.cxx:514:  return new NoaaMetarRealWxController( rootNode );
src/Environment/terrainsampler.cxx:381:        set_subsystem( areaSubsystemName(i), new AreaSampler( areaNodes[i] ) );
src/Environment/terrainsampler.cxx:430:    return new TerrainSamplerImplementation( rootNode );
src/FDM/fdm_shell.cxx:278:    _impl = new FGUFO( dt );
src/FDM/fdm_shell.cxx:282:    _impl = new FGNullFDM( dt );
src/FDM/fdm_shell.cxx:315:    _impl = new FGExternalNet( dt, host, port1, port2, port3 );
src/FDM/fdm_shell.cxx:318:    // /* old */ _impl = new FGExternalPipe( dt, pipe_path );
src/FDM/fdm_shell.cxx:332:    _impl = new FGExternalPipe( dt, pipe_path, pipe_protocol );
src/FDM/fdm_shell.cxx:334:    _impl = new FGNullFDM( dt );
src/FDM/fdm_shell.cxx:338:        _impl = new FGLaRCsim( dt );
src/FDM/fdm_shell.cxx:345:        _impl = new FGJSBsim( dt );
src/FDM/fdm_shell.cxx:352:        _impl = new FGADA( dt );
src/FDM/fdm_shell.cxx:354:        _impl = new FGACMS( dt );
src/FDM/fdm_shell.cxx:356:        _impl = new FGBalloonSim( dt );
src/FDM/fdm_shell.cxx:358:        _impl = new FGMagicCarpet( dt );
src/FDM/fdm_shell.cxx:360://      _impl = new FGAISim( dt );
src/FDM/fdm_shell.cxx:370:        _impl = new YASim( dt );
src/FDM/JSBSim/FGFDMExec.cpp:230:  Models[eInput]            = new FGInput(this);
src/FDM/JSBSim/models/FGInput.cpp:79:  // are not intended to create new properties. For that reason, FGInput
src/FDM/YASim/Airplane.cpp:802:                // For new YASim, the solver drag factor is only applied to
src/GUI/QtLauncher.cxx:455:    FGHTTPClient* http = globals->add_new_subsystem<FGHTTPClient>();
src/Input/input.cxx:65:    set_subsystem( FGMouseInput::staticSubsystemClassId(), new FGMouseInput() );
src/Input/input.cxx:71:    set_subsystem( "input-keyboard", new FGKeyboardInput() );
src/Input/input.cxx:78:    set_subsystem( "input-joystick", new FGJoystickInput() );
src/Input/input.cxx:94:    set_subsystem( "input-event-hid", new FGHIDEventInput() );
src/Instrumentation/commradio.cxx:720:  return new CommRadioImpl(rootNode);
src/Instrumentation/dclgps.cxx:4:// up between current FG code and new KLN89-specific code and removed.
src/Instrumentation/dclgps.hxx:4:// up between current FG code and new KLN89-specific code and removed.
src/Instrumentation/instrument_mgr.cxx:118:            set_subsystem( id, new ADF( node ), 0.15 );
src/Instrumentation/instrument_mgr.cxx:121:            set_subsystem( id, new AirspeedIndicator( node ) );
src/Instrumentation/instrument_mgr.cxx:124:            set_subsystem( id, new Altimeter( node, "altimeter" ) );
src/Instrumentation/instrument_mgr.cxx:127:            set_subsystem( id, new AttitudeIndicator( node ) );
src/Instrumentation/instrument_mgr.cxx:130:            set_subsystem( id, new Clock( node ), 0.25 );
src/Instrumentation/instrument_mgr.cxx:133:            set_subsystem( id, new DME( node ), 1.0 );
src/Instrumentation/instrument_mgr.cxx:136:            set_subsystem( id, new Altimeter( node, "encoder" ), 0.15 );
src/Instrumentation/instrument_mgr.cxx:143:            set_subsystem( id, new GPS( node, true /* default GPS mode */ ) );
src/Instrumentation/instrument_mgr.cxx:146:            set_subsystem( id, new GSDI( node ) );
src/Instrumentation/instrument_mgr.cxx:149:            set_subsystem( id, new HeadingIndicator( node ) );
src/Instrumentation/instrument_mgr.cxx:152:            set_subsystem( id, new HeadingIndicatorFG( node ) );
src/Instrumentation/instrument_mgr.cxx:155:            set_subsystem( id, new HeadingIndicatorDG( node ) );
src/Instrumentation/instrument_mgr.cxx:158:            set_subsystem( id, new FGKR_87( node ) );
src/Instrumentation/instrument_mgr.cxx:161:            set_subsystem( id, new MagCompass( node ) );
src/Instrumentation/instrument_mgr.cxx:164:            set_subsystem( id, new FGMarkerBeacon( node ), 0.2 );
src/Instrumentation/instrument_mgr.cxx:173:            set_subsystem( id, new SlipSkidBall( node ), 0.03 );
src/Instrumentation/instrument_mgr.cxx:182:            set_subsystem( id, new Transponder( node ), 0.2 );
src/Instrumentation/instrument_mgr.cxx:185:            set_subsystem( id, new TurnIndicator( node ) );
src/Instrumentation/instrument_mgr.cxx:188:            set_subsystem( id, new VerticalSpeedIndicator( node ) );
src/Instrumentation/instrument_mgr.cxx:191:            set_subsystem( id, new InstVerticalSpeedIndicator( node ) );
src/Instrumentation/instrument_mgr.cxx:194:            set_subsystem( id, new TACAN( node ), 0.2 );
src/Instrumentation/instrument_mgr.cxx:197:            set_subsystem( id, new MK_VIII( node ), 0.2);
src/Instrumentation/instrument_mgr.cxx:200:            set_subsystem( id, new MasterReferenceGyro( node ) );
src/Instrumentation/instrument_mgr.cxx:212:            set_subsystem( id, new RadarAltimeter( node ) );
src/Instrumentation/instrument_mgr.cxx:215:            set_subsystem( id, new TCAS( node ), 0.2);
src/Instrumentation/instrument_mgr.cxx:97:    set_subsystem("gps[0]", new GPS(nd, true /* default GPS mode */));
src/Instrumentation/newnavradio.cxx:970:        return new NavRadioImpl( rootNode );
src/Instrumentation/newnavradio.cxx:972:    return new FGNavRadio( rootNode );
src/Main/fg_init.cxx:1003:    globals->add_new_subsystem<FGInput>(SGSubsystemMgr::GENERAL);
src/Main/fg_init.cxx:1009:    globals->add_new_subsystem<FGReplay>(SGSubsystemMgr::GENERAL);
src/Main/fg_init.cxx:1010:    globals->add_subsystem("history", new FGFlightHistory);
src/Main/fg_init.cxx:1016:    globals->add_subsystem("voice", new FGVoiceMgr, SGSubsystemMgr::DISPLAY);
src/Main/fg_init.cxx:1023:    globals->add_subsystem("fgcom", new FGCom);
src/Main/fg_init.cxx:1038:        globals->add_subsystem("lighting", new FGLight, SGSubsystemMgr::DISPLAY);
src/Main/fg_init.cxx:1042:    globals->add_new_subsystem<FGAircraftModel>(SGSubsystemMgr::DISPLAY);
src/Main/fg_init.cxx:1043:    globals->add_new_subsystem<FGModelMgr>(SGSubsystemMgr::DISPLAY);
src/Main/fg_init.cxx:1045:    globals->add_new_subsystem<FGViewMgr>(SGSubsystemMgr::DISPLAY);
src/Main/fg_init.cxx:1057:    globals->add_new_subsystem<FGNasalSys>(SGSubsystemMgr::INIT);
src/Main/fg_init.cxx:836:    globals->add_new_subsystem<FGSoundManager>(SGSubsystemMgr::SOUND);
src/Main/fg_init.cxx:849:    globals->add_subsystem("prop-interpolator", new FGInterpolator, SGSubsystemMgr::INIT);
src/Main/fg_init.cxx:855:    globals->add_subsystem("properties", new FGProperties);
src/Main/fg_init.cxx:861:    globals->add_new_subsystem<flightgear::AirportDynamicsManager>();
src/Main/fg_init.cxx:867:            new SGPerformanceMonitor(globals->get_subsystem_mgr(),
src/Main/fg_init.cxx:883:        globals->add_new_subsystem<FGHTTPClient>();
src/Main/fg_init.cxx:885:    globals->add_new_subsystem<FGDNSClient>();
src/Main/fg_init.cxx:891:    globals->add_subsystem("flight", new FDMShell, SGSubsystemMgr::FDM);
src/Main/fg_init.cxx:898:    globals->add_subsystem("environment", new FGEnvironmentMgr);
src/Main/fg_init.cxx:899:    globals->add_new_subsystem<Ephemeris>();
src/Main/fg_init.cxx:906:    globals->add_subsystem("systems", new FGSystemMgr, SGSubsystemMgr::FDM);
src/Main/fg_init.cxx:907:    globals->add_subsystem("instrumentation", new FGInstrumentMgr, SGSubsystemMgr::FDM);
src/Main/fg_init.cxx:908:    globals->add_subsystem("hud", new HUD, SGSubsystemMgr::DISPLAY);
src/Main/fg_init.cxx:909:    globals->add_subsystem("cockpit-displays", new flightgear::CockpitDisplayManager, SGSubsystemMgr::DISPLAY);
src/Main/fg_init.cxx:917:    globals->add_new_subsystem<FGRouteMgr>();
src/Main/fg_init.cxx:922:    globals->add_subsystem( "io", new FGIO );
src/Main/fg_init.cxx:928:    globals->add_subsystem("logger", new FGLogger);
src/Main/fg_init.cxx:934:    globals->add_subsystem("gui", new NewGUI, SGSubsystemMgr::INIT);
src/Main/fg_init.cxx:947:    globals->add_subsystem("Canvas", new CanvasMgr, SGSubsystemMgr::DISPLAY);
src/Main/fg_init.cxx:948:    globals->add_subsystem("CanvasGUI", new GUIMgr, SGSubsystemMgr::DISPLAY);
src/Main/fg_init.cxx:954:    globals->add_new_subsystem<PerformanceDB>(SGSubsystemMgr::POST_FDM);
src/Main/fg_init.cxx:955:    globals->add_subsystem("ATC", new FGATCManager, SGSubsystemMgr::POST_FDM);
src/Main/fg_init.cxx:961:    globals->add_subsystem("mp", new FGMultiplayMgr, SGSubsystemMgr::POST_FDM);
src/Main/fg_init.cxx:968:    globals->add_subsystem("swift", new SwiftConnection, SGSubsystemMgr::POST_FDM);
src/Main/fg_init.cxx:975:    globals->add_subsystem("ai-model", new FGAIManager, SGSubsystemMgr::POST_FDM);
src/Main/fg_init.cxx:976:    globals->add_subsystem("submodel-mgr", new FGSubmodelMgr, SGSubsystemMgr::POST_FDM);
src/Main/fg_init.cxx:982:    globals->add_subsystem("traffic-manager", new FGTrafficManager, SGSubsystemMgr::POST_FDM);
src/Main/fg_init.cxx:997:    globals->add_new_subsystem<FGControls>(SGSubsystemMgr::GENERAL);
src/Main/globals.cxx:147:    subsystem_mgr( new SGSubsystemMgr ),
src/Main/globals.cxx:148:    event_mgr( new SGEventMgr ),
src/Main/globals.hxx:188:    T* add_new_subsystem (SGSubsystemMgr::GroupType
src/Main/main.cxx:211:    simgear::SGTerraSync* terra_sync = new simgear::SGTerraSync();
src/Main/main.cxx:336:        globals->add_new_subsystem<TimeManager>(SGSubsystemMgr::INIT);
src/Main/main.cxx:371:        globals->add_new_subsystem<FGScenery>(SGSubsystemMgr::DISPLAY);
src/Network/http/httpd.cxx:642:  return new MongooseHttpd(configNode);
src/Systems/system_mgr.cxx:77:                          new FGElectricalSystem( node ) );
src/Systems/system_mgr.cxx:80:                          new PitotSystem( node ) );
src/Systems/system_mgr.cxx:83:                          new StaticSystem( node ) );
src/Systems/system_mgr.cxx:86:                          new VacuumSystem( node ) );
src/Viewer/fgviewer.cxx:212:    FGScenery* scenery = globals->add_new_subsystem<FGScenery>();
src/Viewer/view.cxx:191:        v = new View ( FG_LOOKAT, from_model, from_model_index,
src/Viewer/view.cxx:201:        v = new View ( FG_LOOKFROM, from_model, from_model_index,
}}
}}


Line 524: Line 2,619:
# Other module imports.
# Other module imports.
from find_subsystems import FindSubsystems
from find_subsystems import FindSubsystems
# Source code repository paths.
SIMGEAR_PATH = "/flightgear/src/flightgear-simgear"
FLIGHTGEAR_PATH = "/flightgear/src/flightgear-flightgear"




Line 533: Line 2,633:


         # First find all subsystems.
         # First find all subsystems.
         subsystems = FindSubsystems()
         sub = FindSubsystems()


         # Generate a list of files to skip.
         # Generate a list of files to skip.
         pipe = Popen("git diff --name-only ..next", shell=True, stdout=PIPE)
         cmd = "cd %s;" % SIMGEAR_PATH
        cmd += "git diff --name-only ..next;"
        cmd += "cd %s;" % FLIGHTGEAR_PATH
        cmd += "git diff --name-only ..next"
        pipe = Popen(cmd, shell=True, stdout=PIPE)
         blacklist = []
         blacklist = []
         for line in pipe.stdout.readlines():
         for line in pipe.stdout.readlines():
Line 543: Line 2,647:
             blacklist.append(file_name)
             blacklist.append(file_name)


         # Loop over all derived classes.
         # Loop over all derived class declarations.
         print("\nYet to be updated:")
         print("\nYet to be updated:")
         for storage_list in subsystems.subsystems + subsystems.groups:
         for subsystem in sub.subsystems[0] + sub.subsystems[1] + sub.subsystems[2] + sub.subsystems[3] + sub.groups[0] + sub.groups[1] + sub.groups[2] + sub.groups[3]:
             for subsystem in storage_list:
             if subsystem.declaration_file not in blacklist:
                if subsystem.file_name not in blacklist:
                print("    %s: %s" % (subsystem.declaration_file, subsystem))
                    print("    %s: %s" % (subsystem.file_name, subsystem))




Line 555: Line 2,658:
if __name__ == "__main__":
if __name__ == "__main__":
     ToUpdate()
     ToUpdate()
}}
== Automated test suite test creation ==
This script was used to generate the instanced and non-instanced subsystem system tests:
{{collapsible script
| type  = Python script
| title  = Python script for generating the code for the system tests
| lang  = python
| script =
#! /usr/bin/env python3
# Other module imports.
from find_subsystems import FindSubsystems
class TestSuite:
    """Class for generating the code for the system tests."""
    def __init__(self):
        """Auto-generate the C++ code."""
        # First find all subsystems.
        sub = FindSubsystems(output=False)
        # The test name and test code.
        name = []
        code = []
        # Loop over all derived class declarations.
        max_width = 0
        for subsystem in sub.subsystems[0] + sub.subsystems[1] + sub.subsystems[2] + sub.subsystems[3] + sub.groups[0] + sub.groups[1] + sub.groups[2] + sub.groups[3]:
            # Skip non-instantiated base classes.
            if not subsystem.staticSubsystemClassId:
                continue
            # Add the test suite text.
            name.append("test%s" % (subsystem.name))
            code.append("{ create(\"%s\"); }" % (subsystem.staticSubsystemClassId))
            # Formatting.
            max_width = max(len(name[-1]), max_width)
        # Test setup printout.
        print("\n")
        print("    CPPUNIT_TEST_SUITE(NonInstancedSubsystemTests);")
        for i in range(len(name)):
            print("    CPPUNIT_TEST(%s);" % name[i])
        print("    CPPUNIT_TEST_SUITE_END();")
        # Test declaration printout.
        print("\n")
        print("    // The subsystem tests.")
        for i in range(len(name)):
            print("    void %s();" % name[i])
        # Test implementation printout.
        print("\n")
        format_str = "void NonInstancedSubsystemTests::%%-%is() %%-s" % max_width
        for i in range(len(name)):
            print(format_str % (name[i], code[i]))
# Instantiate the class if run as a script.
if __name__ == "__main__":
    TestSuite()
}}
}}

Latest revision as of 06:51, 22 October 2019

Tracking down subsystems

Script

The following script is for finding all FlightGear dependencies:

All subsystems

The result is:

);

/flightgear/src/flightgear-flightgear/src/Scenery/scenery.cxx: {"SGSky", SGSubsystemMgr::Dependency::NONSUBSYSTEM_HARD}}); /flightgear/src/flightgear-flightgear/src/Time/light.cxx: SGSky* thesky = globals->get_renderer()->getSky(); /flightgear/src/flightgear-flightgear/src/Time/light.cxx: SGSky* thesky = globals->get_renderer()->getSky(); }}

Refactoring

To check that all subsystems on a branch have been updated or refactored:

Automated test suite test creation

This script was used to generate the instanced and non-instanced subsystem system tests: