Make and use a single function to read incoming CAN messages
authorRomain Forlot <romain.forlot@iot.bzh>
Tue, 16 May 2017 14:36:51 +0000 (16:36 +0200)
committerRomain Forlot <romain.forlot@iot.bzh>
Fri, 19 May 2017 09:36:43 +0000 (11:36 +0200)
Change-Id: I5d3f2a8628ace464ad25989346cc76682c591bd8
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
CAN-binder/low-can-binding/binding/low-can-cb.cpp
CAN-binder/low-can-binding/binding/low-can-hat.hpp
CAN-binder/low-can-binding/can/can-signals.cpp
CAN-binder/low-can-binding/can/can-signals.hpp
CAN-binder/low-can-binding/diagnostic/diagnostic-manager.cpp
CAN-binder/low-can-binding/diagnostic/diagnostic-manager.hpp

index d298779..4faae85 100644 (file)
@@ -52,33 +52,50 @@ void on_no_clients(std::string message)
        }
 }
 
-int read_can_signal(sd_event_source *s, int fd, uint32_t revents, void *userdata)
+static void push_n_notify(const can_message_t cm)
 {
-       can_signal_t* sig= (can_signal_t*)userdata;
-       sig->read_socket();
-
-       /* check if error or hangup */
-       if ((revents & (EPOLLERR|EPOLLRDHUP|EPOLLHUP)) != 0)
-       {
-               sd_event_source_unref(s);
-               sig->get_socket().close();
-               sig->create_rx_filter();
-       }
-       return 0;
+       can_bus_t& cbm = configuration_t::instance().get_can_bus_manager();
+       std::lock_guard<std::mutex> can_message_lock(cbm.get_can_message_mutex());
+       { cbm.push_new_can_message(cm); }
+       cbm.get_new_can_message_cv().notify_one();
 }
 
-int read_diagnostic_message(sd_event_source *s, int fd, uint32_t revents, void *userdata)
+int read_message(sd_event_source *s, int fd, uint32_t revents, void *userdata)
 {
+       can_message_t cm;
+       can_signal_t* sig;
        diagnostic_manager_t& diag_m = configuration_t::instance().get_diagnostic_manager();
-       diag_m.read_socket();
+
+       if(userdata != nullptr)
+       {
+               sig = (can_signal_t*)userdata;
+               utils::socketcan_bcm_t s = sig->get_socket();
+               s >> cm;
+       }
+       else
+       {
+               utils::socketcan_bcm_t s = diag_m.get_socket();
+               s >> cm;
+       }
+
+       push_n_notify(cm);
 
        /* check if error or hangup */
        if ((revents & (EPOLLERR|EPOLLRDHUP|EPOLLHUP)) != 0)
        {
                sd_event_source_unref(s);
-               diag_m.get_socket().close();
-               diag_m.cleanup_active_requests(true);
-               ERROR(binder_interface, "%s: Error on diagnostic manager socket, cancelling active requests.", __FUNCTION__);
+               if(userdata != nullptr)
+               {
+                       sig->get_socket().close();
+                       sig->create_rx_filter();
+                       NOTICE(binder_interface, "%s: Recreated RX_SETUP BCM job for signal: %s", __FUNCTION__, sig->get_name().c_str());
+               }
+               else
+               {
+                       diag_m.get_socket().close();
+                       diag_m.cleanup_active_requests(true);
+                       ERROR(binder_interface, "%s: Error on diagnostic manager socket, cancelling active requests.", __FUNCTION__);
+               }
                return -1;
        }
 
@@ -207,7 +224,7 @@ static int subscribe_unsubscribe_signals(struct afb_req request, bool subscribe,
                        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_can_signal, sig.get());
+               sd_event_add_io(afb_daemon_get_event_loop(binder_interface->daemon), &e_source, sig->get_socket().socket(), EPOLLIN, read_message, sig.get());
                rets++;
                DEBUG(binder_interface, "%s: signal: %s subscribed", __FUNCTION__, sig->get_name().c_str());
        }
index 57c0a53..b3384d7 100644 (file)
@@ -32,8 +32,7 @@ extern "C" struct afb_binding_interface;
 extern const struct afb_binding_interface *binder_interface;
 
 void on_no_clients(std::string message);
-int read_can_signal(sd_event_source *s, int fd, uint32_t revents, void *userdata);
-int read_diagnostic_message(sd_event_source *s, int fd, uint32_t revents, void *userdata);
+int read_message(sd_event_source *s, int fd, uint32_t revents, void *userdata);
 
 void subscribe(struct afb_req request);
 void unsubscribe(struct afb_req request);
\ No newline at end of file
index 0b58967..d196c07 100644 (file)
@@ -255,13 +255,3 @@ int can_signal_t::create_rx_filter()
                return 0;
        return -1;
 }
-
-void can_signal_t::read_socket()
-{
-       can_message_t msg;
-       can_bus_t& cbm = configuration_t::instance().get_can_bus_manager();
-       socket_ >> msg;
-       std::lock_guard<std::mutex> can_message_lock(cbm.get_can_message_mutex());
-       { cbm.push_new_can_message(msg); }
-       cbm.get_new_can_message_cv().notify_one();
-}
\ No newline at end of file
index 79f56db..1277bf3 100644 (file)
@@ -157,5 +157,4 @@ public:
        void set_last_value(float val);
 
        int create_rx_filter();
-       void read_socket();
 };
\ No newline at end of file
index c4be28f..4b25426 100644 (file)
@@ -57,16 +57,6 @@ bool diagnostic_manager_t::initialize()
        return initialized_;
 }
 
-void diagnostic_manager_t::read_socket()
-{
-       can_message_t msg;
-       can_bus_t& cbm = configuration_t::instance().get_can_bus_manager();
-       socket_ >> msg;
-       std::lock_guard<std::mutex> can_message_lock(cbm.get_can_message_mutex());
-       { cbm.push_new_can_message(msg); }
-       cbm.get_new_can_message_cv().notify_one();
-}
-
 utils::socketcan_bcm_t& diagnostic_manager_t::get_socket()
 {
        return socket_;
@@ -454,7 +444,7 @@ active_diagnostic_request_t* diagnostic_manager_t::add_recurring_request(Diagnos
                                                &event_source_,
                                                socket_.socket(),
                                                EPOLLIN,
-                                               read_diagnostic_message,
+                                               read_message,
                                                nullptr) < 0)
                                        {
                                                cleanup_request(entry, true);
index bcee3dc..894cf63 100644 (file)
@@ -66,7 +66,6 @@ public:
 
        bool initialize();
 
-       void read_socket();
        utils::socketcan_bcm_t& get_socket();
        std::string get_can_bus();
        active_diagnostic_request_t* get_last_recurring_requests() const;