diff options
author | Romain Forlot <romain.forlot@iot.bzh> | 2017-05-05 18:31:41 +0200 |
---|---|---|
committer | Romain Forlot <romain.forlot@iot.bzh> | 2017-05-05 18:31:41 +0200 |
commit | 692376f019562e48ddef074b427f2397cae25087 (patch) | |
tree | 7c5ba2532b021c9b822676af19dd28a63b7691ab /CAN-binder/low-can-binding/binding | |
parent | e49eed2b1fffced9f5f8d2b997bb6b987cf208f3 (diff) |
Separation between hat and callback binding parts
As well as handling reading signals BCM socket using systemd event loop.
Change-Id: I1e121635ec5db489b2bcb88a3101e716bf8883d5
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'CAN-binder/low-can-binding/binding')
-rw-r--r-- | CAN-binder/low-can-binding/binding/configuration.hpp | 2 | ||||
-rw-r--r-- | CAN-binder/low-can-binding/binding/low-can-cb.cpp (renamed from CAN-binder/low-can-binding/binding/low-can-binding.cpp) | 120 | ||||
-rw-r--r-- | CAN-binder/low-can-binding/binding/low-can-hat.cpp | 86 | ||||
-rw-r--r-- | CAN-binder/low-can-binding/binding/low-can-hat.hpp (renamed from CAN-binder/low-can-binding/binding/low-can-binding.hpp) | 5 |
4 files changed, 129 insertions, 84 deletions
diff --git a/CAN-binder/low-can-binding/binding/configuration.hpp b/CAN-binder/low-can-binding/binding/configuration.hpp index ab799e81..10bdf4b4 100644 --- a/CAN-binder/low-can-binding/binding/configuration.hpp +++ b/CAN-binder/low-can-binding/binding/configuration.hpp @@ -27,7 +27,7 @@ #include "../can/can-message.hpp" #include "../diagnostic/diagnostic-manager.hpp" -#include "low-can-binding.hpp" +#include "low-can-hat.hpp" /// /// @brief Class representing a configuration attached to the binding. diff --git a/CAN-binder/low-can-binding/binding/low-can-binding.cpp b/CAN-binder/low-can-binding/binding/low-can-cb.cpp index 99d14718..414fa910 100644 --- a/CAN-binder/low-can-binding/binding/low-can-binding.cpp +++ b/CAN-binder/low-can-binding/binding/low-can-cb.cpp @@ -16,16 +16,15 @@ * limitations under the License. */ -#include "low-can-binding.hpp" +#include "low-can-hat.hpp" #include <map> #include <queue> #include <mutex> #include <vector> #include <thread> -#include <time.h> -#include <linux/can.h> #include <json-c/json.h> +#include <systemd/sd-event.h> #include "openxc.pb.h" #include "configuration.hpp" @@ -42,9 +41,6 @@ extern "C" #include <afb/afb-service-itf.h> }; -// Interface between the daemon and the binding -const struct afb_binding_interface *binder_interface; - void on_no_clients(std::string message) { DiagnosticRequest* diag_req = configuration_t::instance().get_request_from_diagnostic_message(message); @@ -56,6 +52,14 @@ void on_no_clients(std::string message) } } +int read(sd_event_source *s, int fd, uint32_t revents, void *userdata) +{ + can_signal_t* sig= (can_signal_t*)userdata; + if(sig->read_socket() != can_message_format_t::ERROR) + return 0; + return -1; +} + ///****************************************************************************** /// /// Subscription and unsubscription @@ -172,11 +176,13 @@ static int subscribe_unsubscribe_signals(struct afb_req request, bool subscribe, for(const auto& sig: signals.can_signals) { - if(conf.get_can_bus_manager().create_rx_filter(*sig) <= 0 && - subscribe_unsubscribe_signal(request, subscribe, sig->get_name()) <=0 ) + if(sig->create_rx_filter() <= 0 && + subscribe_unsubscribe_signal(request, subscribe, sig->get_name()) <=0) { return -1; } + struct sd_event_source* e_source; + sd_event_add_io(afb_daemon_get_event_loop(binder_interface->daemon), &e_source, sig->get_socket().socket(), EPOLLIN, read, sig); rets++; DEBUG(binder_interface, "%s: signal: %s subscribed", __FUNCTION__, sig->get_name().c_str()); } @@ -212,85 +218,35 @@ static const std::vector<std::string> parse_args_from_request(struct afb_req req return ret; } -extern "C" +void subscribe(struct afb_req request) { - static void subscribe(struct afb_req request) - { - std::vector<std::string> args; - struct utils::signals_found sf; - int ok = 0, total = 0; - bool subscribe = true; + std::vector<std::string> args; + struct utils::signals_found sf; + int ok = 0, total = 0; + bool subscribe = true; - args = parse_args_from_request(request, subscribe); - - for(const auto& sig: args) - { - openxc_DynamicField search_key = build_DynamicField(sig); - sf = utils::signals_manager_t::instance().find_signals(search_key); - total = (int)sf.can_signals.size() + (int)sf.diagnostic_messages.size(); - - if (sf.can_signals.empty() && sf.diagnostic_messages.empty()) - NOTICE(binder_interface, "%s: No signal(s) found for %s.", __FUNCTION__, sig.c_str()); - else - ok = subscribe_unsubscribe_signals(request, subscribe, sf); - } - - NOTICE(binder_interface, "%s: Subscribed/unsubscribe correctly to %d/%d signal(s).", __FUNCTION__, ok, total); - if (ok > 0) - afb_req_success(request, NULL, NULL); - else - afb_req_fail(request, "error", NULL); - } - - static void unsubscribe(struct afb_req request) - { - parse_args_from_request(request, false); - } + args = parse_args_from_request(request, subscribe); - static const struct afb_verb_desc_v1 verbs[]= + for(const auto& sig: args) { - { .name= "subscribe", .session= AFB_SESSION_NONE, .callback= subscribe, .info= "subscribe to notification of CAN bus messages." }, - { .name= "unsubscribe", .session= AFB_SESSION_NONE, .callback= unsubscribe, .info= "unsubscribe a previous subscription." } - }; + openxc_DynamicField search_key = build_DynamicField(sig); + sf = utils::signals_manager_t::instance().find_signals(search_key); + total = (int)sf.can_signals.size() + (int)sf.diagnostic_messages.size(); - static const struct afb_binding binding_desc { - AFB_BINDING_VERSION_1, - { - "Low level CAN bus service", - "low-can", - verbs - } - }; - - const struct afb_binding *afbBindingV1Register (const struct afb_binding_interface *itf) - { - binder_interface = itf; - - return &binding_desc; + if (sf.can_signals.empty() && sf.diagnostic_messages.empty()) + NOTICE(binder_interface, "%s: No signal(s) found for %s.", __FUNCTION__, sig.c_str()); + else + ok = subscribe_unsubscribe_signals(request, subscribe, sf); } - /// @brief Initialize the binding. - /// - /// @param[in] service Structure which represent the Application Framework Binder. - /// - /// @return Exit code, zero if success. - int afbBindingV1ServiceInit(struct afb_service service) - { - can_bus_t& can_bus_manager = configuration_t::instance().get_can_bus_manager(); - - /// Initialize CAN socket - if(can_bus_manager.init_can_dev() == 0) - { - can_bus_manager.start_threads(); - - /// Initialize Diagnostic manager that will handle obd2 requests. - /// We pass by default the first CAN bus device to its Initialization. - /// TODO: be able to choose the CAN bus device that will be use as Diagnostic bus. - if(configuration_t::instance().get_diagnostic_manager().initialize()) - return 0; - } + NOTICE(binder_interface, "%s: Subscribed/unsubscribe correctly to %d/%d signal(s).", __FUNCTION__, ok, total); + if (ok > 0) + afb_req_success(request, NULL, NULL); + else + afb_req_fail(request, "error", NULL); +} - ERROR(binder_interface, "%s: There was something wrong with CAN device Initialization. Check your config file maybe", __FUNCTION__); - return 1; - } -}; + void unsubscribe(struct afb_req request) +{ + parse_args_from_request(request, false); +}
\ No newline at end of file diff --git a/CAN-binder/low-can-binding/binding/low-can-hat.cpp b/CAN-binder/low-can-binding/binding/low-can-hat.cpp new file mode 100644 index 00000000..b115a964 --- /dev/null +++ b/CAN-binder/low-can-binding/binding/low-can-hat.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2015, 2016 "IoT.bzh" + * Author "Romain Forlot" <romain.forlot@iot.bzh> + * Author "Loic Collignon" <loic.collignon@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. + */ + +#include "low-can-hat.hpp" + +#include <map> +#include <queue> +#include <mutex> +#include <vector> +#include <json-c/json.h> + +#include "configuration.hpp" +#include "../can/can-bus.hpp" + +extern "C" +{ + #include <afb/afb-service-itf.h> +}; + +// Interface between the daemon and the binding +const struct afb_binding_interface *binder_interface; + +extern "C" +{ + static const struct afb_verb_desc_v1 verbs[]= + { + { .name= "subscribe", .session= AFB_SESSION_NONE, .callback= subscribe, .info= "subscribe to notification of CAN bus messages." }, + { .name= "unsubscribe", .session= AFB_SESSION_NONE, .callback= unsubscribe, .info= "unsubscribe a previous subscription." } + }; + + static const struct afb_binding binding_desc { + AFB_BINDING_VERSION_1, + { + "Low level CAN bus service", + "low-can", + verbs + } + }; + + const struct afb_binding *afbBindingV1Register (const struct afb_binding_interface *itf) + { + binder_interface = itf; + + return &binding_desc; + } + + /// @brief Initialize the binding. + /// + /// @param[in] service Structure which represent the Application Framework Binder. + /// + /// @return Exit code, zero if success. + int afbBindingV1ServiceInit(struct afb_service service) + { + can_bus_t& can_bus_manager = configuration_t::instance().get_can_bus_manager(); + + /// Initialize CAN socket + if(can_bus_manager.init_can_dev() == 0) + { + can_bus_manager.start_threads(); + + /// Initialize Diagnostic manager that will handle obd2 requests. + /// We pass by default the first CAN bus device to its Initialization. + /// TODO: be able to choose the CAN bus device that will be use as Diagnostic bus. + if(configuration_t::instance().get_diagnostic_manager().initialize()) + return 0; + } + + ERROR(binder_interface, "%s: There was something wrong with CAN device Initialization. Check your config file maybe", __FUNCTION__); + return 1; + } +}; diff --git a/CAN-binder/low-can-binding/binding/low-can-binding.hpp b/CAN-binder/low-can-binding/binding/low-can-hat.hpp index ed5741d8..7df4663c 100644 --- a/CAN-binder/low-can-binding/binding/low-can-binding.hpp +++ b/CAN-binder/low-can-binding/binding/low-can-hat.hpp @@ -30,4 +30,7 @@ extern "C" struct afb_binding_interface; extern const struct afb_binding_interface *binder_interface; -void on_no_clients(std::string message);
\ No newline at end of file +void on_no_clients(std::string message); + +void subscribe(struct afb_req request); +void unsubscribe(struct afb_req request);
\ No newline at end of file |