diff options
author | Romain Forlot <romain.forlot@iot.bzh> | 2017-09-20 16:54:14 +0200 |
---|---|---|
committer | Romain Forlot <romain.forlot@iot.bzh> | 2017-12-14 11:00:25 +0100 |
commit | 78202d5bd8a8d09a55bb71b9df6d3f54b18184b8 (patch) | |
tree | afbc89a7c104a70e7771939765309e977a5ab96a /conf.d | |
parent | b68f95e384aa35b54e453b5e7d09dabf8d82340c (diff) |
Make LUA works
- Added LUA library at link
- Make app-template crash build if a checked file fails
- Fix old defined variable CONTROL_LUA_PATH to a default
one in the binding data directory
- Add an example with unit conversion made in LUA
Change-Id: I1b4712bde32a38044ad6b14ebd38b6782fd01fe9
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'conf.d')
18 files changed, 234 insertions, 86 deletions
diff --git a/conf.d/app-templates b/conf.d/app-templates -Subproject 908a0372d53c74a037da3debe1e276a214343c4 +Subproject 3465ddbdec8d77e2a59315e50f954ea2d35aa1c diff --git a/conf.d/autobuild/agl/autobuild b/conf.d/autobuild/agl/autobuild index 4811441..3a1ba5f 100755 --- a/conf.d/autobuild/agl/autobuild +++ b/conf.d/autobuild/agl/autobuild @@ -29,8 +29,9 @@ help: @echo "- clean" @echo "- distclean" @echo "- configure" - @echo "- build" - @echo "- package" + @echo "- build: compilation, link and prepare files for package into a widget" + @echo "- package: output a widget file '*.wgt'" + @echo "- install: install in your ${CMAKE_INSTALL_DIR} directory" @echo "" @echo "Usage: ./conf.d/autobuild/agl/autobuild package DEST=${HOME}/opt" @echo "Don't use your build dir as DEST as wgt file is generated at this location" @@ -58,6 +59,9 @@ package: build @cmake --build ${BUILD_DIR} --target widget @mkdir -p ${DEST} && cp ${BUILD_DIR}/*wgt ${DEST} +install: build + @cmake --build ${BUILD_DIR} --target install + ${BUILD_DIR}/Makefile: @[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR} @[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && cmake ${CONFIGURE_ARGS} ..) diff --git a/conf.d/autobuild/linux/autobuild b/conf.d/autobuild/linux/autobuild index 4811441..3a1ba5f 100755 --- a/conf.d/autobuild/linux/autobuild +++ b/conf.d/autobuild/linux/autobuild @@ -29,8 +29,9 @@ help: @echo "- clean" @echo "- distclean" @echo "- configure" - @echo "- build" - @echo "- package" + @echo "- build: compilation, link and prepare files for package into a widget" + @echo "- package: output a widget file '*.wgt'" + @echo "- install: install in your ${CMAKE_INSTALL_DIR} directory" @echo "" @echo "Usage: ./conf.d/autobuild/agl/autobuild package DEST=${HOME}/opt" @echo "Don't use your build dir as DEST as wgt file is generated at this location" @@ -58,6 +59,9 @@ package: build @cmake --build ${BUILD_DIR} --target widget @mkdir -p ${DEST} && cp ${BUILD_DIR}/*wgt ${DEST} +install: build + @cmake --build ${BUILD_DIR} --target install + ${BUILD_DIR}/Makefile: @[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR} @[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && cmake ${CONFIGURE_ARGS} ..) diff --git a/conf.d/cmake/00-debian-osconfig.cmake b/conf.d/cmake/00-debian-osconfig.cmake new file mode 100644 index 0000000..2ce0ad3 --- /dev/null +++ b/conf.d/cmake/00-debian-osconfig.cmake @@ -0,0 +1 @@ +list(APPEND PKG_REQUIRED_LIST lua-5.3>=5.3) diff --git a/conf.d/cmake/00-default-osconfig.cmake b/conf.d/cmake/00-default-osconfig.cmake new file mode 100644 index 0000000..a2b9325 --- /dev/null +++ b/conf.d/cmake/00-default-osconfig.cmake @@ -0,0 +1 @@ +list(APPEND PKG_REQUIRED_LIST lua>=5.3) diff --git a/conf.d/cmake/00-suse-config.cmake b/conf.d/cmake/00-suse-config.cmake index 0c40b68..8c8303b 100644 --- a/conf.d/cmake/00-suse-config.cmake +++ b/conf.d/cmake/00-suse-config.cmake @@ -1 +1,2 @@ -add_definitions(-DSUSE_LUA_INCDIR)
\ No newline at end of file +add_definitions(-DSUSE_LUA_INCDIR) +list(APPEND PKG_REQUIRED_LIST lua>=5.3) diff --git a/conf.d/cmake/config.cmake b/conf.d/cmake/config.cmake index d2f31ae..4f2cf71 100644 --- a/conf.d/cmake/config.cmake +++ b/conf.d/cmake/config.cmake @@ -125,7 +125,7 @@ set(CMAKE_INSTALL_PREFIX $ENV{HOME}/opt) # -O2 # CACHE STRING "Compilation flags for RELEASE build type.") -add_definitions("-DCONTROL_CONFIG_PRE=\"init\"") +add_definitions("-DCONTROL_SUPPORT_LUA=1") add_definitions("-DCTL_PLUGIN_MAGIC=3286576532") # (BUG!!!) as PKG_CONFIG_PATH does not work [should be an env variable] diff --git a/conf.d/cmake/low-can.c b/conf.d/cmake/low-can.c new file mode 100644 index 0000000..86f0f5c --- /dev/null +++ b/conf.d/cmake/low-can.c @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2016 "IoT.bzh" + * Author Romain Forlot <romain.forlot@iot.bzh> + * + * 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. + * +*/ + +#define _GNU_SOURCE // needed for vasprintf + +#define AFB_BINDING_VERSION 2 +#include <afb/afb-binding.h> +#include <systemd/sd-event.h> +#include <json-c/json_object.h> +#include <stdbool.h> +#include <string.h> + +#include "ctl-plugin.h" +#include "wrap-json.h" + +CTLP_REGISTER("low-can"); + +typedef struct { + bool door; + bool window; +} doorT; + +typedef struct { + doorT* front_left; + doorT* front_right; + doorT* rear_left; + doorT* rear_right; +} allDoorsCtxT; + +// Call at initialisation time +CTLP_ONLOAD(plugin, api) { + allDoorsCtxT *allDoorCtx = (allDoorsCtxT*)calloc (1, sizeof(allDoorsCtxT)); + memset(allDoorCtx, 0, sizeof(allDoorsCtxT)); + + AFB_NOTICE ("Low-can plugin: label='%s' version='%s' info='%s'", plugin->label, plugin->version, plugin->info); + return (void*)allDoorCtx; +} + +CTLP_CAPI (subscribeToLow, source, argsJ, eventJ, context) { + json_object* signalArrayJ = NULL, *subscribeArgsJ = NULL, *subscribeFilterJ = NULL, *responseJ = NULL; + const char* unit = NULL; + double frequency = 0; + int err = 0; + + err = wrap_json_unpack(eventJ, "{so,s?s,s?F !}", + "signal", &signalArrayJ, + "unit", &unit, + "frequency", &frequency); + if(err) + { + AFB_ERROR("Problem to unpack JSON object eventJ: %s", + json_object_to_json_string(eventJ)); + return err; + } + + if(frequency > 0) + { + wrap_json_pack(&subscribeFilterJ, "{sf}", "frequency", frequency); + } + + for (int idx = 0; idx < json_object_array_length(signalArrayJ); idx++) + { + json_object* aSignalJ = json_object_array_get_idx(signalArrayJ, idx); + err = wrap_json_pack(&subscribeArgsJ, "{ss, so*}", + "event", json_object_get_string(aSignalJ), + "filter", subscribeFilterJ); + if(err) + { + AFB_ERROR("Error building subscription query object"); + return err; + } + AFB_DEBUG("Calling subscribe with %s", json_object_to_json_string_ext(subscribeArgsJ, JSON_C_TO_STRING_PRETTY)); + err = afb_service_call_sync("low-can", "subscribe", subscribeArgsJ, &responseJ); + if(err) + { + AFB_ERROR("Can't find api 'low-can'"); + return err; + } + } + + return err; +} + +CTLP_CAPI (isOpen, source, argsJ, eventJ, context) { + + const char* eventName; + json_object *eventStatus = NULL; + long long int *timestamp = NULL; + allDoorsCtxT *ctx=(allDoorsCtxT*)context; + + AFB_DEBUG("Here is the situation: source:%s, args:%s, event:%s,\n fld: %s, flw: %s, frd: %s, frw: %s, rld: %s, rlw: %s, rrd: %s, rrw: %s", + source->label, + json_object_to_json_string(argsJ), + json_object_to_json_string(eventJ), + ctx->front_left->door ? "true":"false", + ctx->front_left->window ? "true":"false", + ctx->front_right->door ? "true":"false", + ctx->front_right->window ? "true":"false", + ctx->rear_left->door ? "true":"false", + ctx->rear_left->window ? "true":"false", + ctx->rear_right->door ? "true":"false", + ctx->rear_right->window ? "true":"false" + ); + + int err = wrap_json_unpack(eventJ, "{ss,sb,s?F}", + "event", &eventName, + "value", &eventStatus, + "timestamp", ×tamp); + if(err) + { + AFB_ERROR("Error parsing event %s", json_object_to_json_string(eventJ)); + return -1; + } + + if(strcasestr(eventName, "front_left")) + { + if(strcasestr(eventName, "door")) {ctx->front_left->door = eventStatus;} + else if(strcasestr(eventName, "window")) {ctx->front_left->window = eventStatus;} + else {AFB_WARNING("Unexpected behavior, this '%s' is not a door ! ", json_object_to_json_string(eventJ));} + } + else if(strcasestr(eventName, "front_right")) + { + if(strcasestr(eventName, "door")) {ctx->front_right->door = eventStatus;} + else if(strcasestr(eventName, "window")) {ctx->front_right->window = eventStatus;} + else {AFB_WARNING("Unexpected behavior, this '%s' is not a door ! ", json_object_to_json_string(eventJ));} + } + else if(strcasestr(eventName, "rear_left")) + { + if(strcasestr(eventName, "door")) {ctx->rear_left->door = eventStatus;} + else if(strcasestr(eventName, "window")) {ctx->rear_left->window = eventStatus;} + else {AFB_WARNING("Unexpected behavior, this '%s' is not a door ! ", json_object_to_json_string(eventJ));} + } + else if(strcasestr(eventName, "rear_right")) + { + if(strcasestr(eventName, "door")) {ctx->rear_right->door = eventStatus;} + else if(strcasestr(eventName, "window")) {ctx->rear_right->window = eventStatus;} + else {AFB_WARNING("Unexpected behavior, this '%s' is not a door ! ", json_object_to_json_string(eventJ));} + } + else {AFB_WARNING("Unexpected behavior, this '%s' is not a door ! ", json_object_to_json_string(eventJ));} + + return 0; +} diff --git a/conf.d/project/etc/init-daemon.json b/conf.d/project/etc/init-daemon.json index a1f75f5..045f3fe 100644 --- a/conf.d/project/etc/init-daemon.json +++ b/conf.d/project/etc/init-daemon.json @@ -3,10 +3,10 @@ "metadata": { "label": "Signal Composer", "version": "1.0", - "api": "signal-composer", + "api": "test", "info": "Signal composer Configuration", "require": ["low-can"], - "files": ["sources", "sig-doors"] + "files": ["sources", "sig-doors", "sig-demoboard"] }, "plugins": [ { diff --git a/conf.d/project/etc/sig-demoboard.json b/conf.d/project/etc/sig-demoboard.json index 3d03f3e..5eb662c 100644 --- a/conf.d/project/etc/sig-demoboard.json +++ b/conf.d/project/etc/sig-demoboard.json @@ -6,9 +6,12 @@ "class": "temporal", "unit": "km/h", "frequency": 1, + "getSignalsArgs": { + "frequency": 5, + "min": 10 + }, "onReceived": { - "label": "Unit converter", - "lua": "_Unit_Converter", + "function": "lua://_Unit_Converter", "args": { "from": "km/h", "to": "mi/h" diff --git a/conf.d/project/etc/sources.json b/conf.d/project/etc/sources.json index be99a41..dcb55a3 100644 --- a/conf.d/project/etc/sources.json +++ b/conf.d/project/etc/sources.json @@ -3,12 +3,6 @@ { "api": "low-can", "info": "Low level binding to handle CAN bus communications", - "init": { - "function": "api://low-can/subscribe", - "args": { - "event": "message*" - } - }, "getSignals": { "function": "plugin://low-can-callbacks/subscribeToLow", "args": { @@ -19,9 +13,9 @@ "api": "gps", "info": "Low level binding which retrieve Satellite positionning values", "init": { - "function": "api://gps/location", + "function": "api://gps/subscribe", "args": { - "arg1": "first argument" + "value": "location" } }, "getSignals": { diff --git a/conf.d/project/lua.d/00-viwi-low-can.lua b/conf.d/project/lua.d/00-viwi-low-can.lua deleted file mode 100644 index b13863a..0000000 --- a/conf.d/project/lua.d/00-viwi-low-can.lua +++ /dev/null @@ -1,27 +0,0 @@ ---[[ - Copyright (C) 2017 "IoT.bzh" - Author Romain Forlot <romain.forlot@iot.bzh> - - 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. ---]] - -function _SubscribeLowCan (request, args) - - AFB:notice ("_We gonna subscribe to %s", args) - local err, result= AFB:servsync ("low-can","subscribe", args) - if (err) then - AFB:fail ("AFB:service_call_sync fail"); - else - AFB:success (request, result["response"]) - end -end diff --git a/conf.d/project/lua.d/doscript-helloworld.lua b/conf.d/project/lua.d/doscript-helloworld.lua deleted file mode 100644 index e722db7..0000000 --- a/conf.d/project/lua.d/doscript-helloworld.lua +++ /dev/null @@ -1,36 +0,0 @@ ---[[ - Copyright (C) 2016 "IoT.bzh" - Author Fulup Ar Foll <fulup@iot.bzh> - - 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. - - - Simple API script to be use with AGL control LuaDoCall API - - After the script is loaded by lua_docall - - Controller start function=xxxx where xxxx is taken from script filename doscript-xxxx-anything - ---]] - -function _helloworld (request, query) - - AFB:notice ("LUA HelloWorld: Simple test query=%s", query); - - if (query == nil) then - AFB:notice ("LUA HelloWorld:FX query should not be empty"); - AFB:fail (request, "LUA HelloWorld: query should not be empty"); - else - AFB:notice ("LUA HelloWorld:OK query=%s", query); - AFB:success (request, {arg0="Demat", arg1="Bonjours", arg2="Gootentag", arg3="Morning"}); - end - -end diff --git a/conf.d/project/lua.d/onload-daemon-00-utils.lua b/conf.d/project/lua.d/init-daemon-00-utils.lua index 29d2c70..29d2c70 100644 --- a/conf.d/project/lua.d/onload-daemon-00-utils.lua +++ b/conf.d/project/lua.d/init-daemon-00-utils.lua diff --git a/conf.d/project/lua.d/onload-daemon-01-init.lua b/conf.d/project/lua.d/init-daemon-01-init.lua index 26ff08a..0b8a923 100644 --- a/conf.d/project/lua.d/onload-daemon-01-init.lua +++ b/conf.d/project/lua.d/init-daemon-01-init.lua @@ -27,8 +27,8 @@ _Global_Context={} is save into _Global_Context for further use. Note: init functions are not call from a client and thus do not receive query - --]] + function _Sample_Controller_Init(source, control) printf ("[-- Sample_Controller_Init --] source=%d control=%s", source, Dump_Table(control)) @@ -44,5 +44,4 @@ function _Sample_Controller_Init(source, control) -- just for fun create an event _Global_Context["event"]=AFB:evtmake(control["zzzz"]) - end diff --git a/conf.d/project/lua.d/onload-daemon-03-controls.lua b/conf.d/project/lua.d/init-daemon-03-controls.lua index cc13e0f..cc13e0f 100644 --- a/conf.d/project/lua.d/onload-daemon-03-controls.lua +++ b/conf.d/project/lua.d/init-daemon-03-controls.lua diff --git a/conf.d/project/lua.d/onload-daemon-04-oncall.lua b/conf.d/project/lua.d/init-daemon-04-oncall.lua index 7c0e9bc..ae16aa7 100644 --- a/conf.d/project/lua.d/onload-daemon-04-oncall.lua +++ b/conf.d/project/lua.d/init-daemon-04-oncall.lua @@ -21,12 +21,59 @@ --global counter to keep track of calls _count=0 + +_interval={ + {"km/h",1}, --the "1" should never really get used but + {"mi/h",0.62137119223733}, + {"m/s",0.27777777777778}, +} + +_positions={} +for i=1,3 do + _positions[_interval[i][1]]=i +end + +--function _Unit_Converter(value, sourceunits, targetunits) +function _Unit_Converter(source, args, event) + local value = event["value"] + local sourceunits = args["from"] + local targetunits = args["to"] + local sourcei, targeti = _positions[sourceunits], _positions[targetunits] + assert(sourcei and targeti) + + AFB:notice("LUA OnCall Echo Args source=%s args=%s event=%s", source, args, event) + + if sourcei<targeti then + + local base=1 + for i=sourcei+1,targeti do + base=base*_interval[i][2] + end + + print("Value in", targetunits, "is", value/base) + + elseif sourcei>targeti then + + local base=1 + for i=targeti+1,sourcei do + base=base*interval[i][2] + end + + print("Value in ", targetunits, "is", value*base) + + else + print("No conversion") + end +end + -- Display receive arguments and echo them to caller -function _LUA_Simple_Echo_Args (request, args) +function _Simple_Echo_Args (source, args, event) _count=_count+1 - AFB:notice("LUA OnCall Echo Args count=%d args=%s", count, args) + AFB:notice("LUA OnCall Echo Args count=%d args=%s event=%s", count, args, event) + print ("--inlua-- source=", Dump_Table(source)) print ("--inlua-- args=", Dump_Table(args)) + print ("--inlua-- event=", Dump_Table(event)) local response={ ["count"]=_count, @@ -34,7 +81,7 @@ function _LUA_Simple_Echo_Args (request, args) } -- fulup Embdeded table ToeDone AFB:success (request, response) - AFB:success (request, {["func"]="Simple_Echo_Args", ["ret1"]=5678, ["ret2"]="abcd"}) + -- AFB:success (request, response) end local function Test_Async_CB (request, result, context) diff --git a/conf.d/project/lua.d/onload-daemon-10-event.lua b/conf.d/project/lua.d/init-daemon-10-event.lua index 474ebe0..474ebe0 100644 --- a/conf.d/project/lua.d/onload-daemon-10-event.lua +++ b/conf.d/project/lua.d/init-daemon-10-event.lua |