diff options
author | Romain Forlot <romain.forlot@iot.bzh> | 2017-09-18 14:30:01 +0200 |
---|---|---|
committer | Romain Forlot <romain.forlot@iot.bzh> | 2017-12-14 11:00:25 +0100 |
commit | c7d508ecd4c57b1f8f372f4e5042d834b7f42ff4 (patch) | |
tree | c96a5a03cea86db6266204b8d4efd371e5664321 /plugins/low-can.cpp | |
parent | 08571bc92a047bac2de2f2f133277e6b1fa4ffb6 (diff) |
Make callback from plugin work
Can't shared C++ symbol easily with plugin so workaround
with a separate static function that handle the job
Change-Id: I1208b51bc47c2daa5f08e10b25260cf206f90aed
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'plugins/low-can.cpp')
-rw-r--r-- | plugins/low-can.cpp | 81 |
1 files changed, 47 insertions, 34 deletions
diff --git a/plugins/low-can.cpp b/plugins/low-can.cpp index 8479a47..1f528a5 100644 --- a/plugins/low-can.cpp +++ b/plugins/low-can.cpp @@ -47,10 +47,17 @@ typedef struct { } allDoorsCtxT; typedef struct { - bindingApp* bApp; + struct pluginCBT* pluginHandle; allDoorsCtxT allDoorsCtx; } lowCANCtxT; +void setDoor(doorT* aDoor, const char* eventName, int 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);} +} + // Call at initialisation time CTLP_ONLOAD(plugin, bAppHandle) { @@ -59,7 +66,7 @@ CTLP_ONLOAD(plugin, bAppHandle) ::memset(&allDoorsCtx, 0, sizeof(allDoorsCtxT)); pluginCtx->allDoorsCtx = allDoorsCtx; - pluginCtx->bApp = (bindingApp*)bAppHandle; + pluginCtx->pluginHandle = (struct pluginCBT*)bAppHandle; AFB_NOTICE ("Low-can plugin: label='%s' version='%s' info='%s'", plugin->label, @@ -115,26 +122,12 @@ CTLP_CAPI (subscribeToLow, source, argsJ, eventJ, context) { } CTLP_CAPI (isOpen, source, argsJ, eventJ, context) { - const char* eventName; - bool eventStatus; + const char *eventName = nullptr; + int eventStatus; double timestamp; - lowCANCtxT *pluginCtx=(lowCANCtxT*)context; - - AFB_NOTICE("This 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), - 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" - ); - - int err = wrap_json_unpack(eventJ, "{ss,s?b,s?F}", + lowCANCtxT *pluginCtx=(lowCANCtxT*)source->context; + + int err = wrap_json_unpack(eventJ, "{ss,sb,s?F}", "name", &eventName, "value", &eventStatus, "timestamp", ×tamp); @@ -144,32 +137,52 @@ CTLP_CAPI (isOpen, source, argsJ, eventJ, context) { return -1; } + struct SignalValue value = { + .hasBool = true, .boolVal = eventStatus, + .hasNum = false, .numVal = 0, + .hasStr = false, .strVal = std::string() + }; if(strcasestr(eventName, "front_left")) { - if(strcasestr(eventName, "door")) {pluginCtx->allDoorsCtx.front_left.door = eventStatus;} - else if(strcasestr(eventName, "window")) {pluginCtx->allDoorsCtx.front_left.window = eventStatus;} - else {AFB_WARNING("Unexpected behavior, this '%s' is not a door ! ", json_object_to_json_string(eventJ));} + pluginCtx->pluginHandle->setSignalValue(eventName,(long long int)timestamp, value); + setDoor(&pluginCtx->allDoorsCtx.front_left, eventName, eventStatus); } else if(strcasestr(eventName, "front_right")) { - if(strcasestr(eventName, "door")) {pluginCtx->allDoorsCtx.front_right.door = eventStatus;} - else if(strcasestr(eventName, "window")) {pluginCtx->allDoorsCtx.front_right.window = eventStatus;} - else {AFB_WARNING("Unexpected behavior, this '%s' is not a door ! ", json_object_to_json_string(eventJ));} + pluginCtx->pluginHandle->setSignalValue(eventName,(long long int)timestamp, value); + setDoor(&pluginCtx->allDoorsCtx.front_right, eventName, eventStatus); } else if(strcasestr(eventName, "rear_left")) { - if(strcasestr(eventName, "door")) {pluginCtx->allDoorsCtx.rear_left.door = eventStatus;} - else if(strcasestr(eventName, "window")) {pluginCtx->allDoorsCtx.rear_left.window = eventStatus;} - else {AFB_WARNING("Unexpected behavior, this '%s' is not a door ! ", json_object_to_json_string(eventJ));} + pluginCtx->pluginHandle->setSignalValue(eventName,(long long int)timestamp, value); + setDoor(&pluginCtx->allDoorsCtx.rear_left, eventName, eventStatus); } else if(strcasestr(eventName, "rear_right")) { - if(strcasestr(eventName, "door")) {pluginCtx->allDoorsCtx.rear_right.door = eventStatus;} - else if(strcasestr(eventName, "window")) {pluginCtx->allDoorsCtx.rear_right.window = eventStatus;} - else {AFB_WARNING("Unexpected behavior, this '%s' is not a door ! ", json_object_to_json_string(eventJ));} + pluginCtx->pluginHandle->setSignalValue(eventName,(long long int)timestamp, value); + setDoor(&pluginCtx->allDoorsCtx.rear_right, eventName, eventStatus); + } + else + { + AFB_WARNING("Unexpected behavior, this '%s' is it really a door ! ", json_object_to_json_string(eventJ)); + return -1; } - else {AFB_WARNING("Unexpected behavior, this '%s' is not a door ! ", json_object_to_json_string(eventJ));} + + AFB_DEBUG("This 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), + 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" +); return 0; } + } |