From 7f15ef65f420179b606f136ed805fae9d320b321 Mon Sep 17 00:00:00 2001 From: Romain Forlot Date: Sun, 22 Jul 2018 01:13:17 +0200 Subject: Improved performance Before value was translated to a C type variable two times, at the reception then at the emission. Now it just receives and sends the signal value without translation nor interpretation except if you ask for an average, minimum or maximum value. Then in those cases it interprets the json to return you a value or an error if there is no numeric values to compute. Remove unneeded log message at event reception. Improved signal search engine, will search in source's signals map by the signal ID not the event name which lead to a more direct map match. Bugs-AGL: SPEC-1612 Depends-On: I43e79ed73a507ac2ca7ed4cdc3f16ec009392194 Change-Id: Ie253c3fe1e8cde42dabe8832da74e9f9bf442c14 Signed-off-by: Romain Forlot --- plugins/builtin.cpp | 14 +++++--------- plugins/gps.cpp | 2 +- plugins/low-can.cpp | 34 ++++++++++++++++++---------------- 3 files changed, 24 insertions(+), 26 deletions(-) (limited to 'plugins') diff --git a/plugins/builtin.cpp b/plugins/builtin.cpp index e56d413..28bcba7 100644 --- a/plugins/builtin.cpp +++ b/plugins/builtin.cpp @@ -32,27 +32,23 @@ CTLP_LUA_REGISTER("builtin"); CTLP_LUA2C (setSignalValueWrap, source, argsJ, responseJ) { const char* name = nullptr; - double resultNum; + json_object* resultNumJ; uint64_t timestamp; struct signalCBT* ctx = (struct signalCBT*)source->context; - if(! wrap_json_unpack(argsJ, "{ss, sF, sI? !}", + if(! wrap_json_unpack(argsJ, "{ss, so, sI? !}", "name", &name, - "value", &resultNum, + "value", &resultNumJ, "timestamp", ×tamp)) { - *responseJ = json_object_new_string("Fail to unpack JSON arguments value"); return -1; } - *responseJ = json_object_new_string(json_object_to_json_string(argsJ)); - - struct signalValue result = resultNum; if(ctx->aSignal) - {ctx->setSignalValue(ctx->aSignal, timestamp*NANO, result);} + ctx->setSignalValue(ctx->aSignal, timestamp*NANO, resultNumJ); else - {ctx->searchNsetSignalValue(name, timestamp*NANO, result);} + ctx->searchNsetSignalValue(name, timestamp*NANO, resultNumJ); return 0; } diff --git a/plugins/gps.cpp b/plugins/gps.cpp index 646754a..4913f31 100644 --- a/plugins/gps.cpp +++ b/plugins/gps.cpp @@ -59,7 +59,7 @@ CTLP_CAPI (getHeading, source, argsJ, eventJ) { if(coordUpdated) { heading = round(r2d * atan2((curLon - prvLon) * cos(d2r * curLat), curLat - prvLat)); - ctx->setSignalValue(ctx->aSignal, 0, heading); + ctx->setSignalValue(ctx->aSignal, 0, json_object_new_double(heading)); } AFB_NOTICE("======== Heading: %f", heading); diff --git a/plugins/low-can.cpp b/plugins/low-can.cpp index 7bbe763..5153ee9 100644 --- a/plugins/low-can.cpp +++ b/plugins/low-can.cpp @@ -31,8 +31,8 @@ extern "C" CTLP_CAPI_REGISTER("low-can"); typedef struct { - bool door; - bool window; + json_object* door; + json_object* window; } doorT; typedef struct { @@ -47,11 +47,13 @@ struct pluginCtxT { allDoorsCtxT allDoorsCtx; }; -void setDoor(doorT* aDoor, const char* eventName, int eventStatus) +void setDoor(doorT* aDoor, const char* eventName, json_object* eventStatus) { - if(strcasestr(eventName, "door")) {aDoor->door = eventStatus;} - else if(strcasestr(eventName, "window")) {aDoor->window = eventStatus;} - else {AFB_WARNING("Unexpected behavior, this '%s' is not a door ! ", eventName);} + if(json_object_is_type(eventStatus, json_type_boolean)) { + if(strcasestr(eventName, "door")) aDoor->door = eventStatus; + else if(strcasestr(eventName, "window")) aDoor->window = eventStatus; + else AFB_WARNING("Unexpected behavior, this '%s' is not a door ! ", eventName); + } } // Call at initialisation time @@ -132,12 +134,12 @@ CTLP_CAPI (subscribeToLow, source, argsJ, eventJ) { CTLP_CAPI (isOpen, source, argsJ, eventJ) { const char *eventName = nullptr; - int eventStatus; + json_object *eventStatus; uint64_t timestamp; struct signalCBT* context = reinterpret_cast(source->context); struct pluginCtxT* pluginCtx = reinterpret_cast(context->pluginCtx); - int err = wrap_json_unpack(eventJ, "{ss,sb,s?I}", + int err = wrap_json_unpack(eventJ, "{ss,so,s?I}", "name", &eventName, "value", &eventStatus, "timestamp", ×tamp); @@ -177,14 +179,14 @@ CTLP_CAPI (isOpen, source, argsJ, eventJ) { source->uid, argsJ ? json_object_to_json_string(argsJ):"", eventJ ? json_object_to_json_string(eventJ):"", - pluginCtx->allDoorsCtx.front_left.door ? "true":"false", - pluginCtx->allDoorsCtx.front_left.window ? "true":"false", - pluginCtx->allDoorsCtx.front_right.door ? "true":"false", - pluginCtx->allDoorsCtx.front_right.window ? "true":"false", - pluginCtx->allDoorsCtx.rear_left.door ? "true":"false", - pluginCtx->allDoorsCtx.rear_left.window ? "true":"false", - pluginCtx->allDoorsCtx.rear_right.door ? "true":"false", - pluginCtx->allDoorsCtx.rear_right.window ? "true":"false" + json_object_get_string(pluginCtx->allDoorsCtx.front_left.door), + json_object_get_string(pluginCtx->allDoorsCtx.front_left.window), + json_object_get_string(pluginCtx->allDoorsCtx.front_right.door), + json_object_get_string(pluginCtx->allDoorsCtx.front_right.window), + json_object_get_string(pluginCtx->allDoorsCtx.rear_left.door), + json_object_get_string(pluginCtx->allDoorsCtx.rear_left.window), + json_object_get_string(pluginCtx->allDoorsCtx.rear_right.door), + json_object_get_string(pluginCtx->allDoorsCtx.rear_right.window) ); return 0; -- cgit 1.2.3-korg