Add get() and list() API 55/10755/3
authorYuichi Kusakabe <yuichi.kusakabe@jp.fujitsu.com>
Fri, 1 Sep 2017 11:10:00 +0000 (20:10 +0900)
committerRomain Forlot <romain.forlot@iot.bzh>
Fri, 1 Sep 2017 13:10:27 +0000 (13:10 +0000)
This patch is porting AMB get() and list() API.

Change-Id: Ic1d391219f1d64ab127bc1977a5b198abe0fc94b
Signed-off-by: Yuichi Kusakabe <yuichi.kusakabe@jp.fujitsu.com>
low-can-binding/binding/low-can-cb.cpp
low-can-binding/binding/low-can-hat.cpp
low-can-binding/binding/low-can-hat.hpp

index 0bb5503..1b7ce10 100644 (file)
@@ -514,3 +514,113 @@ void write(struct afb_req request)
        else
                afb_req_fail(request, "error", NULL);
 }
+
+static struct json_object *get_signals_value(const std::string& name)
+{
+       struct utils::signals_found sf;
+       struct json_object *ans = nullptr;
+
+       openxc_DynamicField search_key = build_DynamicField(name);
+       sf = utils::signals_manager_t::instance().find_signals(search_key);
+
+       if (sf.can_signals.empty())
+       {
+               AFB_WARNING("No signal(s) found for %s.", name.c_str());
+               return NULL;
+       }
+       ans = json_object_new_array();
+       for(const auto& sig: sf.can_signals)
+       {
+               struct json_object *jobj = json_object_new_object();
+               json_object_object_add(jobj, "event", json_object_new_string(sig->get_name().c_str()));
+               json_object_object_add(jobj, "value", json_object_new_double(sig->get_last_value()));
+               json_object_array_add(ans, jobj);
+       }
+
+       return ans;
+}
+void get(struct afb_req request)
+{
+       int rc = 0;
+       struct json_object* args = nullptr,
+               *json_name = nullptr;
+       json_object *ans = nullptr;
+
+       args = afb_req_json(request);
+
+       // Process about Raw CAN message on CAN bus directly
+       if (args != nullptr &&
+               (json_object_object_get_ex(args, "event", &json_name) && json_object_is_type(json_name, json_type_string) ))
+       {
+               ans = get_signals_value(json_object_get_string(json_name));
+               if (!ans)
+                       rc = -1;
+       }
+       else
+       {
+               AFB_ERROR("Request argument malformed. Please use the following syntax:");
+               rc = -1;
+       }
+
+       if (rc >= 0)
+               afb_req_success(request, ans, NULL);
+       else
+               afb_req_fail(request, "error", NULL);
+}
+
+
+static struct json_object *list_can_message(const std::string& name)
+{
+       struct utils::signals_found sf;
+       struct json_object *ans = nullptr;
+
+       openxc_DynamicField search_key = build_DynamicField(name);
+       sf = utils::signals_manager_t::instance().find_signals(search_key);
+
+       if (sf.can_signals.empty() && sf.diagnostic_messages.empty())
+       {
+               AFB_WARNING("No signal(s) found for %s.", name.c_str());
+               return NULL;
+       }
+       ans = json_object_new_array();
+       for(const auto& sig: sf.can_signals)
+       {
+               json_object_array_add(ans,
+                       json_object_new_string(sig->get_name().c_str()));
+       }
+       for(const auto& sig: sf.diagnostic_messages)
+       {
+               json_object_array_add(ans,
+                       json_object_new_string(sig->get_name().c_str()));
+       }
+
+       return ans;
+}
+
+void list(struct afb_req request)
+{
+       int rc = 0;
+       json_object *ans = nullptr;
+       struct json_object* args = nullptr,
+               *json_name = nullptr;
+       args = afb_req_json(request);
+       const char *name;
+       if ((args != nullptr) &&
+               (json_object_object_get_ex(args, "event", &json_name) && json_object_is_type(json_name, json_type_string)))
+       {
+               name = json_object_get_string(json_name);
+       }
+       else
+       {
+               name = "*";
+       }
+
+       ans = list_can_message(name);
+       if (!ans)
+               rc = -1;
+
+       if (rc >= 0)
+               afb_req_success(request, ans, NULL);
+       else
+               afb_req_fail(request, "error", NULL);
+}
index ae16f5d..2b5baa3 100644 (file)
@@ -57,6 +57,8 @@ extern "C"
                { .verb= "subscribe", .callback= subscribe, .auth= NULL, .info="Let subscribe to signals", .session= AFB_SESSION_NONE},
                { .verb= "unsubscribe", .callback= unsubscribe, .auth= NULL, .info="Let unsubscribe signals", .session= AFB_SESSION_NONE},
                { .verb= "write", .callback= write, .auth= &afb_auth_loa_1, .info="Write a single CAN message on a CAN bus", .session= AFB_SESSION_LOA_1},
+               { .verb= "get", .callback= get, .auth=NULL, .info="get a current value of CAN message", .session= AFB_SESSION_NONE},
+               { .verb= "list",.callback= list, .auth=NULL, .info="get a supported CAN message list", .session= AFB_SESSION_NONE},
                { .verb= NULL, .callback= NULL, .auth= NULL, .info=NULL, .session= 0}
        };
 
index 162a8e5..1f550a8 100644 (file)
@@ -40,3 +40,5 @@ void auth(struct afb_req request);
 void subscribe(struct afb_req request);
 void unsubscribe(struct afb_req request);
 void write(struct afb_req request);
+void get(struct afb_req request);
+void list(struct afb_req request);