1
0
Fork 0
fgdata/Nasal/addons.nas
2020-04-16 16:23:51 +01:00

102 lines
3.1 KiB
Text

##
# Initialize addons configured with --addon=foobar command line switch:
# - get the list of registered add-ons
# - load the addon-main.nas file of each add-on into namespace
# __addon[ADDON_ID]__
# - call function main() from every such addon-main.nas with the add-on ghost
# as argument (an addons.Addon instance).
# Example:
#
# fgfs --addon=/foo/bar/baz
#
# - AddonManager.cxx parses /foo/bar/baz/addon-metadata.xml
# - AddonManager.cxx creates prop nodes under /addons containing add-on metadata
# - AddonManager.cxx loads /foo/bar/baz/addon-config.xml into the Property Tree
# - AddonManager.cxx adds /foo/bar/baz to the list of aircraft paths (to get
# permissions to read files from there)
# - this script loads /foo/bar/baz/addon-main.nas into namespace
# __addon[ADDON_ID]__
# - this script calls main(addonGhost) from /foo/bar/baz/addon-main.nas.
# - the add-on ghost can be used to retrieve most of the add-on metadata, for
# instance:
# addonGhost.id the add-on identifier
# addonGhost.name the add-on name
# addonGhost.version.str() the add-on version as a string
# addonGhost.basePath the add-on base path (realpath() of
# "/foo/bar/baz" here)
# etc.
#
# For more details, see $FG_ROOT/Docs/README.add-ons.
# hashes to store listeners and timers per addon ID
var _modules = {};
var getNamespaceName = func(a) {
return "__addon[" ~ a.id ~ "]__";
}
var load = func(a) {
var namespace = getNamespaceName(a);
var loaded = a.node.getNode("loaded", 1);
loaded.setBoolValue(0);
var module = modules.Module.new(a.id, namespace, a.node);
module.setFilePath(a.basePath);
module.setMainFile("addon-main.nas");
if (module.load(a) != nil) {
logprint(LOG_INFO, "[OK] '" ~ a.name ~ "' (V. " ~ a.version.str() ~
") loaded.");
module.printTrackedResources();
} else {
logprint(DEV_ALERT, "Failed loading addon-main.nas for " ~ a.id);
}
_modules[a.id] = module;
}
var remove = func(a) {
logprint(LOG_INFO, "- Removing add-on ", a.id);
_modules[a.id].unload();
}
var _reloadFlags = {};
var reload = func(a) {
addons.remove(a);
addons.load(a);
}
var commandAddonReload = func(node)
{
var a = addons.getAddon(node.getChild("id").getValue());
if (_modules[a.id] == nil) {
logprint(DEV_ALERT, "Unknown add-on to reload: "~id);
return;
}
addons.reload(a)
};
var init = func {
addcommand("addon-reload", commandAddonReload);
foreach (var addon; addons.registeredAddons()) {
addons._reloadFlags[addon.id] = addon.node.getNode("reload", 1);
addons._reloadFlags[addon.id].setBoolValue(0);
var makeListener = func(a) {
return func(n) {
if (n.getValue()) {
n.setValue(0);
addons.reload(a);
}
};
}
setlistener(addons._reloadFlags[addon.id], makeListener(addon));
addons.load(addon);
}
}
var id = _setlistener("/sim/signals/fdm-initialized", func {
removelistener(id);
addons.init();
})