From 05d31a77fb2742d4aedd26a13454b21b5df83b20 Mon Sep 17 00:00:00 2001 From: Yuichi Kusakabe Date: Fri, 1 Sep 2017 20:10:00 +0900 Subject: Add get() and list() API This patch is porting AMB get() and list() API. Change-Id: Ic1d391219f1d64ab127bc1977a5b198abe0fc94b Signed-off-by: Yuichi Kusakabe --- low-can-binding/binding/low-can-cb.cpp | 110 ++++++++++++++++++++++++++++++++ low-can-binding/binding/low-can-hat.cpp | 2 + low-can-binding/binding/low-can-hat.hpp | 2 + 3 files changed, 114 insertions(+) diff --git a/low-can-binding/binding/low-can-cb.cpp b/low-can-binding/binding/low-can-cb.cpp index 0bb5503..1b7ce10 100644 --- a/low-can-binding/binding/low-can-cb.cpp +++ b/low-can-binding/binding/low-can-cb.cpp @@ -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); +} diff --git a/low-can-binding/binding/low-can-hat.cpp b/low-can-binding/binding/low-can-hat.cpp index ae16f5d..2b5baa3 100644 --- a/low-can-binding/binding/low-can-hat.cpp +++ b/low-can-binding/binding/low-can-hat.cpp @@ -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} }; diff --git a/low-can-binding/binding/low-can-hat.hpp b/low-can-binding/binding/low-can-hat.hpp index 162a8e5..1f550a8 100644 --- a/low-can-binding/binding/low-can-hat.hpp +++ b/low-can-binding/binding/low-can-hat.hpp @@ -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); -- cgit 1.2.3-korg