summaryrefslogtreecommitdiffstats
path: root/conf.d
diff options
context:
space:
mode:
Diffstat (limited to 'conf.d')
m---------conf.d/app-templates0
-rwxr-xr-xconf.d/autobuild/agl/autobuild8
-rwxr-xr-xconf.d/autobuild/linux/autobuild8
-rw-r--r--conf.d/cmake/00-debian-osconfig.cmake1
-rw-r--r--conf.d/cmake/00-default-osconfig.cmake1
-rw-r--r--conf.d/cmake/00-suse-config.cmake3
-rw-r--r--conf.d/cmake/config.cmake2
-rw-r--r--conf.d/cmake/low-can.c157
-rw-r--r--conf.d/project/etc/init-daemon.json4
-rw-r--r--conf.d/project/etc/sig-demoboard.json7
-rw-r--r--conf.d/project/etc/sources.json10
-rw-r--r--conf.d/project/lua.d/00-viwi-low-can.lua27
-rw-r--r--conf.d/project/lua.d/doscript-helloworld.lua36
-rw-r--r--conf.d/project/lua.d/init-daemon-00-utils.lua (renamed from conf.d/project/lua.d/onload-daemon-00-utils.lua)0
-rw-r--r--conf.d/project/lua.d/init-daemon-01-init.lua (renamed from conf.d/project/lua.d/onload-daemon-01-init.lua)3
-rw-r--r--conf.d/project/lua.d/init-daemon-03-controls.lua (renamed from conf.d/project/lua.d/onload-daemon-03-controls.lua)0
-rw-r--r--conf.d/project/lua.d/init-daemon-04-oncall.lua (renamed from conf.d/project/lua.d/onload-daemon-04-oncall.lua)53
-rw-r--r--conf.d/project/lua.d/init-daemon-10-event.lua (renamed from conf.d/project/lua.d/onload-daemon-10-event.lua)0
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", &timestamp);
+ 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