diff options
author | Romain Forlot <romain.forlot@iot.bzh> | 2017-02-27 23:17:43 +0100 |
---|---|---|
committer | Romain Forlot <romain.forlot@iot.bzh> | 2017-02-28 21:45:49 +0100 |
commit | d4c6484ca4f8d9eb8f97d7e0555e461f2831baa3 (patch) | |
tree | c36a1d8c575306ebfc3aa86b5c7dc3df808fe623 | |
parent | 63101e73ec21aeca93ba4ed0e2c7eba77bd52210 (diff) |
Fix: start reading the can bus if it was correctly
opened.
Change-Id: If285791aee51d4a57e17270e8ac458cb6869f970
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
-rw-r--r-- | src/can-utils.cpp | 6 | ||||
-rw-r--r-- | src/low-can-binding-new.cpp | 172 |
2 files changed, 4 insertions, 174 deletions
diff --git a/src/can-utils.cpp b/src/can-utils.cpp index b6fbf894..47375443 100644 --- a/src/can-utils.cpp +++ b/src/can-utils.cpp @@ -207,10 +207,12 @@ int can_bus_t::init_can_dev() { can_bus_dev_t can_bus_device_handler(device); if (can_bus_device_handler.open()) + { i++; + can_bus_device_handler.start_reading(std::ref(*this)); + } else ERROR(binder_interface, "Can't open device %s", device); - can_bus_device_handler.start_reading(std::ref(*this)); } NOTICE(binder_interface, "Initialized %d/%d can bus device(s)", i, t); @@ -249,7 +251,7 @@ std::vector<std::string> can_bus_t::read_conf() { taxi = json_object_get_string(canbus); DEBUG(binder_interface, "Can bus found: %s", taxi); - ret.push_back(taxi); + ret.push_back(std::string(taxi)); } else { diff --git a/src/low-can-binding-new.cpp b/src/low-can-binding-new.cpp deleted file mode 100644 index 13571f2a..00000000 --- a/src/low-can-binding-new.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* - * 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-binding.hpp" - -/******************************************************************************** -* -* Subscription and unsubscription -* -*********************************************************************************/ -static int subscribe_unsubscribe_signal(struct afb_req request, const std::string& sig) -{ - int ret; - - // TODO: lock the subscribed_signals when insert/remove - const auto& ss_i = subscribed_signals.find(sig); - if (ss_i != subscribed_signals.end()) - { - if(!afb_event_is_valid(ss_i->second)) - { - if(!subscribe) - { - NOTICE(binder_interface, "Event isn't valid, it can't be unsubscribed."); - ret = 1; - } - else - { - ss_i->second = afb_daemon_make_event(binder_interface->daemon, ss_i->first.c_str()); - if (!afb_event_is_valid(ss_i->second)) - { - ERROR(binder_interface, "Can't create an event, something goes wrong."); - ret = 0; - } - } - } - } - else - { - subscribed_signals[sig] = afb_daemon_make_event(binder_interface->daemon, sig); - if (!afb_event_is_valid(ss_i->second)) - { - ERROR(binder_interface, "Can't create an event, something goes wrong."); - ret = 0; - } - } - - if (((subscribe ? afb_req_subscribe : afb_req_unsubscribe)(request, subscribed_signals[sig])) < 0) - { - ERROR(binder_interface, "Operation goes wrong for signal: %s", sig); - ret = 0; - } - else - ret = 1; - - return ret; -} - -static int subscribe_signals(struct afb_req request, const std::vector<std::string>& signals) -{ - int ret = 0; - - for(const auto& signal_i : signals) - { - ret = subscribe_signal(request, subscribe, signal_i); - if(ret == 0) - return ret; - } - return ret; -} - -std::vector<std::string> get_name(struct afb_req request) -{ - int i, n; - std::vector<std::string> ret; - struct json_object *args, *a, *x; - - args = afb_req_json(request); - if (args == NULL || !json_object_object_get_ex(args, "event", &a)) - ret.clear(); - else if (json_object_get_type(a) != json_type_array) - ret.push_back(json_object_get_string(a)); - else - { - n = json_object_array_length(a); - for (i = 0 ; i < n ; i++) { - x = json_object_array_get_idx(a, i); - ret.push_back(json_object_get_string(x)); - } - } - - return ret; -} - -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, - { - "CAN bus service", - "can", - verbs - } -}; - -extern "C" -{ - static void subscribe(struct afb_req request) - { - int ret; - std::vector<std::string> names; - - names = get_name(request); - if(names.empty()) - ret = subscribe_signals(request, "*"); - else - ret = subscribe_signals(request, names); - } - - static void unsubscribe(struct afb_req request) - { - subscribe_unsubscribe(request, false); - } - - const struct afb_binding *afbBindingV1Register (const struct afb_binding_interface *itf) - { - 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) - { - int fd_conf; - fd_conf = afb_daemon_rootdir_open_locale(interface->daemon, "can_bus.json", O_RDONLY, NULL); - - /* Open CAN socket */ - can_bus_t can_bus_handler(interface, fd_conf); - if(can_bus_handler.init_can_dev() == 0) - { - can_bus_handler.start_threads(); - return 0; - } - - return 1; - } -};
\ No newline at end of file |