summaryrefslogtreecommitdiffstats
path: root/docs/3_Developer_Guides/5_Controller_Guides
diff options
context:
space:
mode:
authorgrowupboron <shankhoghosh123@gmail.com>2020-09-11 17:18:57 +0530
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>2020-09-11 12:11:56 +0000
commit4aad369c9728061c97b3de792286e743ee884b09 (patch)
tree14bddddeab334e3fdbdcf29446a87aa11cf6cd97 /docs/3_Developer_Guides/5_Controller_Guides
parent619a7e48085be1538c3b01eb93dcb9dc95bf0436 (diff)
Simplified doc-site generationjellyfish_9.99.4jellyfish/9.99.49.99.4
Updated theme to windmill Using Mkdocs static site generator Deployed on readthedocs Signed-off-by: growupboron <shankhoghosh123@gmail.com> Change-Id: If62eaaea1855c91b64f687900f54eba6bc1caee8 Reviewed-on: https://gerrit.automotivelinux.org/gerrit/c/AGL/documentation/+/25236 Reviewed-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org> Tested-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
Diffstat (limited to 'docs/3_Developer_Guides/5_Controller_Guides')
-rw-r--r--docs/3_Developer_Guides/5_Controller_Guides/3.6.1_Installation.md84
-rw-r--r--docs/3_Developer_Guides/5_Controller_Guides/3.6.2_Controller_Configuration.md250
-rw-r--r--docs/3_Developer_Guides/5_Controller_Guides/3.6.3_Usage.md196
-rw-r--r--docs/3_Developer_Guides/5_Controller_Guides/3.6.4_Config_Sample.md107
4 files changed, 637 insertions, 0 deletions
diff --git a/docs/3_Developer_Guides/5_Controller_Guides/3.6.1_Installation.md b/docs/3_Developer_Guides/5_Controller_Guides/3.6.1_Installation.md
new file mode 100644
index 0000000..0234269
--- /dev/null
+++ b/docs/3_Developer_Guides/5_Controller_Guides/3.6.1_Installation.md
@@ -0,0 +1,84 @@
+---
+edit_link: ''
+title: Installation
+origin_url: >-
+ https://git.automotivelinux.org/src/libappcontroller/plain/docs/controller.md?h=master
+---
+
+<!-- WARNING: This file is generated by fetch_docs.js using /home/boron/Documents/AGL/docs-webtemplate/site/_data/tocs/devguides/master/libappcontroller-guides-devguides-book.yml -->
+
+# Controller
+
+* Object: Generic Controller to handle Policy,Small Business Logic, Glue in between components, ...
+* Status: Release Candidate
+* Author: Fulup Ar Foll fulup@iot.bzh
+* Date : May-2018
+* Require : af-binder version >= FF (handle only bindings v3)
+
+## Features
+
+* Create a controller application from a JSON config file
+* Each control (eg: navigation, multimedia, ...) is a suite of actions. When all actions succeed
+ control is granted, if one fails control access is denied.
+* Actions can either be:
+ * Invocation of an other binding API, either internal or external (eg: a policy service, Alsa UCM, ...)
+ * C routines from a user provided plugin (eg: policy routine, proprietary code, ...)
+ * Lua script function. Lua provides access to every AGL appfw functionality and can be extended by
+ plugins written in C.
+
+## Installation
+
+* Controller can easily be included as a separate library in any AGL service or application binder.
+* Dependencies: the only dependencies are [AGL application framework](https://gerrit.automotivelinux.org/gerrit/p/src/app-framework-binder.git)
+ and [libafb-helpers](https://gerrit.automotivelinux.org/gerrit/p/src/libafb-helpers.git).
+* Controller relies on Lua-5.3, when not needed Lua might be removed at compilation time.
+
+The controller library is integrated by default in the AGL SDK since the Guppy
+version (>=7) and is also available as a package for the AGL supported linux
+distributions.
+
+You could find the SDK build from Yocto which embed the afb-helpers library
+here:
+
+* For [releases](https://download.automotivelinux.org/AGL/release/) >= Guppy, in
+ the latest machine's deploy directory. (e.g for Guppy in
+ `latest/<yourmachine>/deploy/sdk` directory)
+* For the [master](https://download.automotivelinux.org/AGL/snapshots/master/)
+ development branch, in the latest machine's deploy directory. (e.g in
+ `latest/<yourmachine>/deploy/sdk` directory)
+
+To install the native package please refer to [this chapter](../1-verify-build-host.html)
+in the AGL documentation to install the AGL repository for your distribution.
+
+Then use your package manager to install the library.
+
+### OpenSuse
+
+```bash
+sudo zypper ref
+sudo zypper install agl-libappcontroller-devel
+```
+
+### Fedora
+
+```bash
+sudo dnf ref
+sudo dnf install agl-libappcontroller-devel
+```
+
+### Ubuntu/Debian
+
+```bash
+sudo apt-get update
+sudo apt-get install agl-libappcontroller-dev
+```
+
+## Monitoring
+
+* The default test HTML page expect the monitoring HTML page to be accessible under /monitoring with
+ the --monitoring option.
+* The monitoring HTML pages are installed with the app framework binder in a subdirectory called
+ monitoring.
+* You can add other HTML pages with the alias options e.g:
+ afb-daemon --port=1234 --monitoring --alias=/path1/to/htmlpages:/path2/to/htmlpages --ldpaths=. --workdir=. --roothttp=../htdocs
+* The monitoring is accessible at http://localhost:1234/monitoring.
diff --git a/docs/3_Developer_Guides/5_Controller_Guides/3.6.2_Controller_Configuration.md b/docs/3_Developer_Guides/5_Controller_Guides/3.6.2_Controller_Configuration.md
new file mode 100644
index 0000000..cbb2d57
--- /dev/null
+++ b/docs/3_Developer_Guides/5_Controller_Guides/3.6.2_Controller_Configuration.md
@@ -0,0 +1,250 @@
+---
+edit_link: ''
+title: Controller Configuration
+origin_url: >-
+ https://git.automotivelinux.org/src/libappcontroller/plain/docs/controllerConfig.md?h=master
+---
+
+<!-- WARNING: This file is generated by fetch_docs.js using /home/boron/Documents/AGL/docs-webtemplate/site/_data/tocs/devguides/master/libappcontroller-guides-devguides-book.yml -->
+
+# Controller binding configuration
+
+By default the controller searches for a config filename with the same 'middlename' as the daemon process. As an example if your process name is afb-daemon then middle name is 'daemon'. In addition, if your process name is afb-daemon-audio the middle name is also 'daemon'. Moreover the prefix is chosen when you call the [CtlConfigSearch](<#4)_Do_controller_config_parsing_at_binding_pre-init>) function, see below:
+
+```bash
+CtlConfigSearch(AFB_ApiT apiHandle, const char *dirList, const char *prefix)
+```
+
+```bash
+# Middlename is taken from process middlename.
+(prefix-)middlename*.json
+```
+
+You may overload the config search path with environment variables
+
+* **CONTROL_CONFIG_PATH**: change default reserch path for configuration. You may provide multiple directories separated by ':'.
+* **CONTROL_LUA_PATH**: same as CONTROL_CONFIG_PATH but for Lua script files.
+
+Example: to load a config named '(prefix-)myconfig-test.json' do
+
+```bash
+afb-daemon --name myconfig --verbose ...'
+```
+
+The configuration is loaded dynamically during startup time. The controller scans **CONTROL_CONFIG_PATH** for a file corresponding to the pattern
+"(prefix-)bindermiddlename*.json". The first file found in the path is loaded,
+any other file corresponding to the same path is ignored and only generates a warning.
+
+Each block in the configuration file is defined with
+
+* **uid**: mandatory, it is used either for debugging or as input for the action (eg: signal name, control name, ...)
+* **info**: optional, it is used for documentation purpose only
+
+> **Note**: by default the controller config search path is defined at compilation time, but the path might be overloaded with the **CONTROL_CONFIG_PATH**
+> environment variable.
+
+## Config is organised in sections
+
+* **metadata**: describes the configuration
+* **plugins or resources**: defines the set of functions provided by the plugins allowing to load additionnal resources (compiled C or lua)
+* **onload**: a collection of actions meant to be executed at startup time
+* **control**: sets the controls with a collection of actions, in dynamic api it could also specify the verbs of the api
+* **event**: a collection of actions meant to be executed when receiving a given signal
+* **personnal sections**: personnal section
+
+Callbacks to parse sections are documented in [Declare your controller config section in your binding](./Usage.html#declare-your-controller-config-section-in-your-binding) section. You can use the callback defined in controller or define your own callback.
+
+## Metadata
+
+As today matadata is only used for documentation purpose.
+
+* **uid**: mandatory
+* **version**: mandatory
+* **api**: mandatory
+* **info**: optional
+* **require**: optional
+* **author**: optional
+* **date**: optional
+
+## OnLoad section
+
+Onload section defines startup time configuration. Onload may provide multiple initialisation
+profiles, each with a different uid.
+
+You can define the following keys or arrays of the following keys:
+
+* **uid**: mandatory.
+* **info**: optional
+* **action**: mandatory
+* **args**: optionnal
+
+## Control section
+
+Control section defines a list of controls that are accessible.
+
+You can define the following keys or arrays of the following keys, moreover
+this section could be verb api:
+
+* **uid**: mandatory
+* **info**: optional
+* **action**: the list of actions is mandatory
+
+## Event section
+
+Event section defines a list of actions to be executed on event reception. Event can do
+anything a controller can (change state, send back signal, ...)
+eg: if a controller subscribes to vehicle speed, then speed-event may adjust
+master-volume to speed.
+
+You can define the following keys or arrays of the following keys, moreover you can define an event from an another API with the following syntax "API/event".
+
+* **uid**: mandatory
+* **info**: optional
+* **action**: the list of actions is mandatory
+
+## Plugin section
+
+Plugin section defines plugins used with this controller. A plugin is a C/C++ program meant to
+execute some tasks after an event or on demand. This easily extends intrinsec
+binding logic for ad-hoc needs.
+
+You can define the following keys or arrays of the following keys:
+
+* **uid**: mandatory
+* **info**: optionnal
+* **spath**: optionnal, semicolon separated paths where to find the plugin. This could be a compiled shared library or LUA scripts. Could be specified using CONTROL_PLUGIN_PATH environment variable also.
+* **libs**: mandatory, Plugin file or LUA scripts to load
+* **lua**: optionnal, C functions that could be called from a LUA script
+
+## Personnal sections
+
+* **uid**: mandatory
+* **info**: optionnal
+* **action**: mandatory
+* **any keys wanted**: optionnal
+
+You can define your own sections and add your own callbacks into the
+CtlSectionT structure, see
+[Declare your controller config section in your binding](<#3_Declare_your_controller_config_section_in_your_binding>) section.
+
+## Actions Categories
+
+Controller supports three categories of actions. Each action returns a status
+where 0=success and 1=failure.
+
+* **AppFw API** provides a generic model to request other bindings. Requested bindings can be local (eg: ALSA/UCM) or external (eg: vehicle signalling).
+ * `"action": "api://API_NAME#verb_name"`
+* C-API, when defined in the onload section, the plugin may provide C native API with `CTLP-CAPI(apiname, uid, args, query, context)`. Plugin may also create Lua command with `CTLP-LUA2C(LuaFuncName, uid, args, query, context)`. Where `args`+`query` are JSON-C object and context is the returned value from `CTLP_ONLOAD` function. Any missing value is set to NULL.
+ * `"action": "plugin://plugin_name#function_name"`
+* Lua-API, when compiled with Lua option, the controller supports action defined directly in Lua script. During "*onload*" phase, the controller searches in `CONTROL_LUA_PATH` file with pattern "(prefix-)bindermiddlename*.lua". Any file corresponding to this pattern is automatically loaded. Any function defined in those Lua scripts can be called through a controller action. Lua functions receive three parameters (uid, args, query).
+ * `"action": "lua://plugin_name#function_name"`
+
+You also can add the **privileges** property that handles AGL permission
+needed to be able to call this action.
+
+> **Note**: Lua added functions are systematically prefixed. AGL standard AppFw
+functions are prefixed with AGL: (eg: AFB:notice(), AFB:success(), ...).
+> User Lua functions added through the plugin and CTLP_LUA2C are prefixed with
+the plugin uid or the one you defined in your config (eg: MyPlug:HelloWorld1).
+
+## Available Application Framework Commands
+
+Each Lua AppFw commands should be prefixed by AFB:
+
+* `AFB:notice ("format", arg1,... argn)` directly printed LUA tables as json string with '%s'.
+ `AFB:error`, `AFB:warning`, `AFB:info`, `AFB:debug` work on the same model. Printed messages are limited to 512 characters.
+
+* `AFB:service ('API', 'VERB', {query}, "Lua_Callback_Name", {context})` is an asynchronous call to another binding. When empty, query/context should be set to '{}'
+ and not to 'nil'. When 'nil', Lua does not send 'NULL' value but removes arguments to calling stack. WARNING:"Callback"
+ is the name of the callback as a string and not a pointer to the callback. (If someone as a solution to fix this, please
+ let me known). Callback is call as LUA "function Alsa_Get_Hal_CB (error, result, context)" where:
+ * error is a Boolean
+ * result is the full answer from AppFw (do not forget to extract the response)
+ * context is a copy of the Lua table pass as an argument (warning it's a copy not a pointer to original table)
+
+* `error,result=AFB:servsync('API', 'VERB', {query})` is saved as previous but for synchronous call. Note that Lua accepts multiple
+ returns. AFB:servsync returns both the error message and the response as a Lua table. Like for AFB:service, the user should not
+ forget to extract response from result.
+
+* `AFB:success(request, response)` is the success request. request is the opaque handle passes when Lua is called from (api="control", verb="docall").
+ Response is a Lua table that will be returned to the client.
+
+* `AFB:fail(request, response)` is the same as for success. Note that LUA generates automatically the error code from Lua function name.
+ The response is transformed into a json string before being returned to the client.
+
+* `EventHandle=AFB:evtmake("MyEventName")` creates an event and returns the handle as an opaque handle. Note that due to a limitation
+ of json_object, this opaque handle cannot be passed as an argument in a callback context.
+
+* `AFB:subscribe(request, MyEventHandle)` subscribes a given client to a previously created event.
+
+* `AFB:evtpush (MyEventHandle, MyEventData)` pushes an event to every subscribed client. MyEventData is a Lua table that will be
+ sent as a json object to the corresponding clients.
+
+* `timerHandle=AFB:timerset (MyTimer, "Timer_Test_CB", context)` initialises a timer from MyTimer Lua table. This table should contains 3 elements:
+ MyTimer={[l"abel"]="MyTimerName", ["delay"]=timeoutInMs, ["count"]=nBOfCycles}. Note that if count==0 then timer is cycled
+ infinitely. Context is a standard Lua table. This function returns an opaque handle to be used to further control the timer.
+
+* `AFB:timerclear(timerHandle)` kills an existing timer. Returns an error when timer does not exit.
+
+* `MyTimer=AFB:timerget(timerHandle)` returns uid, delay and count of an active timer. Returns an error when timerHandle does not
+ point on an active timer.
+
+* `AFB:GetEventLoop()` retrieves the common systemd's event loop of AFB.
+
+* `AFB:RootDirGetFD()` gets the root directory file descriptor. This file descriptor can be used with functions 'openat', 'fstatat', ...
+
+> **Note**: Except for functions call during binding initialisation period. Lua calls are protected and should returned clean messages
+> even when they are improperly used. If you find bug please report.
+
+## Adding Lua command from User Plugin
+
+User Plugin is optional and may provide either native C-action accessible directly from controller actions as defined in
+JSON config file, or alternatively may provide a set of Lua commands usable inside any script (onload, control,event). A simple
+plugin that provides both notice C API and Lua commands is provided as example (see ctl-plugin-sample.c). Technically a
+plugin is a simple sharelibrary and any code fitting in sharelib might be used as a plugin. Developer should nevertheless
+not forget that except when no-concurrency flag was at binding construction time, any binding should to be thread safe.
+
+A plugin must be declared with `CTLP_REGISTER("MyCtlSamplePlugin")`. This entry point defines a special structure that is checked
+at plugin load time by the controller. Then you have an optional init routine declare with `CTLP_ONLOAD(plugin, handle)`.
+ The init routine may create
+a plugin context that is later presented to every plugin API, this for both LUA and native C ones. Then each:
+
+* C API declare with `CTLP_CAPI(MyCFunction, source, argsJ, queryJ) {your code}`. Where:
+ * **MyFunction** is your function
+ * **source** is the structure config
+ * **argsJ** a json_object containing the argument attaches to this control in JSON config file
+ * **queryJ** a json_object
+
+* Lua API declare with `CTLP_LUA2C(MyLuaCFunction, source, argsJ, responseJ) {your code}`. Where
+ * **MyLuaCFunction** is both the name of your C function and Lua command
+ * **source** is the structure config
+ * **argsJ** the arguments passed this time from Lua script and not from Json config file.
+ * **responseJ** if success the argument is passed into the request.
+
+> **Warning**: Lua samples use with controller enforce strict mode. As a result every variable should be declared either as
+> local or as global. Unfortunately "luac" is not smart enough to handle strict mode at build time and errors only appear
+> at run time. Because of this strict mode every global variables (which include functions) should be prefixed by '_'.
+> Note that LUA requires an initialisation value for every variables and declaring something like "local myvar" will not
+> allocate "myvar".
+
+## Debugging Facilities
+
+Controller Lua scripts are checked for syntax from CMAKE template with Luac. When needed to go further, a developer API should be allowed to
+execute directly Lua commands within the controller context from Rest/Ws (api=control, verb=lua_doscript). DoScript API takes two
+other optional arguments func=xxxx where xxxx is the function to execute within Lua script and args, a JSON object to provide
+input parameters. When funcname is not given by default, the controller tries to execute middle filename doscript-xxxx-????.lua.
+
+When executed from the controller, Lua script may use any AppFw Apis as well as any L2C user defines commands in plugin.
+
+## Running as Standalone Controller
+
+The controller is a standard binding. It can be started with the following command:
+
+```bash
+afb-daemon --name=yourname --port=1234 --workdir=. --roothttp=./htdocs --tracereq=common --token= --verbose --binding=pathtoyourbinding.so --monitoring
+```
+
+Afb-Daemon only loads controller bindings without searching for the other
+binding. In this case, the controller binding will search for a configuration file
+name '(prefix-)bindermiddlename*.json'. This model can be used to implement for testing
+purpose or simply to act as the glue between a UI and other binder/services.
diff --git a/docs/3_Developer_Guides/5_Controller_Guides/3.6.3_Usage.md b/docs/3_Developer_Guides/5_Controller_Guides/3.6.3_Usage.md
new file mode 100644
index 0000000..b28d8b2
--- /dev/null
+++ b/docs/3_Developer_Guides/5_Controller_Guides/3.6.3_Usage.md
@@ -0,0 +1,196 @@
+---
+edit_link: ''
+title: Usage
+origin_url: >-
+ https://git.automotivelinux.org/src/libappcontroller/plain/docs/Usage.md?h=master
+---
+
+<!-- WARNING: This file is generated by fetch_docs.js using /home/boron/Documents/AGL/docs-webtemplate/site/_data/tocs/devguides/master/libappcontroller-guides-devguides-book.yml -->
+
+# Usage
+
+## Add libappcontroller as a static library to your binding
+
+In your `config.cmake` file, add a dependency to the controller library, i.e:
+
+```cmake
+set(PKG_REQUIRED_LIST
+ json-c
+ afb-daemon
+ appcontroller --> this is the controller library dependency name.
+)
+```
+
+Or you can also use the [FIND_PACKAGE](https://cmake.org/cmake/help/v3.6/command/find_package.html?highlight=find_package)
+CMake command to add it.
+
+## Declare your controller config section in your binding
+
+```C
+// CtlSectionT syntax:
+// key: "section name in config file"
+// loadCB: callback to process section
+// handle: a void* pass to callback when processing section
+static CtlSectionT ctlSections[]= {
+ {.key="plugins" , .loadCB= PluginConfig, .handle= &halCallbacks},
+ {.key="onload" , .loadCB= OnloadConfig},
+ {.key="halmap" , .loadCB= MapConfigLoad},
+ {.key=NULL}
+};
+
+```
+
+## Do the controller config parsing at binding pre-init
+
+```C
+ // check if config file exist
+ const char *dirList= getenv("CTL_CONFIG_PATH");
+ if (!dirList) dirList=CONTROL_CONFIG_PATH;
+
+ const char *configPath = CtlConfigSearch(apiHandle, dirList, "prefix");
+ if(!confiPath) return -1;
+
+ ctlConfig = CtlConfigLoad(dirList, ctlSections);
+ if (!ctlConfig) return -1;
+```
+
+## Execute the controller config during binding init
+
+```C
+ int err = CtlConfigExec (ctlConfig);
+```
+
+## (Optional) Migrate from the git submodule version
+
+### Remove the git submodule version
+
+If you already use the controller component but use the submodule version then
+you have to get rid of it to be sure to link and use the library version. To do
+so, you have to do the following:
+
+* deinitialize the submodule using `git`
+
+```bash
+# This example assumes that the git submodule is named app-controller-submodule
+# and is located at your root project repository.
+git submodule deinit app-controller-submodule
+```
+
+* remove the relative submodule lines from the `.gitmodules` file
+
+```bash
+vim .gitmodules
+```
+
+* remove the `ctl-utilities` target link from any CMake target you specified.
+ Those lines look like:
+
+```bash
+TARGET_LINK_LIBRARIES(${TARGET_NAME}
+ ctl-utilities # REMOVE THIS LINE
+ ${link_libraries}
+ )
+```
+
+### Use the native af-binder functions
+
+The controller redefined some binder's functions to add an abstraction between
+several binding versions. But now, as the controller is binding v3 only, the
+abstraction layer from the controller has been removed and you should switch
+your functions from the old controller's definitions to binder's definitions.
+
+You have to replace any `include` statements of `afb-definitions.h` by
+`afb/afb-binding.h` if you included it somewhere. If you have only included
+`ctl-config.h` file then you are fine.
+
+```diff
+- #include <afb-definitions.h>
++ #include <afb/afb-binding.h>
+```
+
+To help migrating gracefully the old controller's definitions, you could use the
+sed script to automate the migration for you. From your project root directory,
+executes the following commands:
+
+```bash
+wget -O controller-migration.sed https://iot.bzh/download/public/tools/controller-migration.sed
+for f in $(find . -name *.c -o -name *.h)
+do
+sed -i -rf controller-migration.sed ${f}
+done
+```
+
+> **NOTE**: `AFB_ServiceCall` and `AFB_ServiceSync` has been migrated to their
+> homologue `afb_api_call_legacy` and `afb_api_call_sync_legacy` respectively
+> but you have to be aware that they are *legacy* functions and you should use
+> the news call functions `afb_api_call` and `afb_api_call_sync` instead.
+> Cf [Binder API functions reference](../../../apis_services/reference/af-binder/reference-v3/func-api.html#calls-and-job-functions)
+> for more details on these functions.
+
+As a reminder, here are the old controller's functions definitions that you
+should migrate:
+
+```c
+ #define AFB_ReqNone NULL
+ typedef afb_req_t AFB_ReqT;
+ typedef afb_api_t AFB_ApiT;
+ typedef afb_event_t AFB_EventT;
+
+ #define AFB_EventIsValid(eventid) eventid
+ #define AFB_EventPush afb_event_push
+ #define AFB_ReqSubscribe afb_req_subscribe
+ #define AFB_EventMake(api, name) afb_api_make_event(api, name)
+
+ #define AFB_ReqJson(request) afb_req_json(request)
+
+ #define AFB_ReqSuccess afb_req_success
+ #define AFB_ReqSuccessF afb_req_success_f
+ #define AFB_ReqFail afb_req_fail
+ #define AFB_ReqFailF afb_req_fail_f
+
+ #define AFB_ReqNotice(request, ...) AFB_REQ_NOTICE (request, __VA_ARGS__)
+ #define AFB_ReqWarning(request, ...) AFB_REQ_WARNING (request, __VA_ARGS__)
+ #define AFB_ReqDebug(request, ...) AFB_REQ_DEBUG (request, __VA_ARGS__)
+ #define AFB_ReqError(request, ...) AFB_REQ_ERROR (request, __VA_ARGS__)
+ #define AFB_ReqInfo(request, ...) AFB_REQ_INFO (request, __VA_ARGS__)
+
+ #define AFB_ApiVerbose(api, level, ...) afb_api_verbose(api, level, __VA_ARGS__)
+ #define AFB_ApiNotice(api, ...) AFB_API_NOTICE (api, __VA_ARGS__)
+ #define AFB_ApiWarning(api, ...) AFB_API_WARNING (api, __VA_ARGS__)
+ #define AFB_ApiDebug(api, ...) AFB_API_DEBUG (api, __VA_ARGS__)
+ #define AFB_ApiError(api, ...) AFB_API_ERROR (api, __VA_ARGS__)
+ #define AFB_ApiInfo(api, ...) AFB_API_INFO (api, __VA_ARGS__)
+
+ #define AFB_GetApiSettings afb_api_settings
+
+ #define AFB_ReqIsValid(request) request
+ #define AFB_EvtIsValid(evtHandle) evtHandle
+
+ #define AFB_ServiceCall(api, ...) afb_api_call_legacy(api, __VA_ARGS__)
+ #define AFB_ServiceSync(api, ...) afb_api_call_sync_legacy(api, __VA_ARGS__)
+
+ #define AFB_ApiCall(api, ...) afb_api_call(api, __VA_ARGS__)
+ #define AFB_ApiSync(api, ...) afb_api_call_sync(api, __VA_ARGS__)
+
+ #define AFB_ReqVCBData afb_req_get_vcbdata
+ #define AFB_ReqGetApi afb_req_get_api
+ #define AFB_GetEventLoop(api) afb_api_get_event_loop(api)
+ #define AFB_RootDirGetFD(api) afb_api_rootdir_get_fd(api)
+ #define AFB_RequireApi(api, ...) afb_api_require_api(api, __VA_ARGS__)
+
+ #define AFB_ClientCtxSet(request, replace, createCB, freeCB, handle) afb_req_context(request, replace, createCB, freeCB, handle)
+ #define AFB_ClientCtxClear(request) afb_req_context_clear(request)
+
+ #define AFB_ReqSetLOA(request, level) afb_req_session_set_LOA(request, level)
+
+ #define AFB_NewApi afb_api_new_api
+
+ #define AFB_ApiAddVerb afb_api_add_verb
+
+ #define AFB_ApiSetUserData afb_api_set_userdata
+ #define AFB_ApiGetUserData afb_api_get_userdata
+
+ #define AFB_ApiOnEvent afb_api_on_event
+ #define AFB_ApiOnInit afb_api_on_init
+ #define AFB_ApiSeal afb_api_seal
+``` \ No newline at end of file
diff --git a/docs/3_Developer_Guides/5_Controller_Guides/3.6.4_Config_Sample.md b/docs/3_Developer_Guides/5_Controller_Guides/3.6.4_Config_Sample.md
new file mode 100644
index 0000000..3e8020f
--- /dev/null
+++ b/docs/3_Developer_Guides/5_Controller_Guides/3.6.4_Config_Sample.md
@@ -0,0 +1,107 @@
+---
+edit_link: ''
+title: Config Sample
+origin_url: >-
+ https://git.automotivelinux.org/src/libappcontroller/plain/docs/configSample.md?h=master
+---
+
+<!-- WARNING: This file is generated by fetch_docs.js using /home/boron/Documents/AGL/docs-webtemplate/site/_data/tocs/devguides/master/libappcontroller-guides-devguides-book.yml -->
+
+# Config Sample
+
+Here after a simple configuration sample.
+
+```json
+{
+ "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json",
+ "metadata": {
+ "uid": "sample-audio-control",
+ "api": "audio-control",
+ "info": "Provide Default Audio Policy for Multimedia, Navigation and Emergency",
+ "version": "1.0",
+ "require": ["intel-hda", "jabra-usb", "scarlett-usb"]
+ },
+ "plugins": {
+ "uid" : "MyPlug",
+ "spath":"./plugins/pluginname:../conf.d/project/lua.d",
+ "libs": ["ctl-audio-plugin-sample.ctlso", "softmixer-simple.lua"],
+ "lua": ["Lua2cHelloWorld1", "Lua2cHelloWorld2"]
+ },
+ "onload": [{
+ "uid": "onload-sample-cb",
+ "info": "Call control sharelib install entrypoint",
+ "action": "lua://MyPlug#SamplePolicyInit",
+ "args": {
+ "arg1": "first_arg",
+ "nextarg": "second arg value"
+ }
+ }, {
+ "uid": "onload-sample-api",
+ "info": "Assert AlsaCore Presence",
+ "action": "api://alsacore#ping",
+ "args": {
+ "test": "onload-sample-api"
+ }
+ }
+ ],
+ "controls":[{
+ "uid": "multimedia",
+ "privileges": "urn:AGL:permission:audio:public:mutimedia",
+ "action": "lua://MyPlug#Audio_Set_Multimedia"
+ }, {
+ "uid": "navigation",
+ "privileges": "urn:AGL:permission:audio:public:navigation",
+ "action": "lua://MyPlug#Audio_Set_Navigation"
+ }, {
+ "uid": "emergency",
+ "privileges": "urn:AGL:permission:audio:public:emergency",
+ "action": "lua://MyPlug#Audio_Set_Emergency"
+ }, {
+ "uid": "multimedia-control-cb",
+ "info": "Call Sharelib Sample Callback",
+ "action": "plugin://MyPlug#sampleControlNavigation",
+ "args": {
+ "arg1": "snoopy",
+ "arg2": "toto"
+ }
+ }, {
+ "uid": "navigation-control-ucm",
+ "action": "api://alsacore#ping",
+ "args": {
+ "test": "navigation"
+ }
+ }, {
+ "uid": "navigation-control-lua",
+ "info": "Call Lua Script to set Navigation",
+ "action": "lua://MyPlug#Audio_Set_Navigation"
+ }
+ ],
+ "events":[{
+ "uid": "speed-action-1",
+ "action": "plugin://MyPlug#Blink-when-over-130",
+ "args": {
+ "speed": 130,
+ "blink-speed": 1000
+ }
+ }, {
+ "uid": "Adjust-Volume",
+ "action": "lua://MyPlug#Adjust_Volume_To_Speed"
+ }, {
+ "uid": "Display-Rear-Camera",
+ "action": "plugin://MyPlug#Display-Rear-Camera"
+ }, {
+ "uid": "Prevent-Phone-Call",
+ "action": "api://phone#status",
+ "args": {
+ "call-accepted": "false"
+ }
+ }, {
+ "uid": "Authorize-Video",
+ "action": "api://video#status",
+ "args": {
+ "tv-accepted": "true"
+ }
+ }
+ ]
+}
+``` \ No newline at end of file