Nasal Initialization: Difference between revisions

From FlightGear wiki
Jump to navigation Jump to search
Line 37: Line 37:


Otherwise a listener is added that will load the module when enabled is set to true.
Otherwise a listener is added that will load the module when enabled is set to true.
== Enabling / Disabling modules ==
There is a mechanism to enable/disable modules in the C++ domain (in FGNasalSys), however, at the time of writing, the state of this mechanism is unclear. This section shall be updated once the desired design as well as the implementation has been clarified.


= Open questions =
= Open questions =
Review the sources to confirm / update this doc.
Review the sources to confirm / update this doc.

Revision as of 09:57, 20 February 2020

some notes on how Nasal files from FGDATA/Nasal appear to be processed when Flightgear is started.

Initialization of Nasal core-/default-modules

When Flightgear starts, it will start the Nasal parser and load modules from FGDATA/Nasal.

Core modules

The nasal root folder (FGDATA/Nasal/) is scanned for .nas files and these files are loaded (apparantly in alphabetical order). After all .nas files are loaded /sim/signals/nasal-dir-initialized is set, which triggers listeners in some of the files just loaded. This allows to use functions from other core files, which have just been defined, e.g. which were not yet available when parsing the file.

Optional load-once modules

After the files in the root directory have been processed, the first level of subdirectories is scanned for .nas files. Each subdirectory defines a module / namespace which becomes available only after the files in the subdirectory have been completly processed, e.g. a variable foo in module bar becomes available as bar.foo only after parsing of the respective folder.

Note

Sub-sub-directories will not be scanned for .nas files - at least not automatically on FG startup. Of course, files of sub-sub-directories can be included (sooner or later) by the Nasal code that is being processed, so optional code can be loaded on demand.

Enabling of load-once modules

Enabling / loading of this modules is done in the C++ code and is a little bit complicated (see FG sources /src/Scripting/NasalSys.cxx). FGNasalSys::init() scans FGDATA/Nasal for subdirectories and calls FGNasalSys::addModule() for each subdirectory passing its name as module name and a list of all .nas files in it.

FGNasalSys::addModule() in turn creates property nodes for each file like /nasal/<moduleName>/file[i] = <filename>

Caution

For each subdirectory there SHALL be an entry in FGDATA/defaults.xml defining the default state of the module.

Warning  Add message

init() continues, sets the property /sim/signal/nasal-dir-initialized to true and calls FGNasalSys::loadPropertyScripts()

FGNasalSys::loadPropertyScripts() checks /nasal/<moduleName>/enabled. If it is true, the files will be loaded by calling FGNasalSys::loadModule() which in turn calls FGNasalSys::createModule().

Otherwise a listener is added that will load the module when enabled is set to true.

Open questions

Review the sources to confirm / update this doc.