From 692376f019562e48ddef074b427f2397cae25087 Mon Sep 17 00:00:00 2001 From: Romain Forlot Date: Fri, 5 May 2017 18:31:41 +0200 Subject: [PATCH] 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 --- .../low-can-binding/binding/configuration.hpp | 2 +- .../{low-can-binding.cpp => low-can-cb.cpp} | 120 +++++++-------------- CAN-binder/low-can-binding/binding/low-can-hat.cpp | 86 +++++++++++++++ .../{low-can-binding.hpp => low-can-hat.hpp} | 5 +- CAN-binder/low-can-binding/can/can-bus-dev.cpp | 4 +- CAN-binder/low-can-binding/can/can-bus.hpp | 2 +- CAN-binder/low-can-binding/can/can-decoder.cpp | 2 +- CAN-binder/low-can-binding/can/can-message.cpp | 2 +- CAN-binder/low-can-binding/utils/config-parser.cpp | 2 +- CAN-binder/low-can-binding/utils/signals.hpp | 2 +- CAN-binder/low-can-binding/utils/socketcan.hpp | 2 +- 11 files changed, 136 insertions(+), 93 deletions(-) rename CAN-binder/low-can-binding/binding/{low-can-binding.cpp => low-can-cb.cpp} (70%) create mode 100644 CAN-binder/low-can-binding/binding/low-can-hat.cpp rename CAN-binder/low-can-binding/binding/{low-can-binding.hpp => low-can-hat.hpp} (88%) 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 similarity index 70% rename from CAN-binder/low-can-binding/binding/low-can-binding.cpp rename to 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 #include #include #include #include -#include -#include #include +#include #include "openxc.pb.h" #include "configuration.hpp" @@ -42,9 +41,6 @@ extern "C" #include }; -// 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 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 args; - struct utils::signals_found sf; - int ok = 0, total = 0; - bool subscribe = true; + std::vector 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" + * Author "Loic Collignon" + * + * 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 +#include +#include +#include +#include + +#include "configuration.hpp" +#include "../can/can-bus.hpp" + +extern "C" +{ + #include +}; + +// 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 similarity index 88% rename from CAN-binder/low-can-binding/binding/low-can-binding.hpp rename to 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 diff --git a/CAN-binder/low-can-binding/can/can-bus-dev.cpp b/CAN-binder/low-can-binding/can/can-bus-dev.cpp index 7155a72d..bc6f8583 100644 --- a/CAN-binder/low-can-binding/can/can-bus-dev.cpp +++ b/CAN-binder/low-can-binding/can/can-bus-dev.cpp @@ -24,9 +24,7 @@ #include "can-bus.hpp" #include "can-message.hpp" -#include "../binding/low-can-binding.hpp" -#include "canutil/write.h" -#include "bitfield/bitfield.h" +#include "../binding/low-can-hat.hpp" /// @brief Class constructor /// diff --git a/CAN-binder/low-can-binding/can/can-bus.hpp b/CAN-binder/low-can-binding/can/can-bus.hpp index 3fcc29fc..f6a3745e 100644 --- a/CAN-binder/low-can-binding/can/can-bus.hpp +++ b/CAN-binder/low-can-binding/can/can-bus.hpp @@ -30,7 +30,7 @@ #include "can-signals.hpp" #include "../utils/config-parser.hpp" #include "../diagnostic/diagnostic-manager.hpp" -#include "../binding/low-can-binding.hpp" +#include "../binding/low-can-hat.hpp" // TODO actual max is 32 but dropped to 24 for memory considerations #define MAX_ACCEPTANCE_FILTERS 24 diff --git a/CAN-binder/low-can-binding/can/can-decoder.cpp b/CAN-binder/low-can-binding/can/can-decoder.cpp index 9a381113..f36c4b94 100644 --- a/CAN-binder/low-can-binding/can/can-decoder.cpp +++ b/CAN-binder/low-can-binding/can/can-decoder.cpp @@ -20,7 +20,7 @@ #include "canutil/read.h" #include "../utils/openxc-utils.hpp" -#include "../binding/low-can-binding.hpp" +#include "../binding/low-can-hat.hpp" /// @brief Parse the signal's bitfield from the given data and return the raw /// value. diff --git a/CAN-binder/low-can-binding/can/can-message.cpp b/CAN-binder/low-can-binding/can/can-message.cpp index b6e4458b..ac2610e5 100644 --- a/CAN-binder/low-can-binding/can/can-message.cpp +++ b/CAN-binder/low-can-binding/can/can-message.cpp @@ -19,7 +19,7 @@ #include -#include "../binding/low-can-binding.hpp" +#include "../binding/low-can-hat.hpp" /// /// @brief Class constructor diff --git a/CAN-binder/low-can-binding/utils/config-parser.cpp b/CAN-binder/low-can-binding/utils/config-parser.cpp index 60ea1187..9c81afb0 100644 --- a/CAN-binder/low-can-binding/utils/config-parser.cpp +++ b/CAN-binder/low-can-binding/utils/config-parser.cpp @@ -17,7 +17,7 @@ #include "config-parser.hpp" -#include "../binding/low-can-binding.hpp" +#include "../binding/low-can-hat.hpp" namespace utils { diff --git a/CAN-binder/low-can-binding/utils/signals.hpp b/CAN-binder/low-can-binding/utils/signals.hpp index 88b98756..053433ae 100644 --- a/CAN-binder/low-can-binding/utils/signals.hpp +++ b/CAN-binder/low-can-binding/utils/signals.hpp @@ -26,7 +26,7 @@ #include "../can/can-signals.hpp" #include "../diagnostic/diagnostic-message.hpp" -#include "../binding/low-can-binding.hpp" +#include "../binding/low-can-hat.hpp" namespace utils { diff --git a/CAN-binder/low-can-binding/utils/socketcan.hpp b/CAN-binder/low-can-binding/utils/socketcan.hpp index 3dcc277d..e9116643 100644 --- a/CAN-binder/low-can-binding/utils/socketcan.hpp +++ b/CAN-binder/low-can-binding/utils/socketcan.hpp @@ -24,7 +24,7 @@ #include #include "../can/can-message.hpp" -#include "../binding/low-can-binding.hpp" +#include "../binding/low-can-hat.hpp" #define INVALID_SOCKET -1 -- 2.16.6