From a7d41a6fa1e29d800ce8ac9e95e8f943814463e8 Mon Sep 17 00:00:00 2001 From: Fulup Ar Foll Date: Fri, 18 Aug 2017 01:09:56 +0200 Subject: Integration with Alsa HookPlugin is now working. --- Controller-afb/ctl-dispatch.c | 665 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 665 insertions(+) create mode 100644 Controller-afb/ctl-dispatch.c (limited to 'Controller-afb/ctl-dispatch.c') diff --git a/Controller-afb/ctl-dispatch.c b/Controller-afb/ctl-dispatch.c new file mode 100644 index 0000000..1708204 --- /dev/null +++ b/Controller-afb/ctl-dispatch.c @@ -0,0 +1,665 @@ +/* + * Copyright (C) 2016 "IoT.bzh" + * Author Fulup Ar Foll + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, something express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Reference: + * Json load using json_unpack https://jansson.readthedocs.io/en/2.9/apiref.html#parsing-and-validating-values + */ + +#define _GNU_SOURCE +#include +#include +#include + +#include "ctl-binding.h" + +typedef void*(*DispatchPluginInstallCbT)(const char* label, const char*version, const char*info); + + +static afb_req NULL_AFBREQ = {}; + + +typedef struct { + const char* label; + const char *info; + DispatchActionT *actions; +} DispatchHandleT; + +typedef struct { + const char *label; + const char *info; + void *context; + char *sharelib; + void *dlHandle; + luaL_Reg *l2cFunc; + int l2cCount; +} DispatchPluginT; + +typedef struct { + const char* label; + const char *info; + const char *version; + DispatchPluginT *plugin; + DispatchHandleT **onloads; + DispatchHandleT **events; + DispatchHandleT **controls; +} DispatchConfigT; + +// global config handle +STATIC DispatchConfigT *configHandle = NULL; + +STATIC int DispatchControlToIndex(DispatchHandleT **controls, const char* controlLabel) { + + for (int idx = 0; controls[idx]; idx++) { + if (!strcasecmp(controlLabel, controls[idx]->label)) return idx; + } + return -1; +} + +STATIC int DispatchOneControl(DispatchSourceT source, DispatchHandleT **controls, const char* controlLabel, json_object *queryJ, afb_req request) { + int err; + + if (!configHandle) { + AFB_ERROR("DISPATCH-CTL-API: (Hoops/Bug!!!) No Config Loaded"); + goto OnErrorExit; + } + + if (!configHandle->controls) { + AFB_ERROR("DISPATCH-CTL-API: No Control Action in Json config label=%s version=%s", configHandle->label, configHandle->version); + goto OnErrorExit; + } + + int index = DispatchControlToIndex(controls, controlLabel); + if (index < 0 || !controls[index]->actions) { + AFB_ERROR("DISPATCH-CTL-API:NotFound/Error label=%s in Json Control Config File", controlLabel); + goto OnErrorExit; + } + + // Fulup (Bug/Feature) in current version is unique to every onload profile + if (configHandle->plugin && configHandle->plugin->l2cCount) { + LuaL2cNewLib (configHandle->plugin->label, configHandle->plugin->l2cFunc, configHandle->plugin->l2cCount); + } + + // loop on action for this control + DispatchActionT *actions = controls[index]->actions; + for (int idx = 0; actions[idx].label; idx++) { + + switch (actions[idx].mode) { + case CTL_MODE_API: + { + json_object *returnJ; + + // if query is empty increment usage count and pass args + if (!queryJ || json_object_get_type(queryJ) != json_type_object) { + json_object_get(actions[idx].argsJ); + queryJ= actions[idx].argsJ; + } else if (actions[idx].argsJ) { + + // Merge queryJ and argsJ before sending request + if (json_object_get_type(actions[idx].argsJ) == json_type_object) { + json_object_object_foreach(actions[idx].argsJ, key, val) { + json_object_object_add(queryJ, key, val); + } + } else { + json_object_object_add(queryJ, "args", actions[idx].argsJ); + } + } + + int err = afb_service_call_sync(actions[idx].api, actions[idx].call, queryJ, &returnJ); + if (err) { + static const char*format = "DispatchOneControl(Api) api=%s verb=%s args=%s"; + if (afb_req_is_valid(request))afb_req_fail_f(request, "DISPATCH-CTL-MODE:API", format, actions[idx].label, actions[idx].api, actions[idx].call); + else AFB_ERROR(format, actions[idx].api, actions[idx].call, actions[idx].label); + goto OnErrorExit; + } + break; + } + +#ifdef CONTROL_SUPPORT_LUA + case CTL_MODE_LUA: + err = LuaCallFunc(source, &actions[idx], queryJ); + if (err) { + static const char*format = "DispatchOneControl(Lua) label=%s func=%s args=%s"; + if (afb_req_is_valid(request)) afb_req_fail_f(request, "DISPATCH-CTL-MODE:Lua", format, actions[idx].label, actions[idx].call, json_object_get_string(actions[idx].argsJ)); + else AFB_ERROR(format, actions[idx].label, actions[idx].call, json_object_get_string(actions[idx].argsJ)); + goto OnErrorExit; + } + break; +#endif + + case CTL_MODE_CB: + err = (*actions[idx].actionCB) (source, actions[idx].label, actions[idx].argsJ, queryJ, configHandle->plugin->context); + if (err) { + static const char*format = "DispatchOneControl(Callback) label%s func=%s args=%s"; + if (afb_req_is_valid(request)) afb_req_fail_f(request, "DISPATCH-CTL-MODE:Cb", format, actions[idx].label, actions[idx].call, json_object_get_string(actions[idx].argsJ)); + else AFB_ERROR(format, actions[idx].label, actions[idx].call, json_object_get_string(actions[idx].argsJ)); + goto OnErrorExit; + } + break; + + default: + { + static const char*format = "DispatchOneControl(unknown) mode control=%s action=%s"; + AFB_ERROR(format, controls[index]->label); + if (afb_req_is_valid(request))afb_req_fail_f(request, "DISPATCH-CTL-MODE:Unknown", format, controls[index]->label); + } + } + } + + // everything when fine + if (afb_req_is_valid(request))afb_req_success(request, NULL, controls[index]->label); + return 0; + +OnErrorExit: + return -1; +} + + +// Event name is mapped on control label and executed as a standard control + +PUBLIC void DispatchOneEvent(const char *evtLabel, json_object *eventJ) { + DispatchHandleT **events = configHandle->events; + + (void) DispatchOneControl(CTL_SOURCE_EVENT, events, evtLabel, eventJ, NULL_AFBREQ); +} + +// Event name is mapped on control label and executed as a standard control + +PUBLIC int DispatchOnLoad(const char *onLoadLabel) { + DispatchHandleT **onloads = configHandle->onloads; + + int err = DispatchOneControl(CTL_SOURCE_ONLOAD, onloads, onLoadLabel, NULL, NULL_AFBREQ); + return err; +} + +PUBLIC void ctlapi_dispatch(afb_req request) { + DispatchHandleT **controls = configHandle->controls; + json_object *queryJ, *argsJ=NULL; + const char *target; + DispatchSourceT source= CTL_SOURCE_UNKNOWN; + + queryJ = afb_req_json(request); + int err = wrap_json_unpack(queryJ, "{s:s, s?i s?o !}", "target", &target, "source", &source, "args", &argsJ); + if (err) { + afb_req_fail_f(request, "CTL-DISPTACH-INVALID", "missing target or args not a valid json object query=%s", json_object_get_string(queryJ)); + goto OnErrorExit; + } + + (void) DispatchOneControl(source, controls, target, argsJ, request); + +OnErrorExit: + return; +} + +// Wrapper to Lua2c plugin command add context dans delegate to LuaWrapper +PUBLIC int DispatchOneL2c(lua_State* luaState, char *funcname, Lua2cFunctionT callback) { +#ifndef CONTROL_SUPPORT_LUA + AFB_ERROR("DISPATCH-ONE-L2C: LUA support not selected (cf:CONTROL_SUPPORT_LUA) in config.cmake"); + return 1; +#else + int err=Lua2cWrapper(luaState, funcname, callback, configHandle->plugin->context); + return err; +#endif +} + + +// List Avaliable Configuration Files + +PUBLIC void ctlapi_config(struct afb_req request) { + json_object*tmpJ; + char *dirList; + + + json_object* queryJ = afb_req_json(request); + if (queryJ && json_object_object_get_ex(queryJ, "cfgpath", &tmpJ)) { + dirList = strdup(json_object_get_string(tmpJ)); + } else { + + dirList = getenv("CONTROL_CONFIG_PATH"); + if (!dirList) dirList = strdup(CONTROL_CONFIG_PATH); + AFB_NOTICE("CONFIG-MISSING: use default CONTROL_CONFIG_PATH=%s", CONTROL_CONFIG_PATH); + } + + // get list of config file + struct json_object *responseJ = ScanForConfig(dirList, CTL_SCAN_RECURSIVE, "onload", "json"); + + if (json_object_array_length(responseJ) == 0) { + afb_req_fail(request, "CONFIGPATH:EMPTY", "No Config Found in CONTROL_CONFIG_PATH"); + } else { + afb_req_success(request, responseJ, NULL); + } + + return; +} + +// unpack individual action object + +STATIC int DispatchLoadOneAction(DispatchConfigT *controlConfig, json_object *actionJ, DispatchActionT *action) { + char *api = NULL, *verb = NULL, *callback = NULL, *lua = NULL; + int err, modeCount = 0; + + err = wrap_json_unpack(actionJ, "{ss,s?s,s?s,s?s,s?s,s?s,s?o !}" + , "label", &action->label, "info", &action->info, "callback", &callback, "lua", &lua, "api", &api, "verb", &verb, "args", &action->argsJ); + if (err) { + AFB_ERROR("DISPATCH-LOAD-ACTION Missing something label|info|callback|lua|(api+verb)|args in %s", json_object_get_string(actionJ)); + goto OnErrorExit; + } + + if (lua) { + action->mode = CTL_MODE_LUA; + action->call = lua; + modeCount++; + } + + if (api && verb) { + action->mode = CTL_MODE_API; + action->api = api; + action->call = verb; + modeCount++; + } + + if (callback && controlConfig->plugin) { + action->mode = CTL_MODE_CB; + action->call = callback; + modeCount++; + + action->actionCB = dlsym(controlConfig->plugin->dlHandle, callback); + if (!action->actionCB) { + AFB_ERROR("DISPATCH-LOAD-ACTION fail to find calbback=%s in %s", callback, controlConfig->plugin->sharelib); + goto OnErrorExit; + } + } + + // make sure at least one mode is selected + if (modeCount == 0) { + AFB_ERROR("DISPATCH-LOAD-ACTION No Action Selected lua|callback|(api+verb) in %s", json_object_get_string(actionJ)); + goto OnErrorExit; + } + + if (modeCount > 1) { + AFB_ERROR("DISPATCH-LOAD-ACTION:ToMany arguments lua|callback|(api+verb) in %s", json_object_get_string(actionJ)); + goto OnErrorExit; + } + return 0; + +OnErrorExit: + return -1; +}; + +STATIC DispatchActionT *DispatchLoadActions(DispatchConfigT *controlConfig, json_object *actionsJ) { + int err; + DispatchActionT *actions; + + // action array is close with a nullvalue; + if (json_object_get_type(actionsJ) == json_type_array) { + int count = json_object_array_length(actionsJ); + actions = calloc(count + 1, sizeof (DispatchActionT)); + + for (int idx = 0; idx < count; idx++) { + json_object *actionJ = json_object_array_get_idx(actionsJ, idx); + err = DispatchLoadOneAction(controlConfig, actionJ, &actions[idx]); + if (err) goto OnErrorExit; + } + + } else { + actions = calloc(2, sizeof (DispatchActionT)); + err = DispatchLoadOneAction(controlConfig, actionsJ, &actions[0]); + if (err) goto OnErrorExit; + } + + return actions; + +OnErrorExit: + return NULL; + +} + +STATIC DispatchHandleT *DispatchLoadControl(DispatchConfigT *controlConfig, json_object *controlJ) { + json_object *actionsJ, *permissionsJ; + int err; + + DispatchHandleT *dispatchHandle = calloc(1, sizeof (DispatchHandleT)); + err = wrap_json_unpack(controlJ, "{ss,s?s,s?o, so !}", "label", &dispatchHandle->label, "info", &dispatchHandle->info + , "permissions", &permissionsJ, "actions", &actionsJ); + if (err) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:CONTROL Missing something label|[info]|actions in %s", json_object_get_string(controlJ)); + goto OnErrorExit; + } + + dispatchHandle->actions = DispatchLoadActions(controlConfig, actionsJ); + if (!dispatchHandle->actions) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:CONTROL Error when parsing actions %s", dispatchHandle->label); + goto OnErrorExit; + } + return dispatchHandle; + +OnErrorExit: + return NULL; +} + +STATIC DispatchHandleT *DispatchLoadOnload(DispatchConfigT *controlConfig, json_object *onloadJ) { + json_object *actionsJ = NULL, *requireJ = NULL, *pluginJ = NULL; + int err; + + DispatchHandleT *dispatchHandle = calloc(1, sizeof (DispatchHandleT)); + err = wrap_json_unpack(onloadJ, "{ss,s?s, s?o,s?o,s?o !}", + "label", &dispatchHandle->label, "info", &dispatchHandle->info, "plugin", &pluginJ, "require", &requireJ, "actions", &actionsJ); + if (err) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:ONLOAD Missing something label|[info]|[plugin]|[actions] in %s", json_object_get_string(onloadJ)); + goto OnErrorExit; + } + + // best effort to initialise everything before starting + if (requireJ) { + + void DispatchRequireOneApi(json_object * bindindJ) { + const char* requireBinding = json_object_get_string(bindindJ); + err = afb_daemon_require_api(requireBinding, 1); + if (err) { + AFB_WARNING("DISPATCH-LOAD-CONFIG:REQUIRE Fail to get=%s", requireBinding); + } + } + + if (json_object_get_type(requireJ) == json_type_array) { + for (int idx = 0; idx < json_object_array_length(requireJ); idx++) { + DispatchRequireOneApi(json_object_array_get_idx(requireJ, idx)); + } + } else { + DispatchRequireOneApi(requireJ); + } + } + + if (pluginJ) { + json_object *lua2csJ = NULL; + DispatchPluginT *dPlugin= calloc(1, sizeof(DispatchPluginT)); + controlConfig->plugin = dPlugin; + const char*ldSearchPath=NULL; + + err = wrap_json_unpack(pluginJ, "{ss,s?s,s?s,ss,s?o!}", + "label", &dPlugin->label, "info", &dPlugin->info, "ldpath", &ldSearchPath, "sharelib", &dPlugin->sharelib, "lua2c", &lua2csJ); + if (err) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:ONLOAD Plugin missing label|[info]|sharelib|[lua2c] in %s", json_object_get_string(onloadJ)); + goto OnErrorExit; + } + + // if search path not in Json config file, then try default + if (!ldSearchPath) ldSearchPath=CONTROL_PLUGIN_PATH; + + // search for default policy config file + json_object *pluginPathJ = ScanForConfig(ldSearchPath, CTL_SCAN_RECURSIVE, dPlugin->sharelib, NULL); + if (!pluginPathJ || json_object_array_length(pluginPathJ) == 0) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:PLUGIN Missing plugin=%s in path=%s", dPlugin->sharelib, ldSearchPath); + goto OnErrorExit; + } + + char *filename; + char*fullpath; + err = wrap_json_unpack(json_object_array_get_idx(pluginPathJ, 0), "{s:s, s:s !}", "fullpath", &fullpath, "filename", &filename); + if (err) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:PLUGIN HOOPs invalid plugin file path = %s", json_object_get_string(pluginPathJ)); + goto OnErrorExit; + } + + if (json_object_array_length(pluginPathJ) > 1) { + AFB_WARNING("DISPATCH-LOAD-CONFIG:PLUGIN plugin multiple instances in searchpath will use %s/%s", fullpath, filename); + } + + char pluginpath[CONTROL_MAXPATH_LEN]; + strncpy(pluginpath, fullpath, sizeof (pluginpath)); + strncat(pluginpath, "/", sizeof (pluginpath)); + strncat(pluginpath, filename, sizeof (pluginpath)); + dPlugin->dlHandle = dlopen(pluginpath, RTLD_NOW); + if (!dPlugin->dlHandle) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:PLUGIN Fail to load pluginpath=%s err= %s", pluginpath, dlerror()); + goto OnErrorExit; + } + + CtlPluginMagicT *ctlPluginMagic = (CtlPluginMagicT*) dlsym(dPlugin->dlHandle, "CtlPluginMagic"); + if (!ctlPluginMagic || ctlPluginMagic->magic != CTL_PLUGIN_MAGIC) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:Plugin symbol'CtlPluginMagic' missing or != CTL_PLUGIN_MAGIC plugin=%s", pluginpath); + goto OnErrorExit; + } else { + AFB_NOTICE("DISPATCH-LOAD-CONFIG:Plugin %s successfully registered", ctlPluginMagic->label); + } + + // Jose hack to make verbosity visible from sharelib + struct afb_binding_data_v2 *afbHidenData = dlsym(dPlugin->dlHandle, "afbBindingV2data"); + if (afbHidenData) *afbHidenData = afbBindingV2data; + + // Push lua2cWrapper @ into plugin + Lua2cWrapperT *lua2cInPlug = dlsym(dPlugin->dlHandle, "Lua2cWrap"); +#ifndef CONTROL_SUPPORT_LUA + if (lua2cInPlug) *lua2cInPlug = NULL; +#else + // Lua2cWrapper is part of binder and not expose to dynamic link + if (lua2cInPlug) *lua2cInPlug = DispatchOneL2c; + + { + int Lua2cAddOne(luaL_Reg *l2cFunc, const char* l2cName, int index) { + char funcName[CONTROL_MAXPATH_LEN]; + strncpy(funcName, "lua2c_", sizeof(funcName)); + strncat(funcName, l2cName, sizeof(funcName)); + + Lua2cFunctionT l2cFunction= (Lua2cFunctionT)dlsym(dPlugin->dlHandle, funcName); + if (!l2cFunction) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:Plugin symbol'%s' missing err=%s", funcName, dlerror()); + return 1; + } + l2cFunc[index].func=(void*)l2cFunction; + l2cFunc[index].name=strdup(l2cName); + + return 0; + } + + int errCount = 0; + luaL_Reg *l2cFunc=NULL; + int count=0; + + // look on l2c command and push them to LUA + if (json_object_get_type(lua2csJ) == json_type_array) { + int length = json_object_array_length(lua2csJ); + l2cFunc = calloc(length + 1, sizeof (luaL_Reg)); + for (count=0; count < length; count++) { + int err; + const char *l2cName = json_object_get_string(json_object_array_get_idx(lua2csJ, count)); + err = Lua2cAddOne(l2cFunc, l2cName, count); + if (err) errCount++; + } + } else { + l2cFunc = calloc(2, sizeof (luaL_Reg)); + const char *l2cName = json_object_get_string(lua2csJ); + errCount = Lua2cAddOne(l2cFunc, l2cName, 0); + count=1; + } + if (errCount) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:Plugin %d symbols not found in plugin='%s'", errCount, pluginpath); + goto OnErrorExit; + } else { + dPlugin->l2cFunc= l2cFunc; + dPlugin->l2cCount= count; + } + } +#endif + DispatchPluginInstallCbT ctlPluginOnload = dlsym(dPlugin->dlHandle, "CtlPluginOnload"); + if (ctlPluginOnload) { + dPlugin->context = (*ctlPluginOnload) (controlConfig->label, controlConfig->version, controlConfig->info); + } + } + + dispatchHandle->actions = DispatchLoadActions(controlConfig, actionsJ); + if (!dispatchHandle->actions) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:ONLOAD Error when parsing actions %s", dispatchHandle->label); + goto OnErrorExit; + } + return dispatchHandle; + +OnErrorExit: + return NULL; +} + +STATIC DispatchConfigT *DispatchLoadConfig(const char* filepath) { + json_object *controlConfigJ, *ignoreJ; + int err; + + // Load JSON file + controlConfigJ = json_object_from_file(filepath); + if (!controlConfigJ) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:JsonLoad invalid JSON %s ", filepath); + goto OnErrorExit; + } + + AFB_INFO("DISPATCH-LOAD-CONFIG: loading config filepath=%s", filepath); + + json_object *metadataJ = NULL, *onloadsJ = NULL, *controlsJ = NULL, *eventsJ = NULL; + err = wrap_json_unpack(controlConfigJ, "{s?o,so,s?o,s?o,s?o !}", "$schema", &ignoreJ, "metadata", &metadataJ, "onload", &onloadsJ, "controls", &controlsJ, "events", &eventsJ); + if (err) { + AFB_ERROR("DISPATCH-LOAD-CONFIG Missing something metadata|[onload]|[controls]|[events] in %s", json_object_get_string(controlConfigJ)); + goto OnErrorExit; + } + + DispatchConfigT *controlConfig = calloc(1, sizeof (DispatchConfigT)); + if (metadataJ) { + err = wrap_json_unpack(metadataJ, "{ss,s?s,ss !}", "label", &controlConfig->label, "info", &controlConfig->info, "version", &controlConfig->version); + if (err) { + AFB_ERROR("DISPATCH-LOAD-CONFIG:METADATA Missing something label|version|[label] in %s", json_object_get_string(metadataJ)); + goto OnErrorExit; + } + } + + if (onloadsJ) { + DispatchHandleT *dispatchHandle; + + if (json_object_get_type(onloadsJ) != json_type_array) { + controlConfig->onloads = (DispatchHandleT**) calloc(2, sizeof (void*)); + dispatchHandle = DispatchLoadOnload(controlConfig, onloadsJ); + controlConfig->onloads[0] = dispatchHandle; + } else { + int length = json_object_array_length(onloadsJ); + controlConfig->onloads = (DispatchHandleT**) calloc(length + 1, sizeof (void*)); + + for (int jdx = 0; jdx < length; jdx++) { + json_object *onloadJ = json_object_array_get_idx(onloadsJ, jdx); + dispatchHandle = DispatchLoadOnload(controlConfig, onloadJ); + controlConfig->onloads[jdx] = dispatchHandle; + } + } + } + + if (controlsJ) { + DispatchHandleT *dispatchHandle; + + if (json_object_get_type(controlsJ) != json_type_array) { + controlConfig->controls = (DispatchHandleT**) calloc(2, sizeof (void*)); + dispatchHandle = DispatchLoadControl(controlConfig, controlsJ); + controlConfig->controls[0] = dispatchHandle; + } else { + int length = json_object_array_length(controlsJ); + controlConfig->controls = (DispatchHandleT**) calloc(length + 1, sizeof (void*)); + + for (int jdx = 0; jdx < length; jdx++) { + json_object *controlJ = json_object_array_get_idx(controlsJ, jdx); + dispatchHandle = DispatchLoadControl(controlConfig, controlJ); + controlConfig->controls[jdx] = dispatchHandle; + } + } + } + + if (eventsJ) { + DispatchHandleT *dispatchHandle; + + if (json_object_get_type(eventsJ) != json_type_array) { + controlConfig->events = (DispatchHandleT**) calloc(2, sizeof (void*)); + dispatchHandle = DispatchLoadControl(controlConfig, eventsJ); + controlConfig->events[0] = dispatchHandle; + } else { + int length = json_object_array_length(eventsJ); + controlConfig->events = (DispatchHandleT**) calloc(length + 1, sizeof (void*)); + + for (int jdx = 0; jdx < length; jdx++) { + json_object *eventJ = json_object_array_get_idx(eventsJ, jdx); + dispatchHandle = DispatchLoadControl(controlConfig, eventJ); + controlConfig->events[jdx] = dispatchHandle; + } + } + } + + return controlConfig; + +OnErrorExit: + return NULL; +} + + +// Load default config file at init + +PUBLIC int DispatchInit() { + int index, err, luaLoaded = 0; + char controlFile [CONTROL_MAXPATH_LEN]; + + const char *dirList= getenv("CONTROL_CONFIG_PATH"); + if (!dirList) dirList=CONTROL_CONFIG_PATH; + + strncpy(controlFile, CONTROL_CONFIG_PRE "-", CONTROL_MAXPATH_LEN); + strncat(controlFile, GetBinderName(), CONTROL_MAXPATH_LEN); + + // search for default dispatch config file + json_object* responseJ = ScanForConfig(dirList, CTL_SCAN_RECURSIVE, controlFile, "json"); + + // We load 1st file others are just warnings + for (index = 0; index < json_object_array_length(responseJ); index++) { + json_object *entryJ = json_object_array_get_idx(responseJ, index); + + char *filename; + char*fullpath; + err = wrap_json_unpack(entryJ, "{s:s, s:s !}", "fullpath", &fullpath, "filename", &filename); + if (err) { + AFB_ERROR("DISPATCH-INIT HOOPs invalid JSON entry= %s", json_object_get_string(entryJ)); + goto OnErrorExit; + } + + if (index == 0) { + if (strcasestr(filename, controlFile)) { + char filepath[CONTROL_MAXPATH_LEN]; + strncpy(filepath, fullpath, sizeof (filepath)); + strncat(filepath, "/", sizeof (filepath)); + strncat(filepath, filename, sizeof (filepath)); + configHandle = DispatchLoadConfig(filepath); + if (!configHandle) { + AFB_ERROR("DISPATCH-INIT:ERROR Fail loading [%s]", filepath); + goto OnErrorExit; + } + luaLoaded = 1; + break; + } + } else { + AFB_WARNING("DISPATCH-INIT:WARNING Secondary Control Config Ignored %s/%s", fullpath, filename); + } + } + + // no dispatch config found remove control API from binder + if (!luaLoaded) { + AFB_WARNING("DISPATCH-INIT:WARNING Not Found Control dispatch file [%s]", controlFile); + } + + AFB_NOTICE("DISPATCH-INIT:SUCCES: Audio Control Dispatch Init"); + return 0; + +OnErrorExit: + AFB_NOTICE("DISPATCH-INIT:ERROR: Audio Control Dispatch Init"); + return 1; +} + + + -- cgit 1.2.3-korg From d51d083be8e34000cd00ce979445eacb45a16e97 Mon Sep 17 00:00:00 2001 From: Fulup Ar Foll Date: Sun, 20 Aug 2017 17:16:28 +0200 Subject: Updated to latest App Template --- Alsa-afb/Alsa-ApiHat.c | 2 +- Alsa-afb/CMakeLists.txt | 3 - Audio-Common/filescan-utils.c | 9 +- Controller-afb/CMakeLists.txt | 5 +- Controller-afb/README.md | 2 +- Controller-afb/ctl-binding.c | 7 +- Controller-afb/ctl-dispatch.c | 4 +- Controller-afb/ctl-lua.c | 7 +- HAL-afb/HDA-intel/CMakeLists.txt | 3 - HAL-afb/Jabra-Solemate/CMakeLists.txt | 4 - HAL-afb/Scarlett-Focusrite/CMakeLists.txt | 4 - README.md | 4 +- conf.d/app-templates | 2 +- conf.d/project/config.d/CMakeLists.txt | 32 - conf.d/project/config.d/onload-audio-control.json | 128 ---- .../project/config.d/onload-daemon-standalone.json | 72 -- conf.d/project/json.d/CMakeLists.txt | 32 + conf.d/project/json.d/onload-audio-control.json | 128 ++++ .../project/json.d/onload-daemon-standalone.json | 72 ++ conf.d/project/lua.d/onload-aaaa-00-utils.lua | 86 +++ conf.d/project/lua.d/onload-aaaa-01-controls.lua | 162 +++++ conf.d/project/lua.d/onload-aaaa-02-timer.lua | 69 ++ conf.d/project/lua.d/onload-aaaa-03-oncall.lua | 70 ++ conf.d/project/lua.d/onload-audio-0utils.lua | 86 --- conf.d/project/lua.d/onload-audio-controls.lua | 162 ----- conf.d/project/lua.d/onload-audio-oncall.lua | 70 -- conf.d/project/lua.d/onload-audio-timer.lua | 69 -- data/CMakeLists.txt | 33 - data/default-control-policy.json | 90 --- nbproject/configurations.xml | 759 +++++++++++++++++++-- nbproject/project.xml | 4 + 31 files changed, 1339 insertions(+), 841 deletions(-) delete mode 100644 conf.d/project/config.d/CMakeLists.txt delete mode 100644 conf.d/project/config.d/onload-audio-control.json delete mode 100644 conf.d/project/config.d/onload-daemon-standalone.json create mode 100644 conf.d/project/json.d/CMakeLists.txt create mode 100644 conf.d/project/json.d/onload-audio-control.json create mode 100644 conf.d/project/json.d/onload-daemon-standalone.json create mode 100644 conf.d/project/lua.d/onload-aaaa-00-utils.lua create mode 100644 conf.d/project/lua.d/onload-aaaa-01-controls.lua create mode 100644 conf.d/project/lua.d/onload-aaaa-02-timer.lua create mode 100644 conf.d/project/lua.d/onload-aaaa-03-oncall.lua delete mode 100644 conf.d/project/lua.d/onload-audio-0utils.lua delete mode 100644 conf.d/project/lua.d/onload-audio-controls.lua delete mode 100644 conf.d/project/lua.d/onload-audio-oncall.lua delete mode 100644 conf.d/project/lua.d/onload-audio-timer.lua delete mode 100644 data/CMakeLists.txt delete mode 100644 data/default-control-policy.json (limited to 'Controller-afb/ctl-dispatch.c') diff --git a/Alsa-afb/Alsa-ApiHat.c b/Alsa-afb/Alsa-ApiHat.c index a8663ca..e22f2d5 100644 --- a/Alsa-afb/Alsa-ApiHat.c +++ b/Alsa-afb/Alsa-ApiHat.c @@ -31,7 +31,7 @@ #include "Alsa-ApiHat.h" STATIC int AlsaInit(void) { - int rc= prctl(PR_SET_NAME, "afb-audio-agent",NULL,NULL,NULL); + int rc= prctl(PR_SET_NAME, "afb-aaaa-agent",NULL,NULL,NULL); if (rc) AFB_ERROR("ERROR: AlsaCore fail to rename process"); return rc; diff --git a/Alsa-afb/CMakeLists.txt b/Alsa-afb/CMakeLists.txt index 38b957d..fab49ae 100644 --- a/Alsa-afb/CMakeLists.txt +++ b/Alsa-afb/CMakeLists.txt @@ -36,6 +36,3 @@ PROJECT_TARGET_ADD(alsa-lowlevel) ${link_libraries} ) - # installation directory - INSTALL(TARGETS ${TARGET_NAME} - LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/Audio-Common/filescan-utils.c b/Audio-Common/filescan-utils.c index af0b5c9..4a5613f 100644 --- a/Audio-Common/filescan-utils.c +++ b/Audio-Common/filescan-utils.c @@ -113,9 +113,12 @@ PUBLIC const char *GetBinderName() { if (binderName) return binderName; - // retrieve binder name from process name afb-name-trailer - prctl(PR_GET_NAME, psName,NULL,NULL,NULL); - binderName=(char*)GetMidleName(psName); + binderName= getenv("AFB_BINDER_NAME"); + if (!binderName) { + // retrieve binder name from process name afb-name-trailer + prctl(PR_GET_NAME, psName,NULL,NULL,NULL); + binderName=(char*)GetMidleName(psName); + } return binderName; } \ No newline at end of file diff --git a/Controller-afb/CMakeLists.txt b/Controller-afb/CMakeLists.txt index d1eb886..c7602f8 100644 --- a/Controller-afb/CMakeLists.txt +++ b/Controller-afb/CMakeLists.txt @@ -16,7 +16,7 @@ # limitations under the License. ########################################################################### -ADD_COMPILE_OPTIONS(-DCONTROL_ONLOAD_DEFAULT="onload-default") +ADD_COMPILE_OPTIONS(-DCONTROL_ONLOAD_PROFILE="onload-default-profile") ADD_COMPILE_OPTIONS(-DCONTROL_DOSCRIPT_PRE="doscript") ADD_COMPILE_OPTIONS(-DCONTROL_CONFIG_PRE="onload") @@ -57,9 +57,6 @@ PROJECT_TARGET_ADD(control-afb) ${link_libraries} ) - # installation directory - INSTALL(TARGETS ${TARGET_NAME} - LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX} ) PROJECT_TARGET_ADD(audio-plugin-sample) diff --git a/Controller-afb/README.md b/Controller-afb/README.md index e6cab72..9bab485 100644 --- a/Controller-afb/README.md +++ b/Controller-afb/README.md @@ -30,7 +30,7 @@ Each bloc in the configuration file are defined with * info: optional used for documentation purpose only Note by default controller config search path is defined at compilation time, but path might be overloaded with CONTROL_CONFIG_PATH -environment variable. +environment variable. Setenv 'CONTROL_ONLOAD_PROFILE'=xxxx to overload 'onload-default-profile' initialisation sequence. ### Config is organised in 4 sections: diff --git a/Controller-afb/ctl-binding.c b/Controller-afb/ctl-binding.c index 8771fc0..ec33f82 100644 --- a/Controller-afb/ctl-binding.c +++ b/Controller-afb/ctl-binding.c @@ -55,9 +55,12 @@ PUBLIC int CtlBindingInit () { errcount += LuaLibInit(); #endif + const char *profile= getenv("CONTROL_ONLOAD_PROFILE"); + if (!profile) profile=CONTROL_ONLOAD_PROFILE; + // now that everything is initialised execute the onload action - if (!errcount) - errcount += DispatchOnLoad(CONTROL_ONLOAD_DEFAULT); + if (!errcount) + errcount += DispatchOnLoad(CONTROL_ONLOAD_PROFILE); AFB_DEBUG ("Audio Policy Control Binding Done errcount=%d", errcount); return errcount; diff --git a/Controller-afb/ctl-dispatch.c b/Controller-afb/ctl-dispatch.c index 1708204..0104229 100644 --- a/Controller-afb/ctl-dispatch.c +++ b/Controller-afb/ctl-dispatch.c @@ -178,6 +178,8 @@ PUBLIC void DispatchOneEvent(const char *evtLabel, json_object *eventJ) { // Event name is mapped on control label and executed as a standard control PUBLIC int DispatchOnLoad(const char *onLoadLabel) { + if (!configHandle) return 1; + DispatchHandleT **onloads = configHandle->onloads; int err = DispatchOneControl(CTL_SOURCE_ONLOAD, onloads, onLoadLabel, NULL, NULL_AFBREQ); @@ -650,7 +652,7 @@ PUBLIC int DispatchInit() { // no dispatch config found remove control API from binder if (!luaLoaded) { - AFB_WARNING("DISPATCH-INIT:WARNING Not Found Control dispatch file [%s]", controlFile); + AFB_WARNING("DISPATCH-INIT:WARNING (setenv CONTROL_CONFIG_PATH) No Config '%s-*.json' in '%s'", controlFile, dirList); } AFB_NOTICE("DISPATCH-INIT:SUCCES: Audio Control Dispatch Init"); diff --git a/Controller-afb/ctl-lua.c b/Controller-afb/ctl-lua.c index 4ef6b65..3f45055 100644 --- a/Controller-afb/ctl-lua.c +++ b/Controller-afb/ctl-lua.c @@ -965,7 +965,10 @@ PUBLIC int LuaLibInit () { strncat (fullprefix, GetBinderName(), sizeof(fullprefix)); strncat (fullprefix, "-", sizeof(fullprefix)); - json_object *luaScriptPathJ = ScanForConfig(CONTROL_LUA_PATH , CTL_SCAN_RECURSIVE, fullprefix, "lua"); + const char *dirList= getenv("CONTROL_LUA_PATH"); + if (!dirList) dirList=CONTROL_LUA_PATH; + + json_object *luaScriptPathJ = ScanForConfig(dirList , CTL_SCAN_RECURSIVE, fullprefix, "lua"); // open a new LUA interpretor luaState = luaL_newstate(); @@ -1021,7 +1024,7 @@ PUBLIC int LuaLibInit () { // no policy config found remove control API from binder if (index == 0) { - AFB_WARNING ("POLICY-INIT:WARNING No Control LUA file in path=[%s]", CONTROL_LUA_PATH); + AFB_WARNING ("POLICY-INIT:WARNING (setenv CONTROL_LUA_PATH) No LUA '%s*.lua' in '%s'", fullprefix, dirList); } AFB_DEBUG ("Audio control-LUA Init Done"); diff --git a/HAL-afb/HDA-intel/CMakeLists.txt b/HAL-afb/HDA-intel/CMakeLists.txt index aa67e0b..380e493 100644 --- a/HAL-afb/HDA-intel/CMakeLists.txt +++ b/HAL-afb/HDA-intel/CMakeLists.txt @@ -37,6 +37,3 @@ PROJECT_TARGET_ADD(hal-intel-hda) audio-common ) - # installation directory - INSTALL(TARGETS ${TARGET_NAME} - LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/HAL-afb/Jabra-Solemate/CMakeLists.txt b/HAL-afb/Jabra-Solemate/CMakeLists.txt index bf61dad..41d6915 100644 --- a/HAL-afb/Jabra-Solemate/CMakeLists.txt +++ b/HAL-afb/Jabra-Solemate/CMakeLists.txt @@ -36,7 +36,3 @@ PROJECT_TARGET_ADD(hal-jabra-usb) hal-interface audio-common ) - - # installation directory - INSTALL(TARGETS ${TARGET_NAME} - LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/HAL-afb/Scarlett-Focusrite/CMakeLists.txt b/HAL-afb/Scarlett-Focusrite/CMakeLists.txt index 1cc83e6..90ee92a 100644 --- a/HAL-afb/Scarlett-Focusrite/CMakeLists.txt +++ b/HAL-afb/Scarlett-Focusrite/CMakeLists.txt @@ -36,7 +36,3 @@ PROJECT_TARGET_ADD(hal-scalett-usb) hal-interface audio-common ) - - # installation directory - INSTALL(TARGETS ${TARGET_NAME} - LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/README.md b/README.md index 2063677..e9ad55f 100644 --- a/README.md +++ b/README.md @@ -113,9 +113,7 @@ from the wrong relative directory, either you have to use 'set solib-search-path # ToBeBone (WorkInProgess: This list is getting longer every day) ------------------------------------------------------------------- -* Support response from LUA with nested table (currently fail miserably) -* Add timer base callback from Lua -* Enable export of LUA commands directly from Plugin + * Allow LUA to run a shell command # Running an debugging on a target ------------------------------------------------------- diff --git a/conf.d/app-templates b/conf.d/app-templates index 9a73785..350c5b9 160000 --- a/conf.d/app-templates +++ b/conf.d/app-templates @@ -1 +1 @@ -Subproject commit 9a737858056dae3348e4659ed5e9168d39f1b23a +Subproject commit 350c5b97459226f7e031c73edb3a79a2d99cb250 diff --git a/conf.d/project/config.d/CMakeLists.txt b/conf.d/project/config.d/CMakeLists.txt deleted file mode 100644 index 8070997..0000000 --- a/conf.d/project/config.d/CMakeLists.txt +++ /dev/null @@ -1,32 +0,0 @@ -########################################################################### -# Copyright 2017 IoT.bzh -# -# author: Fulup Ar Foll -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################### - - -################################################## -# Control Policy Config file -################################################## -PROJECT_TARGET_ADD(ctl-config.d) - - file(GLOB XML_FILES "*.json") - - add_input_files("${XML_FILES}") - - SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES - LABELS "DATA" - OUTPUT_NAME ${TARGET_NAME} - ) diff --git a/conf.d/project/config.d/onload-audio-control.json b/conf.d/project/config.d/onload-audio-control.json deleted file mode 100644 index 77a8fce..0000000 --- a/conf.d/project/config.d/onload-audio-control.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "$schema": "ToBeDone", - "metadata": { - "label": "sample-audio-control", - "info": "Provide Default Audio Policy for Multimedia, Navigation and Emergency", - "version": "1.0" - }, - "onload": [{ - "label": "onload-default", - "info": "onload initialisation config", - "plugin": { - "label" : "_MyPlug", - "sharelib": "ctl-audio-plugin-sample.ctlso", - "lua2c": ["Lua2cHelloWorld1", "Lua2cHelloWorld2"] - }, - "require": ["intel-hda", "jabra-usb", "scarlett-usb"], - "actions": [ - { - "label": "onload-sample-cb", - "info": "Call control sharelib install entrypoint", - "callback": "SamplePolicyInit", - "args": { - "arg1": "first_arg", - "nextarg": "second arg value" - } - }, { - "label": "onload-sample-api", - "info": "Assert AlsaCore Presence", - "api": "alsacore", - "verb": "ping", - "args": {"data": "none"} - }, { - "label": "onload-hal-lua", - "info": "Load avaliable HALs", - "lua": "_Alsa_Get_Hal" - } - ] - }], - "controls": - [ - { - "label": "multimedia", - "actions": { - "label": "multimedia-control-lua", - "info": "Call Lua Script function Test_Lua_Engin", - "lua": "_Audio_Set_Multimedia" - } - }, { - "label": "navigation", - "actions": { - "label": "navigation-control-lua", - "info": "Call Lua Script to set Navigation", - "lua": "_Audio_Set_Navigation" - } - }, { - "label": "emergency", - "actions": { - "label": "emergency-control-ucm", - "lua": "_Audio_Set_Emergency" - } - }, { - "label": "multi-step-sample", - "info" : "all actions must succeed for control to be accepted", - "actions": [{ - "label": "multimedia-control-cb", - "info": "Call Sharelib Sample Callback", - "callback": "sampleControlNavigation", - "args": { - "arg1": "snoopy", - "arg2": "toto" - } - }, { - "label": "navigation-control-ucm", - "api": "alsacore", - "verb": "ping", - "args": { - "test": "navigation" - } - }, { - "label": "navigation-control-lua", - "info": "Call Lua Script to set Navigation", - "lua": "_Audio_Set_Navigation" - }] - } - ], - "events": - [ - { - "label": "SampleEvent1", - "info": "define action when receiving a given event", - "actions": [ - { - "label": "Event Callback-1", - "callback": "SampleControlEvent", - "args": { - "arg": "action-1" - } - }, { - "label": "Event Callback-2", - "callback": "SampleControlEvent", - "args": { - "arg": "action-2" - } - } - ] - }, - { - "label": "SampleEvent2", - "info": "define action when receiving a given event", - "actions": [ - { - "label": "Event Callback-1", - "callback": "SampleControlEvent", - "args": { - "arg": "action-1" - } - }, { - "label": "Event Callback-2", - "callback": "SampleControlEvent", - "args": { - "arg": "action-2" - } - } - ] - } - ] -} - diff --git a/conf.d/project/config.d/onload-daemon-standalone.json b/conf.d/project/config.d/onload-daemon-standalone.json deleted file mode 100644 index de52c22..0000000 --- a/conf.d/project/config.d/onload-daemon-standalone.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "$schema": "ToBeDone", - "metadata": { - "label": "sample-standalone-control", - "info": "Minimal Standalone Controller Config", - "version": "1.0" - }, - "onload": [{ - "label": "onload-default", - "info": "onload initialisation config", - "actions": - { - "label": "control-init", - "lua": "_Control_Init" - } - }], - "controls": - [ - { - "label": "Button-1", - "actions": { - "label": "Action on Button One", - "lua": "_Button_Press", - "args": { - "button": 1 - } - } - }, { - "label": "Button-1", - "actions": { - "label": "Action on Button Two", - "lua": "_Button_Press", - "args": { - "button": 2 - } - } - }, { - "label": "Button-1", - "actions": { - "label": "Action on Button Three", - "lua": "_Button_Press", - "args": { - "button": 3 - } - } - } - ], - "events": - [ - { - "label": "Event1", - "actions": { - "label": "Action Event 1", - "lua": "_Event_Received", - "args": { - "evtname": "xxx" - } - } - }, - { - "label": "Event2", - "actions": { - "label": "Action Event 2", - "lua": "_Event_Received", - "args": { - "evtname": "yyy" - } - } - } - ] -} - diff --git a/conf.d/project/json.d/CMakeLists.txt b/conf.d/project/json.d/CMakeLists.txt new file mode 100644 index 0000000..8070997 --- /dev/null +++ b/conf.d/project/json.d/CMakeLists.txt @@ -0,0 +1,32 @@ +########################################################################### +# Copyright 2017 IoT.bzh +# +# author: Fulup Ar Foll +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +########################################################################### + + +################################################## +# Control Policy Config file +################################################## +PROJECT_TARGET_ADD(ctl-config.d) + + file(GLOB XML_FILES "*.json") + + add_input_files("${XML_FILES}") + + SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES + LABELS "DATA" + OUTPUT_NAME ${TARGET_NAME} + ) diff --git a/conf.d/project/json.d/onload-audio-control.json b/conf.d/project/json.d/onload-audio-control.json new file mode 100644 index 0000000..77a8fce --- /dev/null +++ b/conf.d/project/json.d/onload-audio-control.json @@ -0,0 +1,128 @@ +{ + "$schema": "ToBeDone", + "metadata": { + "label": "sample-audio-control", + "info": "Provide Default Audio Policy for Multimedia, Navigation and Emergency", + "version": "1.0" + }, + "onload": [{ + "label": "onload-default", + "info": "onload initialisation config", + "plugin": { + "label" : "_MyPlug", + "sharelib": "ctl-audio-plugin-sample.ctlso", + "lua2c": ["Lua2cHelloWorld1", "Lua2cHelloWorld2"] + }, + "require": ["intel-hda", "jabra-usb", "scarlett-usb"], + "actions": [ + { + "label": "onload-sample-cb", + "info": "Call control sharelib install entrypoint", + "callback": "SamplePolicyInit", + "args": { + "arg1": "first_arg", + "nextarg": "second arg value" + } + }, { + "label": "onload-sample-api", + "info": "Assert AlsaCore Presence", + "api": "alsacore", + "verb": "ping", + "args": {"data": "none"} + }, { + "label": "onload-hal-lua", + "info": "Load avaliable HALs", + "lua": "_Alsa_Get_Hal" + } + ] + }], + "controls": + [ + { + "label": "multimedia", + "actions": { + "label": "multimedia-control-lua", + "info": "Call Lua Script function Test_Lua_Engin", + "lua": "_Audio_Set_Multimedia" + } + }, { + "label": "navigation", + "actions": { + "label": "navigation-control-lua", + "info": "Call Lua Script to set Navigation", + "lua": "_Audio_Set_Navigation" + } + }, { + "label": "emergency", + "actions": { + "label": "emergency-control-ucm", + "lua": "_Audio_Set_Emergency" + } + }, { + "label": "multi-step-sample", + "info" : "all actions must succeed for control to be accepted", + "actions": [{ + "label": "multimedia-control-cb", + "info": "Call Sharelib Sample Callback", + "callback": "sampleControlNavigation", + "args": { + "arg1": "snoopy", + "arg2": "toto" + } + }, { + "label": "navigation-control-ucm", + "api": "alsacore", + "verb": "ping", + "args": { + "test": "navigation" + } + }, { + "label": "navigation-control-lua", + "info": "Call Lua Script to set Navigation", + "lua": "_Audio_Set_Navigation" + }] + } + ], + "events": + [ + { + "label": "SampleEvent1", + "info": "define action when receiving a given event", + "actions": [ + { + "label": "Event Callback-1", + "callback": "SampleControlEvent", + "args": { + "arg": "action-1" + } + }, { + "label": "Event Callback-2", + "callback": "SampleControlEvent", + "args": { + "arg": "action-2" + } + } + ] + }, + { + "label": "SampleEvent2", + "info": "define action when receiving a given event", + "actions": [ + { + "label": "Event Callback-1", + "callback": "SampleControlEvent", + "args": { + "arg": "action-1" + } + }, { + "label": "Event Callback-2", + "callback": "SampleControlEvent", + "args": { + "arg": "action-2" + } + } + ] + } + ] +} + diff --git a/conf.d/project/json.d/onload-daemon-standalone.json b/conf.d/project/json.d/onload-daemon-standalone.json new file mode 100644 index 0000000..de52c22 --- /dev/null +++ b/conf.d/project/json.d/onload-daemon-standalone.json @@ -0,0 +1,72 @@ +{ + "$schema": "ToBeDone", + "metadata": { + "label": "sample-standalone-control", + "info": "Minimal Standalone Controller Config", + "version": "1.0" + }, + "onload": [{ + "label": "onload-default", + "info": "onload initialisation config", + "actions": + { + "label": "control-init", + "lua": "_Control_Init" + } + }], + "controls": + [ + { + "label": "Button-1", + "actions": { + "label": "Action on Button One", + "lua": "_Button_Press", + "args": { + "button": 1 + } + } + }, { + "label": "Button-1", + "actions": { + "label": "Action on Button Two", + "lua": "_Button_Press", + "args": { + "button": 2 + } + } + }, { + "label": "Button-1", + "actions": { + "label": "Action on Button Three", + "lua": "_Button_Press", + "args": { + "button": 3 + } + } + } + ], + "events": + [ + { + "label": "Event1", + "actions": { + "label": "Action Event 1", + "lua": "_Event_Received", + "args": { + "evtname": "xxx" + } + } + }, + { + "label": "Event2", + "actions": { + "label": "Action Event 2", + "lua": "_Event_Received", + "args": { + "evtname": "yyy" + } + } + } + ] +} + diff --git a/conf.d/project/lua.d/onload-aaaa-00-utils.lua b/conf.d/project/lua.d/onload-aaaa-00-utils.lua new file mode 100644 index 0000000..b8ecd7e --- /dev/null +++ b/conf.d/project/lua.d/onload-aaaa-00-utils.lua @@ -0,0 +1,86 @@ +--[[ + Copyright (C) 2016 "IoT.bzh" + Author Fulup Ar Foll + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Note: this file should be called before any other to assert declare function + is loaded before anything else. + + References: + http://lua-users.org/wiki/DetectingUndefinedVariables + +--]] + + +--=================================================== +--= Niklas Frykholm +-- basically if user tries to create global variable +-- the system will not let them!! +-- call GLOBAL_lock(_G) +-- +--=================================================== +function GLOBAL_lock(t) + local mt = getmetatable(t) or {} + mt.__newindex = lock_new_index + setmetatable(t, mt) +end + +--=================================================== +-- call GLOBAL_unlock(_G) +-- to change things back to normal. +--=================================================== +function GLOBAL_unlock(t) + local mt = getmetatable(t) or {} + mt.__newindex = unlock_new_index + setmetatable(t, mt) +end + +function lock_new_index(t, k, v) + if (string.sub(k,1,1) ~= "_") then + GLOBAL_unlock(_G) + error("GLOBALS are locked -- " .. k .. + " must be declared local or prefix with '_' for globals.", 2) + else + rawset(t, k, v) + end +end + +function unlock_new_index(t, k, v) + rawset(t, k, v) +end + +-- return serialised version of printable table +function Dump_Table(o) + if type(o) == 'table' then + local s = '{ ' + for k,v in pairs(o) do + if type(k) ~= 'number' then k = '"'..k..'"' end + s = s .. '['..k..'] = ' .. Dump_Table(v) .. ',' + end + return s .. '} ' + else + return tostring(o) + end +end + + +-- simulate C prinf function +printf = function(s,...) + io.write(s:format(...)) + io.write("\n") + return +end + +-- lock global variable +GLOBAL_lock(_G) diff --git a/conf.d/project/lua.d/onload-aaaa-01-controls.lua b/conf.d/project/lua.d/onload-aaaa-01-controls.lua new file mode 100644 index 0000000..24c4f71 --- /dev/null +++ b/conf.d/project/lua.d/onload-aaaa-01-controls.lua @@ -0,0 +1,162 @@ +--[[ + Copyright (C) 2016 "IoT.bzh" + Author Fulup Ar Foll + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Provide sample policy function for AGL Advance Audio Agent +--]] + +-- Global HAL registry +_Audio_Hal_Registry={} + +-- Callback when receiving HAL registry +function _Alsa_Get_Hal_CB (error, result, context) + -- Initialise an empty table + local registry={} + + -- Only process when response is valid + if (error) then + AFB_ErrOr ("[Audio_Init_CB] ErrOr result=%s", result) + return + end + + -- Extract response from result + local response=result["response"] + + -- Index HAL Bindings APIs by shortname + for key,value in pairs(response) do + registry[value["shortname"]]=value["api"] + end + + -- store Exiting HAL for further use + printf ("-- [Audio_Init_CB] -- Audio_register_Hal=%s", Dump_Table(registry)) + _Audio_Hal_Registry=registry + +end + +-- Function call at binding load time +function _Alsa_Get_Hal(args) + + printf ("[-- Audio_Get_Hal --] args=%s", Dump_Table(argsT)) + + -- Query AlsaCore for Active HALs (no query, no context) + AFB:service ('alsacore', 'hallist', {}, "_Alsa_Get_Hal_CB", {}) + +end + +-- In sample configuration Query/Args parsing is common to all audio control +local function Audio_Parse_Request (source, args, query) + + local apihal={} + + -- In this test we expect targeted device to be given from query (could come for args as well) + if (query == nil ) then + AFB:error ("--LUA:Audio_Set_Navigation query should contain and args with targeted apihal|device") + return -- refuse control + end + + -- Alsa Hook plugin asound sample config provides target sound card by name + if (query["device"] ~= nil) then + apihal=_Audio_Hal_Registry[query["device"]] + end + + -- HTML5 test page provides directly HAL api. + if (query["apihal"] ~= nil) then + apihal= query["apihal"] + end + + -- if requested HAL is not found then deny the control + if (apihal == nil) then + AFB:error ("--LUA:Audio_Set_Navigation No Active HAL Found") + return -- refuse control + end + + -- return api or nil when not found + return apihal +end + +-- Set Navigation lower sound when play +function _Audio_Set_Navigation(source, args, query) + + -- in strict mode every variables should be declared + local err=0 + local ctlhal={} + local response={} + local apihal={} + + AFB:notice ("LUA:Audio_Set_Use_Case source=%d args=%s query=%s", source, args, query); + + -- Parse Query/Args and if HAL not found then refuse access + apihal= Audio_Parse_Request (source, args, query) + if (apihal == nil) then return 1 end + + + -- if source < 0 then Alsa HookPlugin is closing PCM + if (source < 0) then + -- Ramp Up Multimedia channel synchronously + ctlhal={['label']='Master_Playback_Volume', ['val']=100} + err, response= AFB:servsync (apihal, 'ctlset',ctlhal) + else + -- Ramp Down Multimedia channel synchronously + ctlhal={['label']='Master_Playback_Volume', ['val']=50} + err, response= AFB:servsync (apihal, 'ctlset',ctlhal) + end + + if (err) then + AFB:error("--LUA:Audio_Set_Navigation halapi=%s refuse ctl=%s", apihal, ctlhal) + return 1 -- control refused + end + + + return 0 -- control accepted +end + + +-- Select Multimedia mode +function _Audio_Set_Multimedia (source, args, query) + + -- in strict mode every variables should be declared + local err=0 + local ctlhal={} + local response={} + local apihal={} + + AFB:notice ("LUA:Audio_Set_Use_Case source=%d args=%s query=%s", source, args, query); + + -- Parse Query/Args and if HAL not found then refuse access + apihal= Audio_Parse_Request (source, args, query) + if (apihal == nil) then return 1 end + + + -- if Mumtimedia control only increase volume on open + if (source >= 0) then + -- Ramp Down Multimedia channel synchronously + ctlhal={['label']='Master_Playback_Volume', ['val']=100} + err, response= AFB:servsync (apihal, 'ctlset',ctlhal) + end + + if (err) then + AFB:error("--LUA:Audio_Set_Navigation halapi=%s refuse ctl=%s", apihal, ctlhal) + return 1 -- control refused + end + + + return 0 -- control accepted +end + +-- Select Emergency Mode +function _Audio_Set_Emergency(source, args, query) + return 1 -- Always refuse in this test +end diff --git a/conf.d/project/lua.d/onload-aaaa-02-timer.lua b/conf.d/project/lua.d/onload-aaaa-02-timer.lua new file mode 100644 index 0000000..db7a937 --- /dev/null +++ b/conf.d/project/lua.d/onload-aaaa-02-timer.lua @@ -0,0 +1,69 @@ +--[[ + Copyright (C) 2016 "IoT.bzh" + Author Fulup Ar Foll + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Provide Sample Timer Handing to push event from LUA +--]] + +-- Create event on Lua script load +local MyEventHandle=AFB:evtmake("MyTestEvent") + +-- Call count time every delay/ms +local function Timer_Test_CB (timer, context) + + local evtinfo= AFB:timerget(timer) + print ("timer=", Dump_Table(evtinfo)) + + --send an event an event with count as value + AFB:evtpush (MyEventHandle, {["label"]= evtinfo["label"], ["count"]=evtinfo["count"], ["info"]=context["info"]}) + + -- note when timerCB return!=0 timer is kill + return 0 + +end + +-- sendback event depending on count and delay +function _Simple_Timer_Test (request, args) + + local context = { + ["info"]="My 1st private Event", + } + + -- if delay not defined default is 5s + if (args["delay"]==nil) then args["delay"]=5000 end + + -- if count is not defined default is 10 + if (args["count"]==nil) then args["count"]=10 end + + -- we could use directly args but it is a sample + local myTimer = { + ["label"]=args["label"], + ["delay"]=args["delay"], + ["count"]=args["count"], + } + AFB:notice ("Test_Timer myTimer=%s", myTimer) + + -- subscribe to event + AFB:subscribe (request, MyEventHandle) + + -- settimer take a table with delay+count as input (count==0 means infinite) + AFB:timerset (myTimer, "Timer_Test_CB", context) + + -- nothing special to return send back args + AFB:success (request, myTimer) + + return 0 +end diff --git a/conf.d/project/lua.d/onload-aaaa-03-oncall.lua b/conf.d/project/lua.d/onload-aaaa-03-oncall.lua new file mode 100644 index 0000000..23b538e --- /dev/null +++ b/conf.d/project/lua.d/onload-aaaa-03-oncall.lua @@ -0,0 +1,70 @@ +--[[ + Copyright (C) 2016 "IoT.bzh" + Author Fulup Ar Foll + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Provide sample LUA routines to be used with AGL control "lua_docall" API +--]] + +--global counter to keep track of calls +_count=0 + +-- Display receive arguments and echo them to caller +function _Simple_Echo_Args (request, args) + _count=_count+1 + AFB:notice("LUA OnCall Echo Args count=%d args=%s", count, args) + + print ("--inlua-- args=", Dump_Table(args)) + + local response={ + ["count"]=_count, + ["args"]=args, + } + + -- fulup Embdeded table ToeDone AFB:success (request, response) + AFB:success (request, {["func"]="Simple_Echo_Args", ["ret1"]=5678, ["ret2"]="abcd"}) +end + +local function Test_Async_CB (request, result, context) + response={ + ["result"]=result, + ["context"]=context, + } + + AFB:notice ("Test_Async_CB result=%s context=%s", result, context) + AFB:success (request, response) +end + +function _Test_Call_Async (request, args) + local context={ + ["value1"]="abcd", + ["value2"]=1234 + } + + AFB:notice ("Test_Call_Async args=%s cb=Test_Async_CB", args) + AFB:service("alsacore","ping", "Test_Async_CB", context) +end + +function _Test_Call_Sync (request, args) + + AFB:notice ("Test_Call_Sync args=%s", args) + local err, response= AFB:service_sync ("alsacore","ping", args) + if (err) then + AFB:fail ("AFB:service_call_sync fail"); + else + AFB:success (request, response) + end +end + diff --git a/conf.d/project/lua.d/onload-audio-0utils.lua b/conf.d/project/lua.d/onload-audio-0utils.lua deleted file mode 100644 index b8ecd7e..0000000 --- a/conf.d/project/lua.d/onload-audio-0utils.lua +++ /dev/null @@ -1,86 +0,0 @@ ---[[ - Copyright (C) 2016 "IoT.bzh" - Author Fulup Ar Foll - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - Note: this file should be called before any other to assert declare function - is loaded before anything else. - - References: - http://lua-users.org/wiki/DetectingUndefinedVariables - ---]] - - ---=================================================== ---= Niklas Frykholm --- basically if user tries to create global variable --- the system will not let them!! --- call GLOBAL_lock(_G) --- ---=================================================== -function GLOBAL_lock(t) - local mt = getmetatable(t) or {} - mt.__newindex = lock_new_index - setmetatable(t, mt) -end - ---=================================================== --- call GLOBAL_unlock(_G) --- to change things back to normal. ---=================================================== -function GLOBAL_unlock(t) - local mt = getmetatable(t) or {} - mt.__newindex = unlock_new_index - setmetatable(t, mt) -end - -function lock_new_index(t, k, v) - if (string.sub(k,1,1) ~= "_") then - GLOBAL_unlock(_G) - error("GLOBALS are locked -- " .. k .. - " must be declared local or prefix with '_' for globals.", 2) - else - rawset(t, k, v) - end -end - -function unlock_new_index(t, k, v) - rawset(t, k, v) -end - --- return serialised version of printable table -function Dump_Table(o) - if type(o) == 'table' then - local s = '{ ' - for k,v in pairs(o) do - if type(k) ~= 'number' then k = '"'..k..'"' end - s = s .. '['..k..'] = ' .. Dump_Table(v) .. ',' - end - return s .. '} ' - else - return tostring(o) - end -end - - --- simulate C prinf function -printf = function(s,...) - io.write(s:format(...)) - io.write("\n") - return -end - --- lock global variable -GLOBAL_lock(_G) diff --git a/conf.d/project/lua.d/onload-audio-controls.lua b/conf.d/project/lua.d/onload-audio-controls.lua deleted file mode 100644 index 24c4f71..0000000 --- a/conf.d/project/lua.d/onload-audio-controls.lua +++ /dev/null @@ -1,162 +0,0 @@ ---[[ - Copyright (C) 2016 "IoT.bzh" - Author Fulup Ar Foll - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Provide sample policy function for AGL Advance Audio Agent ---]] - --- Global HAL registry -_Audio_Hal_Registry={} - --- Callback when receiving HAL registry -function _Alsa_Get_Hal_CB (error, result, context) - -- Initialise an empty table - local registry={} - - -- Only process when response is valid - if (error) then - AFB_ErrOr ("[Audio_Init_CB] ErrOr result=%s", result) - return - end - - -- Extract response from result - local response=result["response"] - - -- Index HAL Bindings APIs by shortname - for key,value in pairs(response) do - registry[value["shortname"]]=value["api"] - end - - -- store Exiting HAL for further use - printf ("-- [Audio_Init_CB] -- Audio_register_Hal=%s", Dump_Table(registry)) - _Audio_Hal_Registry=registry - -end - --- Function call at binding load time -function _Alsa_Get_Hal(args) - - printf ("[-- Audio_Get_Hal --] args=%s", Dump_Table(argsT)) - - -- Query AlsaCore for Active HALs (no query, no context) - AFB:service ('alsacore', 'hallist', {}, "_Alsa_Get_Hal_CB", {}) - -end - --- In sample configuration Query/Args parsing is common to all audio control -local function Audio_Parse_Request (source, args, query) - - local apihal={} - - -- In this test we expect targeted device to be given from query (could come for args as well) - if (query == nil ) then - AFB:error ("--LUA:Audio_Set_Navigation query should contain and args with targeted apihal|device") - return -- refuse control - end - - -- Alsa Hook plugin asound sample config provides target sound card by name - if (query["device"] ~= nil) then - apihal=_Audio_Hal_Registry[query["device"]] - end - - -- HTML5 test page provides directly HAL api. - if (query["apihal"] ~= nil) then - apihal= query["apihal"] - end - - -- if requested HAL is not found then deny the control - if (apihal == nil) then - AFB:error ("--LUA:Audio_Set_Navigation No Active HAL Found") - return -- refuse control - end - - -- return api or nil when not found - return apihal -end - --- Set Navigation lower sound when play -function _Audio_Set_Navigation(source, args, query) - - -- in strict mode every variables should be declared - local err=0 - local ctlhal={} - local response={} - local apihal={} - - AFB:notice ("LUA:Audio_Set_Use_Case source=%d args=%s query=%s", source, args, query); - - -- Parse Query/Args and if HAL not found then refuse access - apihal= Audio_Parse_Request (source, args, query) - if (apihal == nil) then return 1 end - - - -- if source < 0 then Alsa HookPlugin is closing PCM - if (source < 0) then - -- Ramp Up Multimedia channel synchronously - ctlhal={['label']='Master_Playback_Volume', ['val']=100} - err, response= AFB:servsync (apihal, 'ctlset',ctlhal) - else - -- Ramp Down Multimedia channel synchronously - ctlhal={['label']='Master_Playback_Volume', ['val']=50} - err, response= AFB:servsync (apihal, 'ctlset',ctlhal) - end - - if (err) then - AFB:error("--LUA:Audio_Set_Navigation halapi=%s refuse ctl=%s", apihal, ctlhal) - return 1 -- control refused - end - - - return 0 -- control accepted -end - - --- Select Multimedia mode -function _Audio_Set_Multimedia (source, args, query) - - -- in strict mode every variables should be declared - local err=0 - local ctlhal={} - local response={} - local apihal={} - - AFB:notice ("LUA:Audio_Set_Use_Case source=%d args=%s query=%s", source, args, query); - - -- Parse Query/Args and if HAL not found then refuse access - apihal= Audio_Parse_Request (source, args, query) - if (apihal == nil) then return 1 end - - - -- if Mumtimedia control only increase volume on open - if (source >= 0) then - -- Ramp Down Multimedia channel synchronously - ctlhal={['label']='Master_Playback_Volume', ['val']=100} - err, response= AFB:servsync (apihal, 'ctlset',ctlhal) - end - - if (err) then - AFB:error("--LUA:Audio_Set_Navigation halapi=%s refuse ctl=%s", apihal, ctlhal) - return 1 -- control refused - end - - - return 0 -- control accepted -end - --- Select Emergency Mode -function _Audio_Set_Emergency(source, args, query) - return 1 -- Always refuse in this test -end diff --git a/conf.d/project/lua.d/onload-audio-oncall.lua b/conf.d/project/lua.d/onload-audio-oncall.lua deleted file mode 100644 index 23b538e..0000000 --- a/conf.d/project/lua.d/onload-audio-oncall.lua +++ /dev/null @@ -1,70 +0,0 @@ ---[[ - Copyright (C) 2016 "IoT.bzh" - Author Fulup Ar Foll - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Provide sample LUA routines to be used with AGL control "lua_docall" API ---]] - ---global counter to keep track of calls -_count=0 - --- Display receive arguments and echo them to caller -function _Simple_Echo_Args (request, args) - _count=_count+1 - AFB:notice("LUA OnCall Echo Args count=%d args=%s", count, args) - - print ("--inlua-- args=", Dump_Table(args)) - - local response={ - ["count"]=_count, - ["args"]=args, - } - - -- fulup Embdeded table ToeDone AFB:success (request, response) - AFB:success (request, {["func"]="Simple_Echo_Args", ["ret1"]=5678, ["ret2"]="abcd"}) -end - -local function Test_Async_CB (request, result, context) - response={ - ["result"]=result, - ["context"]=context, - } - - AFB:notice ("Test_Async_CB result=%s context=%s", result, context) - AFB:success (request, response) -end - -function _Test_Call_Async (request, args) - local context={ - ["value1"]="abcd", - ["value2"]=1234 - } - - AFB:notice ("Test_Call_Async args=%s cb=Test_Async_CB", args) - AFB:service("alsacore","ping", "Test_Async_CB", context) -end - -function _Test_Call_Sync (request, args) - - AFB:notice ("Test_Call_Sync args=%s", args) - local err, response= AFB:service_sync ("alsacore","ping", args) - if (err) then - AFB:fail ("AFB:service_call_sync fail"); - else - AFB:success (request, response) - end -end - diff --git a/conf.d/project/lua.d/onload-audio-timer.lua b/conf.d/project/lua.d/onload-audio-timer.lua deleted file mode 100644 index db7a937..0000000 --- a/conf.d/project/lua.d/onload-audio-timer.lua +++ /dev/null @@ -1,69 +0,0 @@ ---[[ - Copyright (C) 2016 "IoT.bzh" - Author Fulup Ar Foll - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Provide Sample Timer Handing to push event from LUA ---]] - --- Create event on Lua script load -local MyEventHandle=AFB:evtmake("MyTestEvent") - --- Call count time every delay/ms -local function Timer_Test_CB (timer, context) - - local evtinfo= AFB:timerget(timer) - print ("timer=", Dump_Table(evtinfo)) - - --send an event an event with count as value - AFB:evtpush (MyEventHandle, {["label"]= evtinfo["label"], ["count"]=evtinfo["count"], ["info"]=context["info"]}) - - -- note when timerCB return!=0 timer is kill - return 0 - -end - --- sendback event depending on count and delay -function _Simple_Timer_Test (request, args) - - local context = { - ["info"]="My 1st private Event", - } - - -- if delay not defined default is 5s - if (args["delay"]==nil) then args["delay"]=5000 end - - -- if count is not defined default is 10 - if (args["count"]==nil) then args["count"]=10 end - - -- we could use directly args but it is a sample - local myTimer = { - ["label"]=args["label"], - ["delay"]=args["delay"], - ["count"]=args["count"], - } - AFB:notice ("Test_Timer myTimer=%s", myTimer) - - -- subscribe to event - AFB:subscribe (request, MyEventHandle) - - -- settimer take a table with delay+count as input (count==0 means infinite) - AFB:timerset (myTimer, "Timer_Test_CB", context) - - -- nothing special to return send back args - AFB:success (request, myTimer) - - return 0 -end diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt deleted file mode 100644 index 3b052c9..0000000 --- a/data/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -########################################################################### -# Copyright 2017 IoT.bzh -# -# author: Fulup Ar Foll -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################### - - - -################################################## -# Control Policy Config file -################################################## -PROJECT_TARGET_ADD(Control_config) - - file(GLOB XML_FILES "*.json") - - add_input_files("${XML_FILES}") - - SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES - LABELS "DATA" - OUTPUT_NAME ${TARGET_NAME} - ) diff --git a/data/default-control-policy.json b/data/default-control-policy.json deleted file mode 100644 index c6f8bd0..0000000 --- a/data/default-control-policy.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "$schema": "ToBeDone", - "metadata": { - "label": "sample-audio-policy", - "info": "Provide Default Audio Policy for Multimedia, Navigation and Emergency", - "version": "1.0" - }, - "onload": { - "info": "controller initialisation config", - "plugin": "sample-audio-policy.so", - "actions": [ - { - "info": "Call policy sharelib install entrypoint", - "callback": "SamplePolicyInstall", - "query": {"arg1" : "first_arg", "nextarg": "second arg value"} - }, { - "info": "Assert AlsaCore Presence", - "api": "alsacore", - "verb": "ping" - } - ] - }, - "controls": - [{ - "label": "multimedia", - "actions": [ - { - "label": "multimedia-policy-cb", - "info": "Call Sharelib Sample Callback", - "callback": "samplePolicyCB", - "query": { - "arg1": "snoopy", - "arg2": "toto" - } - }, { - "label": "multimedia-policy-ucm", - "info": "Subcall AlSA UCM navigation", - "api": "alsacore", - "verb": "ucmset", - "query": { - "verb": "multimedia" - } - } - ] - }, - { - "label":"navigation", - "action" : { - "api": "alsacore", - "verb": "ucmset", - "query": { - "verb": "navigation" - }, - "optional": true, - "timeout": 100 - } - }, { - "label":"emergency", - "action": { - "api": "alsacore", - "verb": "ucmset", - "query": { - "verb": "emergency" - } - } - }] - , - "events": [ - { - "label": "SampleEvent", - "comment": "define action when receiving a given event", - "actions": [ - { - "info": "Event Callback-1", - "callback": "ProcessEventCB", - "query": { - "arg": "action-1" - } - }, { - "info": "Event Callback-2", - "callback": "ProcessEventCB", - "query": { - "arg": "action-2" - } - } - ] - } - ] -} - diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index 235c3b0..cf14956 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -49,6 +49,7 @@ ctl-lua.c ctl-misc.c ctl-plugin-sample.c + ctl-policy.c ctl-timer.c @@ -118,11 +119,10 @@ false - - - - - + + + @@ -134,7 +134,7 @@ ${MAKE} -f Makefile install ${MAKE} -f Makefile clean build/CMakeFiles/feature_tests.bin - + @@ -147,11 +147,11 @@ ex="false" tool="0" flavor2="3"> - + - + ../../../opt/include/alsa /usr/include/json-c @@ -162,14 +162,14 @@ - + build/Alsa-afb - + ../../../opt/include/alsa /usr/include/json-c @@ -180,7 +180,7 @@ - + ../../../opt/include/alsa /usr/include/json-c @@ -191,7 +191,7 @@ - + ../../../opt/include/alsa /usr/include/json-c @@ -202,7 +202,7 @@ - + ../../../opt/include/afb Audio-Common @@ -212,7 +212,7 @@ - + ../../../opt/include/afb Audio-Common @@ -222,7 +222,7 @@ - + Audio-Common /usr/include/json-c @@ -231,45 +231,19 @@ - + - + - ../../../opt/include - ../../../opt/include/alsa - /usr/include/p11-kit-1 - /usr/include/json-c - /usr/include/lua5.3 - Audio-Common build/Controller-afb - - CONTROL_CONFIG_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/config.d:/usr/local/controller/config.d" - CONTROL_CONFIG_POST="control" - CONTROL_CONFIG_PRE="onload" - CONTROL_DOSCRIPT_PRE="doscript" - CONTROL_LUA_EVENT="luaevt" - CONTROL_LUA_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/lua.d:/usr/local/controller/ctl-lua.d" - CONTROL_MAXPATH_LEN=255 - CONTROL_ONLOAD_DEFAULT="onload-default" - CONTROL_PLUGIN_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/build:/home/fulup/opt/audio-bindings/ctlplug:/usr/lib/afb/ctlplug" - CONTROL_SUPPORT_LUA - CTL_PLUGIN_MAGIC=2468013579 - MAX_LINEAR_DB_SCALE=24 - MAX_SND_CARD=16 - NATIVE_LINUX - TLV_BYTE_SIZE=256 - control_afb_EXPORTS - - + - ../../../opt/include/afb - Controller-afb /usr/include/json-c /usr/include/lua5.3 Audio-Common @@ -279,10 +253,8 @@ - + - ../../../opt/include/afb - Controller-afb /usr/include/json-c /usr/include/lua5.3 Audio-Common @@ -292,20 +264,16 @@ - + - ../../../opt/include/afb - Controller-afb /usr/include/json-c build/Controller-afb - + - ../../../opt/include/afb - Controller-afb /usr/include/json-c /usr/include/lua5.3 build/Controller-afb @@ -313,10 +281,8 @@ - + - ../../../opt/include/afb - Controller-afb ../../../opt/include build/Controller-afb @@ -326,9 +292,10 @@ ex="false" tool="0" flavor2="3"> - + Audio-Common + ../../../opt/include build/HAL-afb/HAL-interface @@ -337,7 +304,7 @@ ex="false" tool="0" flavor2="3"> - + Audio-Common build/HAL-afb/HAL-interface @@ -345,36 +312,36 @@ - + build/HAL-afb/HAL-interface - + - + - + - + - + Shared-Interface HAL-afb/HAL-interface @@ -383,7 +350,7 @@ - + HAL-afb/HAL-interface build/HAL-afb/Unicens-USB @@ -391,11 +358,11 @@ - + - + @@ -505,6 +472,14 @@ + + + + ../../../opt/include/afb + Controller-afb + + + @@ -2562,5 +2537,655 @@ + + + GNU|GNU + false + false + + + + + + + + + + true + + + + build + ${MAKE} -f Makefile install + ${MAKE} -f Makefile clean + build/CMakeFiles/feature_tests.bin + + + + + build + cmake .. + true + + + + + + + + + + ../../../opt/include/afb + Alsa-afb + ../../../opt/include/alsa + /usr/include/json-c + Audio-Common + ../../../opt/include + build/Alsa-afb + + + + + + + ../../../opt/include + ../../../opt/include/alsa + /usr/include/p11-kit-1 + /usr/include/json-c + /usr/include/lua5.3 + Audio-Common + build/Alsa-afb + + + CONTROL_MAXPATH_LEN=255 + MAX_LINEAR_DB_SCALE=24 + MAX_SND_CARD=16 + NATIVE_LINUX + TLV_BYTE_SIZE=256 + alsa_lowlevel_EXPORTS + + + + + + + ../../../opt/include/afb + Alsa-afb + ../../../opt/include/alsa + /usr/include/json-c + Audio-Common + ../../../opt/include + build/Alsa-afb + + + + + + + ../../../opt/include/afb + Alsa-afb + ../../../opt/include/alsa + /usr/include/json-c + Audio-Common + ../../../opt/include + build/Alsa-afb + + + + + + + ../../../opt/include/afb + Alsa-afb + ../../../opt/include/alsa + /usr/include/json-c + Audio-Common + ../../../opt/include + build/Alsa-afb + + + + + + + ../../../opt/include/afb + Audio-Common + /usr/include/json-c + build/Audio-Common + + + + + + + ../../../opt/include/afb + Audio-Common + /usr/include/json-c + build/Audio-Common + + + + + + + Audio-Common + /usr/include/json-c + build/Audio-Common + + + + + + + + + + + ../../../opt/include + ../../../opt/include/alsa + /usr/include/p11-kit-1 + /usr/include/json-c + /usr/include/lua5.3 + Audio-Common + build/Controller-afb + + + CONTROL_CONFIG_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/config.d:/home/fulup/opt/controller/config.d" + CONTROL_CONFIG_POST="control" + CONTROL_CONFIG_PRE="onload" + CONTROL_DOSCRIPT_PRE="doscript" + CONTROL_LUA_EVENT="luaevt" + CONTROL_LUA_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/lua.d:/home/fulup/opt/controller-plugins/ctl-lua.d" + CONTROL_MAXPATH_LEN=255 + CONTROL_ONLOAD_PROFILE="onload-default-profile" + CONTROL_PLUGIN_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/build:/home/fulup/opt/controller-plugins:/usr/lib/afb/controller-plugins/ctlplug" + CONTROL_SUPPORT_LUA + CTL_PLUGIN_MAGIC=2468013579 + MAX_LINEAR_DB_SCALE=24 + MAX_SND_CARD=16 + NATIVE_LINUX + TLV_BYTE_SIZE=256 + control_afb_EXPORTS + + + + + + + ../../../opt/include + ../../../opt/include/alsa + /usr/include/p11-kit-1 + /usr/include/json-c + /usr/include/lua5.3 + Audio-Common + build/Controller-afb + + + CONTROL_CONFIG_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/config.d:/home/fulup/opt/controller/config.d" + CONTROL_CONFIG_POST="control" + CONTROL_CONFIG_PRE="onload" + CONTROL_DOSCRIPT_PRE="doscript" + CONTROL_LUA_EVENT="luaevt" + CONTROL_LUA_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/lua.d:/home/fulup/opt/controller-plugins/ctl-lua.d" + CONTROL_MAXPATH_LEN=255 + CONTROL_ONLOAD_PROFILE="onload-default-profile" + CONTROL_PLUGIN_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/build:/home/fulup/opt/controller-plugins:/usr/lib/afb/controller-plugins/ctlplug" + CONTROL_SUPPORT_LUA + CTL_PLUGIN_MAGIC=2468013579 + MAX_LINEAR_DB_SCALE=24 + MAX_SND_CARD=16 + NATIVE_LINUX + TLV_BYTE_SIZE=256 + control_afb_EXPORTS + + + + + + + ../../../opt/include + ../../../opt/include/alsa + /usr/include/p11-kit-1 + /usr/include/json-c + /usr/include/lua5.3 + Audio-Common + build/Controller-afb + + + CONTROL_CONFIG_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/config.d:/home/fulup/opt/controller/config.d" + CONTROL_CONFIG_POST="control" + CONTROL_CONFIG_PRE="onload" + CONTROL_DOSCRIPT_PRE="doscript" + CONTROL_LUA_EVENT="luaevt" + CONTROL_LUA_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/lua.d:/home/fulup/opt/controller-plugins/ctl-lua.d" + CONTROL_MAXPATH_LEN=255 + CONTROL_ONLOAD_PROFILE="onload-default-profile" + CONTROL_PLUGIN_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/build:/home/fulup/opt/controller-plugins:/usr/lib/afb/controller-plugins/ctlplug" + CONTROL_SUPPORT_LUA + CTL_PLUGIN_MAGIC=2468013579 + MAX_LINEAR_DB_SCALE=24 + MAX_SND_CARD=16 + NATIVE_LINUX + TLV_BYTE_SIZE=256 + control_afb_EXPORTS + + + + + + + ../../../opt/include/afb + Controller-afb + /usr/include/json-c + build/Controller-afb + + + + + + + ../../../opt/include + ../../../opt/include/alsa + /usr/include/p11-kit-1 + /usr/include/json-c + /usr/include/lua5.3 + Audio-Common + build/Controller-afb + + + CONTROL_CONFIG_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/config.d:/home/fulup/opt/controller/config.d" + CONTROL_CONFIG_POST="control" + CONTROL_CONFIG_PRE="onload" + CONTROL_DOSCRIPT_PRE="doscript" + CONTROL_LUA_EVENT="luaevt" + CONTROL_LUA_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/lua.d:/home/fulup/opt/controller-plugins/ctl-lua.d" + CONTROL_MAXPATH_LEN=255 + CONTROL_ONLOAD_PROFILE="onload-default-profile" + CONTROL_PLUGIN_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/build:/home/fulup/opt/controller-plugins:/usr/lib/afb/controller-plugins/ctlplug" + CONTROL_SUPPORT_LUA + CTL_PLUGIN_MAGIC=2468013579 + MAX_LINEAR_DB_SCALE=24 + MAX_SND_CARD=16 + NATIVE_LINUX + TLV_BYTE_SIZE=256 + audio_plugin_sample_EXPORTS + + + + + + + ../../../opt/include + ../../../opt/include/alsa + /usr/include/p11-kit-1 + /usr/include/json-c + /usr/include/lua5.3 + Audio-Common + build/Controller-afb + + + CONTROL_CONFIG_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/config.d:/home/fulup/opt/controller/config.d" + CONTROL_CONFIG_POST="control" + CONTROL_CONFIG_PRE="onload" + CONTROL_DOSCRIPT_PRE="doscript" + CONTROL_LUA_EVENT="luaevt" + CONTROL_LUA_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/lua.d:/home/fulup/opt/controller-plugins/ctl-lua.d" + CONTROL_MAXPATH_LEN=255 + CONTROL_ONLOAD_PROFILE="onload-default-profile" + CONTROL_PLUGIN_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/build:/home/fulup/opt/controller-plugins:/usr/lib/afb/controller-plugins/ctlplug" + CONTROL_SUPPORT_LUA + CTL_PLUGIN_MAGIC=2468013579 + MAX_LINEAR_DB_SCALE=24 + MAX_SND_CARD=16 + NATIVE_LINUX + TLV_BYTE_SIZE=256 + control_afb_EXPORTS + + + + + + + Audio-Common + build/HAL-afb/HAL-interface + + + + + + + Audio-Common + build/HAL-afb/HAL-interface + + + + + + + build/HAL-afb/HAL-interface + + + + + + + + + + + + + + + + + + + + + + + Shared-Interface + HAL-afb/HAL-interface + build/HAL-afb/Unicens-USB + + + + + + + HAL-afb/HAL-interface + build/HAL-afb/Unicens-USB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Alsa-Plugin/Alsa-Policy-Hook + ../../../opt/include/alsa + /usr/include/json-c + ../../../opt/include/afb + ../../../opt/include + build/Alsa-Plugin/Alsa-Policy-Hook + + + CONTROL_CONFIG_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/config.d:/usr/local/controller/config.d" + CONTROL_CONFIG_POST="control" + CONTROL_CONFIG_PRE="onload" + CONTROL_DOSCRIPT_PRE="doscript" + CONTROL_LUA_EVENT="luaevt" + CONTROL_LUA_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/lua.d:/usr/local/controller/ctl-lua.d" + CONTROL_MAXPATH_LEN=255 + CONTROL_ONLOAD_DEFAULT="onload-default" + CONTROL_PLUGIN_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/build:/home/fulup/opt/audio-bindings/ctlplug:/usr/lib/afb/ctlplug" + CONTROL_SUPPORT_LUA + CTL_PLUGIN_MAGIC=2468013579 + MAX_LINEAR_DB_SCALE=24 + MAX_SND_CARD=16 + NATIVE_LINUX + PIC + TLV_BYTE_SIZE=256 + policy_hook_cb_EXPORTS + + + + + + + ../../../opt/include + ../../../opt/include/alsa + /usr/include/p11-kit-1 + /usr/include/json-c + /usr/include/lua5.3 + Audio-Common + build/Controller-afb + build/HAL-afb/HAL-plugin + /usr/include/alsa + build/Common + + + CONTROL_CDEV_RX="/dev/inic-usb-crx" + CONTROL_CDEV_TX="/dev/inic-usb-ctx" + CONTROL_CONFIG_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/config.d:/usr/local/controller/config.d" + CONTROL_CONFIG_POST="control" + CONTROL_CONFIG_PRE="onload" + CONTROL_LUA_EVENT="luaevt" + CONTROL_LUA_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/lua.d:/usr/local/controller/ctl-lua.d" + CONTROL_MAXPATH_LEN=255 + CONTROL_ONLOAD_DEFAULT="onload-default" + CONTROL_PLUGIN_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/build:/home/fulup/opt/audio-bindings/ctlplug:/usr/lib/afb/ctlplug" + CTL_PLUGIN_MAGIC=2468013579 + MAX_LINEAR_DB_SCALE=24 + MAX_SND_CARD=16 + TLV_BYTE_SIZE=256 + audio_plugin_sample_EXPORTS + control_afb_EXPORTS + + + + + + + ../../../opt/include + ../../../opt/include/alsa + /usr/include/p11-kit-1 + /usr/include/json-c + /usr/include/lua5.3 + + + CONTROL_CONFIG_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/config.d:/usr/local/controller/config.d" + CONTROL_CONFIG_POST="control" + CONTROL_CONFIG_PRE="onload" + CONTROL_LUA_EVENT="luaevt" + CONTROL_LUA_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/lua.d:/usr/local/controller/ctl-lua.d" + CONTROL_MAXPATH_LEN=255 + CONTROL_ONLOAD_DEFAULT="onload-default" + CONTROL_PLUGIN_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/build:/home/fulup/opt/audio-bindings/ctlplug:/usr/lib/afb/ctlplug" + CTL_PLUGIN_MAGIC=2468013579 + MAX_LINEAR_DB_SCALE=24 + MAX_SND_CARD=16 + TLV_BYTE_SIZE=256 + + + + + + + ../../../opt/include/afb + HAL-afb/HAL-interface + + + + + + + Audio-Common + build/Controller-afb + build/HAL-afb/HAL-plugin + ../../../opt/include/afb + HAL-afb/HAL-plugin + + + CONTROL_CDEV_RX="/dev/inic-usb-crx" + CONTROL_CDEV_TX="/dev/inic-usb-ctx" + audio_plugin_sample_EXPORTS + control_afb_EXPORTS + + + + + + + ../../../opt/include/afb + HAL-afb/HDA-intel + Audio-Common + HAL-afb/HAL-interface + build/HAL-afb/HDA-intel + + + + + + + HAL-afb/Jabra-Solemate + ../../../opt/include/afb + Audio-Common + HAL-afb/HAL-interface + build/HAL-afb/Jabra-Solemate + + + + + + + ../../../opt/include/afb + HAL-afb/Scarlett-Focusrite + Audio-Common + HAL-afb/HAL-interface + build/HAL-afb/Scarlett-Focusrite + + + + + + + Audio-Common + build/Controller-afb + build/HAL-afb/HAL-plugin + ../../../opt/include/afb + HAL-afb/Unicens-USB + + + CONTROL_CDEV_RX="/dev/inic-usb-crx" + CONTROL_CDEV_TX="/dev/inic-usb-ctx" + audio_plugin_sample_EXPORTS + control_afb_EXPORTS + + + + + + + ../../../opt/include + ../../../opt/include/alsa + /usr/include/p11-kit-1 + /usr/include/json-c + /usr/include/lua5.3 + Audio-Common + build/Controller-afb + build/HAL-afb/HAL-plugin + ../../../opt/include/afb + HighLevel-afb + Shared-Interface + build/HighLevel-afb + + + CONTROL_CONFIG_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/config.d:/usr/local/controller/config.d" + CONTROL_CONFIG_POST="control" + CONTROL_CONFIG_PRE="onload" + CONTROL_LUA_EVENT="luaevt" + CONTROL_LUA_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/lua.d:/usr/local/controller/ctl-lua.d" + CONTROL_MAXPATH_LEN=255 + CONTROL_ONLOAD_DEFAULT="onload-default" + CONTROL_PLUGIN_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/build:/home/fulup/opt/audio-bindings/ctlplug:/usr/lib/afb/ctlplug" + CTL_PLUGIN_MAGIC=2468013579 + MAX_LINEAR_DB_SCALE=24 + MAX_SND_CARD=16 + TLV_BYTE_SIZE=256 + audio_plugin_sample_EXPORTS + control_afb_EXPORTS + + + + + + + ../../../opt/include + ../../../opt/include/alsa + /usr/include/p11-kit-1 + /usr/include/json-c + /usr/include/lua5.3 + Audio-Common + build/Controller-afb + build/HAL-afb/HAL-plugin + + + CONTROL_CONFIG_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/config.d:/usr/local/controller/config.d" + CONTROL_CONFIG_POST="control" + CONTROL_CONFIG_PRE="onload" + CONTROL_LUA_EVENT="luaevt" + CONTROL_LUA_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/conf.d/project/lua.d:/usr/local/controller/ctl-lua.d" + CONTROL_MAXPATH_LEN=255 + CONTROL_ONLOAD_DEFAULT="onload-default" + CONTROL_PLUGIN_PATH="/home/fulup/Workspace/AGL-AppFW/audio-bindings-dev/build:/home/fulup/opt/audio-bindings/ctlplug:/usr/lib/afb/ctlplug" + CTL_PLUGIN_MAGIC=2468013579 + MAX_LINEAR_DB_SCALE=24 + MAX_SND_CARD=16 + TLV_BYTE_SIZE=256 + audio_plugin_sample_EXPORTS + control_afb_EXPORTS + + + + diff --git a/nbproject/project.xml b/nbproject/project.xml index db3bdab..b229af2 100644 --- a/nbproject/project.xml +++ b/nbproject/project.xml @@ -33,6 +33,10 @@ Local_Raw_Controller 0 + + Demo-AudioController + 0 + false -- cgit 1.2.3-korg