Nasal Initialization: Difference between revisions

Jump to navigation Jump to search
Line 10: Line 10:
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.
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.


== Sub-directories ==
== Optional load-once modules ==
After the files in the root directory have been processed, the first level of subdirectories is scanned for .nas files.
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,  
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.
e.g. a variable foo in module bar becomes available as bar.foo only after parsing of the respective folder.


'''Sub-sub-directories will not be scanned for .nas files - at least not automatically on FG startup.'''
{{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.
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|
At the time of writing, addModule() creates ''/nasal/<moduleName>/enabled = true'' if it was not defined in defaults.xml.
This is about to be corrected }}
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.


== Enabling / Disabling modules ==
== Enabling / Disabling modules ==
252

edits

Navigation menu