User:Bugman/subsystems: Difference between revisions
Jump to navigation
Jump to search
(→All subsystems: Updated the output to match the newest script.) |
(→Script: Yet another script update.) |
||
Line 15: | Line 15: | ||
# Python module imports. | # Python module imports. | ||
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 24: | ||
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 39: | Line 46: | ||
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. | ||
Line 45: | Line 57: | ||
# 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")), | self.subsystems[1].append(Subsystem("FGAISim", base_class=Subsystem("FGInterface", base_class=Subsystem("SGSubsystem")), declaration_file="src/FDM/SP/AISim.hpp", xml=self.xml)) | ||
# XML start. | # XML start. | ||
Line 66: | Line 78: | ||
self.find_quaternary(path=paths[i], text="classes", tertiary=self.subsystems[2], quaternary=self.subsystems[3], printout=printout[i]) | self.find_quaternary(path=paths[i], text="classes", tertiary=self.subsystems[2], quaternary=self.subsystems[3], printout=printout[i]) | ||
self.find_quaternary(path=paths[i], text="groups", tertiary=self.groups[2], quaternary=self.groups[3], printout=printout[i]) | self.find_quaternary(path=paths[i], text="groups", tertiary=self.groups[2], quaternary=self.groups[3], printout=printout[i]) | ||
# Find the subsystem and subsystem group implementation files. | |||
self.find_implementations() | |||
# Final summary. | # Final summary. | ||
Line 95: | Line 110: | ||
# Return the counts. | # Return the counts. | ||
return subsystems, groups | return subsystems, groups | ||
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 subsystem.declaration_file[:7] == "simgear": | |||
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: | |||
print(cmd) | |||
pipe = Popen(cmd, shell=True, stdout=PIPE) | |||
lines = pipe.stdout.readlines() | |||
if len(lines): | |||
subsystem.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: | |||
print(cmd) | |||
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.implementation_file = files[0] | |||
break | |||
Line 116: | Line 206: | ||
""" | """ | ||
# Printout. | |||
# 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): | ||
if class_name in skip: | if class_name in skip: | ||
continue | continue | ||
primary.append(Subsystem(class_name, base_class=base, | primary.append(Subsystem(class_name, base_class=base, declaration_file=file_name, xml=self.xml)) | ||
# Sort the subsystems by name. | # Sort the subsystems by name. | ||
Line 156: | Line 247: | ||
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): | ||
secondary.append(Subsystem(derived_class, base_class=subsystem, | secondary.append(Subsystem(derived_class, base_class=subsystem, declaration_file=file_name, xml=self.xml)) | ||
# Sort the subsystems by name. | # Sort the subsystems by name. | ||
Line 192: | Line 283: | ||
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): | ||
tertiary.append(Subsystem(derived_class, base_class=subsystem, | tertiary.append(Subsystem(derived_class, base_class=subsystem, declaration_file=file_name, xml=self.xml)) | ||
# Sort all subsystems by name. | # Sort all subsystems by name. | ||
Line 228: | Line 319: | ||
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): | ||
quaternary.append(Subsystem(derived_class, base_class=subsystem, | quaternary.append(Subsystem(derived_class, base_class=subsystem, declaration_file=file_name, xml=self.xml)) | ||
# Sort all subsystems by name. | # Sort all subsystems by name. | ||
Line 258: | Line 349: | ||
# 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) | 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 302: | Line 393: | ||
subsystem_groups_flightgear = 0 | subsystem_groups_flightgear = 0 | ||
for subsystem in self.subsystems[0] + self.subsystems[1] + self.subsystems[2] + self.subsystems[3]: | for subsystem in self.subsystems[0] + self.subsystems[1] + self.subsystems[2] + self.subsystems[3]: | ||
if subsystem. | if subsystem.declaration_file[:7] == "simgear": | ||
subsystem_classes_simgear += 1 | subsystem_classes_simgear += 1 | ||
else: | else: | ||
subsystem_classes_flightgear += 1 | subsystem_classes_flightgear += 1 | ||
for group in self.groups[0] + self.groups[1] + self.groups[2] + self.groups[3]: | for group in self.groups[0] + self.groups[1] + self.groups[2] + self.groups[3]: | ||
if group. | if group.declaration_file[:7] == "simgear": | ||
subsystem_groups_simgear += 1 | subsystem_groups_simgear += 1 | ||
else: | else: | ||
Line 316: | Line 407: | ||
flightgear_total = subsystem_classes_flightgear + subsystem_groups_flightgear | flightgear_total = subsystem_classes_flightgear + subsystem_groups_flightgear | ||
# Printout. | |||
if self.xml: | if self.xml: | ||
print("< | print(" <counts>") | ||
print("< | print(" <simgear>") | ||
print("< | print(" <subsystem_classes>%i</subsystem_classes>" % subsystem_classes_simgear) | ||
print(" <subsystem_groups>%i</subsystem_groups>" % subsystem_groups_simgear) | |||
print(" <total>%i</total>" % simgear_total) | |||
print(" </simgear>") | |||
print(" <flightgear>") | |||
print(" <subsystem_classes>%i</subsystem_classes>" % subsystem_classes_flightgear) | |||
print(" <subsystem_groups>%i</subsystem_groups>" % subsystem_groups_flightgear) | |||
print(" <total>%i</total>" % flightgear_total) | |||
print(" </flightgear>") | |||
print(" <combined>") | |||
print(" <subsystem_classes>%i</subsystem_classes>" % subsystem_classes) | |||
print(" <subsystem_groups>%i</subsystem_groups>" % subsystem_groups) | |||
print(" <total>%i</total>" % subsystem_total) | |||
print(" </combined>") | |||
print(" </counts>") | |||
else: | else: | ||
print("\ | print("\nCounts: %i subsystem classes (%i flightgear, %i simgear)." % (subsystem_classes, subsystem_classes_flightgear, subsystem_classes_simgear)) | ||
print(" | print("Counts: %i subsystem groups (%i flightgear, %i simgear)." % (subsystem_groups, subsystem_groups_flightgear, subsystem_groups_simgear)) | ||
print(" | print("Counts: %i subsystem classes and groups (%i flightgear, %i simgear)." % (subsystem_total, flightgear_total, simgear_total)) | ||
Line 330: | Line 436: | ||
"""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, | def __init__(self, name, base_class=None, declaration_file=None, implementation_file=None, xml=False): | ||
"""Set up the object. | """Set up the object. | ||
@param name: | @param name: The name of the subsystem. | ||
@type name: | @type name: str | ||
@keyword base_class: | @keyword base_class: The name of the base class. | ||
@type base_class: | @type base_class: str | ||
@keyword | @keyword declaration_file: The name of the file containing the subsystem declaration. | ||
@type | @type declaration_file: str | ||
@keyword xml: | @keyword implementation_file: The name of the file containing the subsystem declaration. | ||
@type xml: | @type implementation_file: str | ||
@keyword xml: Produce a valid XML representation of the object. | |||
@type xml: bool | |||
""" | """ | ||
Line 346: | Line 454: | ||
self.name = name | self.name = name | ||
self.base_class = base_class | self.base_class = base_class | ||
self. | self.declaration_file = declaration_file | ||
self.implementation_file = implementation_file | |||
self.xml = xml | self.xml = xml | ||
Line 378: | Line 487: | ||
string += "\"" | string += "\"" | ||
# Add the | # Add the declaration file name. | ||
if self.xml: | if self.xml: | ||
string += " | string += " declaration=" | ||
else: | else: | ||
string += " in " | string += " in " | ||
string += "\"%s\"" % self. | string += "\"%s\"" % self.declaration_file | ||
# Add the implementation file name. | |||
if self.implementation_file: | |||
if self.xml: | |||
string += " implementation=" | |||
else: | |||
string += ", " | |||
string += "\"%s\"" % self.implementation_file | |||
# Closure. | # Closure. |
Revision as of 12:09, 19 April 2018
Tracking down subsystems
Script
The following script is for finding all FlightGear dependencies:
Python script: Python script for finding all subsystems within the flightgear and simgear C++ code bases.
All subsystems
The result is:
XML output: A listing of all flightgear and simgear subsystems and subsystem groups.
XML 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.
<subsystems>
<primary_classes subsystems="91" groups="0">
<ADF from="SGSubsystem" in="src/Instrumentation/adf.hxx"/>
<AirportDynamicsManager from="SGSubsystem" in="src/Airports/airportdynamicsmanager.hxx"/>
<AirspeedIndicator from="SGSubsystem" in="src/Instrumentation/airspeed_indicator.hxx"/>
<Altimeter from="SGSubsystem" in="src/Instrumentation/altimeter.hxx"/>
<AreaSampler from="SGSubsystem" in="src/Environment/terrainsampler.cxx"/>
<AttitudeIndicator from="SGSubsystem" in="src/Instrumentation/attitude_indicator.hxx"/>
<Clock from="SGSubsystem" in="src/Instrumentation/clock.hxx"/>
<CommRadio from="SGSubsystem" in="src/Instrumentation/commradio.hxx"/>
<Component from="SGSubsystem" in="src/Autopilot/component.hxx"/>
<DCLGPS from="SGSubsystem" in="src/Instrumentation/dclgps.hxx"/>
<DME from="SGSubsystem" in="src/Instrumentation/dme.hxx"/>
<Ephemeris from="SGSubsystem" in="src/Environment/ephemeris.hxx"/>
<FDMShell from="SGSubsystem" in="src/FDM/fdm_shell.hxx"/>
<FGAIManager from="SGSubsystem" in="src/AIModel/AIManager.hxx"/>
<FGATCManager from="SGSubsystem" in="src/ATC/atc_mgr.hxx"/>
<FGAircraftModel from="SGSubsystem" in="src/Model/acmodel.hxx"/>
<FGCom from="SGSubsystem" in="src/Network/fgcom.hxx"/>
<FGControls from="SGSubsystem" in="src/Aircraft/controls.hxx"/>
<FGDNSClient from="SGSubsystem" in="src/Network/DNSClient.hxx"/>
<FGElectricalSystem from="SGSubsystem" in="src/Systems/electrical.hxx"/>
<FGEventInput from="SGSubsystem" in="src/Input/FGEventInput.hxx"/>
<FGFX from="SGSubsystem" in="docs-mini/README.introduction"/>
<FGFlightHistory from="SGSubsystem" in="src/Aircraft/FlightHistory.hxx"/>
<FGHTTPClient from="SGSubsystem" in="src/Network/HTTPClient.hxx"/>
<FGHttpd from="SGSubsystem" in="src/Network/http/httpd.hxx"/>
<FGIO from="SGSubsystem" in="src/Main/fg_io.hxx"/>
<FGInterface from="SGSubsystem" in="src/FDM/flight.hxx"/>
<FGJoystickInput from="SGSubsystem" in="src/Input/FGJoystickInput.hxx"/>
<FGKR_87 from="SGSubsystem" in="src/Instrumentation/kr_87.hxx"/>
<FGKeyboardInput from="SGSubsystem" in="src/Input/FGKeyboardInput.hxx"/>
<FGLight from="SGSubsystem" in="src/Time/light.hxx"/>
<FGLogger from="SGSubsystem" in="src/Main/logger.hxx"/>
<FGMagVarManager from="SGSubsystem" in="src/Environment/magvarmanager.hxx"/>
<FGMarkerBeacon from="SGSubsystem" in="src/Instrumentation/marker_beacon.hxx"/>
<FGModelMgr from="SGSubsystem" in="src/Model/modelmgr.hxx"/>
<FGMouseInput from="SGSubsystem" in="src/Input/FGMouseInput.hxx"/>
<FGMultiplayMgr from="SGSubsystem" in="src/MultiPlayer/multiplaymgr.hxx"/>
<FGNasalSys from="SGSubsystem" in="src/Scripting/NasalSys.hxx"/>
<FGNavRadio from="SGSubsystem" in="src/Instrumentation/navradio.hxx"/>
<FGPanel from="SGSubsystem" in="utils/fgpanel/FGPanel.hxx"/>
<FGPanelProtocol from="SGSubsystem" in="utils/fgpanel/FGPanelProtocol.hxx"/>
<FGPrecipitationMgr from="SGSubsystem" in="src/Environment/precipitation_mgr.hxx"/>
<FGProperties from="SGSubsystem" in="src/Main/fg_props.hxx"/>
<FGReplay from="SGSubsystem" in="src/Aircraft/replay.hxx"/>
<FGRidgeLift from="SGSubsystem" in="src/Environment/ridge_lift.hxx"/>
<FGRouteMgr from="SGSubsystem" in="src/Autopilot/route_mgr.hxx"/>
<FGScenery from="SGSubsystem" in="src/Scenery/scenery.hxx"/>
<FGSoundManager from="SGSubsystem" in="src/Sound/soundmanager.hxx"/>
<FGSubmodelMgr from="SGSubsystem" in="src/AIModel/submodel.hxx"/>
<FGTrafficManager from="SGSubsystem" in="src/Traffic/TrafficMgr.hxx"/>
<FGViewMgr from="SGSubsystem" in="src/Viewer/viewmgr.hxx"/>
<FGVoiceMgr from="SGSubsystem" in="src/Sound/voice.hxx"/>
<GPS from="SGSubsystem" in="src/Instrumentation/gps.hxx"/>
<GSDI from="SGSubsystem" in="src/Instrumentation/gsdi.hxx"/>
<GUIMgr from="SGSubsystem" in="src/Canvas/gui_mgr.hxx"/>
<GroundRadar from="SGSubsystem" in="src/Cockpit/groundradar.hxx"/>
<HUD from="SGSubsystem" in="src/Instrumentation/HUD/HUD.hxx"/>
<HeadingIndicator from="SGSubsystem" in="src/Instrumentation/heading_indicator.hxx"/>
<HeadingIndicatorDG from="SGSubsystem" in="src/Instrumentation/heading_indicator_dg.hxx"/>
<HeadingIndicatorFG from="SGSubsystem" in="src/Instrumentation/heading_indicator_fg.hxx"/>
<InstVerticalSpeedIndicator from="SGSubsystem" in="src/Instrumentation/inst_vertical_speed_indicator.hxx"/>
<LayerInterpolateController from="SGSubsystem" in="src/Environment/environment_ctrl.hxx"/>
<MK_VIII from="SGSubsystem" in="src/Instrumentation/mk_viii.hxx"/>
<MagCompass from="SGSubsystem" in="src/Instrumentation/mag_compass.hxx"/>
<MasterReferenceGyro from="SGSubsystem" in="src/Instrumentation/mrg.hxx"/>
<NavDisplay from="SGSubsystem" in="src/Cockpit/NavDisplay.hxx"/>
<NavRadio from="SGSubsystem" in="src/Instrumentation/newnavradio.hxx"/>
<NewGUI from="SGSubsystem" in="src/GUI/new_gui.hxx"/>
<PerformanceDB from="SGSubsystem" in="src/AIModel/performancedb.hxx"/>
<PitotSystem from="SGSubsystem" in="src/Systems/pitot.hxx"/>
<PropertyBasedMgr from="SGSubsystem" in="simgear/props/PropertyBasedMgr.hxx"/>
<PropertyInterpolationMgr from="SGSubsystem" in="simgear/props/PropertyInterpolationMgr.hxx"/>
<RadarAltimeter from="SGSubsystem" in="src/Instrumentation/rad_alt.hxx"/>
<RealWxController from="SGSubsystem" in="src/Environment/realwx_ctrl.hxx"/>
<SGEventMgr from="SGSubsystem" in="simgear/structure/event_mgr.hxx"/>
<SGInterpolator from="SGSubsystem" in="simgear/misc/interpolator.hxx"/>
<SGPerformanceMonitor from="SGSubsystem" in="simgear/structure/SGPerfMon.hxx"/>
<SGSoundMgr from="SGSubsystem" in="simgear/sound/soundmgr.hxx"/>
<SGSubsystemMgr from="SGSubsystem" in="simgear/structure/subsystem_mgr.hxx"/>
<SGTerraSync from="SGSubsystem" in="simgear/scene/tsync/terrasync.hxx"/>
<SlipSkidBall from="SGSubsystem" in="src/Instrumentation/slip_skid_ball.hxx"/>
<StaticSystem from="SGSubsystem" in="src/Systems/static.hxx"/>
<TACAN from="SGSubsystem" in="src/Instrumentation/tacan.hxx"/>
<TCAS from="SGSubsystem" in="src/Instrumentation/tcas.hxx"/>
<TimeManager from="SGSubsystem" in="src/Time/TimeManager.hxx"/>
<Transponder from="SGSubsystem" in="src/Instrumentation/transponder.hxx"/>
<TurnIndicator from="SGSubsystem" in="src/Instrumentation/turn_indicator.hxx"/>
<VacuumSystem from="SGSubsystem" in="src/Systems/vacuum.hxx"/>
<VerticalSpeedIndicator from="SGSubsystem" in="src/Instrumentation/vertical_speed_indicator.hxx"/>
<View from="SGSubsystem" in="src/Viewer/view.hxx"/>
<wxRadarBg from="SGSubsystem" in="src/Cockpit/wxradar.hxx"/>
</primary_classes>
<primary_groups subsystems="0" groups="8">
<Autopilot from="SGSubsystemGroup : SGSubsystem" in="src/Autopilot/autopilot.hxx"/>
<CockpitDisplayManager from="SGSubsystemGroup : SGSubsystem" in="src/Cockpit/cockpitDisplayManager.hxx"/>
<FGEnvironmentMgr from="SGSubsystemGroup : SGSubsystem" in="src/Environment/environment_mgr.hxx"/>
<FGInput from="SGSubsystemGroup : SGSubsystem" in="src/Input/input.hxx"/>
<FGInstrumentMgr from="SGSubsystemGroup : SGSubsystem" in="src/Instrumentation/instrument_mgr.hxx"/>
<FGSystemMgr from="SGSubsystemGroup : SGSubsystem" in="src/Systems/system_mgr.hxx"/>
<FGXMLAutopilotGroup from="SGSubsystemGroup : SGSubsystem" in="src/Autopilot/autopilotgroup.hxx"/>
<TerrainSampler from="SGSubsystemGroup : SGSubsystem" in="src/Environment/terrainsampler.hxx"/>
</primary_groups>
<secondary_classes subsystems="28" groups="0">
<AnalogComponent from="Component : SGSubsystem" in="src/Autopilot/analogcomponent.hxx"/>
<BasicRealWxController from="RealWxController : SGSubsystem" in="src/Environment/realwx_ctrl.cxx"/>
<CanvasMgr from="PropertyBasedMgr : SGSubsystem" in="simgear/canvas/CanvasMgr.hxx"/>
<CommRadioImpl from="CommRadio : SGSubsystem" in="src/Instrumentation/commradio.cxx"/>
<DigitalComponent from="Component : SGSubsystem" in="src/Autopilot/digitalcomponent.hxx"/>
<FGACMS from="FGInterface : SGSubsystem" in="src/FDM/SP/ACMS.hxx"/>
<FGADA from="FGInterface : SGSubsystem" in="src/FDM/SP/ADA.hxx"/>
<FGAISim from="FGInterface : SGSubsystem" in="src/FDM/SP/AISim.hpp"/>
<FGBalloonSim from="FGInterface : SGSubsystem" in="src/FDM/SP/Balloon.h"/>
<FGExternalNet from="FGInterface : SGSubsystem" in="src/FDM/ExternalNet/ExternalNet.hxx"/>
<FGExternalPipe from="FGInterface : SGSubsystem" in="src/FDM/ExternalPipe/ExternalPipe.hxx"/>
<FGHIDEventInput from="FGEventInput : SGSubsystem" in="src/Input/FGHIDEventInput.hxx"/>
<FGJSBsim from="FGInterface : SGSubsystem" in="src/FDM/JSBSim/JSBSim.hxx"/>
<FGLaRCsim from="FGInterface : SGSubsystem" in="src/FDM/LaRCsim/LaRCsim.hxx"/>
<FGLinuxEventInput from="FGEventInput : SGSubsystem" in="src/Input/FGLinuxEventInput.hxx"/>
<FGMacOSXEventInput from="FGEventInput : SGSubsystem" in="src/Input/FGMacOSXEventInput.hxx"/>
<FGMagicCarpet from="FGInterface : SGSubsystem" in="src/FDM/SP/MagicCarpet.hxx"/>
<FGNullFDM from="FGInterface : SGSubsystem" in="src/FDM/NullFDM.hxx"/>
<FGReadablePanel from="FGPanel : SGSubsystem" in="utils/fgpanel/panel_io.hxx"/>
<FGSoundManager from="SGSoundMgr : SGSubsystem" in="src/Sound/soundmanager.hxx"/>
<FGUFO from="FGInterface : SGSubsystem" in="src/FDM/UFO.hxx"/>
<KLN89 from="DCLGPS : SGSubsystem" in="src/Instrumentation/KLN89/kln89.hxx"/>
<LayerInterpolateControllerImplementation from="LayerInterpolateController : SGSubsystem" in="src/Environment/environment_ctrl.cxx"/>
<MongooseHttpd from="FGHttpd : SGSubsystem" in="src/Network/http/httpd.cxx"/>
<NavRadioImpl from="NavRadio : SGSubsystem" in="src/Instrumentation/newnavradio.cxx"/>
<StateMachineComponent from="Component : SGSubsystem" in="src/Autopilot/autopilot.cxx"/>
<YASim from="FGInterface : SGSubsystem" in="src/FDM/YASim/YASim.hxx"/>
<agRadar from="wxRadarBg : SGSubsystem" in="src/Cockpit/agradar.hxx"/>
</secondary_classes>
<secondary_groups subsystems="0" groups="2">
<FGXMLAutopilotGroupImplementation from="FGXMLAutopilotGroup : SGSubsystemGroup : SGSubsystem" in="src/Autopilot/autopilotgroup.cxx"/>
<TerrainSamplerImplementation from="TerrainSampler : SGSubsystemGroup : SGSubsystem" in="src/Environment/terrainsampler.cxx"/>
</secondary_groups>
<tertiary_classes subsystems="6" groups="0">
<DigitalFilter from="AnalogComponent : Component : SGSubsystem" in="src/Autopilot/digitalfilter.hxx"/>
<Logic from="DigitalComponent : Component : SGSubsystem" in="src/Autopilot/logic.hxx"/>
<NoaaMetarRealWxController from="BasicRealWxController : RealWxController : SGSubsystem" in="src/Environment/realwx_ctrl.cxx"/>
<PIDController from="AnalogComponent : Component : SGSubsystem" in="src/Autopilot/pidcontroller.hxx"/>
<PISimpleController from="AnalogComponent : Component : SGSubsystem" in="src/Autopilot/pisimplecontroller.hxx"/>
<Predictor from="AnalogComponent : Component : SGSubsystem" in="src/Autopilot/predictor.hxx"/>
</tertiary_classes>
<quaternary_classes subsystems="1" groups="0">
<FlipFlop from="Logic : DigitalComponent : Component : SGSubsystem" in="src/Autopilot/flipflop.hxx"/>
</quaternary_classes>
<total subsystem_classes="126" subsystem_groups="10" total="136"/>
<simgear subsystem_classes="9" subsystem_groups="0" total="9"/>
<flightgear subsystem_classes="117" subsystem_groups="10" total="127"/>
</subsystems>
Text output: A listing of all flightgear and simgear subsystems and subsystem groups.
Refactoring
To check that all subsystems on a branch have been updated or refactored:
Python script: Python script verifying if all subsystems have been updated.